commit 7029cca974428f4027f2b048a686feef49e22260 Author: sam Date: Sat Oct 11 14:41:23 2008 +0000 Merge www/ and trac/ into a single web/ project. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/web/trunk@2920 92316355-f0b4-4df1-b90c-862c8a59935f diff --git a/static/.htaccess b/static/.htaccess new file mode 100644 index 0000000..6be7ea1 --- /dev/null +++ b/static/.htaccess @@ -0,0 +1,57 @@ +# $Id$ + +# Activated modules +RewriteEngine on + +# We talk utf8 here +AddDefaultCharset utf-8 + +# Disallowed files: .htaccess, .htpasswd, .svn etc. + + Order allow,deny + Deny from all + + + + Order allow,deny + Deny from all + + +# MIME Types + + AddType application/x-cgi-php .html + Action application/x-cgi-php /cgi-bin/php5 + + + AddType application/x-httpd-php .html + +AddType text/css .css +AddType application/octet-stream .TAP + +# Redirects for disallowed stuff +RewriteRule ^.git/.* /.git/ [L] +RewriteRule ^.svn/.* /.svn/ [L] +RewriteRule (.*)/.svn/.* /$1/.svn/ [L] + +# Redirects for manual and lists +RewriteRule ^manual/$ /manual.html?page=index [L] +RewriteRule ^manual/(.*)[.]html /manual.html?page=$1 [L] +RewriteRule ^list/$ /list.html?page=threads [L] +RewriteRule ^list/(.*)[.]html /list.html?page=$1 [L] +RewriteRule ^list-svn/$ /list-svn.html?page=threads [L] +RewriteRule ^list-svn/(.*)[.]html /list-svn.html?page=$1 [L] +RewriteRule ^list-trac/$ /list-trac.html?page=threads [L] +RewriteRule ^list-trac/(.*)[.]html /list-trac.html?page=$1 [L] + +# Misc. redirects +RewriteRule ^([^/]*).(gz|bz2|zip) /files/$1.$2 [R=permanent,L] +RewriteRule ^images/(.*) /img/$1 [R=permanent,L] +RewriteRule ^labs/img2oric.html /img2oric/ [R=permanent,L] +RewriteRule ^devel.html /wiki [R=permanent,L] +RewriteRule ^cgi-bin/viewcvs.cgi /browser [R=permanent,L] + +# Redirects for Trac - FIXME +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.*)$ /cgi-bin/trac.cgi/$1 [PT,L,E=SCRIPT_NAME:/] + diff --git a/static/cacacon07/DSC000011.JPG b/static/cacacon07/DSC000011.JPG new file mode 100644 index 0000000..672e4b1 Binary files /dev/null and b/static/cacacon07/DSC000011.JPG differ diff --git a/static/cacacon07/DSC000013.JPG b/static/cacacon07/DSC000013.JPG new file mode 100644 index 0000000..703be70 Binary files /dev/null and b/static/cacacon07/DSC000013.JPG differ diff --git a/static/cacacon07/DSC000017.JPG b/static/cacacon07/DSC000017.JPG new file mode 100644 index 0000000..9207dca Binary files /dev/null and b/static/cacacon07/DSC000017.JPG differ diff --git a/static/cacacon07/DSC000026.JPG b/static/cacacon07/DSC000026.JPG new file mode 100644 index 0000000..15b6c41 Binary files /dev/null and b/static/cacacon07/DSC000026.JPG differ diff --git a/static/cacacon07/DSC000029.JPG b/static/cacacon07/DSC000029.JPG new file mode 100644 index 0000000..9deb9b1 Binary files /dev/null and b/static/cacacon07/DSC000029.JPG differ diff --git a/static/cacacon07/index.html b/static/cacacon07/index.html new file mode 100644 index 0000000..451cba4 --- /dev/null +++ b/static/cacacon07/index.html @@ -0,0 +1,117 @@ + + + + + + + + + + + + CacaCon’07 - First International libcaca Conference + + + + + + + + + +

FOR IMMEDIATE RELEASE

+ +

Report on the First International libcaca Conference

+ +

Wednesday October 24, 2007

+ +

Sam (ZOY) - Paris, France: CacaCon’07, the first international +libcaca conference, just took place on October 19-20, 2007 in Lyon, France. +

+ +

The most eagerly-awaited event of the conference was of course Jylam’s +keynote. The acclaimed libcaca second-in-chief developer covered the +history of the project, gave key figures about its current status, and +of course hinted at future plans.

+ +

The morning of the second day had been busy with uncalled for attacks +directed at the libcaca team by Mozilla Europe Board of Directors +president Tristan Nitot who reportedly managed to say that "all +applications have memory leaks" without immediately dying of maniac, +self-ridiculing laughter. Needless to say, Jylam’s keynote was +immediately refocused on insisting about libcaca’s superior development +model and giving examples of its speed, lightweightness and general lack +of memory leaks.

+ + + + + + + +
+ Jylam
Jylam
+
+ PowerPipo
PowerPipo
+
+ the audience
the audience
+
+ +

The libcaca team eventually announced its new forthcoming product +"neercs", a replacement for the obsolete Unix utility "screen" with +full Unicode support, window thumbnailing, eye-candy transition effects +and textmode window management. The audience also sat in awe as Jylam, +literally knee-shaking in excitement, admitted that the very tool he had +been using during the keynote was not a Microsoft product or a cheap +clone thereof, but a development version of the libcaca team’s own +fully-featured presentation tool, PowerPipo.

+ +

CacaCon’07 ended with a social event at luxury resort Le Chevreul +(Lyon) where hundreds of potential libcaca users and enthusiasts would +have been able to meet main developers Sam and Jylam.

+ + + + + + +
+ Jylam and Sam
Jylam and Sam
+
+ fan art
fan art
+
+ +

About libcaca:
+libcaca is the industry leading colour ASCII art library. It is part +of a global conspiracy aiming at luring basement-dwelling nerds +into thinking that focusing on overtechnical, useless and generally +uninteresting activities is going to help them get laid. Approximately +700,000 Linux users still believe it to be true and frantically +recompile nightly git snapshots of the kernel as a consequence.

+ +

About Firefox:
+Firefox is the Mozilla Corporation’s rebranded version of the famous +Iceweasel web browser, to which they insist on adding a restrictive +trademark license and a suggestive yiff logo. Notwithstanding, we urge +you to donate all your money to the multimillion-dollar company. The +guys look legit.

+ +

About memory leaks:
+All applications called Firefox have memory leaks.

+ + + + + diff --git a/static/cacacon07/tn-DSC000011.jpeg b/static/cacacon07/tn-DSC000011.jpeg new file mode 100644 index 0000000..70c55a7 Binary files /dev/null and b/static/cacacon07/tn-DSC000011.jpeg differ diff --git a/static/cacacon07/tn-DSC000013.jpeg b/static/cacacon07/tn-DSC000013.jpeg new file mode 100644 index 0000000..1cb5269 Binary files /dev/null and b/static/cacacon07/tn-DSC000013.jpeg differ diff --git a/static/cacacon07/tn-DSC000017.jpeg b/static/cacacon07/tn-DSC000017.jpeg new file mode 100644 index 0000000..1edf1f5 Binary files /dev/null and b/static/cacacon07/tn-DSC000017.jpeg differ diff --git a/static/cacacon07/tn-DSC000026.jpeg b/static/cacacon07/tn-DSC000026.jpeg new file mode 100644 index 0000000..45ef78d Binary files /dev/null and b/static/cacacon07/tn-DSC000026.jpeg differ diff --git a/static/cacacon07/tn-DSC000029.jpeg b/static/cacacon07/tn-DSC000029.jpeg new file mode 100644 index 0000000..87bf986 Binary files /dev/null and b/static/cacacon07/tn-DSC000029.jpeg differ diff --git a/static/cacatris-sample.png b/static/cacatris-sample.png new file mode 100644 index 0000000..9a44de7 Binary files /dev/null and b/static/cacatris-sample.png differ diff --git a/static/cacatris.html b/static/cacatris.html new file mode 100644 index 0000000..c621649 --- /dev/null +++ b/static/cacatris.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + libcaca - cacatris + + + + + + + + + +

cacatris

+ +

Cacatris aims to create a graphical Tetris(c) clone, but in text mode. Main concerns focus on gameplay, and graphical quality (althought current screenshot doesn't really show this).

+

It is currently under heavy developement, thus no downloads are available yet.

+ +

Screenshot

+ +

ttyvaders sample 2

+ + + + + diff --git a/static/download.html b/static/download.html new file mode 100644 index 0000000..8ab4cf5 --- /dev/null +++ b/static/download.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + libcaca - downloads + + + + + + + + + +

You can browse old releases of all the libcaca +software.

+ +

Libcaca development versions

+ +

The latest libcaca beta version is libcaca-0.99.beta13b.tar.gz +(November 28th, 2007). Please download and test it. If you are a developer, +please comment on the current API and let us know what is missing.

+ +

Even more recent code can be downloaded using Subversion. See the development page for more information.

+ +

Documentation

+ +

You can download a PDF version of the +libcaca manual.

+ +

Old libcaca stable versions

+ +

Warning: stable +releases of libcaca are terribly outdated. If you want to test libcaca, you +are encouraged to check the development versions.

+ +

Latest stable libcaca release is libcaca-0.9.tar.gz (216KB) / libcaca-0.9.tar.bz2 (172KB).

+ +

A Windows zip archive containing the libcaca demos can be downloaded here: +libcaca-win32-0.9.zip (100KB).

+ +

Older versions (up to 0.9) were under the LGPL license but all +copyright holders agreed to relicence the codebase under the WTFPL (such a +permission is not retroactive and you should consider old versions as still +covered by the LGPL). The logo on this page is copyrighted by Akira Toriyama +so if anyone fancies drawing a new logo it would be much appreciated.

+ + + + + diff --git a/static/export.html b/static/export.html new file mode 100644 index 0000000..db98c03 --- /dev/null +++ b/static/export.html @@ -0,0 +1,48 @@ + +Generated by libcaca 0.99.beta10 + +
+                                                                                
+       ▄▄▄                                                 ▄▄▄                  
+    ▄▄▄▀▀▀▄ ▄▄                                         ▀▀▀▄▄▄▄▄             
+  ▄▄▄▓▓▓▀▀▄▄▄   ▄▄ ▄▄▄▄ ▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▓▓▓▄▄▄▀▀           
+▓▓▓▒▒▒▓▓▓▓▄▄▀▀▄▄▀▀▄▄▀▀▀▀▄▄▄▄▄▄▄▀▀▀▀▄▄▀▌▓▓▒▓▓▓▓▓         
+▓▒▒░▒▓▓▒▒▒▒▓▓▓▓▓▄▀▓▓▒▓▌▄▓▓▓▓▓▓▄▀▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▄ ▓▓▒▒▒▒▒▓▓        
+█ ▓▒▒░░▒▌ ▓▓▓▒▒▓▓▌▐▒▒▒▓▒▒▒▓▒▒░▒░▒▓ ▓▒▒▒░▒▒▒▓▓▀ ▓▒░▒▒▒▓ ▓▓▒░░▒▒█          
+▒░░░░▒▄ ▄▌▓▒▒▓▓ ░░▒▌▐░░▒░█ ▐░ ░▒▌▐▒░░ ░░▒▀▀▄▒▒░ ▀░░▒█ ▒░░░░▒ █  ▄▄      
+█ ▒▒░▒▒▓▓▓▒░░▒▓░░░▒ ░░░░▒▒░░░█ ▀ ▐░ ▌▐░░░░░░░░ ░░▌▐░░░ █▄▄▄▀▀    
+▓▓▒▒▓▓▀▄▒░░ ░▒▒▓ ▒▒▒▓▌▐▒▒▒░░▒▓▓▄█ ▒░░░░ ▒░░▒▒▒▒░ ░░ ░░▐█▀▀▓▓  
+ ▀▓▓▓▀▄▓▓▒▒░░ ░░▒▓▓▀▀▄▓▓▓▒▒░▄▄▄▀▀▀█▌▒▒░▒▒▒ ▓▒▒▌ ▐▒▒░▒▒▒▒░▒▄▄░░░▒▒▒▓▓
+   ▀▀ ▓▓▓▒▒░░ ░░░░ ▄▄▄▀▀▄▄▄▓▓▒▒▒░░░▄▄▄▀▓▓▓▀▄▓▓▓▓▓ ▓▓▒▒▒▓▓ ▓▒▒▒░░░▒▒▒▒▒▓▓▓
+     ▀▀▀▀▓▓▓▒▒▒░░▀█▄ ▀▀▀ ▀▄▄▓▓▒▒▓▓▓▓▄▄▀▀▀▄▄▄▓▓▓▓▌▐▓▓▓▓▒▒▒▒▓▓▓▓▓▀▀
+   ▄▀▀▀▄▄▀▀▓▓▓▀▄▄▀▀▄  ▄▀▀▀▀▄▄▀▀▓▓▄█▀▀▀▀▄▄▀▀▀██▀▄▄▀▀▄▄▄▀▀▀▓▓▓▓▀▀▀▄▄▀▀ 
+ ▄▄▄ ▀▀▄▄▄█▀▀▄▄▓▓▄▄░▒▓▒▀██▄▄▀▄▄▓▓▓▓▄▄▀▀▀▀▄▄█▀▀▀▄▄▄  ▄▄▀▀▀▀▀    
+ ▐▓▓▓▄▄▀▀▄▄ ▓▓▓▒▒▒▓▓  ░▒▓▓▒█ █▀▓▓▓▒▒░▒▓▓▓▓▄▀▄▄▄██ ▓▓▓▓▓▓       
+  ██ ▓▓▒▒▒▓▓▄▄▀▀▒▒▒░░░▒▒ █▄░▒▓▒▄█▌▓▓▒▒░░░░▒▒▒▓▓█ ▓▓▓▓▓▒▒▒▓▓      
+  ▐▓▒▒░▒▒▓▓▓▓▀ ▒░░░░░▒▀▄█▄▄▄▄▀▀▄ ▒▒░░░▒░░░▒▒▌▐▓▒▒▓▄▄▒▒▒▒░░░▒▓▓       
+   ██ ▓▓▒░░░▒▒▒▒▀▌▒░░ ░░░ ▄▄▀▀▄▄▓▓▓▌ ░░▒▒░▌▐░░▒▀▄▒░░░▒▒▒░░░░ ░░░▒     
+    ██ ▒░░░░░░░░░░░ ░░▌ ▐▓▓▒▒░▒▒▒▓  ▄▄▄▀░▒░░░ ░░░▀▀▀░░ ░░░░     
+     █ ▒▒▒░░░▒▒▒░░░▒▒  ▒░░░░░░░░▒▒░░░░░▒▒▒▄  ▒▒░░░░▒▒▌▄▒▒░░░░░▒▓       
+      ▓▓▒▒▒▒▓▓▓▒▒▒▓▓  ▒▒▒▓▓▓▓▒▒▒ ▓▓▓▒▒▒▒▒▓▓▓▄█ ▓▓▒▒▒▒▓▓▓▒▒▒▒▒▒▓      
+        ▀▀▓▓▀▀▓▓▀ ▄▓▓▓▀▀▄▄▀▀▓▓▓▄▀▀▓▓▓▓▓▓▀▀▓▓▓▓▀▀▀▀▓▓▓▓▓       
+          ▀▀▄▄▀ ▀▀▀▄▄█▄▄▄▄███▄▄▄▄▀▀▄▄▄▄▄▄█▄▄▄▄ ▀▄▄▄▄▀▀▀▀▄▄▄▄▄         
+             ▀▀      █▀▄▄▄▄▄▄▀▀▄▄▄▄▄▄▄███▄▄▄▄▄▄ ▀▀▀▀     ▀▀▀▀▀           
+                     █  ░▒▓▄ █  ░▒▓ █▄▀▀▀▀▀█  ░▒▓                           
+                     █  ░▒▓ ██  ░▒▓▄  ░▒▀█   ░▒▓                          
+                     █  ░▒▓ ██  ░▒▓▀  ░▒▓█   ░▒▓                          
+                      ▄▄▄▄▀▀▄▄▄▄▄█▄▄▄▄▄▀▀▄▄▄▄▄                           
+                        ▀▀▀▀    ▀▀▀▀▀ ▀▀▀▀▀▀  ▀▀▀▀▀                             
+                           M O R T A L   W S H                                
+▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
+                                                                                
+                  PiL HQ ■ Syndrome Couriers HQ ■ GODS WHQ                      
+                16.8 Duals ■ 8i8.XxX.XxXx ■ 8 Node Ringdown                     
+                         S: QUAZiMODEM & CiPHER                                 
+                    CO'S:  LORD THiNKER   THE MOZARELLO                         
+                   SLiCE & DiCE ■ HURRiCAN ■ RAZOR BLADE                        
+                                                                                
+▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
+                        ANSi BY   LUC AiM 'NiNE FO' >                         
+                                                                                
+                                                                                
+
diff --git a/static/export.ps b/static/export.ps new file mode 100644 index 0000000..bbaffe4 --- /dev/null +++ b/static/export.ps @@ -0,0 +1,20710 @@ +%! +%% libcaca PDF export +%%LanguageLevel: 2 +%%Pages: 1 +%%DocumentData: Clean7Bit +/csquare { + newpath + 0 0 moveto + 0 1 rlineto + 1 0 rlineto + 0 -1 rlineto + closepath + setrgbcolor + fill +} def +/S { + Show +} bind def +/Courier-Bold findfont +8 scalefont +setfont +gsave +6 10 scale +0 43 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.666667 0.666667 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.666667 0.000000 0.666667 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +1 0 translate + 0.000000 0.000000 0.000000 csquare +-80 1 translate +grestore +0 430 translate +newpath +6 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 422 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 412 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +54 412 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +60 412 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +66 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 412 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +366 412 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +372 412 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +378 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 412 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +24 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +30 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +36 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +42 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +48 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +54 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +60 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +66 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +72 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +78 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +84 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +90 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +96 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +174 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +354 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +360 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +366 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +372 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +378 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +384 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +390 402 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +396 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +402 402 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +408 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 402 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +24 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +30 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +36 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +78 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +84 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +90 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +96 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +102 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +108 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +114 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +120 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +126 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +132 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +138 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +144 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +150 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +156 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +186 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +192 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +198 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +204 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +222 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +228 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +234 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +240 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +246 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +264 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +270 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +282 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +288 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +294 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +300 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +306 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +312 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +318 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +324 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +336 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +342 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +348 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +354 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +372 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 392 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +402 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +408 392 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +414 392 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +420 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 392 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 382 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +12 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +18 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +24 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +30 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +36 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +78 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +120 382 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +126 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +132 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +138 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +150 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +156 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +168 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +174 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +180 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +210 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +216 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +276 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 382 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +312 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +330 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +336 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +348 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +354 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +372 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 382 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +420 382 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +426 382 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +432 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 382 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 372 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +12 372 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +18 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +24 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +30 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +36 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +78 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +114 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 372 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +126 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +144 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +150 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +168 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +174 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +180 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +186 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +198 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +204 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +210 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +216 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +222 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +228 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +240 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +246 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +276 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 372 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +330 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +336 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +354 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +360 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +372 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 372 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +420 372 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +426 372 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +432 372 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +438 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 372 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 362 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +12 362 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +18 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +24 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +30 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +36 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +60 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +78 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +90 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +114 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +144 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +150 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +168 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +174 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +180 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +186 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +198 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +204 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +210 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +216 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +222 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +228 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +240 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +276 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +312 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +330 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +336 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +354 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +372 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 362 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +420 362 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +426 362 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +432 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 362 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 352 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +12 352 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +18 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +24 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +30 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +36 352 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +42 352 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 352 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +54 352 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 352 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 352 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +72 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +78 352 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +84 352 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +90 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +96 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +114 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +144 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +150 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +168 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +174 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +180 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +186 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +198 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +204 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +216 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +222 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +228 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +240 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +246 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +252 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +276 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +300 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +306 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +312 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +330 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +342 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +354 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +366 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 352 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 352 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +420 352 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +426 352 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +432 352 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +438 352 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +444 352 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +450 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 352 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 342 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +12 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +18 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +24 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +30 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +36 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +42 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +54 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +84 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +90 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +114 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +132 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +168 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +228 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +240 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +258 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +270 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +282 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +294 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +300 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +312 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +354 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +372 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +378 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 342 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 342 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +414 342 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +420 342 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +426 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +432 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +438 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +450 342 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +456 342 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +462 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 342 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 332 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +12 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +18 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +24 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +30 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +36 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +42 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +54 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +108 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +114 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +168 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +174 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +234 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +264 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +318 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +360 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 332 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +402 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +408 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +414 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +420 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +426 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +432 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 332 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +456 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +462 332 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +468 332 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +474 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 332 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 322 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 322 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +18 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +24 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +30 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +36 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +42 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +54 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +108 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 322 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 322 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 322 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +132 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +168 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +174 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 322 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +318 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +336 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 322 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +408 322 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +414 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +456 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +462 322 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +468 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +474 322 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +480 322 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +6 312 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 312 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 312 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +24 312 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +30 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +36 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +42 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +54 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +102 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +108 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 312 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 312 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 312 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +138 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +150 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +156 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +234 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +318 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 312 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 312 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +456 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +462 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +468 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +474 312 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +480 312 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +6 302 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 302 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 302 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 302 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 302 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +42 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +48 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +54 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +60 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +108 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +120 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +126 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +132 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +138 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +144 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +150 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +156 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +162 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +168 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +174 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +180 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +186 302 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +192 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +234 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +288 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +318 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +330 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +336 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +342 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +456 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +462 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +468 302 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +474 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +480 302 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +6 292 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 292 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 292 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +30 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +36 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +42 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +48 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +54 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +60 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +66 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +72 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +78 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +84 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +108 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +120 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +126 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +132 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +138 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +150 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +156 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +168 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +174 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +180 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +186 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +234 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +264 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +270 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +282 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +288 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +336 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +342 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +348 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +354 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +360 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +378 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +384 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +390 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 292 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +456 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +462 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +468 292 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +474 292 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +480 292 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +18 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +24 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +30 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +36 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +54 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +60 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +66 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +72 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +78 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +84 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +90 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +96 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +102 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +108 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +120 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +126 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +132 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +144 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +150 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 282 moveto +0.666667 0.000000 0.000000 setrgbcolor +(?) show +newpath +192 282 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 282 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 282 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 282 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 282 moveto +0.666667 0.000000 0.000000 setrgbcolor +(?) show +newpath +222 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +276 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +330 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +336 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +342 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +348 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +354 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +360 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +366 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +372 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +378 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +384 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +390 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +414 282 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +420 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +426 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +432 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +438 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 282 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +450 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +456 282 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +462 282 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 282 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 282 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 282 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +18 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +24 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +30 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +36 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +72 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +78 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +84 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +90 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +96 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +102 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +108 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +144 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +150 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +168 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 272 moveto +0.666667 0.000000 0.000000 setrgbcolor +(?) show +newpath +186 272 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 272 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 272 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +210 272 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 272 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 272 moveto +0.666667 0.000000 0.000000 setrgbcolor +(?) show +newpath +228 272 moveto +0.666667 0.000000 0.000000 setrgbcolor +( ) show +newpath +234 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +276 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +312 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +330 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +336 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +354 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +360 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +366 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +372 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +378 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +384 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +420 272 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +426 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +432 272 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +438 272 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +444 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 272 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 262 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 262 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 262 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +24 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +30 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +36 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +78 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +96 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +102 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +108 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +120 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +144 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +150 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +168 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 262 moveto +0.666667 0.000000 0.000000 setrgbcolor +(?) show +newpath +192 262 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 262 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 262 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 262 moveto +1.000000 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 262 moveto +0.666667 0.000000 0.000000 setrgbcolor +(?) show +newpath +222 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +246 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +276 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +288 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +312 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +330 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +336 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +354 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +366 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +372 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +378 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +420 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +426 262 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +432 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +438 262 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 262 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +450 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 262 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 252 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 252 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 252 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +24 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +30 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +36 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +42 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +78 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +120 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +144 252 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +168 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +174 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +240 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +246 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 252 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +288 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +294 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +306 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +312 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +324 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +330 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +336 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +354 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +372 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +402 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +408 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +420 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +426 252 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +432 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 252 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 252 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +450 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 252 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 242 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 242 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 242 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +24 242 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +30 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +36 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +42 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +48 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +66 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +72 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +78 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +108 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +120 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +126 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +138 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +150 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +156 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +168 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +180 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +186 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +210 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +216 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +222 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +228 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +240 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +246 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +252 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +258 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +282 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +288 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +294 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +318 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +324 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +330 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +336 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +342 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +348 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +354 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +372 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +378 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +384 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +396 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +402 242 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +414 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +420 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +426 242 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +432 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +438 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 242 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +450 242 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +456 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 242 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 232 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +12 232 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +18 232 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +24 232 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +30 232 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +36 232 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +42 232 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +48 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +54 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +84 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +90 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +96 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +102 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +108 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +114 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +120 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +126 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +132 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +144 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +168 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +180 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +186 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +198 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +204 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +210 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +216 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +222 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +228 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +234 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +258 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +264 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +270 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +276 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +300 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +318 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +330 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +336 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +348 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +360 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +366 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +372 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +378 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +384 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +390 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +408 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 232 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +426 232 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +432 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +438 232 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 232 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +450 232 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +456 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 232 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 222 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +42 222 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +48 222 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +54 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +60 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +108 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +120 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +126 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +132 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +180 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +186 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +192 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +198 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +216 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +222 222 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +228 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +(?) show +newpath +234 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +312 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +318 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 222 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 222 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 222 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +450 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 222 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 212 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +48 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +54 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +60 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +108 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +120 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +126 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +132 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +174 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +324 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 212 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +438 212 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +444 212 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +450 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 212 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 202 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +60 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +66 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +72 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +108 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +114 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +120 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +126 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +132 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +156 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +168 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +174 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +234 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 202 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +312 202 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +318 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +330 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +378 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 202 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +432 202 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +438 202 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +444 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 202 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +72 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +78 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +84 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +90 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +96 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +102 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +108 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +114 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +120 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +126 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +132 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +138 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +150 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +156 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +198 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +264 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +270 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +282 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +288 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +318 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +324 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +336 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +342 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +348 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +354 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +360 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +366 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +372 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +378 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +384 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +390 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +396 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +402 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +408 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +414 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +420 192 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +426 192 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +432 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 192 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +90 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +96 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +138 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +150 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +156 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +162 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +168 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +174 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +180 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +186 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +204 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +210 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +216 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +222 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +228 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +246 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +252 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +258 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +264 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +270 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +282 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +288 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +294 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +300 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +306 182 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +312 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 182 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +336 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +342 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +348 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +354 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +360 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +396 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +402 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +408 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +414 182 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +420 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 182 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 172 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +138 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +150 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +156 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +( ) show +newpath +186 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +198 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +204 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +264 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +270 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +282 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +288 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 172 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 172 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 172 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 172 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 162 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +138 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +150 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +156 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +198 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +204 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +240 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +246 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 162 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +264 162 moveto +0.000000 0.000000 0.666667 setrgbcolor +(?) show +newpath +270 162 moveto +0.000000 0.000000 0.666667 setrgbcolor +( ) show +newpath +276 162 moveto +0.000000 0.000000 0.666667 setrgbcolor +( ) show +newpath +282 162 moveto +0.000000 0.000000 0.666667 setrgbcolor +( ) show +newpath +288 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 162 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 162 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 162 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 162 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 152 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +138 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +144 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +150 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +156 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +186 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +192 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +198 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +204 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +240 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +( ) show +newpath +246 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +264 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +270 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +( ) show +newpath +276 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +( ) show +newpath +282 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +( ) show +newpath +288 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 152 moveto +0.333333 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 152 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +324 152 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +330 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 152 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 142 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +144 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +150 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +156 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +162 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +168 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +174 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +180 142 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +186 142 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +192 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +198 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +204 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +210 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +216 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +222 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +228 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +234 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +240 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +246 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +252 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +258 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +264 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +270 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +276 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +282 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +288 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +294 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +300 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +306 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +312 142 moveto +1.000000 0.333333 1.000000 setrgbcolor +(?) show +newpath +318 142 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +324 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 142 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +156 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +162 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +168 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +174 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +180 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +186 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +192 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +198 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +204 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +210 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +216 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +222 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +228 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +234 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +240 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +246 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +252 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +258 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +264 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +270 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +276 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +282 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +288 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +294 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +300 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +306 132 moveto +0.666667 0.000000 0.666667 setrgbcolor +(?) show +newpath +312 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 132 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(M) show +newpath +174 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +180 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(O) show +newpath +186 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +192 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(R) show +newpath +198 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +204 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(T) show +newpath +210 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +216 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(A) show +newpath +222 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +228 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(L) show +newpath +234 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +240 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +246 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +252 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(W) show +newpath +258 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +264 122 moveto +0.333333 0.333333 0.333333 setrgbcolor +(i) show +newpath +270 122 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +276 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(S) show +newpath +282 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +288 122 moveto +1.000000 1.000000 1.000000 setrgbcolor +(H) show +newpath +294 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 122 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +12 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +18 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +24 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +30 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +36 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +42 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +54 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +108 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +120 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +126 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +132 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +168 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +174 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +234 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +318 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +456 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +462 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +468 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +474 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +480 112 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +6 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 102 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(P) show +newpath +120 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +126 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(L) show +newpath +132 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +138 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +144 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Q) show +newpath +150 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +156 92 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +162 92 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +168 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(S) show +newpath +174 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(y) show +newpath +180 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(n) show +newpath +186 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(d) show +newpath +192 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(r) show +newpath +198 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(o) show +newpath +204 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(m) show +newpath +210 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(e) show +newpath +216 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +222 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(C) show +newpath +228 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(o) show +newpath +234 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(u) show +newpath +240 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(r) show +newpath +246 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +252 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(e) show +newpath +258 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(r) show +newpath +264 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(s) show +newpath +270 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +276 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +282 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Q) show +newpath +288 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +294 92 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +300 92 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +306 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(G) show +newpath +312 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +318 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(D) show +newpath +324 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(S) show +newpath +330 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +336 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(W) show +newpath +342 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +348 92 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Q) show +newpath +354 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 92 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(1) show +newpath +108 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(6) show +newpath +114 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(.) show +newpath +120 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(8) show +newpath +126 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +132 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(D) show +newpath +138 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(u) show +newpath +144 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(a) show +newpath +150 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(l) show +newpath +156 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(s) show +newpath +162 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +168 82 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +174 82 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +180 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(8) show +newpath +186 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +192 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(8) show +newpath +198 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(.) show +newpath +204 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(X) show +newpath +210 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(x) show +newpath +216 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(X) show +newpath +222 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(.) show +newpath +228 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(X) show +newpath +234 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(x) show +newpath +240 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(X) show +newpath +246 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(x) show +newpath +252 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +258 82 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +264 82 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +270 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(8) show +newpath +276 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +282 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(N) show +newpath +288 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(o) show +newpath +294 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(d) show +newpath +300 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(e) show +newpath +306 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +312 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +318 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +324 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(n) show +newpath +330 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(g) show +newpath +336 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(d) show +newpath +342 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(o) show +newpath +348 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(w) show +newpath +354 82 moveto +0.666667 0.000000 0.666667 setrgbcolor +(n) show +newpath +360 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 82 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(S) show +newpath +162 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(:) show +newpath +168 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +174 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Q) show +newpath +180 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(U) show +newpath +186 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(A) show +newpath +192 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Z) show +newpath +198 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +204 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(M) show +newpath +210 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +216 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(D) show +newpath +222 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +228 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(M) show +newpath +234 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +240 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(&) show +newpath +246 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +252 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(C) show +newpath +258 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +264 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(P) show +newpath +270 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +276 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +282 72 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +288 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 72 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(C) show +newpath +132 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +138 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(') show +newpath +144 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(S) show +newpath +150 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(:) show +newpath +156 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +162 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +168 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(L) show +newpath +174 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +180 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +186 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(D) show +newpath +192 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +198 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(T) show +newpath +204 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +210 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +216 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(N) show +newpath +222 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(K) show +newpath +228 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +234 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +240 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +246 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +252 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +258 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(T) show +newpath +264 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +270 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +276 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +282 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(M) show +newpath +288 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +294 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Z) show +newpath +300 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(A) show +newpath +306 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +312 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +318 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(L) show +newpath +324 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(L) show +newpath +330 62 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +336 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 62 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(S) show +newpath +126 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(L) show +newpath +132 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +138 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(C) show +newpath +144 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +150 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +156 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(&) show +newpath +162 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +168 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(D) show +newpath +174 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +180 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(C) show +newpath +186 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +192 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +198 52 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +204 52 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +210 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(H) show +newpath +216 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(U) show +newpath +222 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +228 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +234 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(i) show +newpath +240 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(C) show +newpath +246 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(A) show +newpath +252 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(N) show +newpath +258 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +264 52 moveto +1.000000 1.000000 1.000000 setrgbcolor +(?) show +newpath +270 52 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +276 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +282 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(A) show +newpath +288 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(Z) show +newpath +294 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(O) show +newpath +300 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(R) show +newpath +306 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +( ) show +newpath +312 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(B) show +newpath +318 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(L) show +newpath +324 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(A) show +newpath +330 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(D) show +newpath +336 52 moveto +0.666667 0.000000 0.666667 setrgbcolor +(E) show +newpath +342 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 52 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 42 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +12 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +18 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +24 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +30 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +36 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +42 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +48 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +54 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +60 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +66 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +72 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +78 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +84 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +90 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +96 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +102 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +108 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +114 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +120 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +126 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +132 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +138 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +144 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +150 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +156 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +162 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +168 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +174 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +180 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +186 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +192 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +198 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +204 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +210 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +216 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +222 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +228 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +234 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +240 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +246 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +252 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +258 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +264 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +270 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +276 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +282 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +288 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +294 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +300 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +306 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +312 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +318 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +324 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +330 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +336 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +342 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +348 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +354 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +360 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +366 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +372 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +378 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +384 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +390 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +396 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +402 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +408 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +414 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +420 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +426 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +432 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +438 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +444 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +450 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +456 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +462 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +468 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +474 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +480 32 moveto +0.333333 0.333333 0.333333 setrgbcolor +(?) show +newpath +6 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(A) show +newpath +156 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(N) show +newpath +162 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(S) show +newpath +168 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(i) show +newpath +174 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +180 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(B) show +newpath +186 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(Y) show +newpath +192 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +198 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +204 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +210 22 moveto +1.000000 1.000000 1.000000 setrgbcolor +(L) show +newpath +216 22 moveto +1.000000 1.000000 1.000000 setrgbcolor +(U) show +newpath +222 22 moveto +1.000000 1.000000 1.000000 setrgbcolor +(C) show +newpath +228 22 moveto +1.000000 1.000000 1.000000 setrgbcolor +( ) show +newpath +234 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(<) show +newpath +240 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +246 22 moveto +0.333333 0.333333 1.000000 setrgbcolor +(A) show +newpath +252 22 moveto +0.333333 0.333333 1.000000 setrgbcolor +(i) show +newpath +258 22 moveto +0.333333 0.333333 1.000000 setrgbcolor +(M) show +newpath +264 22 moveto +0.333333 0.333333 1.000000 setrgbcolor +( ) show +newpath +270 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(') show +newpath +276 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +(N) show +newpath +282 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +(i) show +newpath +288 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +(N) show +newpath +294 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +(E) show +newpath +300 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +( ) show +newpath +306 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +(F) show +newpath +312 22 moveto +0.000000 0.000000 0.666667 setrgbcolor +(O) show +newpath +318 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(') show +newpath +324 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +( ) show +newpath +330 22 moveto +0.333333 0.333333 0.333333 setrgbcolor +(>) show +newpath +336 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 22 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 12 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +6 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +12 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +18 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +24 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +30 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +36 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +42 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +48 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +54 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +60 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +66 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +72 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +78 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +84 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +90 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +96 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +102 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +108 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +114 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +120 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +126 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +132 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +138 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +144 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +150 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +156 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +162 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +168 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +174 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +180 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +186 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +192 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +198 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +204 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +210 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +216 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +222 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +228 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +234 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +240 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +246 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +252 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +258 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +264 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +270 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +276 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +282 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +288 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +294 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +300 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +306 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +312 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +318 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +324 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +330 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +336 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +342 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +348 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +354 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +360 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +366 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +372 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +378 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +384 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +390 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +396 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +402 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +408 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +414 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +420 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +426 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +432 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +438 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +444 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +450 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +456 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +462 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +468 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +474 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +newpath +480 2 moveto +0.666667 0.666667 0.666667 setrgbcolor +( ) show +showpage diff --git a/static/export.svg b/static/export.svg new file mode 100644 index 0000000..3f00a4d --- /dev/null +++ b/static/export.svg @@ -0,0 +1,5397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +M +O +R +T +A +L +W +i +S +H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +P +i +L +H +Q + +S +y +n +d +r +o +m +e +C +o +u +r +i +e +r +s +H +Q + +G +O +D +S +W +H +Q +1 +6 +. +8 +D +u +a +l +s + +8 +i +8 +. +X +x +X +. +X +x +X +x + +8 +N +o +d +e +R +i +n +g +d +o +w +n +S +: +Q +U +A +Z +i +M +O +D +E +M +& +C +i +P +H +E +R +C +O +' +S +: +L +O +R +D +T +H +i +N +K +E +R +T +H +E +M +O +Z +A +R +E +L +L +O +S +L +i +C +E +& +D +i +C +E + +H +U +R +R +i +C +A +N + +R +A +Z +O +R +B +L +A +D +E + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A +N +S +i +B +Y +L +U +C +< +A +i +M +' +N +i +N +E +F +O +' +> + + diff --git a/static/favicon.ico b/static/favicon.ico new file mode 100644 index 0000000..ede4c57 Binary files /dev/null and b/static/favicon.ico differ diff --git a/static/footer.inc b/static/footer.inc new file mode 100644 index 0000000..533724e --- /dev/null +++ b/static/footer.inc @@ -0,0 +1,17 @@ + + + + +
+
+
+
+
+

valid XHTML 1.1 & CSS

+
+

+
+
+
+
+ diff --git a/static/header.inc b/static/header.inc new file mode 100644 index 0000000..3af377f --- /dev/null +++ b/static/header.inc @@ -0,0 +1,28 @@ +
+
+
+

+ +

+

libcaca - Colour AsCii Art library

+
+
+
+ + + +
+
+
diff --git a/static/img/back1.png b/static/img/back1.png new file mode 100644 index 0000000..d9eeb6d Binary files /dev/null and b/static/img/back1.png differ diff --git a/static/img/back2.png b/static/img/back2.png new file mode 100644 index 0000000..3c1a8bc Binary files /dev/null and b/static/img/back2.png differ diff --git a/static/img/back3.png b/static/img/back3.png new file mode 100644 index 0000000..ef54ed4 Binary files /dev/null and b/static/img/back3.png differ diff --git a/static/img/back4.png b/static/img/back4.png new file mode 100644 index 0000000..11e1124 Binary files /dev/null and b/static/img/back4.png differ diff --git a/static/img/cacaball-80x50.png b/static/img/cacaball-80x50.png new file mode 100644 index 0000000..a37d967 Binary files /dev/null and b/static/img/cacaball-80x50.png differ diff --git a/static/img/cacaplas-80x50.png b/static/img/cacaplas-80x50.png new file mode 100644 index 0000000..12f6335 Binary files /dev/null and b/static/img/cacaplas-80x50.png differ diff --git a/static/img/export.png b/static/img/export.png new file mode 100644 index 0000000..e595f96 Binary files /dev/null and b/static/img/export.png differ diff --git a/static/img/green-left.png b/static/img/green-left.png new file mode 100644 index 0000000..9de2bfd Binary files /dev/null and b/static/img/green-left.png differ diff --git a/static/img/green-right.png b/static/img/green-right.png new file mode 100644 index 0000000..feae7b2 Binary files /dev/null and b/static/img/green-right.png differ diff --git a/static/img/rotate.png b/static/img/rotate.png new file mode 100644 index 0000000..09d4054 Binary files /dev/null and b/static/img/rotate.png differ diff --git a/static/img/sample.png b/static/img/sample.png new file mode 100644 index 0000000..aea7738 Binary files /dev/null and b/static/img/sample.png differ diff --git a/static/img/stitch-80x45.png b/static/img/stitch-80x45.png new file mode 100644 index 0000000..0e22588 Binary files /dev/null and b/static/img/stitch-80x45.png differ diff --git a/static/img/swallow-80x32.png b/static/img/swallow-80x32.png new file mode 100644 index 0000000..a6168e3 Binary files /dev/null and b/static/img/swallow-80x32.png differ diff --git a/static/img/tn-cacaball-80x50.jpeg b/static/img/tn-cacaball-80x50.jpeg new file mode 100644 index 0000000..a0f24cd Binary files /dev/null and b/static/img/tn-cacaball-80x50.jpeg differ diff --git a/static/img/tn-cacaplas-80x50.jpeg b/static/img/tn-cacaplas-80x50.jpeg new file mode 100644 index 0000000..93c3a81 Binary files /dev/null and b/static/img/tn-cacaplas-80x50.jpeg differ diff --git a/static/img/tn-export.jpeg b/static/img/tn-export.jpeg new file mode 100644 index 0000000..4d40988 Binary files /dev/null and b/static/img/tn-export.jpeg differ diff --git a/static/img/tn-rotate.jpeg b/static/img/tn-rotate.jpeg new file mode 100644 index 0000000..610de33 Binary files /dev/null and b/static/img/tn-rotate.jpeg differ diff --git a/static/img/tn-stitch-80x45.jpeg b/static/img/tn-stitch-80x45.jpeg new file mode 100644 index 0000000..bc1f068 Binary files /dev/null and b/static/img/tn-stitch-80x45.jpeg differ diff --git a/static/img/tn-swallow-80x32.jpeg b/static/img/tn-swallow-80x32.jpeg new file mode 100644 index 0000000..8bd5342 Binary files /dev/null and b/static/img/tn-swallow-80x32.jpeg differ diff --git a/static/img/tn-truecolor-32x16.jpeg b/static/img/tn-truecolor-32x16.jpeg new file mode 100644 index 0000000..5b43ffd Binary files /dev/null and b/static/img/tn-truecolor-32x16.jpeg differ diff --git a/static/img/tn-unicode-80x24.jpeg b/static/img/tn-unicode-80x24.jpeg new file mode 100644 index 0000000..e6b9205 Binary files /dev/null and b/static/img/tn-unicode-80x24.jpeg differ diff --git a/static/img/trac_banner.png b/static/img/trac_banner.png new file mode 100644 index 0000000..78adb07 Binary files /dev/null and b/static/img/trac_banner.png differ diff --git a/static/img/truecolor-32x16.png b/static/img/truecolor-32x16.png new file mode 100644 index 0000000..cfedc93 Binary files /dev/null and b/static/img/truecolor-32x16.png differ diff --git a/static/img/unicode-80x24.png b/static/img/unicode-80x24.png new file mode 100644 index 0000000..d38bb2c Binary files /dev/null and b/static/img/unicode-80x24.png differ diff --git a/static/img2oric/OUTPUT.TAP b/static/img2oric/OUTPUT.TAP new file mode 100644 index 0000000..59e878f Binary files /dev/null and b/static/img2oric/OUTPUT.TAP differ diff --git a/static/img2oric/bb.png b/static/img2oric/bb.png new file mode 100644 index 0000000..db1bd52 Binary files /dev/null and b/static/img2oric/bb.png differ diff --git a/static/img2oric/bear.gif b/static/img2oric/bear.gif new file mode 100644 index 0000000..03a4731 Binary files /dev/null and b/static/img2oric/bear.gif differ diff --git a/static/img2oric/blur-eatme.png b/static/img2oric/blur-eatme.png new file mode 100644 index 0000000..267d2c0 Binary files /dev/null and b/static/img2oric/blur-eatme.png differ diff --git a/static/img2oric/bufbw.png b/static/img2oric/bufbw.png new file mode 100644 index 0000000..654272d Binary files /dev/null and b/static/img2oric/bufbw.png differ diff --git a/static/img2oric/buffy.png b/static/img2oric/buffy.png new file mode 100644 index 0000000..721bf2e Binary files /dev/null and b/static/img2oric/buffy.png differ diff --git a/static/img2oric/dog.png b/static/img2oric/dog.png new file mode 100644 index 0000000..23c9f8f Binary files /dev/null and b/static/img2oric/dog.png differ diff --git a/static/img2oric/eatme.png b/static/img2oric/eatme.png new file mode 100644 index 0000000..72c360b Binary files /dev/null and b/static/img2oric/eatme.png differ diff --git a/static/img2oric/homer.png b/static/img2oric/homer.png new file mode 100644 index 0000000..5245cb5 Binary files /dev/null and b/static/img2oric/homer.png differ diff --git a/static/img2oric/img2oric.c b/static/img2oric/img2oric.c new file mode 100644 index 0000000..a31e892 --- /dev/null +++ b/static/img2oric/img2oric.c @@ -0,0 +1,610 @@ +/* + * img2oric Convert an image to Oric Atmos colours + * Copyright (c) 2008 Sam Hocevar + * All Rights Reserved + * + * Changes: + * Jan 18, 2008: initial release + * Jan 23, 2008: add support for inverse video on attribute change + * improve Floyd-Steinberg coefficient values + * Jun 14, 2008: Win32 version + * Jun 18, 2008: add meaningful error messages + * + * This program is free software. It comes without any warranty, to + * the extent permitted by applicable law. You can redistribute it + * and/or modify it under the terms of the Do What The Fuck You Want + * To Public License, Version 2, as published by Sam Hocevar. See + * http://sam.zoy.org/wtfpl/COPYING for more details. + * + * To build this program on Linux: + * cc -O3 -funroll-loops -W -Wall img2oric.c -o img2oric \ + * $(pkg-config --cflags --libs sdl) -lSDL_image -lm + * To build a Windows executable: + * i586-mingw32msvc-cc -O3 -funroll-loops -W -Wall \ + * img2oric.c -o img2oric.exe -lgdi32 + */ + +#include +#include +#include + +#include + +#if defined _WIN32 +# include +# define uint8_t unsigned char +#else +# include +#endif + +/* + * BMP output name and Oric output name + */ +#define BMPFILE "output.bmp" +#define ORICFILE "OUTPUT" /* ".TAP" will be appended */ + +/* + * Image dimensions and recursion depth. DEPTH = 2 is a reasonable value, + * DEPTH = 3 gives good quality, and higher values may improve the results + * even more but at the cost of significantly longer computation times. + */ +#define WIDTH 240 +#define HEIGHT 200 +#define DEPTH 3 + +/* + * Error diffusion table, similar to Floyd-Steinberg. I choose not to + * propagate 100% of the error, because doing so creates awful artifacts + * (full lines of the same colour, massive colour bleeding) for unclear + * reasons. Atkinson dithering propagates 3/4 of the error, which is even + * less than our 31/32. I also choose to propagate slightly more in the + * X direction to avoid banding effects due to rounding errors. + * It would be interesting, for future versions of this software, to + * propagate the error to the second line, too. But right now I find it far + * too complex to do. + * + * +-------+-------+ + * | error |FS0/FSX| + * +-------+-------+-------+ + * |FS1/FSX|FS2/FSX|FS3/FSX| + * +-------+-------+-------+ + */ +#define FS0 15 +#define FS1 6 +#define FS2 9 +#define FS3 1 +#define FSX 32 + +/* + * The simple Oric RGB palette, made of the 8 Neugebauer primary colours. Each + * colour is repeated 6 times so that we can point to the palette to paste + * whole blocks of 6 pixels. It’s also organised so that palette[7-x] is the + * RGB negative of palette[x], and screen command X uses palette[X & 7]. + */ +#define o 0x0000 +#define X 0xffff +static const int palette[8][6 * 3] = +{ + { o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o }, + { X, o, o, X, o, o, X, o, o, X, o, o, X, o, o, X, o, o }, + { o, X, o, o, X, o, o, X, o, o, X, o, o, X, o, o, X, o }, + { X, X, o, X, X, o, X, X, o, X, X, o, X, X, o, X, X, o }, + { o, o, X, o, o, X, o, o, X, o, o, X, o, o, X, o, o, X }, + { X, o, X, X, o, X, X, o, X, X, o, X, X, o, X, X, o, X }, + { o, X, X, o, X, X, o, X, X, o, X, X, o, X, X, o, X, X }, + { X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X }, +}; + +/* + * Gamma correction tables. itoc_table and ctoi_table accept overflow and + * underflow values to a reasonable extent, so that we don’t have to check + * for these cases later in the code. Tests kill performance. + */ +#define PAD 2048 +static int itoc_table_clip[PAD + 256 + PAD], ctoi_table_clip[PAD + 256 + PAD]; +static int *itoc_table = itoc_table_clip + PAD; +static int *ctoi_table = ctoi_table_clip + PAD; + +static void init_tables(void) +{ + int i; + + for(i = 0; i < PAD + 256 + PAD; i++) + { + double f = 1.0 * (i - PAD) / 255.999; + if(f >= 0.) + { + itoc_table_clip[i] = (int)(65535.999 * pow(f, 1./2.2)); + ctoi_table_clip[i] = (int)(65535.999 * pow(f, 2.2)); + } + else + { + itoc_table_clip[i] = - (int)(65535.999 * pow(-f, 1./2.2)); + ctoi_table_clip[i] = - (int)(65535.999 * pow(-f, 2.2)); + } + } +} + +static inline int itoc(int p) { return itoc_table[p / 0x100]; } +static inline int ctoi(int p) { return ctoi_table[p / 0x100]; } + +/* + * Set new background and foreground colours according to the given command. + */ +static inline void domove(uint8_t command, uint8_t *bg, uint8_t *fg) +{ + if((command & 0x78) == 0x00) + *fg = command & 0x7; + else if((command & 0x78) == 0x10) + *bg = command & 0x7; +} + +/* + * Clamp pixel value to avoid colour bleeding. Deactivated because it + * does not give satisfactory results. + */ +#define CLAMP 0x1000 +static inline int clamp(int p) +{ +#if 0 + /* FIXME: doesn’t give terribly good results on eg. eatme.png */ + if(p < - CLAMP) return - CLAMP; + if(p > 0xffff + CLAMP) return 0xffff + CLAMP; +#endif + return p; +} + +/* + * Compute the perceptual error caused by replacing the input pixels "in" + * with the output pixels "out". "inerr" is the diffused error that should + * be applied to "in"’s first pixel. "outerr" will hold the diffused error + * to apply after "in"’s last pixel upon next call. The return value does + * not mean much physically; it is one part of the algorithm where you need + * to play a bit in order to get appealing results. That’s how image + * processing works, dude. + */ +static inline int geterror(int const *in, int const *inerr, + int const *out, int *outerr) +{ + int tmperr[9 * 3]; + int i, c, ret = 0; + + /* 9 cells: 1 for the end of line, 8 for the errors below */ + memcpy(tmperr, inerr, 3 * sizeof(int)); + memset(tmperr + 3, 0, 8 * 3 * sizeof(int)); + + for(i = 0; i < 6; i++) + { + for(c = 0; c < 3; c++) + { + /* Experiment shows that this is important at small depths */ + int a = clamp(in[i * 3 + c] + tmperr[c]); + int b = out[i * 3 + c]; + tmperr[c] = (a - b) * FS0 / FSX; + tmperr[c + (i * 3 + 3)] += (a - b) * FS1 / FSX; + tmperr[c + (i * 3 + 6)] += (a - b) * FS2 / FSX; + tmperr[c + (i * 3 + 9)] += (a - b) * FS3 / FSX; + ret += (a - b) / 256 * (a - b) / 256; + } + } + + for(i = 0; i < 4; i++) + { + for(c = 0; c < 3; c++) + { + /* Experiment shows that this is important at large depths */ + int a = itoc((in[i * 3 + c] + in[i * 3 + 3 + c] + + in[i * 3 + 6 + c]) / 3); + int b = itoc((out[i * 3 + c] + out[i * 3 + 3 + c] + + out[i * 3 + 6 + c]) / 3); + ret += (a - b) / 256 * (a - b) / 256; + } + } + + /* Using the diffused error as a perceptual error component is stupid, + * because that’s not what it is at all, but I found that it helped a + * bit in some cases. */ + for(i = 0; i < 3; i++) + ret += tmperr[i] / 256 * tmperr[i] / 256; + + memcpy(outerr, tmperr, 3 * sizeof(int)); + + return ret; +} + +static uint8_t bestmove(int const *in, uint8_t bg, uint8_t fg, + int const *errvec, int depth, int maxerror, + int *error, int *out) +{ + int voidvec[3], nvoidvec[3], bestrgb[6 * 3], tmprgb[6 * 3], tmpvec[3]; + int const *voidrgb, *nvoidrgb, *vec, *rgb; + int besterror, curerror, suberror, statice, voide, nvoide; + int i, j, c; + uint8_t command, bestcommand; + + /* Precompute error for the case where we change the foreground colour + * and hence only print the background colour or its negative */ + voidrgb = palette[bg]; + voide = geterror(in, errvec, voidrgb, voidvec); + nvoidrgb = palette[7 - bg]; + nvoide = geterror(in, errvec, nvoidrgb, nvoidvec); + + /* Precompute sub-error for the case where we print pixels (and hence + * don’t change the palette). It’s not the exact error because we should + * be propagating the error to the first pixel here. */ + if(depth > 0) + { + int tmp[3] = { 0, 0, 0 }; + bestmove(in + 6 * 3, bg, fg, tmp, depth - 1, maxerror, &statice, NULL); + } + + /* Check every likely command: + * 0-7: change foreground to 0-7 + * 8-15: change foreground to 0-7, print negative background + * 16-23: change background to 0-7 + * 24-31: change background to 0-7, print negative background + * 32: normal stuff + * 33: inverse video stuff */ + besterror = 0x7ffffff; + bestcommand = 0x10; + memcpy(bestrgb, voidrgb, 6 * 3 * sizeof(int)); + for(j = 0; j < 34; j++) + { + static uint8_t const lookup[] = + { + 0x00, 0x04, 0x01, 0x05, 0x02, 0x06, 0x03, 0x07, + 0x80, 0x84, 0x81, 0x85, 0x82, 0x86, 0x83, 0x87, + 0x10, 0x14, 0x11, 0x15, 0x12, 0x16, 0x13, 0x17, + 0x90, 0x94, 0x91, 0x95, 0x92, 0x96, 0x93, 0x97, + 0x40, 0xc0 + }; + + uint8_t newbg = bg, newfg = fg; + + command = lookup[j]; + domove(command, &newbg, &newfg); + + /* Keeping bg and fg is useless, because we could use standard + * pixel printing instead */ + if((command & 0x40) == 0x00 && newbg == bg && newfg == fg) + continue; + + /* I *think* having newfg == newbg is useless, too, but I don’t + * want to miss some corner case where swapping bg and fg may be + * interesting, so we continue anyway. */ + +#if 0 + /* Bit 6 off and bit 5 on seems illegal */ + if((command & 0x60) == 0x20) + continue; + + /* Bits 6 and 5 off and bit 3 on seems illegal */ + if((command & 0x68) == 0x08) + continue; +#endif + + if((command & 0xf8) == 0x00) + { + curerror = voide; + rgb = voidrgb; + vec = voidvec; + } + else if((command & 0xf8) == 0x80) + { + curerror = nvoide; + rgb = nvoidrgb; + vec = nvoidvec; + } + else if((command & 0xf8) == 0x10) + { + rgb = palette[newbg]; + curerror = geterror(in, errvec, rgb, tmpvec); + vec = tmpvec; + } + else if((command & 0xf8) == 0x90) + { + rgb = palette[7 - newbg]; + curerror = geterror(in, errvec, rgb, tmpvec); + vec = tmpvec; + } + else + { + int const *bgcolor, *fgcolor; + + if((command & 0x80) == 0x00) + { + bgcolor = palette[bg]; fgcolor = palette[fg]; + } + else + { + bgcolor = palette[7 - bg]; fgcolor = palette[7 - fg]; + } + + memcpy(tmpvec, errvec, 3 * sizeof(int)); + curerror = 0; + + for(i = 0; i < 6; i++) + { + int vec1[3], vec2[3]; + int smalle1 = 0, smalle2 = 0; + + memcpy(vec1, tmpvec, 3 * sizeof(int)); + memcpy(vec2, tmpvec, 3 * sizeof(int)); + for(c = 0; c < 3; c++) + { + int delta1, delta2; + delta1 = clamp(in[i * 3 + c] + tmpvec[c]) - bgcolor[c]; + vec1[c] = delta1 * FS0 / FSX; + smalle1 += delta1 / 256 * delta1; + delta2 = clamp(in[i * 3 + c] + tmpvec[c]) - fgcolor[c]; + vec2[c] = delta2 * FS0 / FSX; + smalle2 += delta2 / 256 * delta2; + } + + if(smalle1 < smalle2) + { + memcpy(tmpvec, vec1, 3 * sizeof(int)); + memcpy(tmprgb + i * 3, bgcolor, 3 * sizeof(int)); + } + else + { + memcpy(tmpvec, vec2, 3 * sizeof(int)); + memcpy(tmprgb + i * 3, fgcolor, 3 * sizeof(int)); + command |= (1 << (5 - i)); + } + } + + /* Recompute full error */ + curerror += geterror(in, errvec, tmprgb, tmpvec); + + rgb = tmprgb; + vec = tmpvec; + } + + if(curerror > besterror) + continue; + + /* Try to avoid bad decisions now that will have a high cost + * later in the line by making the next error more important than + * the current error. */ + curerror = curerror * 3 / 4; + + if(depth == 0) + suberror = 0; /* It’s the end of the tree */ + else if((command & 0x68) == 0x00) + { + bestmove(in + 6 * 3, newbg, newfg, vec, depth - 1, + besterror - curerror, &suberror, NULL); + +#if 0 + /* Slight penalty for colour changes; they're hard to revert. The + * value of 2 was determined empirically. 1.5 is not enough and + * 3 is too much. */ + if(newbg != bg) + suberror = suberror * 10 / 8; + else if(newfg != fg) + suberror = suberror * 9 / 8; +#endif + } + else + suberror = statice; + + if(curerror + suberror < besterror) + { + besterror = curerror + suberror; + bestcommand = command; + memcpy(bestrgb, rgb, 6 * 3 * sizeof(int)); + } + } + + *error = besterror; + if(out) + memcpy(out, bestrgb, 6 * 3 * sizeof(int)); + + return bestcommand; +} + +int main(int argc, char *argv[]) +{ +#if defined _WIN32 + PBITMAPINFO pbinfo; + BITMAPINFO binfo; + BITMAPFILEHEADER bfheader; + ULONG bisize; + HANDLE hfile; + HBITMAP tmp; + HDC hdc; + DWORD ret; +#else + SDL_Surface *tmp, *surface; +#endif + FILE *f; + uint8_t *pixels; + int *src, *dst, *srcl, *dstl; + int stride, x, y, depth, c; + + if(argc < 2) + { + fprintf(stderr, "Error: missing argument.\n"); + fprintf(stderr, "Usage: img2oric \n"); + return 1; + } + +#if defined _WIN32 + tmp = (HBITMAP)LoadImage(NULL, argv[1], IMAGE_BITMAP, + 0, 0, LR_LOADFROMFILE); +#else + tmp = IMG_Load(argv[1]); +#endif + if(!tmp) + { + fprintf(stderr, "Error: could not load image %s.\n", argv[1]); +#if defined _WIN32 + fprintf(stderr, "Maybe try with an 8-bpp or 24-bpp BMP file?\n"); +#endif + return 2; + } + + f = fopen(ORICFILE ".TAP", "w"); + if(!f) + { + fprintf(stderr, "Error: could not open %s.TAP for writing.\n", + ORICFILE); + return 3; + } + fwrite("\x16\x16\x16\x16\x24", 1, 5, f); + fwrite("\x00\xff\x80\x00\xbf\x3f\xa0\x00\x00", 1, 9, f); + fwrite(ORICFILE, 1, strlen(ORICFILE), f); + fwrite("\x00", 1, 1, f); + + init_tables(); + + /* Load the image into a friendly array of fast integers. We create it + * slightly bigger than the image so that we don’t have to care about + * borders when propagating the error later */ + src = calloc((WIDTH + 1) * (HEIGHT + 1) * 3, sizeof(int)); + dst = calloc((WIDTH + 1) * (HEIGHT + 1) * 3, sizeof(int)); + stride = (WIDTH + 1) * 3; + +#if defined _WIN32 + hdc = CreateCompatibleDC(NULL); + SelectObject(hdc, tmp); + for(y = 0; y < HEIGHT; y++) + for(x = 0; x < WIDTH; x++) + { + COLORREF color = GetPixel(hdc, x, y); + src[y * stride + x * 3] = ctoi(GetRValue(color) * 0x101); + src[y * stride + x * 3 + 1] = ctoi(GetGValue(color) * 0x101); + src[y * stride + x * 3 + 2] = ctoi(GetBValue(color) * 0x101); + for(c = 0; c < 3; c++) + dst[y * stride + x * 3 + c] = 0; + } +#else + /* FIXME: endianness */ + surface = SDL_CreateRGBSurface(SDL_SWSURFACE, WIDTH, HEIGHT, 32, + 0xff0000, 0xff00, 0xff, 0x0); + SDL_BlitSurface(tmp, NULL, surface, NULL); + pixels = (uint8_t *)surface->pixels; + for(y = 0; y < HEIGHT; y++) + for(x = 0; x < WIDTH; x++) + for(c = 0; c < 3; c++) + { + src[y * stride + x * 3 + c] + = ctoi(pixels[y * surface->pitch + x * 4 + 2 - c] * 0x101); + dst[y * stride + x * 3 + c] = 0; + } +#endif + + /* Let the fun begin */ + for(y = 0; y < HEIGHT; y++) + { + uint8_t bg = 0, fg = 7; + + fprintf(stderr, "\rProcessing... %i%%", (y * 100 + 99) / HEIGHT); + + for(x = 0; x < WIDTH; x += 6) + { + int errvec[3] = { 0, 0, 0 }; + int dummy, i; + uint8_t command; + + depth = (x + DEPTH < WIDTH) ? DEPTH : (WIDTH - x) / 6 - 1; + srcl = src + y * stride + x * 3; + dstl = dst + y * stride + x * 3; + + /* Recursively compute and apply best command */ + command = bestmove(srcl, bg, fg, errvec, depth, 0x7fffff, + &dummy, dstl); + /* Propagate error */ + for(c = 0; c < 3; c++) + { + for(i = 0; i < 6; i++) + { + int error = srcl[i * 3 + c] - dstl[i * 3 + c]; + srcl[i * 3 + c + 3] = + clamp(srcl[i * 3 + c + 3] + error * FS0 / FSX); + srcl[i * 3 + c + stride - 3] += error * FS1 / FSX; + srcl[i * 3 + c + stride] += error * FS2 / FSX; + srcl[i * 3 + c + stride + 3] += error * FS3 / FSX; + } + + for(i = -1; i < 7; i++) + srcl[i * 3 + c + stride] = clamp(srcl[i * 3 + c + stride]); + } + /* Iterate */ + domove(command, &bg, &fg); + /* Write byte to file */ + fwrite(&command, 1, 1, f); + } + } + + fclose(f); + + fprintf(stderr, " done.\n"); + + /* Save everything */ +#if defined _WIN32 + for(y = 0; y < HEIGHT; y++) + for(x = 0; x < WIDTH; x++) + { + uint8_t r = dst[y * stride + x * 3] / 0x100; + uint8_t g = dst[y * stride + x * 3 + 1] / 0x100; + uint8_t b = dst[y * stride + x * 3 + 2] / 0x100; + SetPixel(hdc, x, y, RGB(r, g, b)); + } + + binfo.bmiHeader.biSize = sizeof(binfo.bmiHeader); + binfo.bmiHeader.biBitCount = 0; + GetDIBits(hdc, tmp, 0, 0, NULL, &binfo, DIB_RGB_COLORS); + + switch(binfo.bmiHeader.biBitCount) + { + case 24: + bisize = sizeof(BITMAPINFOHEADER); + break; + case 16: + case 32: + bisize = sizeof(BITMAPINFOHEADER) + sizeof(DWORD) * 3; + break; + default: + bisize = sizeof(BITMAPINFOHEADER) + + sizeof(RGBQUAD) * (1 << binfo.bmiHeader.biBitCount); + break; + } + + pbinfo = (PBITMAPINFO)GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, bisize); + memcpy(pbinfo, &binfo, sizeof(BITMAPINFOHEADER)); + + bfheader.bfType = 0x4D42; /* "BM" */ + bfheader.bfSize = sizeof(BITMAPFILEHEADER) + + bisize + pbinfo->bmiHeader.biSizeImage; + bfheader.bfReserved1 = 0; + bfheader.bfReserved2 = 0; + bfheader.bfOffBits = sizeof(BITMAPFILEHEADER) + bisize; + + pixels = GlobalAlloc(GMEM_FIXED | GMEM_ZEROINIT, + binfo.bmiHeader.biSizeImage); + GetDIBits(hdc, tmp, 0, pbinfo->bmiHeader.biHeight, + pixels, pbinfo, DIB_RGB_COLORS); + + hfile = CreateFile(BMPFILE, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_ARCHIVE, NULL); + WriteFile(hfile, &bfheader, sizeof(BITMAPFILEHEADER), &ret, NULL); + WriteFile(hfile, pbinfo, bisize, &ret, NULL); + WriteFile(hfile, pixels, pbinfo->bmiHeader.biSizeImage, &ret, NULL); + CloseHandle(hfile); + + GlobalFree(pbinfo); + GlobalFree(pixels); +#else + for(y = 0; y < HEIGHT; y++) + for(x = 0; x < WIDTH; x++) + for(c = 0; c < 3; c++) + pixels[y * surface->pitch + x * 4 + 2 - c] + = itoc(dst[y * stride + x * 3 + c]) / 0x100; + SDL_SaveBMP(surface, BMPFILE); +#endif + + return 0; +} + diff --git a/static/img2oric/img2oric.exe b/static/img2oric/img2oric.exe new file mode 100755 index 0000000..c5e181b Binary files /dev/null and b/static/img2oric/img2oric.exe differ diff --git a/static/img2oric/index.html b/static/img2oric/index.html new file mode 100644 index 0000000..c04c86c --- /dev/null +++ b/static/img2oric/index.html @@ -0,0 +1,139 @@ + + + + + + + + + + + + Caca Labs - img2oric + + + + + + + + + +Oric computer + +

img2oric converts images to the Oric screen format. The Oric +screen format is one of the most twisted standards and very little artwork +exists for this vintage computer. It was therefore the perfect challenge for +the Caca Labs image processing team.

+ +

The graphical part of the Oric screen has 240×200 pixels and can only +display 8 different colours (black, blue, red, green, cyan, magenta, yellow +and white). Each horizontal group of 6 pixels can only use two different +colours: the foreground and the background colours. The background or +the foreground colour may also be changed (one at a time), but while doing +so the next 6 pixels cannot be chosen: they will use the background colour +instead. Finally, a special bit may be activated to display the current group +of pixels in reverse video.

+ +

Downloads

+ +

No real downloads are available yet. However, the file img2oric.c may be compiled on Linux to obtain an +almost functional, yet extremely slow (around 2 minutes to process an image on +a modern computer) program.

+ +

Usage

+ +

img2oric will output to output.bmp, an image file +containing the new version, and to OUTPUT.TAP which contains the +Oric-format file.

+ +

You can download a sample OUTPUT.TAP +file as generated by img2oric. To load it into an Oric +computer, or an emulator such as xeuphoric, just type +HIRES:CLOAD"OUTPUT" and it will be immediately displayed:

+ +

+ +
+ photography courtesy of André Chéramy +

+ +

Screenshots

+ +

These images show how img2oric performs. The results may not seem +terribly clean, but they are probably better than anything that has been seen +so far on an Oric computer.

+ +

These first 4 images show the results on the same images than the ones +on Dbug’s PictConv website, to illustrate the improvements over the +traditional RGB separation technique.

+ +

+ + +

+ +

+ + +

+ +

+ + +

+ +

+ + +

+ +

The following images show img2oric’s results with grayscale +images and cartoon images.

+ +

+ + +

+ +

+ + +

+ +

The following images use real Oric artwork, taken from the Buggy Boy +and the VIP 4 demos: they are almost pixel-perfect.

+ +

+ + +

+ +

+ + +

+ +

And finally, this is an animation whose frames were converted to Oric +colours using img2oric:

+ +

+ + +

+ +

Credits

+ +

img2oric was written by Sam Hocevar. Thanks to Jean-Yves +Lamoureux, Mickaël Pointier, Robert Chéramy, André Chéramy and Fabrice +Frances for their help, their work and the information they provided.

+ + + + + diff --git a/static/img2oric/lena.png b/static/img2oric/lena.png new file mode 100644 index 0000000..b94a5e6 Binary files /dev/null and b/static/img2oric/lena.png differ diff --git a/static/img2oric/mire.png b/static/img2oric/mire.png new file mode 100644 index 0000000..a98cc24 Binary files /dev/null and b/static/img2oric/mire.png differ diff --git a/static/img2oric/oric.png b/static/img2oric/oric.png new file mode 100644 index 0000000..143b519 Binary files /dev/null and b/static/img2oric/oric.png differ diff --git a/static/img2oric/output-bb.png b/static/img2oric/output-bb.png new file mode 100644 index 0000000..e4d5cd8 Binary files /dev/null and b/static/img2oric/output-bb.png differ diff --git a/static/img2oric/output-bear.gif b/static/img2oric/output-bear.gif new file mode 100644 index 0000000..9dbf893 Binary files /dev/null and b/static/img2oric/output-bear.gif differ diff --git a/static/img2oric/output-bufbw.png b/static/img2oric/output-bufbw.png new file mode 100644 index 0000000..75342e4 Binary files /dev/null and b/static/img2oric/output-bufbw.png differ diff --git a/static/img2oric/output-buffy.png b/static/img2oric/output-buffy.png new file mode 100644 index 0000000..f10b089 Binary files /dev/null and b/static/img2oric/output-buffy.png differ diff --git a/static/img2oric/output-dog.png b/static/img2oric/output-dog.png new file mode 100644 index 0000000..288c46c Binary files /dev/null and b/static/img2oric/output-dog.png differ diff --git a/static/img2oric/output-eatme.png b/static/img2oric/output-eatme.png new file mode 100644 index 0000000..c15cdda Binary files /dev/null and b/static/img2oric/output-eatme.png differ diff --git a/static/img2oric/output-homer.png b/static/img2oric/output-homer.png new file mode 100644 index 0000000..8001b1e Binary files /dev/null and b/static/img2oric/output-homer.png differ diff --git a/static/img2oric/output-lena.png b/static/img2oric/output-lena.png new file mode 100644 index 0000000..62920d4 Binary files /dev/null and b/static/img2oric/output-lena.png differ diff --git a/static/img2oric/output-mire.png b/static/img2oric/output-mire.png new file mode 100644 index 0000000..931d7b3 Binary files /dev/null and b/static/img2oric/output-mire.png differ diff --git a/static/img2oric/real-oric.jpeg b/static/img2oric/real-oric.jpeg new file mode 100644 index 0000000..b2789e2 Binary files /dev/null and b/static/img2oric/real-oric.jpeg differ diff --git a/static/img2oric/rotate-bb.png b/static/img2oric/rotate-bb.png new file mode 100644 index 0000000..98dadee Binary files /dev/null and b/static/img2oric/rotate-bb.png differ diff --git a/static/img2oric/xeuphoric.png b/static/img2oric/xeuphoric.png new file mode 100644 index 0000000..968eda8 Binary files /dev/null and b/static/img2oric/xeuphoric.png differ diff --git a/static/index.html b/static/index.html new file mode 100644 index 0000000..99bd208 --- /dev/null +++ b/static/index.html @@ -0,0 +1,376 @@ + + + + + + + + + + + + libcaca - Colour AsCii Art library + + + + + + + + + +libcaca logo + +

Introduction

+ +

libcaca is a graphics library that outputs text instead of pixels, +so that it can work on older video cards or text terminals. It is not unlike +the famous AAlib +library, with the following improvements:

+ +
    +
  • Unicode support
  • +
  • 2048 available colours (some devices can only handle 16)
  • +
  • dithering of colour images
  • +
  • advanced text canvas operations (blitting, rotations)
  • +
+ +

Libcaca works in a text terminal (and should thus work on all Unix +systems including Mac OS X) using the S-Lang or ncurses libraries. It also +works natively on DOS and Windows.

+ +

Libcaca was written by Sam Hocevar <sam@zoy.org> and Jean-Yves Lamoureux +<jylam@lnxscene.org>. It is +free software, +and can be used, modified and distributed under the terms of the Do What The Fuck You Want To Public +License.

+ +

+ libcaca Ohloh metrics + toilet Ohloh metrics +

+ +

News

+ + + +libcaca rendering sample + +

Screenshots

+ +

Here are a few libcaca screenshots.

+ + + + + + + + + + + + + + + + +
+ cacaview +
cacaview +
+ cacaball +
cacaball +
+ cacaplas +
cacaplas +
+ truecolor +
TrueColor +
+
+ unicode +
Unicode +
+ swallow +
swallowing applications +
+ rotation +
canvas rotation +
+ +
+ +

See also the various export formats, generated from an old + ANSI file: + PNG (through TGA), + HTML, + SVG, + PostScript. +

+ + + +

Why?

+ +

+Que dites-vous ?... C’est inutile ?... Je le sais ! +
Mais on ne se bat pas dans l’espoir du succès ! +
Non ! non, c’est bien plus beau lorsque c’est inutile ! +
-- Edmond Rostand, Cyrano de Bergerac +

+ +

I am perfectly aware that libcaca is the waste of time it looks to +be. No need to tell me about that. I urge you to read Théophile Gautier’s +preface to Mademoiselle de Maupin, which also gives an excellent +explanation for the name “libcaca”:

+ +

+Il n’y a rien de vraiment beau que ce qui ne peut servir à rien ; tout ce +qui est utile est laid ; car c’est l’expression de quelque besoin ; et ceux +de l’homme sont ignobles et dégoûtants, comme sa pauvre et infirme nature. - +L’endroit le plus utile d’une maison, ce sont les latrines. +

+ +

As for the name “libcucul”, please refer to the pioneer of modernist +Polish fiction:

+ +

+Mais contre le cucul, il n’y a pas de refuge. Courez après moi +si vous voulez, je m’enfuis la gueule entre les mains. Et voilà, +tralala, Zut à celui qui le lira ! +
-- Witold Gombrowicz, Ferdydurke +

+ + + + + diff --git a/static/lc-mw1.ans b/static/lc-mw1.ans new file mode 100644 index 0000000..ed7b08a --- /dev/null +++ b/static/lc-mw1.ans @@ -0,0 +1,38 @@ + + +   +      + +  +    +      +      +    +         +    +     +    +    +      +       +   +  +  +   +  +        +         +         + + +M O R T A L W i S H + +PiL HQ  Syndrome Couriers HQ  GODS WHQ +16.8 Duals  8i8.XxX.XxXx  8 Node Ringdown +S: QUAZiMODEM & CiPHER +CO'S: LORD THiNKER THE MOZARELLO +SLiCE & DiCE  HURRiCAN  RAZOR BLADE + +ANSi BY LUC < AiM 'NiNE FO' > + + diff --git a/static/list-svn.html b/static/list-svn.html new file mode 100644 index 0000000..b3791f7 --- /dev/null +++ b/static/list-svn.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + libcaca SVN mailing-list + + + + + + + + + + +", "", $data); + $data = eregi_replace(".*", "", $data); + + echo $data; + } + else + { + ?>

Mailing-list error.

+ + + + + diff --git a/static/list-trac.html b/static/list-trac.html new file mode 100644 index 0000000..2dc929c --- /dev/null +++ b/static/list-trac.html @@ -0,0 +1,50 @@ + + + + + + + + + + + + libcaca Trac mailing-list + + + + + + + + + + +", "", $data); + $data = eregi_replace(".*", "", $data); + + echo $data; + } + else + { + ?>

Mailing-list error.

+ + + + + diff --git a/static/list.html b/static/list.html new file mode 100644 index 0000000..7a37c8f --- /dev/null +++ b/static/list.html @@ -0,0 +1,58 @@ + + + + + + + + + + + + libcaca mailing-list + + + + + + + + + + +", "", $data); + $data = eregi_replace(".*", "", $data); + + echo $data; + } + else + { +?> +

There are three libcaca mailing-lists:

+ + + + + + + + diff --git a/static/logo-caca.png b/static/logo-caca.png new file mode 100644 index 0000000..859e27a Binary files /dev/null and b/static/logo-caca.png differ diff --git a/static/main.css b/static/main.css new file mode 100644 index 0000000..620cd1e --- /dev/null +++ b/static/main.css @@ -0,0 +1,185 @@ +/* + * CSS for libcaca + * $Id$ + */ + +/* Common attributes */ + +html, body { + padding: 0; + border: 0; + margin: 0; + height: 100%; +} + +body { + color: black; + background: url('/browser/www/img/back3.png?format=raw') repeat left top; + background-color: black; +} + +body, td, h1, h2, h3, p { + font-family: serif; +} + +h1 { + font-size: 1.6em; + font-variant: small-caps; + color: #002200; + background-color: inherit; +} + +h2, h3 { + text-indent: 0.5em; + border-style: solid; + border-color: #88aa77; + background-color: inherit; +} + +h2 { + font-size: 1.3em; + font-variant: small-caps; + color: #224422; + border-width: 0 0 2px 0; +} + +h3 { + font-size: 1.1em; + color: #335533; + border-width: 0 0 1px 0; +} + +p { + text-indent: 1em; + text-align: inherit; +} + +/* Layout-specific attributes */ + +div.gradleft { + /* no longer used */ +} + +div.gradright { + /* no longer used */ +} + +div.top, div.main, div.bottom { + width: 800px; + display: table-caption; + color: inherit; + background-color: #dddddd; + background: url('/browser/www/img/back4.png?format=raw') repeat left top; + padding: 0 10px 0 10px; + border-style: solid; + border-width: 2px 2px 0 2px; + border-color: black; + margin: 0 auto 0 auto; + text-align: justify; +} + +div.top { + border-width: 2px; + margin-top: 10px; +} + +div.main { + padding: 5px 10px 5px 10px; + height: 100%; +} + +div.bottom { + clear: both; + position: relative; + border-width: 0 2px 2px 2px; + margin-bottom: 5px; +} + +div.bottombar { + font-family: monospace; + font-weight: bold; + font-size: smaller; + padding: 0; + border-style: solid; + border-width: 2px 0 0 0; + border-color: #88aa77; +} + +img.caca { + border: solid 2px #88aa77; + margin: 10px 20px 10px 20px; + float: right; +} + +img.inline, img.inlinetop { + border: solid 2px #88aa77; + padding: 2px; +} + +img.inlinetop { + vertical-align: top; +} + +img.math { + vertical-align: middle; + margin-left: 10px; + margin-right: 10px; +} + +img.matrix { + vertical-align: top; + margin-right: 30px; + margin-top: 10px; +} + +div.toilet { + border: solid 2px #88aa77; + padding-left: 10px; + padding-right: 10px; +} + +p.toilet { + text-indent: 0; +} + +p.dashit { + float: right; + text-align: right; + font-size: smaller; + font-style: italic; +} + +a:link { color: #33aa55; background-color: inherit; } +a:visited { color: #117722; background-color: inherit; } +a:hover { color: #aa22dd; background-color: inherit; text-decoration: none; } +a:active { color: #cc22ff; background-color: inherit; } + +/* Top menubar handling */ + +div.menubar { + text-align: center; + color: inherit; + padding: 8px 0px; +} + +a.menubutton { + color: black; + background: url('/browser/www/img/back4.png?format=raw') repeat left top; + background-color: #dddddd; + text-decoration: none; + font-weight: bold; + border: solid black 2px; + padding: 4px 10px 4px 10px; + margin: 0 5px 0 5px; +} + +a.menubutton:link { + color: black; +} + +a.menubutton:hover { + color: #ffffff; + border-color: #ffffff; + background: inherit; +} + diff --git a/static/manual.html b/static/manual.html new file mode 100644 index 0000000..34258f2 --- /dev/null +++ b/static/manual.html @@ -0,0 +1,54 @@ + + + + + + + + + + + + libcaca manual + + + + + + + + + + + + +", "", $data); + $data = eregi_replace(".*", "", $data); + + echo $data; + } + else + { + ?>

Documentation error.

+ + + + + diff --git a/static/neercs-thumbnails.png b/static/neercs-thumbnails.png new file mode 100644 index 0000000..a8f0f8a Binary files /dev/null and b/static/neercs-thumbnails.png differ diff --git a/static/neercs.html b/static/neercs.html new file mode 100644 index 0000000..14b570c --- /dev/null +++ b/static/neercs.html @@ -0,0 +1,36 @@ + + + + + + + + + + + + libcaca - neercs + + + + + + + + + +

neercs

+ +

neercs is a work-in-progress libcaca project. More later.

+ +

Screenshots

+ +

neercs sample

+ + + + + diff --git a/static/robots.txt b/static/robots.txt new file mode 100644 index 0000000..9a846d4 --- /dev/null +++ b/static/robots.txt @@ -0,0 +1,34 @@ +# $Id$ + +# Do not crawl CVS and .svn directories (they are 403 Forbidden anyway) +User-agent: * +Disallow: CVS +Disallow: .svn + +# Prevent excessive search engine hits +Disallow: /cgi-bin/trac.cgi +Disallow: /log + +# "This robot collects content from the Internet for the sole purpose of +# helping educational institutions prevent plagiarism. [...] we compare +# student papers against the content we find on the Internet to see if we +# can find similarities." (http://www.turnitin.com/robot/crawlerinfo.html) +# --> fuck off. +User-Agent: TurnitinBot +Disallow: / + +# "NameProtect engages in crawling activity in search of a wide range of +# brand and other intellectual property violations that may be of interest +# to our clients." (http://www.nameprotect.com/botinfo.html) +# --> fuck off. +User-Agent: NPBot +Disallow: / + +# "iThenticate® is a new service we have developed to combat the piracy +# of intellectual property and ensure the originality of written work for +# publishers, non-profit agencies, corporations, and newspapers." +# (http://www.slysearch.com/) +# --> fuck off. +User-Agent: SlySearch +Disallow: / + diff --git a/static/study/biblio.html b/static/study/biblio.html new file mode 100644 index 0000000..7948d54 --- /dev/null +++ b/static/study/biblio.html @@ -0,0 +1,157 @@ + + + + + + + + + + + + Libcaca study - Bibliography + + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

Bibliography

+ +
    + +
  • [1] Victor Ostromoukhov. A Simple and Efficient Error-Diffusion + Algorithm. In Proceedings of SIGGRAPH 2001, in ACM Computer Graphics, + Annual Conference Series, pp. 567–572, 2001
  • + +
  • [2] Jamie Hutchinson. Culture, Communication, and an Information Age + Madonna. IEEE Professional Communication Society Newsletter, Volume 45, + Number 3, pp. 1, 5–7, 2001
  • + +
  • [3] V. Ostromoukhov, Reproduction couleur par trames irrégulières + et semi-régulières, Ph.D. Thesis No.1330, EPFL, Lausanne, Switzerland, + 1995
  • + +
  • [4] J. Allebach and Q. Lin, FM screen design using DBS algorithm, + in Proc. IEEE International Conference on Image Processing (ICIP ’96), vol. + 1, pp. 549–552, Lausanne, Switzerland, September 1996
  • + +
  • [5] R.W. Floyd, L. Steinberg, An adaptive algorithm for spatial grey + scale. Proceedings of the Society of Information Display 17, 75–77 + (1976)
  • + +
  • [6] P. Stucki, MECCA - a multiple error correcting computation + algorithm for bi-level image hard copy reproduction. Research report + RZ1060, IBM Research Laboratory, Zurich, Switzerland, 1981
  • + +
  • [7] J. F. Jarvis, C. N. Judice and W. H. Ninke, A Survey of + Techniques for the Display of Continuous Tone Pictures on Bi-level + Displays. Computer Graphics and Image Processing, 5 13–40, 1976
  • + +
  • [8] J. Shiau and Z. Fan, Method for Quantization Gray Level Pixel + Data with Extended Distribution Set, U.S. patent 5,353,127, 1994
  • + +
  • [9] R. Silvers. Digital composition of a mosaic image, U.S. + patent 6,137,498, Oct. 2000
  • + +
  • [10] Daniel Burkes, Presentation of the Burkes error filter for use + in preparing continuous-tone images for presentation on bi-level devices, + in LIB 15 (Publications), CIS Graphics Support Forum, September 15, 1988 + (unpublished)
  • + +
  • [11] Frankie Sierra, in LIB 17 (Developer’s Den), CIS Graphics Support + Forum (unpublished)
  • + +
  • [12] Bill Atkinson, private correspondence with John Balestrieri, + January 2003 (unpublished)
  • + +
  • [13] Robert Ulichney, Digital Halftoning, The MIT Press, + Cambridge, Mass. (1987)
  • + +
  • [14] D.E. Knuth, Digital Halftones by Dot Diffusion, ACM + Transcripts on Graphics, 6(4), 1987, 245-273
  • + +
  • [15] T.C. Chan, K.S. Chen (Apple Computer, Inc.), Method and system + for halftoning by tiling subsets of a threshold array over portions of an + image, U.S. patent 5,761,347, 1998
  • + +
  • [16] Éric Brasseur, Gamma error in picture scaling, World Wide + Web, http://www.4p8.com/eric.brasseur/gamma.html, August 2007 +
  • + +
  • [17] B. Bayer, Color imaging array, in U.S. patent 3,971,065, + 1976
  • + +
  • [18] R.A. Ulichney (Digital Equipment Corporation), Void and cluster + apparatus and method for generating dither templates, in U.S. patent + 5,535,020, 1992
  • + +
  • [19] H. Ancin, A. Bhattacharjya and J. Shu (Seiko Epson Corporation), + Void-and-cluster dither-matrix generation for better half-tone + uniformity, in U.S. patent 6,088,512, 1997
  • + +
  • [20] J.S. Arney, P.G. Anderson, S. Ganawan, Error Diffusion and + Edge Enhancement: Raster Versus Omni-Directional Processing, Western NY + Conference on Image Processing, Rochester, NY, September 9, 2001
  • + +
  • [21] Robert Ulichney, Spatial Extent of Void and Cluster Finding + Filters, IS&T’s 11th International Congress on Non-Impact Printing + Technologies, Oct. 29-Nov 3, 1995
  • + +
  • [22] Alejo Hausner, Graph-order dithering, proceedings of SPIE -- + Volume 6058 Color Imaging XI, 1996
  • + +
  • [23] N. Damera-Venkata, B.L. Evans, FM halftoning via block error + diffusion, proceedings of the 2001 International Conference on Image + Processing, 2001
  • + +
  • [24] R.V. Klassen, R. Eschbach, and K. Bharat, Vector diffusion + in a distorted colour space, proceedings of IS&T’s 47th Annual + Conference, 1994, pp. 489–491
  • + +
  • [25] D. Shaked, N. Arad, A. Fitzhugh, and I. Sobel, Ink relocation + for color halftones, proceedings of IS&T Image Processing, Image + Quality, Image Capture Systems Conference, Portland, OR, 1998, pp. 340–343 +
  • + +
  • [26] T. Riemersma, A Balanced Dither Algorithm, C/C++ Users + Journal, volume 16, issue 12, December 1998
  • + +
+ + + + + + + + + diff --git a/static/study/fig1-2-1.png b/static/study/fig1-2-1.png new file mode 100644 index 0000000..26ba35c Binary files /dev/null and b/static/study/fig1-2-1.png differ diff --git a/static/study/fig1-2-1.svg b/static/study/fig1-2-1.svg new file mode 100644 index 0000000..86b29a9 --- /dev/null +++ b/static/study/fig1-2-1.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + mean error: 0.139max error: 0.333 + + diff --git a/static/study/fig1-2-2.png b/static/study/fig1-2-2.png new file mode 100644 index 0000000..7c730e0 Binary files /dev/null and b/static/study/fig1-2-2.png differ diff --git a/static/study/fig1-2-2.svg b/static/study/fig1-2-2.svg new file mode 100644 index 0000000..0a0857f --- /dev/null +++ b/static/study/fig1-2-2.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + mean error: 0.075max error: 0.2 + + diff --git a/static/study/fig1-2-3.png b/static/study/fig1-2-3.png new file mode 100644 index 0000000..61c7ad9 Binary files /dev/null and b/static/study/fig1-2-3.png differ diff --git a/static/study/fig1-2-3.svg b/static/study/fig1-2-3.svg new file mode 100644 index 0000000..6afbb46 --- /dev/null +++ b/static/study/fig1-2-3.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + mean error: 0.125max error: 0.25 + + diff --git a/static/study/fig1-2-4.png b/static/study/fig1-2-4.png new file mode 100644 index 0000000..077ec49 Binary files /dev/null and b/static/study/fig1-2-4.png differ diff --git a/static/study/fig1-2-4.svg b/static/study/fig1-2-4.svg new file mode 100644 index 0000000..edfaafb --- /dev/null +++ b/static/study/fig1-2-4.svg @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + mean error: 0.0625max error: 0.125 + + diff --git a/static/study/fig2-3-1.png b/static/study/fig2-3-1.png new file mode 100644 index 0000000..87ab487 Binary files /dev/null and b/static/study/fig2-3-1.png differ diff --git a/static/study/fig2-3-1.svg b/static/study/fig2-3-1.svg new file mode 100644 index 0000000..8efa01a --- /dev/null +++ b/static/study/fig2-3-1.svg @@ -0,0 +1,120 @@ + + + + + + + + + image/svg+xml + + + + + + + + 0.2 + 0.6 + 0.8 + 0.4 + + diff --git a/static/study/fig2-3-1b.png b/static/study/fig2-3-1b.png new file mode 100644 index 0000000..c6efcba Binary files /dev/null and b/static/study/fig2-3-1b.png differ diff --git a/static/study/fig2-3-1b.svg b/static/study/fig2-3-1b.svg new file mode 100644 index 0000000..1b5bd83 --- /dev/null +++ b/static/study/fig2-3-1b.svg @@ -0,0 +1,360 @@ + + + + + + + + + image/svg+xml + + + + + + + + + 0.2 + 0.6 + 0.8 + 0.4 + + + + 0.2 + 0.6 + 0.8 + 0.4 + 0.2 + 0.6 + 0.8 + 0.2 + 0.6 + 0.8 + 0.4 + 0.2 + ... + 0.2 + 0.6 + + 0.8 + 0.4 + ... + ... + ... + + diff --git a/static/study/fig2-3-1c.png b/static/study/fig2-3-1c.png new file mode 100644 index 0000000..bc02eeb Binary files /dev/null and b/static/study/fig2-3-1c.png differ diff --git a/static/study/fig2-3-1c.svg b/static/study/fig2-3-1c.svg new file mode 100644 index 0000000..73f7cf7 --- /dev/null +++ b/static/study/fig2-3-1c.svg @@ -0,0 +1,177 @@ + + + + + + + + + image/svg+xml + + + + + + + + 0 + 3 + 1 + 2 + M = + di,j = + 1+Mi,j + 1+m×n + + + diff --git a/static/study/fig2-3-5.png b/static/study/fig2-3-5.png new file mode 100644 index 0000000..b1f4566 Binary files /dev/null and b/static/study/fig2-3-5.png differ diff --git a/static/study/fig2-3-5.svg b/static/study/fig2-3-5.svg new file mode 100644 index 0000000..29dfedf --- /dev/null +++ b/static/study/fig2-3-5.svg @@ -0,0 +1,200 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig2-4-1.png b/static/study/fig2-4-1.png new file mode 100644 index 0000000..802b4c1 Binary files /dev/null and b/static/study/fig2-4-1.png differ diff --git a/static/study/fig2-4-1.svg b/static/study/fig2-4-1.svg new file mode 100644 index 0000000..80aedc2 --- /dev/null +++ b/static/study/fig2-4-1.svg @@ -0,0 +1,810 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + 1 + 4 + 7 + 6 + 0 + 2 + 3 + 8 + 5 + + + + + + + + + + + + + + + + + + 4 + 6 + 3 + 8 + 1 + 5 + 0 + 3 + 7 + + + 5 + 0 + 3 + 2 + 8 + 6 + 7 + 4 + 1 + + + 8 + 2 + 5 + 6 + 4 + 0 + 1 + 7 + 3 + + + 2 + 5 + 8 + 0 + 7 + 3 + 4 + 1 + 6 + + + 7 + 4 + 1 + 3 + 6 + 8 + 2 + 0 + 5 + + + diff --git a/static/study/fig2-5-1.png b/static/study/fig2-5-1.png new file mode 100644 index 0000000..754a304 Binary files /dev/null and b/static/study/fig2-5-1.png differ diff --git a/static/study/fig2-5-1.svg b/static/study/fig2-5-1.svg new file mode 100644 index 0000000..5d463e1 --- /dev/null +++ b/static/study/fig2-5-1.svg @@ -0,0 +1,168 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + 2 + 4 + 3 + 0 + 1 + + + + + + diff --git a/static/study/fig2-5-2.png b/static/study/fig2-5-2.png new file mode 100644 index 0000000..c568579 Binary files /dev/null and b/static/study/fig2-5-2.png differ diff --git a/static/study/fig2-5-2.svg b/static/study/fig2-5-2.svg new file mode 100644 index 0000000..727fd1b --- /dev/null +++ b/static/study/fig2-5-2.svg @@ -0,0 +1,206 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + 7 + 4 + 6 + 0 + 5 + + + 1 + 2 + 3 + + + + + diff --git a/static/study/fig2-5-3.png b/static/study/fig2-5-3.png new file mode 100644 index 0000000..7ff7c24 Binary files /dev/null and b/static/study/fig2-5-3.png differ diff --git a/static/study/fig2-5-3.svg b/static/study/fig2-5-3.svg new file mode 100644 index 0000000..3534a6e --- /dev/null +++ b/static/study/fig2-5-3.svg @@ -0,0 +1,212 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + 4 + 2 + 3 + 0 + 1 + 9 + 6 + 5 + + 7 + 8 + + + + + diff --git a/static/study/fig2-5-4.png b/static/study/fig2-5-4.png new file mode 100644 index 0000000..2acfe23 Binary files /dev/null and b/static/study/fig2-5-4.png differ diff --git a/static/study/fig2-5-4.svg b/static/study/fig2-5-4.svg new file mode 100644 index 0000000..9e4de16 --- /dev/null +++ b/static/study/fig2-5-4.svg @@ -0,0 +1,261 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + 4 + 2 + 3 + 0 + 1 + 9 + 6 + 5 + + 7 + 8 + + + + + + diff --git a/static/study/fig2-6-1.png b/static/study/fig2-6-1.png new file mode 100644 index 0000000..aefe003 Binary files /dev/null and b/static/study/fig2-6-1.png differ diff --git a/static/study/fig2-6-1.svg b/static/study/fig2-6-1.svg new file mode 100644 index 0000000..a032fab --- /dev/null +++ b/static/study/fig2-6-1.svg @@ -0,0 +1,326 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + 8 + 16 + 12 + 0 + 4 + + + 9 + 17 + 13 + 1 + 5 + 11 + 19 + 15 + 3 + 7 + 10 + 18 + 14 + 2 + 6 + + + diff --git a/static/study/fig2-6-2.png b/static/study/fig2-6-2.png new file mode 100644 index 0000000..b061413 Binary files /dev/null and b/static/study/fig2-6-2.png differ diff --git a/static/study/fig2-6-2.svg b/static/study/fig2-6-2.svg new file mode 100644 index 0000000..a36123a --- /dev/null +++ b/static/study/fig2-6-2.svg @@ -0,0 +1,370 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + 21 + 12 + 18 + 0 + 15 + 3 + 6 + 9 + + + + 23 + 14 + 20 + 2 + 17 + 5 + 8 + 11 + 22 + 13 + 19 + 1 + 16 + 4 + 7 + 10 + + + + diff --git a/static/study/fig2-6-3.png b/static/study/fig2-6-3.png new file mode 100644 index 0000000..b97ad17 Binary files /dev/null and b/static/study/fig2-6-3.png differ diff --git a/static/study/fig2-6-3.svg b/static/study/fig2-6-3.svg new file mode 100644 index 0000000..01864ef --- /dev/null +++ b/static/study/fig2-6-3.svg @@ -0,0 +1,574 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + 18 + 10 + 14 + 2 + 6 + 38 + 26 + 22 + 30 + 34 + + + + + 16 + 9 + 13 + 1 + 5 + 37 + 25 + 21 + 29 + 33 + 16 + 8 + 12 + 0 + 4 + 36 + 24 + 20 + 28 + 32 + 17 + 11 + 15 + 3 + 7 + 39 + 27 + 23 + 31 + 35 + + + + + + + diff --git a/static/study/fig2-6-5.png b/static/study/fig2-6-5.png new file mode 100644 index 0000000..c343d73 Binary files /dev/null and b/static/study/fig2-6-5.png differ diff --git a/static/study/fig2-6-5.svg b/static/study/fig2-6-5.svg new file mode 100644 index 0000000..45e197a --- /dev/null +++ b/static/study/fig2-6-5.svg @@ -0,0 +1,439 @@ + + + + + + + + + image/svg+xml + + + + + + + + + 6 + + + + + 24 + 18 + 21 + 9 + 3 + 0 + 15 + 12 + 27 + 8 + 26 + 20 + 23 + 11 + 5 + 2 + 17 + 14 + 29 + 7 + 25 + 19 + 22 + 10 + 4 + 1 + 16 + 13 + 28 + + + + + diff --git a/static/study/fig2-6-6.png b/static/study/fig2-6-6.png new file mode 100644 index 0000000..042dbb6 Binary files /dev/null and b/static/study/fig2-6-6.png differ diff --git a/static/study/fig2-6-6.svg b/static/study/fig2-6-6.svg new file mode 100644 index 0000000..07bc787 --- /dev/null +++ b/static/study/fig2-6-6.svg @@ -0,0 +1,1095 @@ + + + + + + + + + image/svg+xml + + + + + + + + + 18 + 72 + 54 + 63 + 27 + 9 + 0 + 45 + 36 + 81 + 24 + 78 + 60 + 69 + 33 + 15 + 6 + 51 + 42 + 87 + 21 + 75 + 57 + 66 + 30 + 12 + 3 + 48 + 39 + 84 + + 20 + 74 + 56 + 65 + 29 + 11 + 2 + 47 + 38 + 83 + 26 + 80 + 62 + 71 + 35 + 17 + 8 + 53 + 44 + 89 + 23 + 77 + 59 + 68 + 32 + 14 + 5 + 50 + 41 + 86 + + 19 + 73 + 55 + 64 + 28 + 10 + 1 + 46 + 37 + 82 + 25 + 79 + 61 + 70 + 34 + 16 + 7 + 52 + 43 + 88 + 22 + 76 + 58 + 67 + 31 + 13 + 4 + 49 + 40 + 85 + + + + + + diff --git a/static/study/fig3-2-9.png b/static/study/fig3-2-9.png new file mode 100644 index 0000000..4be3b3a Binary files /dev/null and b/static/study/fig3-2-9.png differ diff --git a/static/study/fig3-2-9.svg b/static/study/fig3-2-9.svg new file mode 100644 index 0000000..68d415d --- /dev/null +++ b/static/study/fig3-2-9.svg @@ -0,0 +1,406 @@ + + + + + + + + + image/svg+xml + + + + + + + + + x + 0 + + 32200 + + 30200 + + 26200 + + 12200 + + 5200 + + 12200 + + 12200 + + 26200 + + 12200 + + 12200 + + 5200 + + 16200 + + + + + + + + + + + + + + + diff --git a/static/study/fig3-3-1.png b/static/study/fig3-3-1.png new file mode 100644 index 0000000..a9e85b2 Binary files /dev/null and b/static/study/fig3-3-1.png differ diff --git a/static/study/fig3-3-1.svg b/static/study/fig3-3-1.svg new file mode 100644 index 0000000..3fc7da8 --- /dev/null +++ b/static/study/fig3-3-1.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-3-2.png b/static/study/fig3-3-2.png new file mode 100644 index 0000000..e4b6697 Binary files /dev/null and b/static/study/fig3-3-2.png differ diff --git a/static/study/fig3-3-2.svg b/static/study/fig3-3-2.svg new file mode 100644 index 0000000..8992787 --- /dev/null +++ b/static/study/fig3-3-2.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-3-3.png b/static/study/fig3-3-3.png new file mode 100644 index 0000000..8e17260 Binary files /dev/null and b/static/study/fig3-3-3.png differ diff --git a/static/study/fig3-3-3.svg b/static/study/fig3-3-3.svg new file mode 100644 index 0000000..c54d136 --- /dev/null +++ b/static/study/fig3-3-3.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-3-4.png b/static/study/fig3-3-4.png new file mode 100644 index 0000000..4cf8bf7 Binary files /dev/null and b/static/study/fig3-3-4.png differ diff --git a/static/study/fig3-3-4.svg b/static/study/fig3-3-4.svg new file mode 100644 index 0000000..4d609de --- /dev/null +++ b/static/study/fig3-3-4.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-3-7.png b/static/study/fig3-3-7.png new file mode 100644 index 0000000..626ffbb Binary files /dev/null and b/static/study/fig3-3-7.png differ diff --git a/static/study/fig3-3-7.svg b/static/study/fig3-3-7.svg new file mode 100644 index 0000000..1361b16 --- /dev/null +++ b/static/study/fig3-3-7.svg @@ -0,0 +1,958 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + 43 + 35 + 54 + 46 + 40 + + + + + + + 22 + 14 + 6 + 5 + 2 + 0 + 8 + 16 + 60 + 62 + 56 + 59 + 28 + 32 + 25 + 36 + 34 + 30 + 42 + 10 + 50 + 18 + 39 + 26 + 12 + 44 + 20 + 52 + 9 + 17 + 41 + 49 + 57 + 58 + 61 + 63 + 55 + 47 + 3 + 1 + 7 + 4 + 15 + 31 + 23 + 27 + 33 + 53 + 45 + 37 + 19 + 11 + 38 + 29 + 21 + 13 + 24 + 51 + 48 + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-5-1.png b/static/study/fig3-5-1.png new file mode 100644 index 0000000..23c5b37 Binary files /dev/null and b/static/study/fig3-5-1.png differ diff --git a/static/study/fig3-5-1.svg b/static/study/fig3-5-1.svg new file mode 100644 index 0000000..c1277a1 --- /dev/null +++ b/static/study/fig3-5-1.svg @@ -0,0 +1,160 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-5-3.png b/static/study/fig3-5-3.png new file mode 100644 index 0000000..301f870 Binary files /dev/null and b/static/study/fig3-5-3.png differ diff --git a/static/study/fig3-5-3.svg b/static/study/fig3-5-3.svg new file mode 100644 index 0000000..b68d219 --- /dev/null +++ b/static/study/fig3-5-3.svg @@ -0,0 +1,250 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig3-5-4.png b/static/study/fig3-5-4.png new file mode 100644 index 0000000..d697ef5 Binary files /dev/null and b/static/study/fig3-5-4.png differ diff --git a/static/study/fig3-5-4.svg b/static/study/fig3-5-4.svg new file mode 100644 index 0000000..b565232 --- /dev/null +++ b/static/study/fig3-5-4.svg @@ -0,0 +1,376 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig5-1-1.png b/static/study/fig5-1-1.png new file mode 100644 index 0000000..d932d30 Binary files /dev/null and b/static/study/fig5-1-1.png differ diff --git a/static/study/fig5-1-1.svg b/static/study/fig5-1-1.svg new file mode 100644 index 0000000..1eeb829 --- /dev/null +++ b/static/study/fig5-1-1.svg @@ -0,0 +1,456 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + White + Black + + + + + 0 + + + 0.25 + + + 0.5 + + + 0.75 + + + 1 + + + 50% black50% white + + + + + + + 0.73 + + + + + + + + + + + + + greyscale + gradient + γ = 1 + + + + + black + & white + gradient + γ = 2.2 + + + diff --git a/static/study/fig5-1-2.png b/static/study/fig5-1-2.png new file mode 100644 index 0000000..3faa887 Binary files /dev/null and b/static/study/fig5-1-2.png differ diff --git a/static/study/fig5-1-2.svg b/static/study/fig5-1-2.svg new file mode 100644 index 0000000..1df71e3 --- /dev/null +++ b/static/study/fig5-1-2.svg @@ -0,0 +1,519 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + White + Black + + + + + + 0 + + + 0.25 + + + 0.5 + + + 0.75 + + + 1 + + + 50% black50% grey + + + + + + + 0.80 + + + + + + + + + + black + & white + gradient + + 50% grey50% white + + Grey 0.5 + + + + + 0.36 + + + + 3-colour + gradient + + + diff --git a/static/study/fig5-1-3.png b/static/study/fig5-1-3.png new file mode 100644 index 0000000..de6600a Binary files /dev/null and b/static/study/fig5-1-3.png differ diff --git a/static/study/fig5-1-3.svg b/static/study/fig5-1-3.svg new file mode 100644 index 0000000..77a8cd4 --- /dev/null +++ b/static/study/fig5-1-3.svg @@ -0,0 +1,481 @@ + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + White + Black + + + + + 0 + + + 0.25 + + + 0.5 + + + 0.75 + + + 1 + + + 78% black22% grey + + + + + + + + + + + + + + gamma- + corrected + 3-colour + gradient + γ = 1 + + + + 60% grey40% white + Grey 0.5 + + diff --git a/static/study/fig5-3-1.png b/static/study/fig5-3-1.png new file mode 100644 index 0000000..0d50333 Binary files /dev/null and b/static/study/fig5-3-1.png differ diff --git a/static/study/fig5-3-1.svg b/static/study/fig5-3-1.svg new file mode 100644 index 0000000..8e1d6a0 --- /dev/null +++ b/static/study/fig5-3-1.svg @@ -0,0 +1,524 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig6-1-7.png b/static/study/fig6-1-7.png new file mode 100644 index 0000000..936aa6c Binary files /dev/null and b/static/study/fig6-1-7.png differ diff --git a/static/study/fig6-1-7.svg b/static/study/fig6-1-7.svg new file mode 100644 index 0000000..7cdd4d8 --- /dev/null +++ b/static/study/fig6-1-7.svg @@ -0,0 +1,300 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/study/fig7-3-1.png b/static/study/fig7-3-1.png new file mode 100644 index 0000000..95ca072 Binary files /dev/null and b/static/study/fig7-3-1.png differ diff --git a/static/study/fig7-3-1.svg b/static/study/fig7-3-1.svg new file mode 100644 index 0000000..218ac0a --- /dev/null +++ b/static/study/fig7-3-1.svg @@ -0,0 +1,542 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + * + , - . / 0 1 2 3 4 5* + , - . / 0 1 2 3 4 5* + , - . / 0 1 2 3 4 5* + , - . / 0 1 2 3 4 5* + , - . / 0 1 2 3 4 5 + ... + + + diff --git a/static/study/gnuplot.txt b/static/study/gnuplot.txt new file mode 100644 index 0000000..1ff6ba1 --- /dev/null +++ b/static/study/gnuplot.txt @@ -0,0 +1,16 @@ +# Common settings +set size square +set xr [0:1] +set xtics 0.25 +set yr [0:1] +set ytics 0.25 +set key inside left + +# Gamma curve +set term svg +set output "tmp.svg" +plot exp(2.2 * log(x)) < 0.5 ? 0.5 : -2 lw 2 title "", \ + x title "gamma 1.0" lw 4, \ + exp(1.8 * log(x)) title "gamma 1.8" lw 4, \ + exp(2.2 * log(x)) title "gamma 2.2" lw 4 + diff --git a/static/study/gradient256.png b/static/study/gradient256.png new file mode 100644 index 0000000..5018e48 Binary files /dev/null and b/static/study/gradient256.png differ diff --git a/static/study/gradient256bw.png b/static/study/gradient256bw.png new file mode 100644 index 0000000..e167a09 Binary files /dev/null and b/static/study/gradient256bw.png differ diff --git a/static/study/index.html b/static/study/index.html new file mode 100644 index 0000000..632c258 --- /dev/null +++ b/static/study/index.html @@ -0,0 +1,146 @@ + + + + + + + + + + + + Libcaca study: the science behind colour ASCII art + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + +
+ +

Libcaca study: the science behind colour ASCII art

+ +

This document is an attempt at extending the leverage of skilled +resources by uncovering and addressing the challenges the industry faces +today in the area of colour ASCII art generation.

+ +

Seriously, guys. If you think that what libcaca does is easy, you either +don’t know what you are talking about, or we want you in the team.

+ +

Foreword

+ +

Meet Lena. She will guide us through this document, because the +seriousness of a scientific document in the area of computer graphics can +be measured by the number of times Lena appears in it. She truly is the +Mona Lisa of image processing. [2]

+ +

+ Lena (256×256) + colour gradient (64×256) + Lena (256×256BW) + greyscale gradient (32×256) +

+ +

This document makes a lot of assumptions, such as the fact that input +images are made of pixels that have either one (grey level) or three (red, +green and blue) values uniformly spread between 0 and 1 (with regards to +human contrast perception). Real life is more complicated than that, but +that is beyond the scope of this document for now.

+ +

Table of contents

+ +
    +
  • 1. Colour quantisation +
      +
    • 1.1. Black and white thresholding
    • +
    • 1.2. Greyscale thresholding
    • +
    • 1.3. Dynamic thresholding
    • +
    • 1.4. Random dithering
    • +
    +
  • +
  • 2. Halftoning +
      +
    • 2.1. Halftoning patterns
    • +
    • 2.2. Screen artifacts
    • +
    • 2.3. Ordered dithering
    • +
    • 2.4. Random ordered dithering
    • +
    • 2.5. Non-rectangular dither tiles
    • +
    • 2.6. Supercell dithering
    • +
    • 2.7. Void and cluster method
    • +
    +
  • +
  • 3. Error diffusion +
      +
    • 3.1. Floyd-Steinberg and JaJuNi error diffusion
    • +
    • 3.2. Floyd-Steinberg derivatives
    • +
    • 3.3. Changing image parsing direction
    • +
    • 3.4. Variable coefficients error diffusion
    • +
    • 3.5. Block error diffusion
    • +
    • 3.6. Sub-block error diffusion
    • +
    • 3.7. Direct binary search
    • +
    +
  • +
  • 4. Model-based dithering +
      +
    • 4.1. Gaussian human visual system model
    • +
    • 4.2. Direct binary search
    • +
    • 4.3 Comparing dithering algorithms
    • +
    +
  • +
  • 5. Greyscale dithering +
      +
    • 5.1. Introducing gamma
    • +
    • 5.2. Gamma correction
    • +
    • 5.3. Greyscale sub-block error diffusion
    • +
    +
  • +
  • 6. Colour dithering +
      +
    • 6.1. Separate-space dithering
    • +
    • 6.2. Accounting for other dimensions
    • +
    • 6.3. Reducing visual artifacts
    • +
    • 6.4. Colour sub-block error diffusion
    • +
    +
  • +
  • 7. Photographic mosaics +
      +
    • 7.1. Image classification
    • +
    • 7.2. Error diffusion
    • +
    • 7.3. Colour ASCII art
    • +
    +
  • +
  • Bibliography
  • +
  • Source code
  • +
+ + + + + + + + diff --git a/static/study/lena256.png b/static/study/lena256.png new file mode 100644 index 0000000..1197c5b Binary files /dev/null and b/static/study/lena256.png differ diff --git a/static/study/lena256bw.png b/static/study/lena256bw.png new file mode 100644 index 0000000..63b5dec Binary files /dev/null and b/static/study/lena256bw.png differ diff --git a/static/study/lena512.png b/static/study/lena512.png new file mode 100644 index 0000000..af7783a Binary files /dev/null and b/static/study/lena512.png differ diff --git a/static/study/lena512bw.png b/static/study/lena512bw.png new file mode 100644 index 0000000..eaeb613 Binary files /dev/null and b/static/study/lena512bw.png differ diff --git a/static/study/out/fig2-3-2.png b/static/study/out/fig2-3-2.png new file mode 100644 index 0000000..14e6787 Binary files /dev/null and b/static/study/out/fig2-3-2.png differ diff --git a/static/study/out/fig2-3-2b.png b/static/study/out/fig2-3-2b.png new file mode 100644 index 0000000..5976031 Binary files /dev/null and b/static/study/out/fig2-3-2b.png differ diff --git a/static/study/out/fig2-3-3.png b/static/study/out/fig2-3-3.png new file mode 100644 index 0000000..f87fcdf Binary files /dev/null and b/static/study/out/fig2-3-3.png differ diff --git a/static/study/out/fig2-3-3b.png b/static/study/out/fig2-3-3b.png new file mode 100644 index 0000000..102a172 Binary files /dev/null and b/static/study/out/fig2-3-3b.png differ diff --git a/static/study/out/fig2-3-4.png b/static/study/out/fig2-3-4.png new file mode 100644 index 0000000..537ef45 Binary files /dev/null and b/static/study/out/fig2-3-4.png differ diff --git a/static/study/out/fig2-6-4.png b/static/study/out/fig2-6-4.png new file mode 100644 index 0000000..bb7588e Binary files /dev/null and b/static/study/out/fig2-6-4.png differ diff --git a/static/study/out/fig2-7-1.png b/static/study/out/fig2-7-1.png new file mode 100644 index 0000000..59ad4fe Binary files /dev/null and b/static/study/out/fig2-7-1.png differ diff --git a/static/study/out/fig2-7-2.png b/static/study/out/fig2-7-2.png new file mode 100644 index 0000000..717ad81 Binary files /dev/null and b/static/study/out/fig2-7-2.png differ diff --git a/static/study/out/fig3-1-1.png b/static/study/out/fig3-1-1.png new file mode 100644 index 0000000..11655a4 Binary files /dev/null and b/static/study/out/fig3-1-1.png differ diff --git a/static/study/out/fig3-1-3.png b/static/study/out/fig3-1-3.png new file mode 100644 index 0000000..d008a16 Binary files /dev/null and b/static/study/out/fig3-1-3.png differ diff --git a/static/study/out/fig3-2-1.png b/static/study/out/fig3-2-1.png new file mode 100644 index 0000000..0e63a64 Binary files /dev/null and b/static/study/out/fig3-2-1.png differ diff --git a/static/study/out/fig3-2-1b.png b/static/study/out/fig3-2-1b.png new file mode 100644 index 0000000..f8fec8a Binary files /dev/null and b/static/study/out/fig3-2-1b.png differ diff --git a/static/study/out/fig3-2-1c.png b/static/study/out/fig3-2-1c.png new file mode 100644 index 0000000..4a8b064 Binary files /dev/null and b/static/study/out/fig3-2-1c.png differ diff --git a/static/study/out/fig3-2-3.png b/static/study/out/fig3-2-3.png new file mode 100644 index 0000000..1717185 Binary files /dev/null and b/static/study/out/fig3-2-3.png differ diff --git a/static/study/out/fig3-2-4.png b/static/study/out/fig3-2-4.png new file mode 100644 index 0000000..ae5d345 Binary files /dev/null and b/static/study/out/fig3-2-4.png differ diff --git a/static/study/out/fig3-2-5.png b/static/study/out/fig3-2-5.png new file mode 100644 index 0000000..b4f4a34 Binary files /dev/null and b/static/study/out/fig3-2-5.png differ diff --git a/static/study/out/fig3-2-6.png b/static/study/out/fig3-2-6.png new file mode 100644 index 0000000..8eba89e Binary files /dev/null and b/static/study/out/fig3-2-6.png differ diff --git a/static/study/out/fig3-2-7.png b/static/study/out/fig3-2-7.png new file mode 100644 index 0000000..5de7f6d Binary files /dev/null and b/static/study/out/fig3-2-7.png differ diff --git a/static/study/out/fig3-2-8.png b/static/study/out/fig3-2-8.png new file mode 100644 index 0000000..030f482 Binary files /dev/null and b/static/study/out/fig3-2-8.png differ diff --git a/static/study/out/fig3-3-11.png b/static/study/out/fig3-3-11.png new file mode 100644 index 0000000..408f5c8 Binary files /dev/null and b/static/study/out/fig3-3-11.png differ diff --git a/static/study/out/fig3-3-11b.png b/static/study/out/fig3-3-11b.png new file mode 100644 index 0000000..c80c80b Binary files /dev/null and b/static/study/out/fig3-3-11b.png differ diff --git a/static/study/out/fig3-3-7b.png b/static/study/out/fig3-3-7b.png new file mode 100644 index 0000000..8ccf375 Binary files /dev/null and b/static/study/out/fig3-3-7b.png differ diff --git a/static/study/out/fig3-4-1.png b/static/study/out/fig3-4-1.png new file mode 100644 index 0000000..db0c16e Binary files /dev/null and b/static/study/out/fig3-4-1.png differ diff --git a/static/study/out/fig3-5-2.png b/static/study/out/fig3-5-2.png new file mode 100644 index 0000000..1265de7 Binary files /dev/null and b/static/study/out/fig3-5-2.png differ diff --git a/static/study/out/fig3-5-2b.png b/static/study/out/fig3-5-2b.png new file mode 100644 index 0000000..2de2d61 Binary files /dev/null and b/static/study/out/fig3-5-2b.png differ diff --git a/static/study/out/fig3-5-5.png b/static/study/out/fig3-5-5.png new file mode 100644 index 0000000..1e11460 Binary files /dev/null and b/static/study/out/fig3-5-5.png differ diff --git a/static/study/out/fig3-5-5b.png b/static/study/out/fig3-5-5b.png new file mode 100644 index 0000000..9a04497 Binary files /dev/null and b/static/study/out/fig3-5-5b.png differ diff --git a/static/study/out/fig3-6-1a.png b/static/study/out/fig3-6-1a.png new file mode 100644 index 0000000..92b1767 Binary files /dev/null and b/static/study/out/fig3-6-1a.png differ diff --git a/static/study/out/fig3-6-1b.png b/static/study/out/fig3-6-1b.png new file mode 100644 index 0000000..8d9c9fc Binary files /dev/null and b/static/study/out/fig3-6-1b.png differ diff --git a/static/study/out/fig3-6-1c.png b/static/study/out/fig3-6-1c.png new file mode 100644 index 0000000..c07802d Binary files /dev/null and b/static/study/out/fig3-6-1c.png differ diff --git a/static/study/out/fig3-6-1d.png b/static/study/out/fig3-6-1d.png new file mode 100644 index 0000000..c72bcd6 Binary files /dev/null and b/static/study/out/fig3-6-1d.png differ diff --git a/static/study/out/fig3-6-3a.png b/static/study/out/fig3-6-3a.png new file mode 100644 index 0000000..bea4a64 Binary files /dev/null and b/static/study/out/fig3-6-3a.png differ diff --git a/static/study/out/fig3-6-3b.png b/static/study/out/fig3-6-3b.png new file mode 100644 index 0000000..8ea1c23 Binary files /dev/null and b/static/study/out/fig3-6-3b.png differ diff --git a/static/study/out/fig3-6-3c.png b/static/study/out/fig3-6-3c.png new file mode 100644 index 0000000..19f57dc Binary files /dev/null and b/static/study/out/fig3-6-3c.png differ diff --git a/static/study/out/fig3-6-3d.png b/static/study/out/fig3-6-3d.png new file mode 100644 index 0000000..a164439 Binary files /dev/null and b/static/study/out/fig3-6-3d.png differ diff --git a/static/study/out/fig3-6-3e.png b/static/study/out/fig3-6-3e.png new file mode 100644 index 0000000..70742a4 Binary files /dev/null and b/static/study/out/fig3-6-3e.png differ diff --git a/static/study/out/fig3-6-3f.png b/static/study/out/fig3-6-3f.png new file mode 100644 index 0000000..0815056 Binary files /dev/null and b/static/study/out/fig3-6-3f.png differ diff --git a/static/study/out/fig3-6-3g.png b/static/study/out/fig3-6-3g.png new file mode 100644 index 0000000..c149f1f Binary files /dev/null and b/static/study/out/fig3-6-3g.png differ diff --git a/static/study/out/fig3-6-3h.png b/static/study/out/fig3-6-3h.png new file mode 100644 index 0000000..d062628 Binary files /dev/null and b/static/study/out/fig3-6-3h.png differ diff --git a/static/study/out/fig3-6-3i.png b/static/study/out/fig3-6-3i.png new file mode 100644 index 0000000..8ee0433 Binary files /dev/null and b/static/study/out/fig3-6-3i.png differ diff --git a/static/study/out/fig5-1-1.png b/static/study/out/fig5-1-1.png new file mode 100644 index 0000000..bbc60c2 Binary files /dev/null and b/static/study/out/fig5-1-1.png differ diff --git a/static/study/out/fig5-1-2a.png b/static/study/out/fig5-1-2a.png new file mode 100644 index 0000000..255b2f0 Binary files /dev/null and b/static/study/out/fig5-1-2a.png differ diff --git a/static/study/out/fig5-1-2b.png b/static/study/out/fig5-1-2b.png new file mode 100644 index 0000000..1ae1ee0 Binary files /dev/null and b/static/study/out/fig5-1-2b.png differ diff --git a/static/study/out/fig5-1-2c.png b/static/study/out/fig5-1-2c.png new file mode 100644 index 0000000..8667db9 Binary files /dev/null and b/static/study/out/fig5-1-2c.png differ diff --git a/static/study/out/fig5-1-3a.png b/static/study/out/fig5-1-3a.png new file mode 100644 index 0000000..1e92f92 Binary files /dev/null and b/static/study/out/fig5-1-3a.png differ diff --git a/static/study/out/fig5-1-3b.png b/static/study/out/fig5-1-3b.png new file mode 100644 index 0000000..39ae7e2 Binary files /dev/null and b/static/study/out/fig5-1-3b.png differ diff --git a/static/study/out/fig5-1-3c.png b/static/study/out/fig5-1-3c.png new file mode 100644 index 0000000..66b575c Binary files /dev/null and b/static/study/out/fig5-1-3c.png differ diff --git a/static/study/out/fig5-1-4a.png b/static/study/out/fig5-1-4a.png new file mode 100644 index 0000000..b5d0dc9 Binary files /dev/null and b/static/study/out/fig5-1-4a.png differ diff --git a/static/study/out/fig5-1-4b.png b/static/study/out/fig5-1-4b.png new file mode 100644 index 0000000..866e7c4 Binary files /dev/null and b/static/study/out/fig5-1-4b.png differ diff --git a/static/study/out/fig5-1-4c.png b/static/study/out/fig5-1-4c.png new file mode 100644 index 0000000..356ff2d Binary files /dev/null and b/static/study/out/fig5-1-4c.png differ diff --git a/static/study/out/fig5-1-5a.png b/static/study/out/fig5-1-5a.png new file mode 100644 index 0000000..10e40b1 Binary files /dev/null and b/static/study/out/fig5-1-5a.png differ diff --git a/static/study/out/fig5-1-5b.png b/static/study/out/fig5-1-5b.png new file mode 100644 index 0000000..938233d Binary files /dev/null and b/static/study/out/fig5-1-5b.png differ diff --git a/static/study/out/fig5-1-5c.png b/static/study/out/fig5-1-5c.png new file mode 100644 index 0000000..ccffdbb Binary files /dev/null and b/static/study/out/fig5-1-5c.png differ diff --git a/static/study/out/fig5-1-6.png b/static/study/out/fig5-1-6.png new file mode 100644 index 0000000..76740b6 Binary files /dev/null and b/static/study/out/fig5-1-6.png differ diff --git a/static/study/out/fig6-1-1.png b/static/study/out/fig6-1-1.png new file mode 100644 index 0000000..bbc60c2 Binary files /dev/null and b/static/study/out/fig6-1-1.png differ diff --git a/static/study/out/fig6-1-2a.png b/static/study/out/fig6-1-2a.png new file mode 100644 index 0000000..255b2f0 Binary files /dev/null and b/static/study/out/fig6-1-2a.png differ diff --git a/static/study/out/fig6-1-2b.png b/static/study/out/fig6-1-2b.png new file mode 100644 index 0000000..1ae1ee0 Binary files /dev/null and b/static/study/out/fig6-1-2b.png differ diff --git a/static/study/out/fig6-1-2c.png b/static/study/out/fig6-1-2c.png new file mode 100644 index 0000000..8667db9 Binary files /dev/null and b/static/study/out/fig6-1-2c.png differ diff --git a/static/study/out/fig6-1-3a.png b/static/study/out/fig6-1-3a.png new file mode 100644 index 0000000..1e92f92 Binary files /dev/null and b/static/study/out/fig6-1-3a.png differ diff --git a/static/study/out/fig6-1-3b.png b/static/study/out/fig6-1-3b.png new file mode 100644 index 0000000..39ae7e2 Binary files /dev/null and b/static/study/out/fig6-1-3b.png differ diff --git a/static/study/out/fig6-1-3c.png b/static/study/out/fig6-1-3c.png new file mode 100644 index 0000000..66b575c Binary files /dev/null and b/static/study/out/fig6-1-3c.png differ diff --git a/static/study/out/fig6-1-4a.png b/static/study/out/fig6-1-4a.png new file mode 100644 index 0000000..b5d0dc9 Binary files /dev/null and b/static/study/out/fig6-1-4a.png differ diff --git a/static/study/out/fig6-1-4b.png b/static/study/out/fig6-1-4b.png new file mode 100644 index 0000000..866e7c4 Binary files /dev/null and b/static/study/out/fig6-1-4b.png differ diff --git a/static/study/out/fig6-1-4c.png b/static/study/out/fig6-1-4c.png new file mode 100644 index 0000000..356ff2d Binary files /dev/null and b/static/study/out/fig6-1-4c.png differ diff --git a/static/study/out/fig6-1-5a.png b/static/study/out/fig6-1-5a.png new file mode 100644 index 0000000..10e40b1 Binary files /dev/null and b/static/study/out/fig6-1-5a.png differ diff --git a/static/study/out/fig6-1-5b.png b/static/study/out/fig6-1-5b.png new file mode 100644 index 0000000..938233d Binary files /dev/null and b/static/study/out/fig6-1-5b.png differ diff --git a/static/study/out/fig6-1-5c.png b/static/study/out/fig6-1-5c.png new file mode 100644 index 0000000..ccffdbb Binary files /dev/null and b/static/study/out/fig6-1-5c.png differ diff --git a/static/study/out/fig6-1-6.png b/static/study/out/fig6-1-6.png new file mode 100644 index 0000000..76740b6 Binary files /dev/null and b/static/study/out/fig6-1-6.png differ diff --git a/static/study/out/grad1-1-1.png b/static/study/out/grad1-1-1.png new file mode 100644 index 0000000..fb7190b Binary files /dev/null and b/static/study/out/grad1-1-1.png differ diff --git a/static/study/out/grad1-1-2.png b/static/study/out/grad1-1-2.png new file mode 100644 index 0000000..d4b6d1f Binary files /dev/null and b/static/study/out/grad1-1-2.png differ diff --git a/static/study/out/grad1-1-3.png b/static/study/out/grad1-1-3.png new file mode 100644 index 0000000..abb249c Binary files /dev/null and b/static/study/out/grad1-1-3.png differ diff --git a/static/study/out/grad1-2-1.png b/static/study/out/grad1-2-1.png new file mode 100644 index 0000000..9e1706f Binary files /dev/null and b/static/study/out/grad1-2-1.png differ diff --git a/static/study/out/grad1-2-2.png b/static/study/out/grad1-2-2.png new file mode 100644 index 0000000..b5749bf Binary files /dev/null and b/static/study/out/grad1-2-2.png differ diff --git a/static/study/out/grad1-2-3.png b/static/study/out/grad1-2-3.png new file mode 100644 index 0000000..a6be8fe Binary files /dev/null and b/static/study/out/grad1-2-3.png differ diff --git a/static/study/out/grad1-2-4.png b/static/study/out/grad1-2-4.png new file mode 100644 index 0000000..cb00343 Binary files /dev/null and b/static/study/out/grad1-2-4.png differ diff --git a/static/study/out/grad1-3-1.png b/static/study/out/grad1-3-1.png new file mode 100644 index 0000000..fb7190b Binary files /dev/null and b/static/study/out/grad1-3-1.png differ diff --git a/static/study/out/grad1-3-2.png b/static/study/out/grad1-3-2.png new file mode 100644 index 0000000..7626625 Binary files /dev/null and b/static/study/out/grad1-3-2.png differ diff --git a/static/study/out/grad1-4-1.png b/static/study/out/grad1-4-1.png new file mode 100644 index 0000000..f84378c Binary files /dev/null and b/static/study/out/grad1-4-1.png differ diff --git a/static/study/out/grad1-4-2.png b/static/study/out/grad1-4-2.png new file mode 100644 index 0000000..da364f3 Binary files /dev/null and b/static/study/out/grad1-4-2.png differ diff --git a/static/study/out/grad1-4-3.png b/static/study/out/grad1-4-3.png new file mode 100644 index 0000000..38345b8 Binary files /dev/null and b/static/study/out/grad1-4-3.png differ diff --git a/static/study/out/grad2-1-1.png b/static/study/out/grad2-1-1.png new file mode 100644 index 0000000..710926f Binary files /dev/null and b/static/study/out/grad2-1-1.png differ diff --git a/static/study/out/grad2-3-0.png b/static/study/out/grad2-3-0.png new file mode 100644 index 0000000..e26e988 Binary files /dev/null and b/static/study/out/grad2-3-0.png differ diff --git a/static/study/out/grad2-3-1.png b/static/study/out/grad2-3-1.png new file mode 100644 index 0000000..4745e31 Binary files /dev/null and b/static/study/out/grad2-3-1.png differ diff --git a/static/study/out/grad2-3-1b.png b/static/study/out/grad2-3-1b.png new file mode 100644 index 0000000..1d05fb4 Binary files /dev/null and b/static/study/out/grad2-3-1b.png differ diff --git a/static/study/out/grad2-3-2.png b/static/study/out/grad2-3-2.png new file mode 100644 index 0000000..da70420 Binary files /dev/null and b/static/study/out/grad2-3-2.png differ diff --git a/static/study/out/grad2-3-2b.png b/static/study/out/grad2-3-2b.png new file mode 100644 index 0000000..e7f400f Binary files /dev/null and b/static/study/out/grad2-3-2b.png differ diff --git a/static/study/out/grad2-3-3.png b/static/study/out/grad2-3-3.png new file mode 100644 index 0000000..a8e35fd Binary files /dev/null and b/static/study/out/grad2-3-3.png differ diff --git a/static/study/out/grad2-4-1.png b/static/study/out/grad2-4-1.png new file mode 100644 index 0000000..a7627d3 Binary files /dev/null and b/static/study/out/grad2-4-1.png differ diff --git a/static/study/out/grad2-4-2.png b/static/study/out/grad2-4-2.png new file mode 100644 index 0000000..4c5d738 Binary files /dev/null and b/static/study/out/grad2-4-2.png differ diff --git a/static/study/out/grad2-5-1.png b/static/study/out/grad2-5-1.png new file mode 100644 index 0000000..bf968fd Binary files /dev/null and b/static/study/out/grad2-5-1.png differ diff --git a/static/study/out/grad2-5-2.png b/static/study/out/grad2-5-2.png new file mode 100644 index 0000000..f477059 Binary files /dev/null and b/static/study/out/grad2-5-2.png differ diff --git a/static/study/out/grad2-5-3.png b/static/study/out/grad2-5-3.png new file mode 100644 index 0000000..88acac8 Binary files /dev/null and b/static/study/out/grad2-5-3.png differ diff --git a/static/study/out/grad2-5-4.png b/static/study/out/grad2-5-4.png new file mode 100644 index 0000000..6109690 Binary files /dev/null and b/static/study/out/grad2-5-4.png differ diff --git a/static/study/out/grad2-6-1.png b/static/study/out/grad2-6-1.png new file mode 100644 index 0000000..183ff28 Binary files /dev/null and b/static/study/out/grad2-6-1.png differ diff --git a/static/study/out/grad2-6-2.png b/static/study/out/grad2-6-2.png new file mode 100644 index 0000000..c4719a2 Binary files /dev/null and b/static/study/out/grad2-6-2.png differ diff --git a/static/study/out/grad2-6-3.png b/static/study/out/grad2-6-3.png new file mode 100644 index 0000000..32fc89e Binary files /dev/null and b/static/study/out/grad2-6-3.png differ diff --git a/static/study/out/grad2-6-4.png b/static/study/out/grad2-6-4.png new file mode 100644 index 0000000..1958b1f Binary files /dev/null and b/static/study/out/grad2-6-4.png differ diff --git a/static/study/out/grad2-6-5.png b/static/study/out/grad2-6-5.png new file mode 100644 index 0000000..8ac91e4 Binary files /dev/null and b/static/study/out/grad2-6-5.png differ diff --git a/static/study/out/grad2-6-6.png b/static/study/out/grad2-6-6.png new file mode 100644 index 0000000..69556c2 Binary files /dev/null and b/static/study/out/grad2-6-6.png differ diff --git a/static/study/out/grad2-7-1.png b/static/study/out/grad2-7-1.png new file mode 100644 index 0000000..2e4171d Binary files /dev/null and b/static/study/out/grad2-7-1.png differ diff --git a/static/study/out/grad2-7-2.png b/static/study/out/grad2-7-2.png new file mode 100644 index 0000000..8ca1dc1 Binary files /dev/null and b/static/study/out/grad2-7-2.png differ diff --git a/static/study/out/grad3-0-1.png b/static/study/out/grad3-0-1.png new file mode 100644 index 0000000..d6c889d Binary files /dev/null and b/static/study/out/grad3-0-1.png differ diff --git a/static/study/out/grad3-1-1.png b/static/study/out/grad3-1-1.png new file mode 100644 index 0000000..871457d Binary files /dev/null and b/static/study/out/grad3-1-1.png differ diff --git a/static/study/out/grad3-1-2.png b/static/study/out/grad3-1-2.png new file mode 100644 index 0000000..a74e9b5 Binary files /dev/null and b/static/study/out/grad3-1-2.png differ diff --git a/static/study/out/grad3-1-3.png b/static/study/out/grad3-1-3.png new file mode 100644 index 0000000..5929ea4 Binary files /dev/null and b/static/study/out/grad3-1-3.png differ diff --git a/static/study/out/grad3-2-1.png b/static/study/out/grad3-2-1.png new file mode 100644 index 0000000..e19a449 Binary files /dev/null and b/static/study/out/grad3-2-1.png differ diff --git a/static/study/out/grad3-2-1b.png b/static/study/out/grad3-2-1b.png new file mode 100644 index 0000000..52fab46 Binary files /dev/null and b/static/study/out/grad3-2-1b.png differ diff --git a/static/study/out/grad3-2-1c.png b/static/study/out/grad3-2-1c.png new file mode 100644 index 0000000..bceaeff Binary files /dev/null and b/static/study/out/grad3-2-1c.png differ diff --git a/static/study/out/grad3-2-3.png b/static/study/out/grad3-2-3.png new file mode 100644 index 0000000..9f712be Binary files /dev/null and b/static/study/out/grad3-2-3.png differ diff --git a/static/study/out/grad3-2-4.png b/static/study/out/grad3-2-4.png new file mode 100644 index 0000000..216eed2 Binary files /dev/null and b/static/study/out/grad3-2-4.png differ diff --git a/static/study/out/grad3-2-5.png b/static/study/out/grad3-2-5.png new file mode 100644 index 0000000..d453129 Binary files /dev/null and b/static/study/out/grad3-2-5.png differ diff --git a/static/study/out/grad3-2-6.png b/static/study/out/grad3-2-6.png new file mode 100644 index 0000000..656e3df Binary files /dev/null and b/static/study/out/grad3-2-6.png differ diff --git a/static/study/out/grad3-2-7.png b/static/study/out/grad3-2-7.png new file mode 100644 index 0000000..91ed78f Binary files /dev/null and b/static/study/out/grad3-2-7.png differ diff --git a/static/study/out/grad3-2-8.png b/static/study/out/grad3-2-8.png new file mode 100644 index 0000000..7a45948 Binary files /dev/null and b/static/study/out/grad3-2-8.png differ diff --git a/static/study/out/grad3-3-10.png b/static/study/out/grad3-3-10.png new file mode 100644 index 0000000..070e2ce Binary files /dev/null and b/static/study/out/grad3-3-10.png differ diff --git a/static/study/out/grad3-3-11.png b/static/study/out/grad3-3-11.png new file mode 100644 index 0000000..a17a966 Binary files /dev/null and b/static/study/out/grad3-3-11.png differ diff --git a/static/study/out/grad3-3-3.png b/static/study/out/grad3-3-3.png new file mode 100644 index 0000000..9c09cb3 Binary files /dev/null and b/static/study/out/grad3-3-3.png differ diff --git a/static/study/out/grad3-3-4.png b/static/study/out/grad3-3-4.png new file mode 100644 index 0000000..23b5546 Binary files /dev/null and b/static/study/out/grad3-3-4.png differ diff --git a/static/study/out/grad3-3-5.png b/static/study/out/grad3-3-5.png new file mode 100644 index 0000000..957f977 Binary files /dev/null and b/static/study/out/grad3-3-5.png differ diff --git a/static/study/out/grad3-3-6.png b/static/study/out/grad3-3-6.png new file mode 100644 index 0000000..4ed2296 Binary files /dev/null and b/static/study/out/grad3-3-6.png differ diff --git a/static/study/out/grad3-3-7.png b/static/study/out/grad3-3-7.png new file mode 100644 index 0000000..fee9d85 Binary files /dev/null and b/static/study/out/grad3-3-7.png differ diff --git a/static/study/out/grad3-3-8.png b/static/study/out/grad3-3-8.png new file mode 100644 index 0000000..f5fcbd2 Binary files /dev/null and b/static/study/out/grad3-3-8.png differ diff --git a/static/study/out/grad3-3-9.png b/static/study/out/grad3-3-9.png new file mode 100644 index 0000000..b5cb083 Binary files /dev/null and b/static/study/out/grad3-3-9.png differ diff --git a/static/study/out/grad3-4-1.png b/static/study/out/grad3-4-1.png new file mode 100644 index 0000000..c7ecd66 Binary files /dev/null and b/static/study/out/grad3-4-1.png differ diff --git a/static/study/out/grad3-5-1.png b/static/study/out/grad3-5-1.png new file mode 100644 index 0000000..97346e1 Binary files /dev/null and b/static/study/out/grad3-5-1.png differ diff --git a/static/study/out/grad3-5-2.png b/static/study/out/grad3-5-2.png new file mode 100644 index 0000000..8e71d9b Binary files /dev/null and b/static/study/out/grad3-5-2.png differ diff --git a/static/study/out/grad3-5-3.png b/static/study/out/grad3-5-3.png new file mode 100644 index 0000000..8475feb Binary files /dev/null and b/static/study/out/grad3-5-3.png differ diff --git a/static/study/out/grad3-5-4.png b/static/study/out/grad3-5-4.png new file mode 100644 index 0000000..493ddbc Binary files /dev/null and b/static/study/out/grad3-5-4.png differ diff --git a/static/study/out/grad3-5-5.png b/static/study/out/grad3-5-5.png new file mode 100644 index 0000000..163d566 Binary files /dev/null and b/static/study/out/grad3-5-5.png differ diff --git a/static/study/out/grad3-6-1.png b/static/study/out/grad3-6-1.png new file mode 100644 index 0000000..657d49e Binary files /dev/null and b/static/study/out/grad3-6-1.png differ diff --git a/static/study/out/grad3-6-2.png b/static/study/out/grad3-6-2.png new file mode 100644 index 0000000..b015968 Binary files /dev/null and b/static/study/out/grad3-6-2.png differ diff --git a/static/study/out/grad3-6-3.png b/static/study/out/grad3-6-3.png new file mode 100644 index 0000000..b29031f Binary files /dev/null and b/static/study/out/grad3-6-3.png differ diff --git a/static/study/out/grad3-6-4.png b/static/study/out/grad3-6-4.png new file mode 100644 index 0000000..b71b4ee Binary files /dev/null and b/static/study/out/grad3-6-4.png differ diff --git a/static/study/out/grad4-1-1.png b/static/study/out/grad4-1-1.png new file mode 100644 index 0000000..aeff853 Binary files /dev/null and b/static/study/out/grad4-1-1.png differ diff --git a/static/study/out/grad4-1-2.png b/static/study/out/grad4-1-2.png new file mode 100644 index 0000000..530ea7d Binary files /dev/null and b/static/study/out/grad4-1-2.png differ diff --git a/static/study/out/grad4-2-1.png b/static/study/out/grad4-2-1.png new file mode 100644 index 0000000..b902545 Binary files /dev/null and b/static/study/out/grad4-2-1.png differ diff --git a/static/study/out/grad4-2-2.png b/static/study/out/grad4-2-2.png new file mode 100644 index 0000000..44fbc2f Binary files /dev/null and b/static/study/out/grad4-2-2.png differ diff --git a/static/study/out/grad4-2-3.png b/static/study/out/grad4-2-3.png new file mode 100644 index 0000000..fce5b17 Binary files /dev/null and b/static/study/out/grad4-2-3.png differ diff --git a/static/study/out/grad4-2-4.png b/static/study/out/grad4-2-4.png new file mode 100644 index 0000000..ff95f47 Binary files /dev/null and b/static/study/out/grad4-2-4.png differ diff --git a/static/study/out/grad4-2-5.png b/static/study/out/grad4-2-5.png new file mode 100644 index 0000000..bffc0d1 Binary files /dev/null and b/static/study/out/grad4-2-5.png differ diff --git a/static/study/out/grad4-2-6.png b/static/study/out/grad4-2-6.png new file mode 100644 index 0000000..2876d2e Binary files /dev/null and b/static/study/out/grad4-2-6.png differ diff --git a/static/study/out/grad4-2-7.png b/static/study/out/grad4-2-7.png new file mode 100644 index 0000000..d623f93 Binary files /dev/null and b/static/study/out/grad4-2-7.png differ diff --git a/static/study/out/grad4-2-8.png b/static/study/out/grad4-2-8.png new file mode 100644 index 0000000..98c7dcb Binary files /dev/null and b/static/study/out/grad4-2-8.png differ diff --git a/static/study/out/grad5-0-1.png b/static/study/out/grad5-0-1.png new file mode 100644 index 0000000..a6417d1 Binary files /dev/null and b/static/study/out/grad5-0-1.png differ diff --git a/static/study/out/grad5-0-2.png b/static/study/out/grad5-0-2.png new file mode 100644 index 0000000..ae9cd9c Binary files /dev/null and b/static/study/out/grad5-0-2.png differ diff --git a/static/study/out/grad5-1-1.png b/static/study/out/grad5-1-1.png new file mode 100644 index 0000000..cd64ab2 Binary files /dev/null and b/static/study/out/grad5-1-1.png differ diff --git a/static/study/out/grad5-1-2.png b/static/study/out/grad5-1-2.png new file mode 100644 index 0000000..be3e5cf Binary files /dev/null and b/static/study/out/grad5-1-2.png differ diff --git a/static/study/out/grad5-2-1.png b/static/study/out/grad5-2-1.png new file mode 100644 index 0000000..f202c15 Binary files /dev/null and b/static/study/out/grad5-2-1.png differ diff --git a/static/study/out/grad5-2-2.png b/static/study/out/grad5-2-2.png new file mode 100644 index 0000000..947e4fa Binary files /dev/null and b/static/study/out/grad5-2-2.png differ diff --git a/static/study/out/grad5-2-3.png b/static/study/out/grad5-2-3.png new file mode 100644 index 0000000..6199f44 Binary files /dev/null and b/static/study/out/grad5-2-3.png differ diff --git a/static/study/out/grad5-2-4.png b/static/study/out/grad5-2-4.png new file mode 100644 index 0000000..ad2b894 Binary files /dev/null and b/static/study/out/grad5-2-4.png differ diff --git a/static/study/out/grad5-3-1.png b/static/study/out/grad5-3-1.png new file mode 100644 index 0000000..cefe8e0 Binary files /dev/null and b/static/study/out/grad5-3-1.png differ diff --git a/static/study/out/grad5-3-2.png b/static/study/out/grad5-3-2.png new file mode 100644 index 0000000..10f58e0 Binary files /dev/null and b/static/study/out/grad5-3-2.png differ diff --git a/static/study/out/grad5-4-1.png b/static/study/out/grad5-4-1.png new file mode 100644 index 0000000..671b1f2 Binary files /dev/null and b/static/study/out/grad5-4-1.png differ diff --git a/static/study/out/grad5-4-2.png b/static/study/out/grad5-4-2.png new file mode 100644 index 0000000..8eca2a5 Binary files /dev/null and b/static/study/out/grad5-4-2.png differ diff --git a/static/study/out/grad6-1-1.png b/static/study/out/grad6-1-1.png new file mode 100644 index 0000000..cd64ab2 Binary files /dev/null and b/static/study/out/grad6-1-1.png differ diff --git a/static/study/out/grad6-1-2.png b/static/study/out/grad6-1-2.png new file mode 100644 index 0000000..be3e5cf Binary files /dev/null and b/static/study/out/grad6-1-2.png differ diff --git a/static/study/out/grad6-2-1.png b/static/study/out/grad6-2-1.png new file mode 100644 index 0000000..ebf0793 Binary files /dev/null and b/static/study/out/grad6-2-1.png differ diff --git a/static/study/out/grad6-2-2.png b/static/study/out/grad6-2-2.png new file mode 100644 index 0000000..bbf48ee Binary files /dev/null and b/static/study/out/grad6-2-2.png differ diff --git a/static/study/out/grad6-2-3.png b/static/study/out/grad6-2-3.png new file mode 100644 index 0000000..17c2dd2 Binary files /dev/null and b/static/study/out/grad6-2-3.png differ diff --git a/static/study/out/grad6-2-4.png b/static/study/out/grad6-2-4.png new file mode 100644 index 0000000..ad2b894 Binary files /dev/null and b/static/study/out/grad6-2-4.png differ diff --git a/static/study/out/grad6-4-1.png b/static/study/out/grad6-4-1.png new file mode 100644 index 0000000..671b1f2 Binary files /dev/null and b/static/study/out/grad6-4-1.png differ diff --git a/static/study/out/grad6-4-2.png b/static/study/out/grad6-4-2.png new file mode 100644 index 0000000..8eca2a5 Binary files /dev/null and b/static/study/out/grad6-4-2.png differ diff --git a/static/study/out/lena1-1-1.png b/static/study/out/lena1-1-1.png new file mode 100644 index 0000000..2acb58a Binary files /dev/null and b/static/study/out/lena1-1-1.png differ diff --git a/static/study/out/lena1-1-2.png b/static/study/out/lena1-1-2.png new file mode 100644 index 0000000..7eabba8 Binary files /dev/null and b/static/study/out/lena1-1-2.png differ diff --git a/static/study/out/lena1-1-3.png b/static/study/out/lena1-1-3.png new file mode 100644 index 0000000..a40fe8c Binary files /dev/null and b/static/study/out/lena1-1-3.png differ diff --git a/static/study/out/lena1-2-1.png b/static/study/out/lena1-2-1.png new file mode 100644 index 0000000..cd2747f Binary files /dev/null and b/static/study/out/lena1-2-1.png differ diff --git a/static/study/out/lena1-2-2.png b/static/study/out/lena1-2-2.png new file mode 100644 index 0000000..f36735b Binary files /dev/null and b/static/study/out/lena1-2-2.png differ diff --git a/static/study/out/lena1-2-3.png b/static/study/out/lena1-2-3.png new file mode 100644 index 0000000..466c3e3 Binary files /dev/null and b/static/study/out/lena1-2-3.png differ diff --git a/static/study/out/lena1-2-4.png b/static/study/out/lena1-2-4.png new file mode 100644 index 0000000..b797734 Binary files /dev/null and b/static/study/out/lena1-2-4.png differ diff --git a/static/study/out/lena1-3-1.png b/static/study/out/lena1-3-1.png new file mode 100644 index 0000000..ef9283c Binary files /dev/null and b/static/study/out/lena1-3-1.png differ diff --git a/static/study/out/lena1-3-2.png b/static/study/out/lena1-3-2.png new file mode 100644 index 0000000..7a90a32 Binary files /dev/null and b/static/study/out/lena1-3-2.png differ diff --git a/static/study/out/lena1-4-1.png b/static/study/out/lena1-4-1.png new file mode 100644 index 0000000..0580dd6 Binary files /dev/null and b/static/study/out/lena1-4-1.png differ diff --git a/static/study/out/lena1-4-2.png b/static/study/out/lena1-4-2.png new file mode 100644 index 0000000..faacf2e Binary files /dev/null and b/static/study/out/lena1-4-2.png differ diff --git a/static/study/out/lena1-4-3.png b/static/study/out/lena1-4-3.png new file mode 100644 index 0000000..6fa1f09 Binary files /dev/null and b/static/study/out/lena1-4-3.png differ diff --git a/static/study/out/lena2-1-1.png b/static/study/out/lena2-1-1.png new file mode 100644 index 0000000..06b280f Binary files /dev/null and b/static/study/out/lena2-1-1.png differ diff --git a/static/study/out/lena2-3-0.png b/static/study/out/lena2-3-0.png new file mode 100644 index 0000000..a6b31a2 Binary files /dev/null and b/static/study/out/lena2-3-0.png differ diff --git a/static/study/out/lena2-3-1.png b/static/study/out/lena2-3-1.png new file mode 100644 index 0000000..df3e2bf Binary files /dev/null and b/static/study/out/lena2-3-1.png differ diff --git a/static/study/out/lena2-3-1b.png b/static/study/out/lena2-3-1b.png new file mode 100644 index 0000000..c2ac496 Binary files /dev/null and b/static/study/out/lena2-3-1b.png differ diff --git a/static/study/out/lena2-3-2.png b/static/study/out/lena2-3-2.png new file mode 100644 index 0000000..de514e2 Binary files /dev/null and b/static/study/out/lena2-3-2.png differ diff --git a/static/study/out/lena2-3-2b.png b/static/study/out/lena2-3-2b.png new file mode 100644 index 0000000..b3d4b4b Binary files /dev/null and b/static/study/out/lena2-3-2b.png differ diff --git a/static/study/out/lena2-3-3.png b/static/study/out/lena2-3-3.png new file mode 100644 index 0000000..2df50ed Binary files /dev/null and b/static/study/out/lena2-3-3.png differ diff --git a/static/study/out/lena2-4-1.png b/static/study/out/lena2-4-1.png new file mode 100644 index 0000000..3bf0b31 Binary files /dev/null and b/static/study/out/lena2-4-1.png differ diff --git a/static/study/out/lena2-4-2.png b/static/study/out/lena2-4-2.png new file mode 100644 index 0000000..5c70b23 Binary files /dev/null and b/static/study/out/lena2-4-2.png differ diff --git a/static/study/out/lena2-5-1.png b/static/study/out/lena2-5-1.png new file mode 100644 index 0000000..87cdcb6 Binary files /dev/null and b/static/study/out/lena2-5-1.png differ diff --git a/static/study/out/lena2-5-2.png b/static/study/out/lena2-5-2.png new file mode 100644 index 0000000..cac545d Binary files /dev/null and b/static/study/out/lena2-5-2.png differ diff --git a/static/study/out/lena2-5-3.png b/static/study/out/lena2-5-3.png new file mode 100644 index 0000000..a7e608c Binary files /dev/null and b/static/study/out/lena2-5-3.png differ diff --git a/static/study/out/lena2-5-4.png b/static/study/out/lena2-5-4.png new file mode 100644 index 0000000..cfb6884 Binary files /dev/null and b/static/study/out/lena2-5-4.png differ diff --git a/static/study/out/lena2-6-1.png b/static/study/out/lena2-6-1.png new file mode 100644 index 0000000..1616717 Binary files /dev/null and b/static/study/out/lena2-6-1.png differ diff --git a/static/study/out/lena2-6-2.png b/static/study/out/lena2-6-2.png new file mode 100644 index 0000000..9e0158d Binary files /dev/null and b/static/study/out/lena2-6-2.png differ diff --git a/static/study/out/lena2-6-3.png b/static/study/out/lena2-6-3.png new file mode 100644 index 0000000..7f7f75a Binary files /dev/null and b/static/study/out/lena2-6-3.png differ diff --git a/static/study/out/lena2-6-4.png b/static/study/out/lena2-6-4.png new file mode 100644 index 0000000..b9a4e3d Binary files /dev/null and b/static/study/out/lena2-6-4.png differ diff --git a/static/study/out/lena2-6-5.png b/static/study/out/lena2-6-5.png new file mode 100644 index 0000000..6551c83 Binary files /dev/null and b/static/study/out/lena2-6-5.png differ diff --git a/static/study/out/lena2-6-6.png b/static/study/out/lena2-6-6.png new file mode 100644 index 0000000..13604ee Binary files /dev/null and b/static/study/out/lena2-6-6.png differ diff --git a/static/study/out/lena2-7-1.png b/static/study/out/lena2-7-1.png new file mode 100644 index 0000000..07b6bec Binary files /dev/null and b/static/study/out/lena2-7-1.png differ diff --git a/static/study/out/lena2-7-2.png b/static/study/out/lena2-7-2.png new file mode 100644 index 0000000..ef38ef4 Binary files /dev/null and b/static/study/out/lena2-7-2.png differ diff --git a/static/study/out/lena3-0-1.png b/static/study/out/lena3-0-1.png new file mode 100644 index 0000000..c1b8b9f Binary files /dev/null and b/static/study/out/lena3-0-1.png differ diff --git a/static/study/out/lena3-1-1.png b/static/study/out/lena3-1-1.png new file mode 100644 index 0000000..63a17f1 Binary files /dev/null and b/static/study/out/lena3-1-1.png differ diff --git a/static/study/out/lena3-1-2.png b/static/study/out/lena3-1-2.png new file mode 100644 index 0000000..996be62 Binary files /dev/null and b/static/study/out/lena3-1-2.png differ diff --git a/static/study/out/lena3-1-3.png b/static/study/out/lena3-1-3.png new file mode 100644 index 0000000..5fb4a69 Binary files /dev/null and b/static/study/out/lena3-1-3.png differ diff --git a/static/study/out/lena3-2-1.png b/static/study/out/lena3-2-1.png new file mode 100644 index 0000000..f51c33f Binary files /dev/null and b/static/study/out/lena3-2-1.png differ diff --git a/static/study/out/lena3-2-1b.png b/static/study/out/lena3-2-1b.png new file mode 100644 index 0000000..d30dc15 Binary files /dev/null and b/static/study/out/lena3-2-1b.png differ diff --git a/static/study/out/lena3-2-1c.png b/static/study/out/lena3-2-1c.png new file mode 100644 index 0000000..9243bd5 Binary files /dev/null and b/static/study/out/lena3-2-1c.png differ diff --git a/static/study/out/lena3-2-3.png b/static/study/out/lena3-2-3.png new file mode 100644 index 0000000..0b2579e Binary files /dev/null and b/static/study/out/lena3-2-3.png differ diff --git a/static/study/out/lena3-2-4.png b/static/study/out/lena3-2-4.png new file mode 100644 index 0000000..4260fc1 Binary files /dev/null and b/static/study/out/lena3-2-4.png differ diff --git a/static/study/out/lena3-2-5.png b/static/study/out/lena3-2-5.png new file mode 100644 index 0000000..d764f3e Binary files /dev/null and b/static/study/out/lena3-2-5.png differ diff --git a/static/study/out/lena3-2-6.png b/static/study/out/lena3-2-6.png new file mode 100644 index 0000000..33902db Binary files /dev/null and b/static/study/out/lena3-2-6.png differ diff --git a/static/study/out/lena3-2-7.png b/static/study/out/lena3-2-7.png new file mode 100644 index 0000000..29a2320 Binary files /dev/null and b/static/study/out/lena3-2-7.png differ diff --git a/static/study/out/lena3-2-8.png b/static/study/out/lena3-2-8.png new file mode 100644 index 0000000..9349230 Binary files /dev/null and b/static/study/out/lena3-2-8.png differ diff --git a/static/study/out/lena3-3-1.png b/static/study/out/lena3-3-1.png new file mode 100644 index 0000000..faf11ae Binary files /dev/null and b/static/study/out/lena3-3-1.png differ diff --git a/static/study/out/lena3-3-10.png b/static/study/out/lena3-3-10.png new file mode 100644 index 0000000..3b432d6 Binary files /dev/null and b/static/study/out/lena3-3-10.png differ diff --git a/static/study/out/lena3-3-11.png b/static/study/out/lena3-3-11.png new file mode 100644 index 0000000..9409baf Binary files /dev/null and b/static/study/out/lena3-3-11.png differ diff --git a/static/study/out/lena3-3-2.png b/static/study/out/lena3-3-2.png new file mode 100644 index 0000000..06514d1 Binary files /dev/null and b/static/study/out/lena3-3-2.png differ diff --git a/static/study/out/lena3-3-3.png b/static/study/out/lena3-3-3.png new file mode 100644 index 0000000..116e2d7 Binary files /dev/null and b/static/study/out/lena3-3-3.png differ diff --git a/static/study/out/lena3-3-4.png b/static/study/out/lena3-3-4.png new file mode 100644 index 0000000..c1269e2 Binary files /dev/null and b/static/study/out/lena3-3-4.png differ diff --git a/static/study/out/lena3-3-5.png b/static/study/out/lena3-3-5.png new file mode 100644 index 0000000..2c4ce21 Binary files /dev/null and b/static/study/out/lena3-3-5.png differ diff --git a/static/study/out/lena3-3-6.png b/static/study/out/lena3-3-6.png new file mode 100644 index 0000000..fd55fd7 Binary files /dev/null and b/static/study/out/lena3-3-6.png differ diff --git a/static/study/out/lena3-3-7.png b/static/study/out/lena3-3-7.png new file mode 100644 index 0000000..81b9bd6 Binary files /dev/null and b/static/study/out/lena3-3-7.png differ diff --git a/static/study/out/lena3-3-8.png b/static/study/out/lena3-3-8.png new file mode 100644 index 0000000..492edbe Binary files /dev/null and b/static/study/out/lena3-3-8.png differ diff --git a/static/study/out/lena3-3-9.png b/static/study/out/lena3-3-9.png new file mode 100644 index 0000000..d6c6cce Binary files /dev/null and b/static/study/out/lena3-3-9.png differ diff --git a/static/study/out/lena3-4-1.png b/static/study/out/lena3-4-1.png new file mode 100644 index 0000000..3108c4c Binary files /dev/null and b/static/study/out/lena3-4-1.png differ diff --git a/static/study/out/lena3-5-1.png b/static/study/out/lena3-5-1.png new file mode 100644 index 0000000..be112c6 Binary files /dev/null and b/static/study/out/lena3-5-1.png differ diff --git a/static/study/out/lena3-5-2.png b/static/study/out/lena3-5-2.png new file mode 100644 index 0000000..37266c9 Binary files /dev/null and b/static/study/out/lena3-5-2.png differ diff --git a/static/study/out/lena3-5-3.png b/static/study/out/lena3-5-3.png new file mode 100644 index 0000000..ec21e7a Binary files /dev/null and b/static/study/out/lena3-5-3.png differ diff --git a/static/study/out/lena3-5-4.png b/static/study/out/lena3-5-4.png new file mode 100644 index 0000000..4d9d1d5 Binary files /dev/null and b/static/study/out/lena3-5-4.png differ diff --git a/static/study/out/lena3-5-5.png b/static/study/out/lena3-5-5.png new file mode 100644 index 0000000..677b966 Binary files /dev/null and b/static/study/out/lena3-5-5.png differ diff --git a/static/study/out/lena3-6-1.png b/static/study/out/lena3-6-1.png new file mode 100644 index 0000000..8566192 Binary files /dev/null and b/static/study/out/lena3-6-1.png differ diff --git a/static/study/out/lena3-6-2.png b/static/study/out/lena3-6-2.png new file mode 100644 index 0000000..80b9ea3 Binary files /dev/null and b/static/study/out/lena3-6-2.png differ diff --git a/static/study/out/lena3-6-3.png b/static/study/out/lena3-6-3.png new file mode 100644 index 0000000..b1a8512 Binary files /dev/null and b/static/study/out/lena3-6-3.png differ diff --git a/static/study/out/lena3-6-4.png b/static/study/out/lena3-6-4.png new file mode 100644 index 0000000..c2b9d80 Binary files /dev/null and b/static/study/out/lena3-6-4.png differ diff --git a/static/study/out/lena4-1-1.png b/static/study/out/lena4-1-1.png new file mode 100644 index 0000000..6ef7074 Binary files /dev/null and b/static/study/out/lena4-1-1.png differ diff --git a/static/study/out/lena4-1-2.png b/static/study/out/lena4-1-2.png new file mode 100644 index 0000000..a3cd583 Binary files /dev/null and b/static/study/out/lena4-1-2.png differ diff --git a/static/study/out/lena4-2-1.png b/static/study/out/lena4-2-1.png new file mode 100644 index 0000000..0b182f2 Binary files /dev/null and b/static/study/out/lena4-2-1.png differ diff --git a/static/study/out/lena4-2-2.png b/static/study/out/lena4-2-2.png new file mode 100644 index 0000000..cdcdeac Binary files /dev/null and b/static/study/out/lena4-2-2.png differ diff --git a/static/study/out/lena4-2-3.png b/static/study/out/lena4-2-3.png new file mode 100644 index 0000000..3f761e4 Binary files /dev/null and b/static/study/out/lena4-2-3.png differ diff --git a/static/study/out/lena4-2-4.png b/static/study/out/lena4-2-4.png new file mode 100644 index 0000000..5215773 Binary files /dev/null and b/static/study/out/lena4-2-4.png differ diff --git a/static/study/out/lena4-2-5.png b/static/study/out/lena4-2-5.png new file mode 100644 index 0000000..0729172 Binary files /dev/null and b/static/study/out/lena4-2-5.png differ diff --git a/static/study/out/lena4-2-6.png b/static/study/out/lena4-2-6.png new file mode 100644 index 0000000..ed4374f Binary files /dev/null and b/static/study/out/lena4-2-6.png differ diff --git a/static/study/out/lena4-2-7.png b/static/study/out/lena4-2-7.png new file mode 100644 index 0000000..0d19b24 Binary files /dev/null and b/static/study/out/lena4-2-7.png differ diff --git a/static/study/out/lena4-2-8.png b/static/study/out/lena4-2-8.png new file mode 100644 index 0000000..bebb773 Binary files /dev/null and b/static/study/out/lena4-2-8.png differ diff --git a/static/study/out/lena5-0-1.png b/static/study/out/lena5-0-1.png new file mode 100644 index 0000000..dbc9883 Binary files /dev/null and b/static/study/out/lena5-0-1.png differ diff --git a/static/study/out/lena5-0-2.png b/static/study/out/lena5-0-2.png new file mode 100644 index 0000000..b8a299c Binary files /dev/null and b/static/study/out/lena5-0-2.png differ diff --git a/static/study/out/lena5-2-1.png b/static/study/out/lena5-2-1.png new file mode 100644 index 0000000..b6d6968 Binary files /dev/null and b/static/study/out/lena5-2-1.png differ diff --git a/static/study/out/lena5-2-2.png b/static/study/out/lena5-2-2.png new file mode 100644 index 0000000..df6b0a5 Binary files /dev/null and b/static/study/out/lena5-2-2.png differ diff --git a/static/study/out/lena5-2-3.png b/static/study/out/lena5-2-3.png new file mode 100644 index 0000000..26b757a Binary files /dev/null and b/static/study/out/lena5-2-3.png differ diff --git a/static/study/out/lena5-3-1.png b/static/study/out/lena5-3-1.png new file mode 100644 index 0000000..da41706 Binary files /dev/null and b/static/study/out/lena5-3-1.png differ diff --git a/static/study/out/lena5-3-2.png b/static/study/out/lena5-3-2.png new file mode 100644 index 0000000..e5e84ed Binary files /dev/null and b/static/study/out/lena5-3-2.png differ diff --git a/static/study/out/lena6-1-1.png b/static/study/out/lena6-1-1.png new file mode 100644 index 0000000..63231ab Binary files /dev/null and b/static/study/out/lena6-1-1.png differ diff --git a/static/study/out/lena6-1-2.png b/static/study/out/lena6-1-2.png new file mode 100644 index 0000000..8503ef4 Binary files /dev/null and b/static/study/out/lena6-1-2.png differ diff --git a/static/study/out/lena6-2-1.png b/static/study/out/lena6-2-1.png new file mode 100644 index 0000000..1117c02 Binary files /dev/null and b/static/study/out/lena6-2-1.png differ diff --git a/static/study/out/lena6-2-2.png b/static/study/out/lena6-2-2.png new file mode 100644 index 0000000..90d71b8 Binary files /dev/null and b/static/study/out/lena6-2-2.png differ diff --git a/static/study/out/lena6-2-3.png b/static/study/out/lena6-2-3.png new file mode 100644 index 0000000..5937cb6 Binary files /dev/null and b/static/study/out/lena6-2-3.png differ diff --git a/static/study/out/lena6-2-4.png b/static/study/out/lena6-2-4.png new file mode 100644 index 0000000..d746882 Binary files /dev/null and b/static/study/out/lena6-2-4.png differ diff --git a/static/study/out/lena6-4-1.png b/static/study/out/lena6-4-1.png new file mode 100644 index 0000000..99b87df Binary files /dev/null and b/static/study/out/lena6-4-1.png differ diff --git a/static/study/out/lena6-4-2.png b/static/study/out/lena6-4-2.png new file mode 100644 index 0000000..40af523 Binary files /dev/null and b/static/study/out/lena6-4-2.png differ diff --git a/static/study/out/lena7-0-1.png b/static/study/out/lena7-0-1.png new file mode 100644 index 0000000..5427d78 Binary files /dev/null and b/static/study/out/lena7-0-1.png differ diff --git a/static/study/out/lena7-1-1.png b/static/study/out/lena7-1-1.png new file mode 100644 index 0000000..b8040ba Binary files /dev/null and b/static/study/out/lena7-1-1.png differ diff --git a/static/study/out/lena7-1-2.png b/static/study/out/lena7-1-2.png new file mode 100644 index 0000000..e9b19a1 Binary files /dev/null and b/static/study/out/lena7-1-2.png differ diff --git a/static/study/out/lena7-1-3.png b/static/study/out/lena7-1-3.png new file mode 100644 index 0000000..4a4a35f Binary files /dev/null and b/static/study/out/lena7-1-3.png differ diff --git a/static/study/out/lena7-1-4.png b/static/study/out/lena7-1-4.png new file mode 100644 index 0000000..26b2231 Binary files /dev/null and b/static/study/out/lena7-1-4.png differ diff --git a/static/study/out/lena7-1-5.png b/static/study/out/lena7-1-5.png new file mode 100644 index 0000000..6cf1523 Binary files /dev/null and b/static/study/out/lena7-1-5.png differ diff --git a/static/study/out/pat2-1-1.png b/static/study/out/pat2-1-1.png new file mode 100644 index 0000000..b970ad2 Binary files /dev/null and b/static/study/out/pat2-1-1.png differ diff --git a/static/study/out/pat2-1-2.png b/static/study/out/pat2-1-2.png new file mode 100644 index 0000000..2ff96bd Binary files /dev/null and b/static/study/out/pat2-1-2.png differ diff --git a/static/study/out/pat2-2-1.png b/static/study/out/pat2-2-1.png new file mode 100644 index 0000000..5bf946a Binary files /dev/null and b/static/study/out/pat2-2-1.png differ diff --git a/static/study/out/pat2-2-2.png b/static/study/out/pat2-2-2.png new file mode 100644 index 0000000..54c05f0 Binary files /dev/null and b/static/study/out/pat2-2-2.png differ diff --git a/static/study/out/pat5-1-1.png b/static/study/out/pat5-1-1.png new file mode 100644 index 0000000..b1478d7 Binary files /dev/null and b/static/study/out/pat5-1-1.png differ diff --git a/static/study/out/pat5-2-1.png b/static/study/out/pat5-2-1.png new file mode 100644 index 0000000..8a63a23 Binary files /dev/null and b/static/study/out/pat5-2-1.png differ diff --git a/static/study/out/pat5-2-2.png b/static/study/out/pat5-2-2.png new file mode 100644 index 0000000..72875ad Binary files /dev/null and b/static/study/out/pat5-2-2.png differ diff --git a/static/study/out/pat6-1-1.png b/static/study/out/pat6-1-1.png new file mode 100644 index 0000000..6ae5bb2 Binary files /dev/null and b/static/study/out/pat6-1-1.png differ diff --git a/static/study/out/pat6-2-1.png b/static/study/out/pat6-2-1.png new file mode 100644 index 0000000..8a63a23 Binary files /dev/null and b/static/study/out/pat6-2-1.png differ diff --git a/static/study/out/pat6-2-2.png b/static/study/out/pat6-2-2.png new file mode 100644 index 0000000..72875ad Binary files /dev/null and b/static/study/out/pat6-2-2.png differ diff --git a/static/study/part1.html b/static/study/part1.html new file mode 100644 index 0000000..e2d09ba --- /dev/null +++ b/static/study/part1.html @@ -0,0 +1,202 @@ + + + + + + + + + + + + Libcaca study - 1. Colour quantisation + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + +

1. Colour quantisation

+ +

The process of reducing the number of colours used in an image is called +colour quantisation. It is a very old and common computer graphics +problem. Many methods exist to do the task, and their efficiency depends on +several parameters:

+ +
    +
  • the input image: is it a photograph? a vector drawing? a composition + of both?
  • +
  • the target media: is it a computer screen? if so, what are the size + and the position of the pixels? is it a printed document? if so, + what kind of paper? what kind of ink? or maybe the conversion should + be optimised for both targets?
  • +
  • the quality requirements: for instance, can contrast be raised for + a more appealing result at the expense of accuracy? +
  • the allowed computation time: do we need 50fps or can we afford to + wait 10 seconds for a better result?
  • +
+ +

1.1. Black and white thresholding

+ +

Since a greyscale pixel has a value between 0 and 1, a fast method +to convert the image to black and white is to set all pixels below 0.5 +to black and all pixels above 0.5 to white. This method is called +thresholding and, in our case, results in the following image:

+ +

+ 50% threshold + 50% threshold gradient +

+ +

Not that bad, but we were pretty lucky: the original image’s brightness +was rather well balanced. A lot of detail is lost, though. Different results +can be obtained by choosing “threshold values” other than 0.5, for instance +0.4 or 0.6, resulting in a much brighter or darker image:

+ +

+ 40% threshold + 40% threshold gradient + 60% threshold + 60% threshold gradient +

+ +

Choosing the best thresholding value for a given image is called +average dithering. But even with the best value, the results will +not improve tremendously.

+ +

1.2. Greyscale thresholding

+ +

Better results can be achieved with a slightly bigger palette. Here is +thresholding applied to a 3-colour and to a 5-colour palette:

+ +

+ 3-colour threshold + 3-colour threshold gradient + 5-colour threshold + 5-colour threshold gradient +

+ +

Using this method, shades of grey are evenly used. However, the global +error is far from optimal, as the following graphs show:

+ +

+ mean error 0.138 + mean error 0.075 +

+ +

The following thresholding method minimises the error, at the cost of +underusage of pure black and white colours:

+ +

+ 3-colour threshold, minimal error + 3-colour threshold gradient, minimal error + 5-colour threshold, minimal error + 5-colour threshold gradient, minimal error +

+ +

+ mean error 0.125 + mean error 0.0625 +

+ +

This is a perfect example of a situation where colour accuracy does not +help achieve a better result.

+ +

1.3. Dynamic thresholding

+ +

Dynamic thresholding consists in studying the image before selecting +the threshold values. One strategy, for instance, is to choose the median +pixel value. This is done simply by computing a histogram of the image.

+ +

+ 2-colour dynamic threshold + 2-colour dynamic threshold gradient + 5-colour dynamic threshold + 5-colour dynamic threshold gradient +

+ +

1.4. Random dithering

+ +

Instead of constantly using the same threshold value, one can use a +different random value for each pixel in the image. This technique is simply +called random dithering.

+ +

Here are two simple examples. On the left, threshold values are uniformly +chosen between 0 and 1. On the right, random dithering with threshold values +chosen with a gaussian distribution (mean 0.5, standard deviation 0.15): +

+ +

+ random dithering + random dithering gradient + gaussian (0.5, 0.15) dithering + gaussian (0.5, 0.15) dithering gradient +

+ +

The images look very noisy, but they are arguably an improvement over +standard constant thresholding.

+ +

Finally, this is dynamic thresholding with 4 colours where threshold values +at every pixel are computed as usual, but then perturbated using a gaussian +distribution (mean 0, standard deviation 0.08):

+ +

+ 4-colour dynamic thresholding, gaussian (0, 0.08) + 4-colour dynamic thresholding, gaussian (0, 0.08) gradient +

+ + + + + + + + diff --git a/static/study/part2.html b/static/study/part2.html new file mode 100644 index 0000000..4333d1c --- /dev/null +++ b/static/study/part2.html @@ -0,0 +1,477 @@ + + + + + + + + + + + + Libcaca study - 2. Halftoning + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

2. Halftoning

+ +

2.1. Halftoning patterns

+ +

Observe the following patterns. From a certain distance or assuming small +enough pixels, they look like shades of grey despite being made of only black +and white pixels:

+ +

+ 50% pattern +

+ +

We can do even better using additional patterns such as these 25% and +75% halftone patterns:

+ +

+ 25% and 75% patterns +

+ +

This looks promising. Let’s try immediately on Lena: we will use the +5-colour thresholding picture and replace the 0.25, 0.5 and 0.75 grey values +with the above patterns:

+ +

+ 25%, 50% and 75% halftoning + 25%, 50% and 75% halftoning gradient +

+ +

Not bad for a start. But there is a lot to improve. +By the way, this technique is covered by Apple’s U.S. patent 5761347 +[15].

+ +

2.2. Screen artifacts

+ +

If your screen’s quality is not very good, you might experience slightly +different shades of grey for the following patterns, despite being made of 50% +black and 50% white pixels:

+ +

+ screen imperfections +

+ +

Obviously the middle pattern looks far better to the human eye on a +computer screen. Optimising patterns so that they look good to the human +eye and don't create artifacts is a crucial element of a dithering +algorithm. Here is another example of two patterns that approximate to +the same shade of grey but may look slightly different from a distance:

+ +

+ two different 25% patterns +

+ +

2.3. Ordered dithering

+ +

A generalisation of the dithering technique we just saw that uses a +certain family of patterns is called ordered dithering. It is based on +a dither matrix such as the following one:

+ +

+ 2×2 dither matrix +

+ +

Using the matrix coefficients as threshold values yield the following +results for black, white and three shades of grey (0.25, 0.5 and 0.75):

+ +

+ results of 2×2 dither matrix +

+ +

The dither matrix is therefore repeated all over the image. The first pixel +will be thresholded with a value of 0.2, the second pixel with a value of 0.8, +then the third pixel with a value of 0.2 again, and so on, resulting in an image +very similar to the one previously seen in 2.1:

+ +

+ tiled dither matrix + 2×2 Bayer dithering + 2×2 Bayer dithering gradient +

+ +

For better readability, the matrix is rewritten as following. The dither +coefficients are trivially computed from the matrix cells and the matrix size: +

+ +

+ normalised 2×2 dither matrix +

+ +

Different matrices can give very different results. This is a 4×4 Bayer +ordered dither matrix [17], recursively created from the previous 2×2 +dither matrix:

+ +

+ 4×4 Bayer matrix + 4×4 Bayer dithering + 4×4 Bayer dithering gradient +

+ +

This is an 8×8 Bayer matrix, recursively created from the 4×4 version:

+ +

+ 4×4 Bayer matrix + 4×4 Bayer dithering + 4×4 Bayer dithering gradient +

+ +

This 4×4 cluster dot matrix creates dot patterns:

+ +

+ 4×4 cluster dot matrix + 4×4 cluster dot dithering + 4×4 cluster dot dithering gradient +

+ +

This 8×8 cluster dot matrix mimics the halftoning techniques used by +newspapers:

+ +

+ 4×4 cluster dot matrix + 4×4 cluster dot dithering + 4×4 cluster dot dithering gradient +

+ +

This unusual 5×3 matrix creates artistic vertical line artifacts:

+ +

+ 4×4 cluster dot matrix + 4×4 cluster dot dithering + 4×4 cluster dot dithering gradient +

+ +

There are two major issues with ordered dithering. First, important +visual artifacts may appear. Even Bayer ordered dithering causes +weird cross-hatch pattern artifacts on some images. Second, dithering +matrices do not depend on the original image and thus do not take input +data into account: high frequency features in the image are often missed +and, in some cases, cause even worse artifacts.

+ +

2.4. Random ordered dithering

+ +

Random dithering can help reduce the major problem caused by halftoning, +which is the apparition of pattern artifacts. The method is as simple as +slightly perturbating dither matrix coefficients (or pixel values) +during the halftoning step. The difficult part is picking up an adequate +perturbation function: too much perturbation and the result is unrecognisable, +too little and the artifacts stay.

+ +

For instance, this is the result of 8×8 Bayer dithering perturbated by a +gaussian distribution (mean 0.0, standard deviation 0.08):

+ +

+ 4×4 Bayer dithering, gaussian perturbation + 4×4 Bayer dithering, gaussian perturbation gradient +

+ +

Another way to use random number generators to avoid pattern artifacts is +random dither matrix selection [22]. The image space is no longer tiled +with the same matrix over and over again, but with a random selection from a +list of similar dither matrices.

+ +

This example shows random matrix selection from a list of six 3×3 dither +matrices:

+ +

+ four 3×3 dispersed dot matrices + random Bayer matrix dithering + random Bayer matrix dithering gradient +

+ +

2.5. Non-rectangular dither tiles

+ +

Another way to avoid disturbing pattern artifacts is to use non-rectangular +dither tiles. Here are several examples, the first one generating slanted +square patterns, the second one hexagonal patterns, then slanted square +patterns again with a slightly different angle, and hexagonal patterns again. +The artifacts usually seen in Bayer dithering do not appear here:

+ +

+ cross dither tile + cross dithering + cross dithering gradient +

+ +

+ hex dither tile + hex dithering + hex dithering gradient +

+ +

+ square dither tile + square dithering + square dithering gradient +

+ +

+ hex2 dither tile + hex2 dithering + hex2 dithering gradient +

+ +

2.6. Supercell dithering

+ +

Supercell dithering consists in creating bigger dithering tiles +(supercells) from base tiles. One example is Victor Ostromoukhov’s +CombiScreen method [3].

+ +

Just like Bayer matrices, non-rectangular tiles can be used to recursively +create bigger patterns, giving finer results. The amount of shades of grey +that can be rendered using a given tile is the number of cells in the tile +plus one. Here are a few examples using tiles seen previously:

+ +

+ 4-wise cross dither tile + 4-wise cross dithering + 4-wise cross dithering gradient +

+ +

+ 3-wise hex dither tile + 3-wise hex dithering + 3-wise hex dithering gradient +

+ +

+ 4-wise square dither tile + 4-wise square dithering + 4-wise square dithering gradient +

+ +

This example shows a tile resembling a Davis-Knuth dragon curve. Though +the tile itself is beautiful, it is in reality only a reorganisation of an +8×8 Bayer dither matrix. Therefore the resulting image is exactly the same +as for classical Bayer dithering:

+ +

+ twin dragon dither tile + twin dragon dithering + twin dragon dithering gradient +

+ +

Here are two consecutive iterations of the hexagonal tiling shown +above. Since the area of the original tile is 10 cells, the first iteration +could display 11 different shades of grey. These iterations can display +respectively 31 and 91 shades:

+ +

+ 3-way hex2 dither tile + 3-way hex2 dithering + 3-way hex2 dithering gradient +

+ +

+ 9-way hex2 dither tile + 9-way hex2 dithering + 9-way hex2 dithering gradient +

+ +

2.7. Void and cluster method

+ +

Robert A. Ulichney’s void and cluster method [18] is a very generic +method for dither array generation. It mainly targets huge matrices in order +to reduce artifacts caused by tiling.

+ +

The process goes through many steps. First, a working pattern matrix +needs to be created:

+ +
    +
  • Generate an empty w×h matrix full of 0s
  • +
  • Set n cells to 1
  • +
  • The working matrix is uniformly distributed: +
      +
    • Find the 1 with the most neighbours set to 1 and set that cell + to 0
    • +
    • Find the 0 with the fewest neighbours set to 1 and set that cell + to 1
    • +
    • Repeat until the 1 was just put back where it originally was
    • +
    +
  • +
+ +

Usually n is about 10% of w×h. It can be generated +randomly, loaded from a known pattern, or created using a more powerful +algorithm (chapter 3 will introduce error diffusion algorithms that may be +used to generate the working pattern matrix).

+ +

The dither matrix is then generated from the working pattern in three +steps:

+ +
    +
  • Dither indices 0 to n - 1 are set using a first copy of the + working matrix
  • +
      +
    • n = n - 1
    • +
    • Find the 1 with the most neighbours set to 1 and set that cell + to 0
    • +
    • In the dither matrix, set the corresponding cell to n +
    • +
    • Repeat until n = 0
    • +
    + +
  • Dither indices n to w×h/2 are set using a second copy of + the working matrix
  • +
      +
    • Find the 0 with the fewest neighbours set to 1 and set that cell + to 1
    • +
    • In the dither matrix, set the corresponding cell to n +
    • n = n + 1
    • +
    • Repeat until n ≥ w×h/2
    • +
    + +
  • Dither indices w×h/2 to w×h are set using the same copy + of the working matrix
  • +
      +
    • Find the 0 with the fewest neighbours set to 1 and set that cell + to 1
    • +
    • In the dither matrix, set the corresponding cell to n +
    • n = n + 1
    • +
    • Repeat until n = w×h
    • +
    + +
+ +

The key part of the algorithm is the choice of the void finder and the +cluster finder for each step. Best results are achieved using Voronoï +tesselation [19] [22], but simpler methods such as gaussian +convolution [21] give decent results, too.

+ +

The following two matrices show the results of the algorithm using +randomly generated initial matrices of size respectively 14×14 and 25×25. +The void and cluster finder uses a simple 7×7 gaussian convolution filter. +Gray cells show the initial uniformly distributed matrix:

+ +

+ 14×14 void-and-cluster matrix +

+ +

+ 25×25 void-and-cluster matrix +

+ +

Dither matrices generated with the void and cluster method give impressive +results. They are pretty close to the best quality that can be achieved +using standard ordered dithering:

+ +

+ 14×14 void and cluster dithering + 14×14 void and cluster dithering gradient + 25×25 void and cluster dithering + 25×25 void and cluster dithering gradient +

+ +

This technique is covered by Ulichney’s U.S. patent 5535020 +and the specific implementation we showed is partly covered by Epson’s U.S. patent 6088512. +

+ + + + + + + + + diff --git a/static/study/part3.html b/static/study/part3.html new file mode 100644 index 0000000..c2b347f --- /dev/null +++ b/static/study/part3.html @@ -0,0 +1,632 @@ + + + + + + + + + + + + Libcaca study - 3. Error diffusion + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

3. Error diffusion

+ +

The idea behind error diffusion is to compute the error caused by +thresholding a given pixel and propagate it to neighbour pixels, in order to +compensate for the average intensity loss or gain. It is based upon the +assumption that a slightly out-of-place pixel causes little visual harm. +

+ +

The error is computed by simply substracting the source value and the +destination value. Destination value can be chosen by many means but does +not impact the image a lot with most methods in comparison to the crucial +choice of error distribution coefficients.

+ +

This is the simplest error diffusion method. It thresholds the image +to 0.5 and propagates 100% of the error to the next (right) pixel. It is +quite impressive given its simplicity but causes important visual artifacts: +

+ +

+ Simple error diffusion + Simple error diffusion gradient +

+ +

3.1. Floyd-Steinberg and JaJuNi error diffusion

+ +

The most famous error diffusion method is the Floyd-Steinberg +algorithm [5]. It propagates the error to more than one adjacent pixels using +the following coefficients:

+ +

+ Floyd-Steinberg +

+ +

The result of this algorithm is rather impressive even compared to the +best ordered dither results we could achieve:

+ +

+ Floyd-Steinberg error diffusion + Floyd-Steinberg error diffusion gradient +

+ +

Jarvis, Judice and Ninke dithering [7] (sometimes nicknamed +JaJuNi) was published almost at the same time as Floyd-Steinberg. It +uses a much more complex error diffusion matrix:

+ +

+ Jarvis, Judice and Ninke + Jarvis, Judice and Ninke error diffusion + Jarvis, Judice and Ninke error diffusion gradient +

+ +

3.2. Floyd-Steinberg derivatives

+ +

Zhigang Fan came up with several Floyd-Steinberg derivatives. Fan +dithering [8] just moves one coefficient around:

+ +

+ Fan + Fan error diffusion + Fan error diffusion gradient +

+ +

Shiau-Fan dithering use a family of matrices supposed to reduce +the apparition of artifacts usually seen with Floyd-Steinberg:

+ +

+ Shiau-Fan + Shiau-Fan error diffusion + Shiau-Fan error diffusion gradient +

+ +

+ Shiau-Fan 2 + Shiau-Fan 2 error diffusion + Shiau-Fan 2 error diffusion gradient +

+ +

By the way, these matrices are covered by Shiau’s and Fan’s +U.S. patent +5353127.

+ +

Stucki dithering [6] is a slight variation of Jarvis-Judice-Ninke +dithering:

+ +

+ Stucki + Stucki error diffusion + Stucki error diffusion gradient +

+ +

Burkes dithering is yet another variation [10] which improves on +Stucki dithering by removing a line and making the error coefficients fractions +of powers of two:

+ +

+ Burkes + Burkes error diffusion + Burkes error diffusion gradient +

+ +

Frankie Sierra [11] came up with a few error diffusion matrices: Sierra +dithering is a variation of Jarvis that is slightly faster because it +propagates to fewer pixels, Two-row Sierra is a simplified version +thereof, and Filter Lite is one of the simplest Floyd-Steinberg +derivatives:

+ +

+ Sierra + Sierra error diffusion + Sierra error diffusion gradient +

+ +

+ Sierra + Sierra error diffusion + Sierra error diffusion gradient +

+ +

+ Sierra + Sierra error diffusion + Sierra error diffusion gradient +

+ +

Atkinson dithering [12] only propagates 75% of the error, leading +to a loss of contrast around very dark and very light areas (also called +highlights and shadows), but better contrast in the midtones. The +original Macintosh software HyperScan used this dithering algorithm, +still considered superior to other Floyd-Steinberg derivatives by many Mac +zealots:

+ +

+ Atkinson + Atkinson error diffusion + Atkinson error diffusion gradient +

+ + + +

3.3. Changing image parsing direction

+ +

While image parsing order does not matter with ordered dithering, it can +actually be crucial with error diffusion. The reason is that once a pixel has +been processed, standard error diffusion methods do not go back.

+ +

The usual way to parse an image is one pixel after the other, following +their order in memory. When reaching the end of a line, we automatically jump +to the beginning of the next line. Error diffusion methods using this +parsing order are called raster error diffusion:

+ +

+ Regular parsing +

+ +

Changing the parsing order can help prevent the apparition of artifacts in +error diffusion algorithms. This is serpentine parsing, where every odd +line is parsed in reverse order (right to left):

+ +

+ Serpentine parsing +

+ +

The major problem with Floyd-Steinberg is the worm artifacts it +creates. Here is an example of an image made of grey 0.9 dithered with standard +Floyd-Steinberg and with serpentine Floyd-Steinberg [13 pp.266—267]. +Most of the worm artifacts have disappeared or were highly reduced:

+ +

+ Floyd-Steinberg on grey 90% + serpentine Floyd-Steinberg on grey 90% +

+ +

And here are the results of serpentine Floyd-Steinberg on Lena. Only a +very close look will show the differences with standard Floyd-Steinberg, but +a few of the artifacts did disappear:

+ +

+ serpentine Floyd-Steinberg + serpentine Floyd-Steinberg gradient +

+ +

Riemersma dithering [26] parses the image following a plane-filling +Hilbert curve and only propagates the error of the last q pixels, +weighting it with an exponential rule. The method is interesting and inventive, +unfortunately the results are disappointing: structural artifacts are worse +than with other error diffusion methods (shown here with q = 16 and r += 16):

+ +

+ Hilbert curve parsing + Riemersma dither on Hilbert curve + Riemersma dither on Hilbert curve gradient +

+ +

A variation of Riemersma dithering uses a Hilbert 2 curve, giving +slightly better results but still causing random artifacts here and there: +

+ +

+ Hilbert 2 curve parsing + Riemersma dither on Hilbert 2 curve + Riemersma dither on Hilbert 2 curve gradient +

+ +

An inherent problem with plane-filling curves is that distances on the +curve do not mean anything in image space. Riemersma dithering distributes +error to pixels according to their distance on the curve rather than their +distance in the image.

+ +

We introduce spatial Hilbert dithering that addresses this issue +by distributing the error according to spatial coordinates. We also get rid +of the r parameter, choosing to distribute 100% of the error.

+ +

This is spatial Hilbert dithering on a Hilbert curve and on a Hilbert 2 +curve. The results show a clear improvement over the original Riemersma +algorithm, with far less noise and smoother low-gradient areas:

+ +

+ spatial Hilbert dither on Hilbert curve + spatial Hilbert dither on Hilbert curve gradient + spatial Hilbert dither on Hilbert 2 curve + spatial Hilbert dither on Hilbert 2 curve gradient +

+ +

Dot diffusion [14] is an error diffusion method by Donald E. Knuth +that uses tileable matrices just like ordered dithering, except that the cell +value order is taken into account for error propagation. Diagonal cells get +half as much error as directly adjacent cells:

+ +

+ Dot diffusion +

+ +

For instance, in the following example, cell 25’s error is propagated to +cells 44, 36, 30, 34 and 49. Given the diagonal cells rule, cells 44, 30 and +49 each get 1/7 of the error and cells 36 and 34 each get 2/7 of the error. +Similarly, cell 63 gets 100% of cell 61’s error.

+ +

+ Dot diffusion matrix sample + Dot diffusion + Dot diffusion gradient +

+ +

The initial result is not extraordinary. But Knuth suggests applying a +sharpen filter to the original image before applying dot diffusion. He also +introduces a zeta value to deal with the size of laser printer dots, +pretty similar to what we’ll see later as gamma correction. The +following two images had a sharpening value of 0.9 applied to them. The image +on the right shows zeta = 0.2:

+ +

+ Dot diffusion sharpen 0.9 + Dot diffusion sharpen 0.9 gradient + Dot diffusion sharpen 0.9 zeta 0.2 + Dot diffusion sharpen 0.9 zeta 0.2 gradient +

+ +

Do not get fooled by Knuth’s apparent good results. They specifically +target dot printers and do not give terribly good results on a computer +screen. Actually, a sharpening filter makes just any dithering method look +better, even basic Floyd-Steinberg dithering (shown here with a sharpening +value of 0.9, too):

+ +

+ FS with sharpening + FS with sharpening gradient +

+ +

Dot diffusion was reinvented 14 years later by Arney, Anderson and Ganawan +without even citing Knuth. They call their method omni-directional error +diffusion. Instead of using a clustered dot matrix like Knuth recommends +for dot diffusion, they use a dispersed dot matrix, which gives far better +results on a computer display. This is a 16×12 portion of that matrix:

+ +

+ omni-directional ED matrix sample +

+ +

The preferred implementation of omni-directional error diffusion uses +a slightly different propagation matrix, where top and bottom neighbours get +more error than the others:

+ +

+ omni-directional ED + omni-directional ED + omni-directional ED gradient +

+ +

3.4. Variable coefficients error diffusion

+ +

Small error diffusion matrices usually cause artifacts to appear because +the error is not propagated in enough directions. At the same time, such +matrices also reduce the sharpened aspect common in error diffusion +techniques.

+ +

Ostromoukhov suggests error diffusion values that vary according to the +input value. The list of 256 discrete value triplets for d1, d2 +and d3 he provides [1] give pretty good results with serpentine parsing: +

+ +

+ Ostromoukhov ED matrix + Ostromoukhov ED + Ostromoukhov ED gradient +

+ +

3.5. Block error diffusion

+ +

Sometimes, due to physical restrictions of the target media, output +is limited to some combinations of pixel blocks, such as the ones shown +below:

+ +

+ list of 2×2 pixel blocks +

+ +

It is still possible to dither the image, by doing it 4 pixels at a +time and simply choosing the block from the list that minimises the global +error within the 2×2 block:

+ +

+ 2×2 pixel block quantisation + 2×2 pixel block quantisation gradient +

+ +

Damera-Venkata and Evans introduce block error diffusion [23], which +reuses traditional error diffusion methods such as Floyd-Steinberg but applies +the same error value to all pixels of a given block. Only one error value is +propagated, a+b+c+d, which is the global error within the block:

+ +

+ Floyd-Steinberg + ⊗ + 2×2 balanced matrix + = + 2×2-expanded Floyd-Steinberg +

+ +

Here are the results using the previous pixel blocks:

+ +

+ 2×2 block Floyd-Steinberg + 2×2 block Floyd-Steinberg gradient +

+ +

Carefully chosen blocks create constraints on the final picture that may +be of artistic interest:

+ +

+ artistic 3×3 blocks + 3×3 block Floyd-Steinberg + 3×3 block Floyd-Steinberg gradient +

+ +

Using all possible pixel blocks is not equivalent to dithering the image +pixel by pixel. This is due to both the block-choosing method, which only +minimises the difference of mean values within blocks intead of the sum of +local distances, and to the inefficient matrix coefficients, which propagate +the error beyond immediate neighbours, causing the image to look sharpened. +

+ +

This example shows standard block Floyd-Steinberg using all possible 2×2 +blocks:

+ +

+ all possible 2×2 blocks + full 2×2 block Floyd-Steinberg + full 2×2 block Floyd-Steinberg gradient +

+ +

The results on the vertical gradient indicate poor block-choosing. In +order to improve it, we introduce a modified, weighted intra-block error +distribution matrix, still based on the original Floyd-Steinberg matrix:

+ +

+ Floyd-Steinberg + ⊗ + weighted 2×2 matrix + = + weighted 2×2 propagation matrix +

+ +

The result still looks sharpened, but shows considerably less noise:

+ +

+ weighted full 2×2 block Floyd-Steinberg + weighted full 2×2 block Floyd-Steinberg gradient +

+ +

3.6. Sub-block error diffusion

+ +

We introduce sub-block error diffusion, a novel technique improving +on block error diffusion. It addresses the following observations:

+ +
    +
  • it is not a requirement to propagate the error beyond the immediate + neighbours; since it causes a sharpen effect, we decide not to do it. +
  • +
  • the individual subpixels’ error should be propagated, not the + global block error.
  • +
  • subpixel a’s error is harder to compensate than subpixel + d’s because its immediate neighbours are already in the block + being processed, so we weight the sub-block matching in order to + prioritise pixel a’s matching.
  • +
+ +

We use m⋅n error diffusion matrices, one for each of the current +block’s pixels. Here are four error diffusion matrices for 2×2 blocks, +generated from the standard Floyd-Steinberg matrix:

+ +

+ sub-block 0,0 Floyd-Steinberg + sub-block 1,0 Floyd-Steinberg +

+ +

+ sub-block 0,1 Floyd-Steinberg + sub-block 1,1 Floyd-Steinberg +

+ +

The results are far better than with the original block error diffusion +method. On the left, sub-block error diffusion with all possible 2×2 blocks. +On the right, sub-block error diffusion restricted to the tiles seen in +3.5:

+ +

+ full 2×2 sub-block Floyd-Steinberg + full 2×2 sub-block Floyd-Steinberg gradient + 2×2 lines sub-block Floyd-Steinberg + 2×2 lines sub-block Floyd-Steinberg gradient +

+ +

Similar error diffusion matrices can be generated for 3×3 blocks:

+ +

+ sub-block 0,0/3×3 Floyd-Steinberg + sub-block 1,0/3×3 Floyd-Steinberg + sub-block 2,0/3×3 Floyd-Steinberg +

+ +

+ sub-block 0,1/3×3 Floyd-Steinberg + sub-block 1,1/3×3 Floyd-Steinberg + sub-block 2,1/3×3 Floyd-Steinberg +

+ +

+ sub-block 0,2/3×3 Floyd-Steinberg + sub-block 1,2/3×3 Floyd-Steinberg + sub-block 2,2/3×3 Floyd-Steinberg +

+ +

Here are the results with all the possible 3×3 blocks, and with the +artistic 3×3 blocks seen in 3.5:

+ +

+ 3×3 sub-block Floyd-Steinberg + 3×3 sub-block Floyd-Steinberg gradient + 3×3 artistic sub-block Floyd-Steinberg + 3×3 artistic sub-block Floyd-Steinberg gradient +

+ + + + + + + + + diff --git a/static/study/part4.html b/static/study/part4.html new file mode 100644 index 0000000..db447ac --- /dev/null +++ b/static/study/part4.html @@ -0,0 +1,381 @@ + + + + + + + + + + + + Libcaca study - 4. Model-based dithering + + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

4. Model-based dithering

+ +

So far all dithering methods have relied on the assumption that carefully +positioned black and white pixels gave the illusion of greyscales, but we +have not stated exactly how the human eye reacted. Also, we do not have an +automated way to compare the results of two different algorithms: judging that +an algorithm is “better” has mostly been a subjective process so far.

+ +

In order to figure out what the human eye really sees, we need a human +visual system (HVS) model. Countless models exist, and we are only going to +focus on simple ones for now.

+ +

4.1. Gaussian human visual system model

+ +

One of the simplest models is the gaussian HVS model. It states +that the human eye acts like a gaussian convolution filter, slightly blurring +pixel neighbourhoods and therefore simulating what the eye sees as distance +from the image increases. This model, a simplified luminance spatial +frequency response formula, can be expressed using the two-dimensional +e -(x²+y²)/2σ² function. The σ +parameter sort of introduces the viewing distance into the model.

+ +

Here are the results of applying a gaussian HVS to an 8×8 Bayer dithered +image, simply by convoluting the image with a gaussian blur filter. This +process is also known as inverse halftoning. Different values of +σ simulate what the eye sees from different distances. On the left +σ = 1, on the right σ = 2:

+ +

+ 8×8 Bayer dither, gaussian HVS, σ = 1 + 8×8 Bayer dither, gaussian HVS, σ = 1 gradient + 8×8 Bayer dither, gaussian HVS, σ = 2 + 8×8 Bayer dither, gaussian HVS, σ = 2 gradient +

+ +

4.2. Direct binary search

+ +

We have already seen that standard error diffusion methods do not go back +to pixels that have been set. Direct binary search [4] (DBS) is an +iterative method that processes the image a fixed number of times, or until the +error can no longer be minimised:

+ +
    +
  • Generate an initial dithered image
  • +
  • Repeat until no changes can be applied: +
      +
    • Compute the global error between the original and the dithered + images
    • +
    • For each pixel in the dithered image: +
        +
      • Compute the effect on the error of toggling the value of the + current pixel
      • +
      • Compute the effect on the error of swapping the current pixel + with one of its immediate neighbours
      • +
      • If the error can be reduced, perform the corresponding + action
      • +
      +
    • +
    +
  • +
+ +

The efficiency and quality of DBS depend on many implementation details, +starting with the HVS model it uses to compute the error. Also, the initial +image used as iteration zero will give poor results if pattern artifacts are +already present. The order in which pixels are processed is important, too. +Unfortunately, despite its very high-quality results, DBS is usually a very +slow algorithm.

+ +

Below is an example of the algorithm results. The HVS uses a 11×11 +convolution kernel of the e -sqrt(x²+y²) +function. The initial image is randomly thresholded, and pixels are processed +in raster order. Iterations 1, 2 and 5 are shown:

+ +

+ direct binary search, iteration 0 + direct binary search, iteration 0 gradient + direct binary search, iteration 1 + direct binary search, iteration 1 gradient +

+ +

+ direct binary search, iteration 2 + direct binary search, iteration 2 gradient + direct binary search, iteration 5 + direct binary search, iteration 5 gradient +

+ +

Other HVS models can be used, giving very high quality results. Below are +the results of DBS with the following HVS functions:

+ +
    +
  • e -(x²+y²)/2
  • +
  • e -(x²+y²)/4.5
  • +
  • e -(x²+y²)/8
  • +
  • 2e -(x²+y²)/1.5 + e + -(x²+y²)/8
  • +
+ +

The iteration shown is number 5. More iterations would have improved +the results even slightly more, but that would have been at the expense of +performance:

+ +

+ direct binary search, sigma = 1, iteration 5 + direct binary search, sigma = 1, iteration 5 gradient + direct binary search, sigma = 1.5, iteration 5 + direct binary search, sigma = 1.5, iteration 5 gradient +

+ +

+ direct binary search, sigma = 2, iteration 5 + direct binary search, sigma = 2, iteration 5 gradient + direct binary search, best HVS, iteration 5 + direct binary search, best HVS, iteration 5 gradient +

+ +

4.3 Comparing dithering algorithms

+ +

Using an HVS model, it is possible to classify previously seen algorithms +simply by applying the model to both the source and the destination images, +and computing their per-pixel mean squared error. This gives a better +estimation of the dithering algorithm’s quality than simply computing a +local, pixel-bound error.

+ +

The following table shows that different HVS models give very different +error values depending on the value of σ. Also, in the case of +the DBS algorithm, a carefully crafted HVS function such as the last one, +which combines two different HVS models, gives low error values at every +σ, which means the dithered image is close to the original image at all +corresponding viewing distances:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Chapter 1: ThresholdingError %
σ = 1
Error %
σ = 1.5
Error %
σ = 2
0.5 thresholding8.603037.935547.42669
0.4 thresholding9.789909.109948.61878
0.6 thresholding10.7768910.3337310.00462
dynamic thresholding10.315689.607499.09760
uniform random dithering1.578950.697620.39713
gaussian random dithering2.955902.344612.08792
Chapter 2: HalftoningError %
σ = 1
Error %
σ = 1.5
Error %
σ = 2
25/50/75% patterns dithering0.566420.464900.41816
2×2 Bayer dithering0.566940.466220.41956
4×4 Bayer dithering0.205380.080600.05457
8×8 Bayer dithering0.196910.063520.03354
4×4 cluster dot dithering1.200260.148630.07100
8×8 cluster dot dithering3.862360.852360.14443
5×3 artistic line dithering2.755900.494200.11578
perturbated 8×8 Bayer dithering0.405500.169710.09804
random 3×3 dithering matrix selection0.603290.250550.16521
“plus” pattern dithering0.430610.335400.29851
“hex” pattern dithering0.267470.161190.13068
“doubleplus” pattern dithering0.428520.122320.08904
“hex2” pattern dithering0.350570.130460.09533
4-wise supercell “plus” pattern dithering0.219030.074940.04423
3-wise supercell “hex” pattern dithering0.216210.073560.04193
4-wise supercell “doubleplus” pattern dithering0.408830.070510.03609
6th order dragon curve dithering0.205030.067190.03539
3-wise supercell “hex2” pattern dithering0.326430.078610.04061
9-wise supercell “hex2” pattern dithering0.323360.077750.04087
14×14 void-and-cluster dithering0.197260.067480.03663
25×25 void-and-cluster dithering0.192480.062670.03325
Chapter 3: Error diffusionError %
σ = 1
Error %
σ = 1.5
Error %
σ = 2
naïve error diffusion0.333520.063720.01961
Floyd-Steinberg error diffusion0.092490.018470.00859
serpentine Floyd-Steinberg error diffusion0.098910.018490.00749
Jarvis, Judice and Ninke dithering0.271980.062570.03472
Fan dithering0.102200.017280.00705
4-cell Shiau-Fan dithering0.116180.017850.00660
5-cell Shiau-Fan dithering0.115500.019500.00708
Stucki dithering0.197650.053730.03012
Burkes dithering0.158310.040140.02178
Sierra dithering0.234980.054150.03011
Sierra 2 dithering0.222490.051210.02812
Filter Lite0.097400.016050.00638
Atkinson dithering0.472090.310120.27339
Riemersma dithering on a Hilbert curve0.282240.065290.02693
Riemersma dithering on a Hilbert 2 curve0.266220.060030.02492
spatial Hilbert dithering on a Hilbert curve0.272890.061240.02184
spatial Hilbert dithering on a Hilbert 2 curve0.228210.052460.01911
dot diffusion0.383010.080630.01918
dot diffusion with sharpen = 0.90.785460.349410.23479
dot diffusion with sharpen = 0.9 and zeta = 0.22.912872.193981.99858
serpentine Floyd-Steinberg with sharpen = 0.90.626150.308510.22111
omni-directional error diffusion0.238600.068210.03498
Ostromoukhov’s variable error diffusion0.112030.017720.00593
nearest block matching with 2×2 line tiles1.924301.348221.13685
block error diffusion with 2×2 line tiles0.868070.224110.08901
block error diffusion with 3×3 artistic tiles1.786260.569570.23000
block error diffusion with all 2×2 tiles0.564660.159100.06946
block error diffusion with all 2×2 tiles and
weighted intra-block error distribution
0.377380.104340.04643
sub-block error diffusion with all 2×2 tiles0.146970.026050.00894
sub-block error diffusion with 2×2 line tiles0.357590.060810.01855
sub-block error diffusion with all 3×3 tiles0.328020.065160.02165
sub-block error diffusion with 3×3 artistic tiles1.039630.218390.06678
Chapter 4: Model-based ditheringError %
σ = 1
Error %
σ = 1.5
Error %
σ = 2
DBS with HVS e -sqrt(x²+y²), iteration 10.258100.067800.03489
DBS with HVS e -sqrt(x²+y²), iteration 20.137620.032340.01939
DBS with HVS e -sqrt(x²+y²), iteration 50.104520.027450.01918
DBS with HVS e -(x²+y²)/2, iteration 50.103440.038600.02669
DBS with HVS e -(x²+y²)/4.5, iteration 50.180340.009840.00219
DBS with HVS e -(x²+y²)/8, iteration 50.378040.028660.00295
DBS with HVS 2e -(x²+y²)/1.5 + e -(x²+y²)/8, iteration 50.098380.008840.00263
+ + + +

+ + + + + + + + + diff --git a/static/study/part5.html b/static/study/part5.html new file mode 100644 index 0000000..d136e5c --- /dev/null +++ b/static/study/part5.html @@ -0,0 +1,214 @@ + + + + + + + + + + + + Libcaca study - 5. Greyscale dithering + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

5. Greyscale dithering

+ +

At first sight, generalising dithering to three grey scales seems pretty +straightforward: just add grey 0.5 in the middle of the palette and dither +pixels in the [0, 0.5] range with black and grey, and pixels in the [0.5, 1] +range with grey and white. Here are two different results with 8×8 Bayer +ordered dithering and with serpentine Floyd-Steinberg error diffusion:

+ +

+ 8×8 Bayer ordered dithering, 3 colours + 8×8 Bayer ordered dithering gradient, 3 colours + serpentine FS error diffusion, 3 colours + serpentine FS error diffusion gradient, 3 colours +

+ +

These are pretty much the images that imaging software such as The Gimp +would give (using “positioned” and “Floyd-Steinberg” dithering modes).

+ +

Unfortunately the result is not as good as expected: the white pattern +on Lena’s cheeks is visually disturbing, and there is a lot of 0.5 grey in +the image. Also, the whole image looks darker than with pure black-and-white +dithering, but these previous dithering results looked a lot brighter than +the original image anyway.

+ +

All these issues have to do with the output media’s gamma.

+ +

5.1. Introducing gamma

+ +

If you are reading this document on a computer screen, you may have +noticed that the black and white 50% pattern was closer to a 0.73 greyscale +(left) than to the intuitively expected 0.5 value (right). If you are reading +a printed copy, it might be a different matter.

+ +

+ introducing gamma +

+ +

The mapping linking greyscale steps to intensities is called gamma +correction. An approximate law for gamma correction is given as +I = vγ where v is the coded colour +value (between 0 and 1), I is the perceived colour intensity (between +0% and 100%) and γ is the gamma. A pattern made of even-numbered +0%-intensity pixels and 100%-intensity pixels has an intensity of 50% by +definition. But the corresponding greyscale depends on the gamma value.

+ +

Most modern computer systems use the sRGB gamma model close to the law +with γ = 2.2. As can be seen, it is highly non-linear:

+ +

+ introducing gamma +

+ +

Éric Brasseur wrote a pretty comprehensive +essay [16] about why on a computer screen a 50% black and white pattern +should be scaled down to a grey value of 0.73 instead of 0.5 and how major +computer graphics software totally misses the point. Conversely, it clearly +means that a grey value of 0.5 should not be emulated with a 50% dither +pattern.

+ +

The following figure shows the gamma curve for the naïve three-colour +greyscale gradient we saw above (red curve) compared to the two-colour +gradient (blue curve). Two major observations can be made: the new curve is +far closer to a perfect, linear gradient, but there is a singularity in the +middle of the curve, meaning a break in the gradient’s smoothness.

+ +

+ 3-colour gamma +

+ +

There are three possible ways to reduce the singularity and make the +gradient smoother and/or closer to the original colours:

+ +
    +
  • Choose a different middle grey value, for instance choosing grey 0.73 + will cancel the singularity and match the two-colour gradients we have + been using so far. This is not always possible if the output palette + is fixed.
  • +
  • Don’t place the grey value at the middle of the gradient, for instance + a value of around 25% intensity will again match the previous two-colour + gradients.
  • +
  • Gamma-correct input pixels before assigning them an output + value. This ensures that the resulting gradient is perfectly linear + and has no singularity. +
  • +
+ +

5.2. Gamma correction

+ +

Gamma correction consists in converting pixel values into intensity values +before performing operations on them, then reconverting them to pixel values +before displaying them. The exact same algorithms can be used, they just +operate on slightly different data.

+ +

+ 3-colour gamma coorection +

+ +

Here are the results of gamma-correcting input pixels before doing +any computation on them, then using serpentine Floyd-Steinberg error +diffusion:

+ +

+ serpentine FS, 2 colours, gamma-corrected + serpentine FS, 2 colours, gamma-corrected gradient + serpentine FS, 3 colours, gamma-corrected + serpentine FS, 3 colours, gamma-corrected gradient +

+ +

Two-colour dithering is not visually satisfying: dark areas lack much +detail because the gamma curve is very flat at low intensities. However, +the result itself is far more accurate that previously. The problem, while +still visible, is even less important with three-colour dithering: the image +on the right is superior to what The Gimp or Adobe Photoshop are able to +come up with.

+ +

Finally, this is gamma-corrected 4-colour dithering:

+ +

+ serpentine FS, 4 colours, gamma-corrected + serpentine FS, 4 colours, gamma-corrected gradient +

+ +

5.3. Greyscale sub-block error diffusion

+ +

Support for greyscale and gamma correction is trivially added to our +sub-block error diffusion method. Best-tile choosing is done in contrast +space, while error diffusion is done in intensity space.

+ +

The following picture uses all possible 4-greyscale 2×2 tiles. The +output quality is very close to what standard, pixel-per-pixel error diffusion +achieves:

+ +

+ sub-block FS, full 4-grey tiles + sub-block FS, full 4-grey tiles gradient +

+ +

And finally, this picture only uses 4-greyscale combinations of the +“lines” tiles seen previously:

+ +

+ list of 4-grey 2×2 pixel blocks + sub-block FS, lines 4-grey tiles + sub-block FS, lines 4-grey tiles gradient +

+ + + + + + + + + diff --git a/static/study/part6.html b/static/study/part6.html new file mode 100644 index 0000000..574b43f --- /dev/null +++ b/static/study/part6.html @@ -0,0 +1,256 @@ + + + + + + + + + + + + Libcaca study - 6. Colour dithering + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

6. Colour dithering

+ +

Dithering colour images means dithering three-dimensional elements (RGB +pixels) instead of one-dimensional grey values. It is very complex and +depends on the output media even more than greyscale dithering.

+ +

6.1. Separate-space dithering

+ +

In some cases it is possible to perform three one-dimensional dithering +operations instead of one three-dimensional one. Consider for instance the +following palette: +

+ +

+ 8-colour RGB palette +

+ +

It is made of the eight possible red/green/blue combinations made of 0 +and 1 values:

+ +
+ + + + + + + + + + + + + + +
Red0 0 1 10 0 1 1
Green0 0 0 01 1 1 1
Blue0 1 0 10 1 0 1
+
+ +

One way of dithering an image using this palette is to convert the image +into three greyscale images (separating the red, green and blue channels), +dither each subimage to two colours separately and recombine the images into +three channels. For instance, if at a given pixel the red channel is dithered +to 1 and the green and blue channels are dithered to 0, the final pixel will +be [1 0 0] which is the colour red.

+ +

Separate-space dithering works by splitting the image into three red, +green and blue channels. Each of this channel is treated as a greyscale image +that is then dithered to black and white using any dithering method seen +previously. The resulting images are then treated again as three red, green +and blue channels and recombined into the final image:

+ +

+ separate-space dithering +

+ +

Here are the results with serpentine Floyd-Steinberg dithering applied to +each channel. On the left, no colour correction, as The Gimp or Photoshop would +do; on the right, gamma-corrected dithering:

+ +

+ serpentine FS, 8 colours + serpentine FS, 8 colours gradient + serpentine FS, 8 colours, gamma-corrected + serpentine FS, 8 colours, gamma-corrected gradient +

+ +

6.2. Accounting for other dimensions

+ +

The previous palette was suitable for separate-space dithering. Such a +palette is called separable or orthogonal.

+ +

Here is a palette that cannot be used in the same way:

+ +

+ 8-colour RGB palette +

+ +

As can be seen, it does not have the [0.5 0.5 0.5] grey colour, or the +[1 0.5 0] orange colour, for instance, despite having other combinations of +0, 0.5 and 1 values:

+ +
+ + + + + + + + + + + + + + + + + + + + +
Red0 0 0.5 0.50 0 0.5 0.70.3 0 1 10 0 1 1
Green0 0 0 00.5 0.5 0.5 0.70.3 0 0 01 1 1 1
Blue0 0.5 0 0.50 0.5 0 0.70.3 1 0 10 1 0 1
+
+ +

It is no longer possible to compute the closest colour in each colourspace +and combine them into an RGB colour, since that colour might not be available +in the palette. So we need to determine what the “closest colour” means when +dealing with the whole colour spectrum.

+ +

The following examples show gamma-corrected Floyd-Steinberg using the +above 16-colour palette and two different definitions of distance: the sum +of absolute differences and the euclidian distance. The sum of +absolute differences performs pretty poorly because it does not penalise wide +disparities:

+ +

+ Floyd-Steinberg, sum of absolute differences + Floyd-Steinberg, sum of absolute differences gradient + Floyd-Steinberg, euclidian distance + Floyd-Steinberg, euclidian distance gradient +

+ +

Distances can be computed in another space. For instance, the HSV +space allows to give colour variations a smaller influence than brightness +variations simply by changing the HSV cone’s height. On the left is spatial +Floyd-Steinberg using the euclidian distance in an HSV cone of height 1 and +base radius 1. On the right is the same distance within a cone of height 3 and +base radius 1:

+ +

+ Floyd-Steinberg, 1×1 HSV cone + Floyd-Steinberg, 1×1 HSV cone gradient + Floyd-Steinberg, 3×1 HSV cone + Floyd-Steinberg, 3×1 HSV cone gradient +

+ +

6.3. Reducing visual artifacts

+ +

The following patterns show four ways to dither the same colour using +our 8-colour palette:

+ +
    +
  • 1/2 black, 3/8 blue, 1/8 white
  • +
  • 1/2 blue, 3/8 black, 1/8 yellow
  • +
  • 3/8 black, 3/8 blue, 1/8 red, 1/8 cyan
  • +
  • 1/2 blue, 1/4 black, 1/8 red, 1/8 green
  • +
+ +

All patterns visually blend to the same shade, but the last one is +the most visually appealing:

+ +

+ 3 ways to dither the same colour +

+ +

Shaked, Arad, Fitzhugh and Sobel introduce the minimum brightness +variation criterion (MBVC), stating that in order to reduce halftone noise, +the halftone set which should be used to render the desired colour should be +the one whose brightness variation is minimal [25]. Similarly, Klassen et +al. suggest the selection of low-contrast colour combiation wherever +possible [24].

+ +

6.4. Colour sub-block error diffusion

+ +

Adapting sub-block error diffusion to colour images is almost +straightforward. The major problem is proper weighting in the block-choosing +step. It is a crucial part of the algorithm, and we have yet to find an +efficient method to perform it.

+ +

The images below shows the result using our now well-known “lines” tile +list, using respectively the 8-colour palette and the 16-colour palette:

+ +

+ 8-colour sub-block error diffusion + 8-colour sub-block error diffusion gradient + 16-colour sub-block error diffusion + 16-colour sub-block error diffusion gradient +

+ +

Speed is starting to become a problematic issue. A 16-colour palette can +generate 65,536 unique 2×2 blocks. Exhaustive search to determine the best +tile is no longer realistic, and we need to find better ways to find the +best matching block.

+ + + + + + + + + diff --git a/static/study/part7.html b/static/study/part7.html new file mode 100644 index 0000000..a810502 --- /dev/null +++ b/static/study/part7.html @@ -0,0 +1,140 @@ + + + + + + + + + + + + Libcaca study - 7. Photographic mosaics + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

7. Photographic mosaics

+ +

Photographic mosaics are montages of smaller images creating the illusion +of a bigger image.

+ +

Since we don’t have many images at our disposal, we will simply cut Lena +into small chunks (called tiles) and use these parts to create mosaics. +This is our tile database:

+ +

+ Patterns taken from Lena +

+ +

Generating a photomosaic consists in subdividing the original picture +into x rectangular cells and find x tiles in the database +(with or without duplicates, depending on the set of rules that is decided) +so that when recombined the resulting image resembles the original picture. +By the way, this technique is covered by Runaway Technology Inc.’s +U.S. patent +6137498 [9].

+ +

Picking the right tile for the right cell in the grid is a very +expensive and complicated operation. One of the biggest problems is the +cost of a database lookup: comparing each tile area pixel-by-pixel +is an O(N) operation where N is the size of the database. We can resort +to image classification in order to speed up database lookups.

+ +

7.1. Image classification

+ +

One of the simplest image classification techniques is the storage of +each tile’s average colour into a separate database that is used for +best match lookups. Of course, this computation should be gamma-corrected: +

+ +

+ 1 feature extracted from Lena patterns +

+ +

When creating the mosaic, we then only need to check the average colour +instead of comparing each pixel one by one. Below is the result of the +technique applied on a portion of the Lena picture:

+ +

+ Lena (detail) + Mosaic created from Lena’s detail +

+ +

Better results can be achieved by storing four colour values, one +for each corner of the tile:

+ +

+ 4 features extracted from Lena patterns +

+ +

Having 12 values per tile (4 RGB triplets) is still a lot less than the +original count of 3072 (for 32×32 tiles), and the results show clear +improvement. For instance the feathers-hat frontier is now a lot smoother:

+ +

+ Lena (detail) + Mosaic created from Lena’s detail +

+ +

7.2. Error diffusion

+ +

TODO

+ +

7.3. Colour ASCII art

+ + + +

+ ASCII art tiles +

+ + + + + + + + + diff --git a/static/study/source.html b/static/study/source.html new file mode 100644 index 0000000..8282ad1 --- /dev/null +++ b/static/study/source.html @@ -0,0 +1,101 @@ + + + + + + + + + + + + Libcaca study - Source code + + + + + + + + + + +

Warning: this +document is still work in progress. Feel free to send comments but do not +consider it final material.

+ + + + + +

Source code

+ +

This is the full Python source code to all examples presented in this +document. It can also be downloaded as a standalone study.py Python program.

+ +

Just install the python-gd package on your favourite operating +system and run the script. With the exception of the original colour 512×512 Lena +image, all Lena images and gradients were generated from this program. If +you have installed Inkscape, many graphics such as dither matrices will also +be automatically generated.

+ +

Many algorithms implemented here will seem rather inefficient to people +used to writing image processing software. This is because clarity was almost +always preferred over performance. We believe this document to be of important +value to many researchers in the field, because it implements methods for which +there is no public implementation.

+ +
 $l) {
+    if(ereg('temporary cruft', $l))
+      break;
+    $l = htmlspecialchars($l);
+    $c = 0;
+    $l = preg_replace('/#[^0-9a-f].*/', '\\0',
+                      $l, -1, $c);
+    if($c <= 0) {
+      $l = preg_replace('/(".*"|\\\\$)/',
+                        '\\0', $l);
+      $l = ereg_replace('[A-Z][A-Z][A-Z0-9_]*',
+                        '\\0', $l);
+      $l = preg_replace('/\b(for|def|in|return|while|if|elif|else|class |True|False|None|break|continue|and|or|not|print|global|import|try|catch|yield)\b/',
+                        '\\0', $l);
+      $l = preg_replace('/\b([0-9]+[.][0-9]*|[0-9]*[.][0-9]+|[0-9]+)\b/',
+                        '\\0', $l);
+    }
+    echo $l;
+  }
+?>
+ + + + + + + + + diff --git a/static/study/study.py b/static/study/study.py new file mode 100755 index 0000000..af886aa --- /dev/null +++ b/static/study/study.py @@ -0,0 +1,2775 @@ +#!/usr/bin/env python + +import math, gd, random, sys, os + +# Select which chapters to run +def chapter(n): + if len(sys.argv) == 1: + return True + return str(n) in sys.argv + +############################################################################## + +# Tiny image class to make examples short and readable +class Image(gd.image): + gd.gdMaxColors = 256 * 256 * 256 + def __init__(self, *args): + if args[0].__class__ == str: + print "[LOAD] %s" % (args[0],) + gd.image.__init__(self, *args) + def save(self, name): + print "[PNG] %s" % (name,) + self.writePng(name) + def getGray(self, x, y): + p = self.getPixel((x, y)) + c = self.colorComponents(p)[0] / 255.0 + return c + def getRgb(self, x, y): + p = self.getPixel((x, y)) + rgb = self.colorComponents(p) + return [rgb[0] / 255.0, rgb[1] / 255.0, rgb[2] / 255.0] + def setGray(self, x, y, t): + p = (int)(t * 255.999) + c = self.colorResolve((p, p, p)) + self.setPixel((x, y), c) + def setRgb(self, x, y, r, g, b): + r = (int)(r * 255.999) + g = (int)(g * 255.999) + b = (int)(b * 255.999) + c = self.colorResolve((r, g, b)) + self.setPixel((x, y), c) + def getRegion(self, x, y, w, h): + dest = Image((w, h), True) + self.copyTo(dest, (-x, -y)) + return dest + def getZoom(self, z): + (w, h) = self.size() + dest = Image((w * z, h * z), True) + for y in range(h): + for x in range(w): + rgb = self.getRgb(x, y) + for j in range(z): + for i in range(z): + dest.setRgb(x * z + i, y * z + j, *rgb) + return dest + +# Manipulate gamma values +class Gamma: + def CtoI(x): + if x < 0: + return - math.pow(-x, 2.2) + return math.pow(x, 2.2) + def ItoC(x): + if x < 0: + return - math.pow(-x, 1 / 2.2) + return math.pow(x, 1 / 2.2) + CtoI = staticmethod(CtoI) + ItoC = staticmethod(ItoC) + def CtoI3(x): + return [Gamma.CtoI(x[0]), Gamma.CtoI(x[1]), Gamma.CtoI(x[2])] + def ItoC3(x): + return [Gamma.ItoC(x[0]), Gamma.ItoC(x[1]), Gamma.ItoC(x[2])] + CtoI3 = staticmethod(CtoI3) + ItoC3 = staticmethod(ItoC3) + def Cto2(x): + if x < Gamma.CtoI(0.50): + return 0. + return 1. + def Cto3(x): + if x < Gamma.CtoI(0.25): + return 0. + elif x < Gamma.CtoI(0.75): + return Gamma.CtoI(0.5) + return 1. + def Cto4(x): + if x < Gamma.CtoI(0.17): + return 0. + elif x < Gamma.CtoI(0.50): + return Gamma.CtoI(0.3333) + elif x < Gamma.CtoI(0.83): + return Gamma.CtoI(0.6666) + return 1. + Cto2 = staticmethod(Cto2) + Cto3 = staticmethod(Cto3) + Cto4 = staticmethod(Cto4) + +# Create matrices +def Matrix(w, h, val = 0): + return [[val] * w for n in range(h)] + +# Iterate in 2D space +def rangexy(w, h): + for y in range(h): + for x in range(w): + yield (x, y) + +############################################################################## + +# Create SVG files from matrix data +class Svg: + _data = '' + _w, _h = 0, 0 + def _colorise(val): + return '#fff' + def _reduce(this, val): + if type(val) == float: + for x in range(1, 1000): + if abs(val * x - round(val * x)) < 0.001: + return (int)(round(val * x)), x + return val, 1 + def __init__(self, mat, colorise = _colorise): + # Check whether it is an error diffusion matrix + ed = False + for l in mat: + for x in l: + if type(x) == str or math.floor(x) != x: + ed = True + # Generate SVG file + (w, h) = (len(mat[0]), len(mat)) + s = \ + '\n' \ + '\n' \ + ' \n' \ + ' \n' % (64 * w + 2, 64 * h + 2) + line = \ + ' \n' + box = \ + ' \n' + text = \ + ' %s\n' + for x, y in rangexy(w, h): + val = mat[y][x] + if not ed and val == -1: + continue + if ed and val == 0: + continue + # Put box + (ix, iy) = (64. * x + 1, 64. * y + 1) + if ed and val == -1: + val = '' + c = '#fbb' + else: + c = colorise(val) + s += box % (ix, iy, ix + 64, iy, ix + 64, iy + 64, ix, \ + iy + 64, c) + # Put value + a, b = self._reduce(val) + extra = '' + if b == 1: + (tx, ty) = (ix + 32, iy + 44) + n = len(str(val)) + if n > 3 and type(val) == str: + extra = ' transform="scale(0.7,0.7)"' + tx = tx / 0.7 + ty = ty / 0.7 + elif n > 3: + extra = ' transform="scale(0.7,1.)"' + tx = tx / 0.7 + elif n > 2: + extra = ' transform="scale(0.8,1.)"' + tx = tx / 0.8 + s += text % (32, tx, ty, extra, val) + else: + s += line % (ix + 8, iy + 32, ix + 56, iy + 32) + (tx, ty) = (ix + 32, iy + 26) + s += text % (24, tx, ty, extra, a) + (tx, ty) = (ix + 32, iy + 56) + s += text % (24, tx, ty, extra, b) + s += \ + ' \n' \ + '\n' + self._w = 64 * w + 2 + self._h = 64 * h + 2 + self._data = s + def save(self, name, size): + svgname = name + ".tmp.svg" + f = open(svgname, 'w') + f.write(self._data) + f.close() + f = os.popen("inkscape %s -a %u:%u:%u:%u -w%u -h%u -e %s >/dev/null 2>&1" % (svgname, 0, 0, self._w, self._h, size * self._w / 64., size * self._h / 64., name)) + print "[SVG] %s" % (name,) + f.close() + os.unlink(svgname) + +############################################################################## +print "Initialisation" + +# Load the original Lena image +lena512 = Image("lena512.png") +(w, h) = lena512.size() + +# Image 1: greyscale conversion +# Read the compression FAQ [55] for the rationale behind using the green +# channel (http://www.faqs.org/faqs/compression-faq/part1/section-30.html) +if chapter(0): + (w, h) = lena512.size() + lena512bw = Image((w, h)) + for x, y in rangexy(w, h): + rgb = lena512.getRgb(x, y) + c = rgb[1] + lena512bw.setGray(x, y, c) + lena512bw.save("lena512bw.png") +else: + lena512bw = Image("lena512bw.png") + +def gammascale(src, scale): + (w, h) = src.size() + count = src.colorsTotal() + dest = Image((w / scale, h / scale), count == 0 or count > 256) + for x, y in rangexy(w / scale, h / scale): + r = g = b = 0. + for i, j in rangexy(scale, scale): + rgb = src.getRgb(x * scale + i, y * scale + j) + r += Gamma.CtoI(rgb[0]) + g += Gamma.CtoI(rgb[1]) + b += Gamma.CtoI(rgb[2]) + r = Gamma.ItoC(r / (scale * scale)) + g = Gamma.ItoC(g / (scale * scale)) + b = Gamma.ItoC(b / (scale * scale)) + dest.setRgb(x, y, r, g, b) + return dest + +# Image 2: 50% greyscale +# Image 3: 50% scaling +if chapter(0): + lena256bw = gammascale(lena512bw, 2) + lena256bw.save("lena256bw.png") + lena256 = gammascale(lena512, 2) + lena256.save("lena256.png") +else: + lena256bw = Image("lena256bw.png") + lena256 = Image("lena256.png") + +# Create a 32x256 greyscale gradient +if chapter(0): + grad256bw = Image((32, 256)) + for x, y in rangexy(32, 256): + grad256bw.setGray(x, 255 - y, y / 255.) + grad256bw.save("gradient256bw.png") +else: + grad256bw = Image("gradient256bw.png") + +# Create a 64x256 colour gradient +if chapter(0): + grad256 = Image((64, 256), True) + for x, y in rangexy(64, 256): + grad256.setRgb(x, y, x / 63., (255. - y) / 255, x / 63.) + grad256.save("gradient256.png") +else: + grad256 = Image("gradient256.png") + +############################################################################## +if chapter(1): + print "Chapter 1. Colour quantisation" + +# Output 1.1.1: 50% threshold +# Output 1.1.2: 40% threshold +# Output 1.1.3: 60% threshold +def test11x(src, threshold): + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) > threshold + dest.setGray(x, y, c) + return dest + +if chapter(1): + test11x(grad256bw, 0.5).save("out/grad1-1-1.png") + test11x(lena256bw, 0.5).save("out/lena1-1-1.png") + test11x(grad256bw, 0.4).save("out/grad1-1-2.png") + test11x(lena256bw, 0.4).save("out/lena1-1-2.png") + test11x(grad256bw, 0.6).save("out/grad1-1-3.png") + test11x(lena256bw, 0.6).save("out/lena1-1-3.png") + +# Output 1.2.1: 3-colour threshold +# Output 1.2.2: 5-colour threshold +def test12x(src, colors): + (w, h) = src.size() + dest = Image((w, h)) + q = colors - 1 + p = -.00001 + colors + for x, y in rangexy(w, h): + c = src.getGray(x, y) + c = math.floor(c * p) / q + dest.setGray(x, y, c) + return dest + +if chapter(1): + test12x(grad256bw, 3).save("out/grad1-2-1.png") + test12x(lena256bw, 3).save("out/lena1-2-1.png") + test12x(grad256bw, 5).save("out/grad1-2-2.png") + test12x(lena256bw, 5).save("out/lena1-2-2.png") + +# Output 1.2.3: 3-colour threshold, minimal error +# Output 1.2.4: 5-colour threshold, minimal error +def test12y(src, colors): + (w, h) = src.size() + dest = Image((w, h)) + q = colors - 1 + p = -.00001 + colors - 1 + for x, y in rangexy(w, h): + c = src.getGray(x, y) + c = math.floor((c + 0.5 / p) * p) / q + dest.setGray(x, y, c) + return dest + +if chapter(1): + test12y(grad256bw, 3).save("out/grad1-2-3.png") + test12y(lena256bw, 3).save("out/lena1-2-3.png") + test12y(grad256bw, 5).save("out/grad1-2-4.png") + test12y(lena256bw, 5).save("out/lena1-2-4.png") + +# Output 1.3.1: 2-colour threshold, dynamic thresholding +# Output 1.3.2: 5-colour threshold, dynamic thresholding +def test13x(src, n, fuzzy = None): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + # Compute histogram + histo = [0] * 256 + for x, y in rangexy(w, h): + histo[(int)(src.getGray(x, y) * 255.9999)] += 1 + thresholds = [1. * (1. + i) / n for i in range(n - 1)] + values = [i / (n - 1.) for i in range(n)] + # Parse histogram + total = 0 + t = 0 + for i in range(256): + total += histo[i] + if total > thresholds[t] * w * h: + thresholds[t] = i / 255.0 + t += 1 + if t + 1 > n - 1: + break + # Compute image + for x, y in rangexy(w, h): + c = src.getGray(x, y) + for (i, t) in enumerate(thresholds): + if fuzzy: + t += fuzzy() + if c < t: + dest.setGray(x, y, values[i]) + break + else: + dest.setGray(x, y, values[n - 1]) + return dest + +if chapter(1): + test13x(grad256bw, 2).save("out/grad1-3-1.png") + test13x(lena256bw, 2).save("out/lena1-3-1.png") + test13x(grad256bw, 5).save("out/grad1-3-2.png") + test13x(lena256bw, 5).save("out/lena1-3-2.png") + +# Output 1.4.1: uniform random dithering +def test141(src): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + d = c > random.random() + dest.setGray(x, y, d) + return dest + +if chapter(1): + test141(grad256bw).save("out/grad1-4-1.png") + test141(lena256bw).save("out/lena1-4-1.png") + +# Output 1.4.2: gaussian random dithering +def test142(src): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + d = c > random.gauss(0.5, 0.15) + dest.setGray(x, y, d) + return dest + +if chapter(1): + test142(grad256bw).save("out/grad1-4-2.png") + test142(lena256bw).save("out/lena1-4-2.png") + +# Output 1.4.3: 3-colour threshold, dynamic thresholding, gaussian perturbation +if chapter(1): + fuzzy = lambda : random.gauss(0., 0.08) + test13x(grad256bw, 4, fuzzy).save("out/grad1-4-3.png") + test13x(lena256bw, 4, fuzzy).save("out/lena1-4-3.png") + +############################################################################## +if chapter(2): + print "Chapter 2. Halftoning patterns" + +# Pattern 2.1.1: a 50% halftone pattern with various block sizes +# Pattern 2.1.2: 25% and 75% halftone patterns with various block sizes +if chapter(2): + dest = Image((320, 80)) + for x in range(320): + d = 8 >> (x / 80) + for y in range(80): + c = (x / d + y / d) & 1 + dest.setGray(x, y, c) + dest.save("out/pat2-1-1.png") + + dest = Image((320, 80)) + for x in range(320): + d = 8 >> (x / 80) + for y in range(40): + c = ((x / d + y / d) & 1) or (y / d & 1) + dest.setGray(x, y, c) + for y in range(40, 80): + c = ((x / d + y / d) & 1) and (y / d & 1) + dest.setGray(x, y, c) + dest.save("out/pat2-1-2.png") + +# Output 2.1.1: 20/40/60/80% threshold with 25/50/75% patterns inbetween: +def test211(src): + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + if c < 0.2: + c = 0. + elif c < 0.4: + c = ((x + y) & 1) and (y & 1) + elif c < 0.6: + c = (x + y) & 1 + elif c < 0.8: + c = ((x + y) & 1) or (y & 1) + else: + c = 1. + dest.setGray(x, y, c) + return dest + +if chapter(2): + test211(grad256bw).save("out/grad2-1-1.png") + test211(lena256bw).save("out/lena2-1-1.png") + +# Pattern 2.2.1: vertical, mixed and horizontal black-white halftones +# Pattern 2.2.2: two different 25% patterns +if chapter(2): + dest = Image((240, 80)) + for y in range(80): + for x in range(80): + c = x & 1 + dest.setGray(x, y, c) + for x in range(80, 160): + c = (x / d + y / d) & 1 + dest.setGray(x, y, c) + for x in range(160, 240): + c = y & 1 + dest.setGray(x, y, c) + dest.save("out/pat2-2-1.png") + + dest = Image((320, 80)) + for y in range(80): + for x in range(80): + c = (x / 2 & 1) and (y / 2 & 1) + dest.setGray(x, y, c) + for x in range(80, 160): + c = (x & 1) and (y & 1) + dest.setGray(x, y, c) + for x in range(160, 240): + c = (x & 1) and ((y + x / 2) & 1) + dest.setGray(x, y, c) + for x in range(240, 320): + c = (x / 2 & 1) and ((y / 2 + x / 4) & 1) + dest.setGray(x, y, c) + dest.save("out/pat2-2-2.png") + +# Output 2.3.0: 2x2 Bayer dithering +# Output 2.3.1: 4x4 Bayer dithering +# Output 2.3.1b: 8x8 Bayer dithering +# Output 2.3.2: 4x4 cluster dot +# Output 2.3.2b: 8x8 cluster dot +# Output 2.3.3: 5x3 line dithering +def ordereddither(src, mat): + (w, h) = src.size() + dest = Image((w, h)) + dx = len(mat[0]) + dy = len(mat) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + threshold = (1. + mat[y % dy][x % dx]) / (dx * dy + 1) + c = c > threshold + dest.setGray(x, y, c) + return dest + +def makebayer(rank, mat = False): + if not mat: + mat = Matrix(1, 1) + if not rank: + return mat + n = len(mat) + newmat = Matrix(n * 2, n * 2) + for i, j in rangexy(n, n): + x = mat[j][i] + newmat[j * 2][i * 2] = x + newmat[j * 2][i * 2 + 1] = x + n * n * 3 + newmat[j * 2 + 1][i * 2] = x + n * n * 2 + newmat[j * 2 + 1][i * 2 + 1] = x + n * n + return makebayer(rank - 1, newmat) + +DITHER_BAYER22 = makebayer(1) +DITHER_BAYER44 = makebayer(2) +DITHER_BAYER88 = makebayer(3) + +DITHER_CLUSTER44 = \ + [[ 12, 5, 6, 13], + [ 4, 0, 1, 7], + [ 11, 3, 2, 8], + [ 15, 10, 9, 14]] +DITHER_CLUSTER88 = \ + [[ 24, 10, 12, 26, 35, 47, 49, 37], + [ 8, 0, 2, 14, 45, 59, 61, 51], + [ 22, 6, 4, 16, 43, 57, 63, 53], + [ 30, 20, 18, 28, 33, 41, 55, 39], + [ 34, 46, 48, 36, 25, 11, 13, 27], + [ 44, 58, 60, 50, 9, 1, 3, 15], + [ 42, 56, 62, 52, 23, 7, 5, 17], + [ 32, 40, 54, 38, 31, 21, 19, 29]] +DITHER_LINE53 = \ + [[ 9, 3, 0, 6, 12], + [ 10, 4, 1, 7, 13], + [ 11, 5, 2, 8, 14]] + +def bayercol(val): return ['#fdf', '#dfd', '#ffd', '#dff'][val % 4] + +if chapter(2): + ordereddither(grad256bw, DITHER_BAYER22).save("out/grad2-3-0.png") + ordereddither(lena256bw, DITHER_BAYER22).save("out/lena2-3-0.png") + + Svg(DITHER_BAYER44, bayercol).save("out/fig2-3-2.png", 40) + ordereddither(grad256bw, DITHER_BAYER44).save("out/grad2-3-1.png") + ordereddither(lena256bw, DITHER_BAYER44).save("out/lena2-3-1.png") + + Svg(DITHER_BAYER88, bayercol).save("out/fig2-3-2b.png", 30) + ordereddither(grad256bw, DITHER_BAYER88).save("out/grad2-3-1b.png") + ordereddither(lena256bw, DITHER_BAYER88).save("out/lena2-3-1b.png") + + Svg(DITHER_CLUSTER44).save("out/fig2-3-3.png", 40) + ordereddither(grad256bw, DITHER_CLUSTER44).save("out/grad2-3-2.png") + ordereddither(lena256bw, DITHER_CLUSTER44).save("out/lena2-3-2.png") + + Svg(DITHER_CLUSTER88).save("out/fig2-3-3b.png", 30) + ordereddither(grad256bw, DITHER_CLUSTER88).save("out/grad2-3-2b.png") + ordereddither(lena256bw, DITHER_CLUSTER88).save("out/lena2-3-2b.png") + + Svg(DITHER_LINE53).save("out/fig2-3-4.png", 40) + ordereddither(grad256bw, DITHER_LINE53).save("out/grad2-3-3.png") + ordereddither(lena256bw, DITHER_LINE53).save("out/lena2-3-3.png") + +# Output 2.4.1: 4x4 Bayer dithering with gaussian perturbation +def test241(src, mat): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + dx = len(mat[0]) + dy = len(mat) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + threshold = (1. + mat[y % dy][x % dx]) / (dx * dy + 1) + threshold += random.gauss(0, 0.08) + c = c > threshold + dest.setGray(x, y, c) + return dest + +if chapter(2): + test241(grad256bw, DITHER_BAYER88).save("out/grad2-4-1.png") + test241(lena256bw, DITHER_BAYER88).save("out/lena2-4-1.png") + +# Output 2.4.2: random dither matrice selection +def test242(src, mlist): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + dx = len(mlist[0][0]) + dy = len(mlist[0]) + for x, y in rangexy(w / dx, h / dy): + mat = random.choice(mlist) + for i, j in rangexy(dx, dy): + c = src.getGray(x * dx + i, y * dy + j) + threshold = (1. + mat[j][i]) / (dx * dy + 1) + d = c > threshold + dest.setGray(x * dx + i, y * dy + j, d) + return dest + +if chapter(2): + m1 = [[1, 4, 7], + [6, 0, 2], + [3, 8, 5]] + m2 = [[4, 6, 3], + [8, 1, 5], + [0, 3, 7]] + m3 = [[5, 0, 3], + [2, 8, 6], + [7, 4, 1]] + m4 = [[8, 2, 5], + [6, 4, 0], + [1, 7, 3]] + m5 = [[2, 5, 8], + [0, 7, 3], + [4, 1, 6]] + m6 = [[7, 4, 1], + [3, 6, 8], + [2, 0, 5]] + mlist = [m1, m2, m3, m4, m5, m6] + test242(grad256bw, mlist).save("out/grad2-4-2.png") + test242(lena256bw, mlist).save("out/lena2-4-2.png") + +# Output 2.5.1: cross pattern +# Output 2.5.2: hex pattern +# Output 2.5.3: square pattern +def test25x(src, mat, vec): + # 1. count positive cells + n = 0 + for line in mat: + for x in line: + if x >= 0: + n += 1 + # 2. create list of vectors + l = [] + x = y = 0 + while (x, y) not in l: + l.append((x, y)) + (x, y) = ((x + vec[0][0]) % n, (y + vec[0][1]) % n) + if (x, y) in l: + (x, y) = ((x + vec[1][0]) % n, (y + vec[1][1]) % n) + # 3. create big matrix + m = Matrix(n, n) + for v in l: + for x, y in rangexy(len(mat[0]), len(mat)): + if mat[y][x] < 0: + continue + m[(v[1] + y + n) % n][(v[0] + x + n) % n] = mat[y][x] + # 4. dither image + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + threshold = (1. + m[y % n][x % n]) / (1. + n) + d = c > threshold + dest.setGray(x, y, d) + return dest + +if chapter(2): + mat = [[-1, 4, -1], + [ 3, 0, 1], + [-1, 2, -1]] + vec = [(2, -1), (1, 2)] + test25x(grad256bw, mat, vec).save("out/grad2-5-1.png") + test25x(lena256bw, mat, vec).save("out/lena2-5-1.png") + mat = [[-1, 4, 2, -1], + [ 6, 0, 5, 3], + [-1, 7, 1, -1]] + vec = [(2, -2), (3, 1)] + test25x(grad256bw, mat, vec).save("out/grad2-5-2.png") + test25x(lena256bw, mat, vec).save("out/lena2-5-2.png") + mat = [[-1, -1, -1, 7, -1], + [-1, 2, 6, 9, 8], + [ 3, 0, 1, 5, -1], + [-1, 4, -1, -1, -1]] + vec = [(2, 4), (3, 1)] + test25x(grad256bw, mat, vec).save("out/grad2-5-3.png") + test25x(lena256bw, mat, vec).save("out/lena2-5-3.png") + mat = [[-1, -1, 2, -1], + [ 0, 1, 3, 8], + [ 5, 4, 7, 6], + [-1, 9, -1, -1]] + vec = [(2, 2), (0, 5)] + test25x(grad256bw, mat, vec).save("out/grad2-5-4.png") + test25x(lena256bw, mat, vec).save("out/lena2-5-4.png") + +# Output 2.6.1: 4-wise cross pattern +# Output 2.6.2: 3-wise hex pattern +# Output 2.6.3: 4-wise square pattern +if chapter(2): + mat = [[-1, -1, -1, 18, -1, -1], + [-1, 16, 14, 2, 6, -1], + [12, 0, 4, 10, 17, -1], + [-1, 8, 19, 13, 1, 5], + [-1, 15, 3, 7, 9, -1], + [-1, -1, 11, -1, -1, -1]] + vec = [(4, -2), (2, 4)] + test25x(grad256bw, mat, vec).save("out/grad2-6-1.png") + test25x(lena256bw, mat, vec).save("out/lena2-6-1.png") + + mat = [[-1, 12, 6, -1, -1, -1, -1], + [18, 0, 15, 9, 14, 8, -1], + [-1, 21, 3, 20, 2, 17, 11], + [-1, -1, 13, 7, 23, 5, -1], + [-1, 19, 1, 16, 10, -1, -1], + [-1, -1, 22, 4, -1, -1, -1]] + vec = [(5, -1), (-1, 5)] + test25x(grad256bw, mat, vec).save("out/grad2-6-2.png") + test25x(lena256bw, mat, vec).save("out/lena2-6-2.png") + + mat = [[-1, -1, -1, -1, 30, -1, -1, -1, -1], + [-1, -1, 10, 26, 38, 34, -1, 29, -1], + [-1, 14, 2, 6, 22, 9, 25, 37, 33], + [-1, -1, 18, 28, 13, 1, 5, 21, -1], + [-1, 8, 24, 36, 32, 17, 31, -1, -1], + [12, 0, 4, 20, 11, 27, 39, 35, -1], + [-1, 16, -1, 15, 3, 7, 23, -1, -1], + [-1, -1, -1, -1, 19, -1, -1, -1, -1]] + vec = [(6, 2), (-2, 6)] + test25x(grad256bw, mat, vec).save("out/grad2-6-3.png") + test25x(lena256bw, mat, vec).save("out/lena2-6-3.png") + + mat = [[-1, -1, 3, 35, -1, -1, 1, 33, -1, -1, -1, -1, -1], + [-1, -1, -1, 19, 51, -1, -1, 17, 49, -1, -1, -1, -1], + [ 7, 39, 11, 43, 5, 37, 9, 41, -1, -1, -1, -1, -1], + [-1, 23, 55, 27, 59, 21, 53, 25, 57, -1, -1, -1, -1], + [15, 47, -1, -1, 13, 45, 2, 34, -1, -1, 0, 32, -1], + [-1, 31, 63, -1, -1, 29, 61, 18, 50, -1, -1, 16, 48], + [-1, -1, -1, -1, 6, 38, 10, 42, 4, 36, 8, 40, -1], + [-1, -1, -1, -1, -1, 22, 54, 26, 58, 20, 52, 24, 56], + [-1, -1, -1, -1, 14, 46, -1, -1, 12, 44, -1, -1, -1], + [-1, -1, -1, -1, -1, 30, 62, -1, -1, 28, 60, -1, -1]] + vec = [(8, 0), (0, 8)] + def colorise(val): + if val == 0: return '#fff' + if (val % 64) == 32: return '#ddf' + if (val % 32) == 16: return '#fdd' + if (val % 16) == 8: return '#dff' + if (val % 8) == 4: return '#ffd' + if (val % 4) == 2: return '#fdf' + return '#dfd' + Svg(mat, colorise).save("out/fig2-6-4.png", 25) + test25x(grad256bw, mat, vec).save("out/grad2-6-4.png") + test25x(lena256bw, mat, vec).save("out/lena2-6-4.png") + + mat = [[ -1, -1, -1, -1, -1, -1, 8, -1], + [ -1, -1, 6, -1, 2, 5, 11, 26], + [ 0, 3, 9, 24, 17, 14, 23, 20], + [ 15, 12, 21, 18, 7, 29, -1, -1], + [ -1, 27, 1, 4, 10, 25, -1, -1], + [ -1, -1, 16, 13, 22, 19, -1, -1], + [ -1, -1, -1, 28, -1, -1, -1, -1]] + vec = [(6, 1), (0, 5)] + def colorise(val): return ['#dff', '#ffd', '#fdf'][val % 3] + #Svg(mat, colorise).save("out/fig2-6-5.png", 30) + test25x(grad256bw, mat, vec).save("out/grad2-6-5.png") + test25x(lena256bw, mat, vec).save("out/lena2-6-5.png") + + mat = [[ -1, -1, -1, -1, -1, -1, 24, -1, -1, -1, -1, -1, -1, -1], + [ -1, -1, 18, -1, 6, 15, 33, 78, -1, -1, -1, -1, 26, -1], + [ 0, 9, 27, 72, 51, 42, 69, 60, 20, -1, 8, 17, 35, 80], + [ 45, 36, 63, 54, 21, 87, 2, 11, 29, 74, 53, 44, 71, 62], + [ -1, 81, 3, 12, 30, 75, 47, 38, 65, 56, 23, 89, -1, -1], + [ -1, -1, 48, 39, 66, 57, 25, 83, 5, 14, 32, 77, -1, -1], + [ -1, -1, 19, 84, 7, 16, 34, 79, 50, 41, 68, 59, -1, -1], + [ 1, 10, 28, 73, 52, 43, 70, 61, -1, 86, -1, -1, -1, -1], + [ 46, 37, 64, 55, 22, 88, -1, -1, -1, -1, -1, -1, -1, -1], + [ -1, 82, 4, 13, 31, 76, -1, -1, -1, -1, -1, -1, -1, -1], + [ -1, -1, 49, 40, 67, 58, -1, -1, -1, -1, -1, -1, -1, -1], + [ -1, -1, -1, 85, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]] + test25x(grad256bw, mat, vec).save("out/grad2-6-6.png") + test25x(lena256bw, mat, vec).save("out/lena2-6-6.png") + +# Output 2.7.1: void and cluster matrix generation +def makegauss(n): + c = (-1. + n) / 2 + mat = Matrix(n, n) + for x, y in rangexy(n, n): + mat[y][x] = math.exp(- ((c - x) * (c - x) + (c - y) * (c - y)) / (0.05 * n * n)) + return mat + +def countones(mat): + total = 0 + for l in mat: + for x in l: + if x: + total += 1 + return total + +GAUSS77 = makegauss(7) +GAUSS99 = makegauss(9) + +def getminmax(mat, c): + min = 9999. + max = 0. + h = len(mat) + w = len(mat[0]) + for x, y in rangexy(w, h): + if mat[y][x] != c: + continue + total = 0. + for i, j in rangexy(7, 7): + total += mat[(y + j - 3 + h) % h][(x + i - 3 + w) % w] \ + * GAUSS77[j][i] + if total > max: + (max, max_x, max_y) = (total, x, y) + if total < min: + (min, min_x, min_y) = (total, x, y) + return (min_x, min_y, max_x, max_y) + +def makeuniform(n): + random.seed(0) + mat = Matrix(n, n) + for t in range(n * n / 10): + x = (int)(random.random() * n) + y = (int)(random.random() * n) + mat[y][x] = 1 + while True: + (dummy0, dummy1, x, y) = getminmax(mat, 1.) + mat[y][x] = 0. + (x2, y2, dummy0, dummy1) = getminmax(mat, 0.) + mat[y2][x2] = 1. + if x2 == x and y2 == y: + break + return mat + +def makevoidandcluster(n): + vnc = Matrix(n, n) + # Step 1: step down to zero + mat = makeuniform(n) + rank = countones(mat) + while rank > 0: + rank -= 1 + (dummy0, dummy1, x, y) = getminmax(mat, 1.) + mat[y][x] = 0. + vnc[y][x] = rank + # Step 2: step up to n * n + mat = makeuniform(n) + rank = countones(mat) + while rank < n * n: + (x, y, dummy0, dummy1) = getminmax(mat, 0.) + mat[y][x] = 1. + vnc[y][x] = rank + rank += 1 + return vnc + +def vnccol(n): + return lambda val : ['#fff', '#ddd'][val < n * n / 10] + +if chapter(2): + tmp = makevoidandcluster(14) + Svg(tmp, vnccol(14)).save("out/fig2-7-1.png", 25) + ordereddither(grad256bw, tmp).save("out/grad2-7-1.png") + ordereddither(lena256bw, tmp).save("out/lena2-7-1.png") + tmp = makevoidandcluster(25) + Svg(tmp, vnccol(25)).save("out/fig2-7-2.png", 20) + ordereddither(grad256bw, tmp).save("out/grad2-7-2.png") + ordereddither(lena256bw, tmp).save("out/lena2-7-2.png") + +############################################################################## +if chapter(3): + print "Chapter 3. Error diffusion" + +# Output 3.0.1: naive error diffusion +# Output 3.1.1: standard Floyd-Steinberg +# Output 3.1.2: serpentine Floyd-Steinberg +# FIXME: serpentine only works if rows == offset * 2 + 1 +# Output 3.2.1: Fan (modified Floyd-Steinberg) +# Output 3.2.1b: Shiau-Fan 1 +# Output 3.2.1c: Shiau-Fan 2 +# Output 3.2.2: Jarvis, Judice and Ninke +# Output 3.2.3: Stucki +# Output 3.2.4: Burkes +# Output 3.2.5: Sierra +# Output 3.2.6: Two-line Sierra +# Output 3.2.7: Sierra's Filter Lite +# Output 3.2.8: Atkinson +def test3xx(src, mat, serpentine): + (w, h) = src.size() + dest = Image((w, h)) + lines = len(mat) + rows = len(mat[0]) + offset = mat[0].index(-1) + ey = Matrix(w + rows - 1, lines, 0.) + for y in range(h): + ex = [0.] * (rows - offset) + if serpentine and y & 1: + xrange = range(w - 1, -1, -1) + else: + xrange = range(w) + for x in xrange: + # Set pixel + c = src.getGray(x, y) + ex[0] + ey[0][x + offset] + d = c > 0.5 + dest.setGray(x, y, d) + error = c - d + # Propagate first line of error + for dx in range(rows - offset - 2): + ex[dx] = ex[dx + 1] + error * mat[0][offset + 1 + dx] + ex[rows - offset - 2] = error * mat[0][rows - 1] + # Propagate next lines + if serpentine and y & 1: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][rows - 1 - dx] + else: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][dx] + for dy in range(lines - 1): + ey[dy] = ey[dy + 1] + ey[lines - 1] = [0.] * (w + rows - 1) + return dest + +ERROR_NAIVE = \ + [[ -1, 1]] +ERROR_FSTEIN = \ + [[ 0., -1, 7./16], + [ 3./16, 5./16, 1./16]] +ERROR_JAJUNI = \ + [[ 0., 0., -1, 7./48, 5./48], + [ 3./48, 5./48, 7./48, 5./48, 3./48], + [ 1./48, 3./48, 5./48, 3./48, 1./48]] +ERROR_FAN = \ + [[ 0., 0., -1, 7./16], + [ 1./16, 3./16, 5./16, 0.]] +ERROR_SHIAUFAN = \ + [[ 0., 0., -1, 8./16], + [ 2./16, 2./16, 4./16, 0.]] +ERROR_SHIAUFAN2 = \ + [[ 0., 0., 0., -1, 8./16], + [ 1./16, 1./16, 2./16, 4./16, 0.]] +ERROR_STUCKI = \ + [[ 0., 0., -1, 8./42, 4./42], + [ 2./42, 4./42, 8./42, 4./42, 2./42], + [ 1./42, 2./42, 4./42, 2./42, 1./42]] +ERROR_BURKES = \ + [[ 0., 0., -1, 8./32, 4./32], + [ 2./32, 4./32, 8./32, 4./32, 2./32]] +ERROR_SIERRA = \ + [[ 0., 0., -1, 5./32, 3./32], + [ 2./32, 4./32, 5./32, 4./32, 2./32], + [ 0., 2./32, 3./32, 2./32, 0.]] +ERROR_SIERRA2 = \ + [[ 0., 0., -1, 4./16, 3./16], + [ 1./16, 2./16, 3./16, 2./16, 1./16]] +ERROR_FILTERLITE = \ + [[ 0., -1, 2./4], + [ 1./4, 1./4, 0.]] +ERROR_ATKINSON = \ + [[ 0., -1, 1./8, 1./8], + [ 1./8, 1./8, 1./8, 0.], + [ 0., 1./8, 0., 0.]] +## This is Stevenson-Arce in hex lattice +#ERROR_STAR = \ +# [[ 0., 0., 0., -1, 0., 32./200, 0.], +# [ 12./200, 0., 26./200, 0., 30./200, 0., 16./200], +# [ 0., 12./200, 0., 26./200, 0., 12./200, 0.], +# [ 5./200, 0., 12./200, 0., 12./200, 0., 5./200]] +## This is an attempt at implementing Stevenson-Arce in square lattice +#ERROR_STAR = \ +# [[ 0., 0., -1, 32./200, 0.], +# [ 6./200, 19./200, 28./200, 23./200, 8./200], +# [ 0., 12./200, 26./200, 12./200, 0.], +# [ 2./200, 9./200, 12./200, 9./200, 2./200]] + +if chapter(3): + test3xx(grad256bw, ERROR_NAIVE, False).save("out/grad3-0-1.png") + test3xx(lena256bw, ERROR_NAIVE, False).save("out/lena3-0-1.png") + + Svg(ERROR_FSTEIN).save("out/fig3-1-1.png", 40) + test3xx(grad256bw, ERROR_FSTEIN, False).save("out/grad3-1-1.png") + test3xx(lena256bw, ERROR_FSTEIN, False).save("out/lena3-1-1.png") + test3xx(grad256bw, ERROR_FSTEIN, True).save("out/grad3-1-2.png") + test3xx(lena256bw, ERROR_FSTEIN, True).save("out/lena3-1-2.png") + + Svg(ERROR_JAJUNI).save("out/fig3-1-3.png", 40) + test3xx(grad256bw, ERROR_JAJUNI, False).save("out/grad3-1-3.png") + test3xx(lena256bw, ERROR_JAJUNI, False).save("out/lena3-1-3.png") + + Svg(ERROR_FAN).save("out/fig3-2-1.png", 40) + test3xx(grad256bw, ERROR_FAN, False).save("out/grad3-2-1.png") + test3xx(lena256bw, ERROR_FAN, False).save("out/lena3-2-1.png") + Svg(ERROR_SHIAUFAN).save("out/fig3-2-1b.png", 40) + test3xx(grad256bw, ERROR_SHIAUFAN, False).save("out/grad3-2-1b.png") + test3xx(lena256bw, ERROR_SHIAUFAN, False).save("out/lena3-2-1b.png") + Svg(ERROR_SHIAUFAN2).save("out/fig3-2-1c.png", 40) + test3xx(grad256bw, ERROR_SHIAUFAN2, False).save("out/grad3-2-1c.png") + test3xx(lena256bw, ERROR_SHIAUFAN2, False).save("out/lena3-2-1c.png") + + Svg(ERROR_STUCKI).save("out/fig3-2-3.png", 40) + test3xx(grad256bw, ERROR_STUCKI, False).save("out/grad3-2-3.png") + test3xx(lena256bw, ERROR_STUCKI, False).save("out/lena3-2-3.png") + + Svg(ERROR_BURKES).save("out/fig3-2-4.png", 40) + test3xx(grad256bw, ERROR_BURKES, False).save("out/grad3-2-4.png") + test3xx(lena256bw, ERROR_BURKES, False).save("out/lena3-2-4.png") + + Svg(ERROR_SIERRA).save("out/fig3-2-5.png", 40) + test3xx(grad256bw, ERROR_SIERRA, False).save("out/grad3-2-5.png") + test3xx(lena256bw, ERROR_SIERRA, False).save("out/lena3-2-5.png") + + Svg(ERROR_SIERRA2).save("out/fig3-2-6.png", 40) + test3xx(grad256bw, ERROR_SIERRA2, False).save("out/grad3-2-6.png") + test3xx(lena256bw, ERROR_SIERRA2, False).save("out/lena3-2-6.png") + + Svg(ERROR_FILTERLITE).save("out/fig3-2-7.png", 40) + test3xx(grad256bw, ERROR_FILTERLITE, False).save("out/grad3-2-7.png") + test3xx(lena256bw, ERROR_FILTERLITE, False).save("out/lena3-2-7.png") + + Svg(ERROR_ATKINSON).save("out/fig3-2-8.png", 40) + test3xx(grad256bw, ERROR_ATKINSON, False).save("out/grad3-2-8.png") + test3xx(lena256bw, ERROR_ATKINSON, False).save("out/lena3-2-8.png") + + #test3xx(grad256bw, ERROR_STAR, False).save("out/grad3-2-9.png") + #test3xx(lena256bw, ERROR_STAR, False).save("out/lena3-2-9.png") + + #test3xx(grad256bw, ERROR_STAR, False).save("out/grad3-2-9.png") + #test3xx(lena256bw, ERROR_STAR, False).save("out/lena3-2-9.png") + +# Output 3.3.1: Floyd-Steinberg on grey 90% +# Output 3.3.2: serpentine Floyd-Steinberg on grey 90% +if chapter(3): + tmp = Image((128, 128)) + for x, y in rangexy(128, 128): + tmp.setGray(x, y, 0.90) + test3xx(tmp, ERROR_FSTEIN, True).getZoom(2).save("out/lena3-3-2.png") + test3xx(tmp, ERROR_FSTEIN, False).getZoom(2).save("out/lena3-3-1.png") + +# Output 3.3.3: Riemersma dither on a Hilbert curve +# Output 3.3.4: Riemersma dither on a Hilbert 2 curve +def hilbert(x, y, n): + d1 = [0, 4, 3, 2, 1] + d2 = [0, 3, 4, 1, 2] + m = n/2 + + if x == n - 1 and y == 0: return 0 + if x == 0 and y == m - 1: return 1 + if x == m - 1 and y == m: return 4 + if x == n - 1 and y == m: return 2 + + if y >= m: return hilbert(x % m, y - m, m) + if x < m: return d1[hilbert(y, x, m)] + else: return d2[hilbert(m - 1 - y, n - 1 - x, m)] + +def hilbert2(x, y, n): + d1 = [0, 2, 1, 3, 4] + d2 = [0, 1, 2, 4, 3] + d3 = [0, 2, 1, 4, 3] + m = n/3 + + if x == n - 1 and y == n - 1: return 0 + if x == m - 1 and y == m - 1: return 4 + if x == 2 * m - 1 and y == 0: return 4 + if x == n - 1 and y == m - 1: return 1 + if x == 0 and y == 2 * m - 1: return 1 + if x == m and y == m: return 3 + if x == m * 2 and y == m * 2 - 1: return 3 + if x == m - 1 and y == n - 1: return 4 + if x == 2 * m - 1 and y == 2 * m: return 4 + + if (x < m or x >= m * 2) and (y < m or y >= m * 2): + return hilbert2(x % m, y % m, m) + if x >= m and x < m * 2 and y >= m and y < m * 2: + return d3[hilbert2(2 * m - 1 - x, 2 * m - 1 - y, m)] + if x >= m and x < m * 2: + return d1[hilbert2(x - m, m - 1 - (y % m), m)] + else: # if y >= m and y < m * 2 + return d2[hilbert2(m - 1 - (x % m), y - m, m)] + +def riemersma(src, iterator, order): + (w, h) = src.size() + dest = Image((w, h)) + q = 16 + r = 16 + size = 1 + while size < w or size < h: size *= order + coord = [(0, 0), (0, 1), (0, -1), (-1, 0), (1, 0)] + err = [0] * q + list = [math.exp(math.log(r) * i / (q - 1)) / r for i in range(q)] + (x, y) = (0, 0) + out = False + while True: + if not out: + a = c = src.getGray(x, y) + for i in range(q): + a += err[i] * list[i] + d = a > 0.5 + dest.setGray(x, y, d) + for i in range(q - 1): + err[i] = err[i + 1] + err[q - 1] = c - d + t = iterator(x, y, size) + if t == 0: + break + dx, dy = coord[t] + x += dx + y += dy + if out: + if x < w and y < h: + err = [0] * q + out = False + continue + # Did we fall off the screen? + out = (x > w + q or y > h + q) + return dest + +if chapter(3): + riemersma(grad256bw, hilbert, 2).save("out/grad3-3-3.png") + riemersma(lena256bw, hilbert, 2).save("out/lena3-3-3.png") + riemersma(grad256bw, hilbert2, 3).save("out/grad3-3-4.png") + riemersma(lena256bw, hilbert2, 3).save("out/lena3-3-4.png") + +# Output 3.3.5: spatial Hilbert dither on a Hilbert curve +# Output 3.3.6: spatial Hilbert dither on a Hilbert 2 curve +def spatialhilbert(src, iterator, order): + (w, h) = src.size() + dest = Image((w, h)) + q = 16 + size = 1 + while size < w or size < h: size *= order + coord = [(0, 0), (0, 1), (0, -1), (-1, 0), (1, 0)] + err = [0] * q + dx = [0] * q + dy = [0] * q + dist = [0] * q + (x, y) = (0, 0) + out = False + while True: + if not out: + c = src.getGray(x, y) + err[0] + d = c > 0.5 + dest.setGray(x, y, d) + t = iterator(x, y, size) + if t == 0: + break + dx[0], dy[0] = coord[t] + if not out: + error = c - d + errdiv = 0. + for i in range(q - 1): + t = coord[iterator(x + dx[i], y + dy[i], size)] + dx[i + 1] = dx[i] + t[0] + dy[i + 1] = dy[i] + t[1] + for i in range(q): + dist[i] = dx[i] * dx[i] + dy[i] * dy[i] + errdiv += 1. / dist[i] + error /= errdiv + for i in range(q - 1): + err[i] = err[i + 1] + error / dist[i] + err[q - 1] = error / dist[q - 1] + x += dx[0] + y += dy[0] + if out: + if x < w and y < h: + err = [0] * q + out = False + continue + # Did we fall off the screen? + out = (x > w + q or y > h + q) + return dest + +if chapter(3): + spatialhilbert(grad256bw, hilbert, 2).save("out/grad3-3-5.png") + spatialhilbert(lena256bw, hilbert, 2).save("out/lena3-3-5.png") + spatialhilbert(grad256bw, hilbert2, 3).save("out/grad3-3-6.png") + spatialhilbert(lena256bw, hilbert2, 3).save("out/lena3-3-6.png") + +# Output 3.3.7: Knuth's dot diffusion +# Output 3.3.8: Knuth's dot diffusion, sharpen = 0.9 +# Output 3.3.9: Knuth's dot diffusion, sharpen = 0.9, zeta = 0.2 +# Output 3.3.10: serpentine Floyd-Steinberg, sharpen = 0.9 +def sharpen(src, sharpening): + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + total = 0. + for j in range(-1, 2): + for i in range(-1, 2): + total += src.getGray(x + i, y + j) + total /= 9. + d = (c - sharpening * total) / (1.0 - sharpening) + if d < 0.: + d = 0. + elif d > 1.: + d = 1. + dest.setGray(x, y, d) + return dest + +def test337(src, mat, propagate, zeta): + (w, h) = src.size() + dest = Image((w, h)) + dx = len(mat[0]) + dy = len(mat) + # 0. analyse diffusion matrix to speed up things later + diff = [] + cx, cy = -1, -1 + for x, y in rangexy(len(propagate[0]), len(propagate)): + if propagate[y][x] == -1: + cx, cy = x, y + for x, y in rangexy(len(propagate[0]), len(propagate)): + diff.append((x - cx, y - cy, propagate[y][x])) + # 1. analyse order matrix to get equivalence classes + nclasses = 0 + for l in mat: + for v in l: + if v + 1 > nclasses: + nclasses = v + 1 + classes = [[] for n in range(nclasses)] + for x, y in rangexy(w, h): + classes[mat[y % dy][x % dx]].append((x, y)) + # 2. copy image + img = [[src.getGray(x, y) for x in range(w)] for y in range(h)] + aa = Matrix(w, h, 1.) + # 3. parse all classes + for l in classes: + for x, y in l: + c = img[y][x] + if aa[y][x] == 1.: + error = c + 4. * zeta + else: + error = c - zeta + if x > 0 and aa[y][x-1] == 1.: error += zeta + if y > 0 and aa[y-1][x] == 1.: error += zeta + if x < w-1 and aa[y][x+1] == 1.: error += zeta + if y < h-1 and aa[y+1][x] == 1.: error += zeta + if c + error < 1.: + aa[y][x] = 0. + if x > 0 and aa[y][x-1] == 1.: aa[y][x-1] = .5 + if y > 0 and aa[y-1][x] == 1.: aa[y-1][x] = .5 + if x < w-1 and aa[y][x+1] == 1.: aa[y][x+1] = .5 + if y < h-1 and aa[y+1][x] == 1.: aa[y+1][x] = .5 + else: + error = c - 1. + # Propagate first line of error + total = 0 + err = [] + for (i, j, e) in diff: + if x + i < 0 or x + i >= w \ + or y + j < 0 or y + j >= h: + continue + n = mat[(y + j) % dy][(x + i) % dx] - mat[y % dy][x % dx] + if n <= 0: + continue + err.append((i, j, e)) + total += e + for (i, j, e) in err: + img[y + j][x + i] += error * e / total + # 4. copy image, replacing grey with white + for x, y in rangexy(w, h): + dest.setGray(x, y, aa[y][x] > 0.) + return dest + +ERROR_DOT = \ + [[1./12, 1./6, 1./12], + [ 1./6, -1, 1./6], + [1./12, 1./6, 1./12]] + +if chapter(3): + Svg(ERROR_DOT).save("out/fig3-3-7b.png", 40) + test337(grad256bw, DITHER_CLUSTER88, ERROR_DOT, 0.).save("out/grad3-3-7.png") + test337(lena256bw, DITHER_CLUSTER88, ERROR_DOT, 0.).save("out/lena3-3-7.png") + tmp = sharpen(grad256bw, 0.9) + test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.).save("out/grad3-3-8.png") + test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.2).save("out/grad3-3-9.png") + test3xx(tmp, ERROR_FSTEIN, True).save("out/grad3-3-10.png") + tmp = sharpen(lena256bw, 0.9) + test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.).save("out/lena3-3-8.png") + test337(tmp, DITHER_CLUSTER88, ERROR_DOT, 0.2).save("out/lena3-3-9.png") + test3xx(tmp, ERROR_FSTEIN, True).save("out/lena3-3-10.png") + +# Output 3.3.11: omni-directional error diffusion +def test3311(src): + w, h = src.size() + g = { 0: 0, 1: 1, 2: 1 } + g[-1] = g[2] - g[1] + g[-2] = g[1] - g[0] + n = 2 + while g[n] < w and g[n] < h: + n += 1 + g[n] = g[n - 1] + g[n - 3] + g[-n] = g[-n + 3] - g[-n + 2] + u = g[n - 2] + v = g[n - 1] + a = [[(i * u + j * v) % g[n] for i in range(g[n])] for j in range(g[n])] + return a + +ERROR_OMNI = \ + [[0.1, 0.2, 0.1], + [0.1, -1, 0.1], + [0.1, 0.2, 0.1]] + +if chapter(3): + Svg(ERROR_OMNI).save("out/fig3-3-11.png", 40) + + mat = test3311(grad256bw) + test337(grad256bw, mat, ERROR_OMNI, 0.).save("out/grad3-3-11.png") + + mat = test3311(lena256bw) + tmp = [[str(mat[y][x]) for x in range(16)] for y in range(12)] + for x in range(16): tmp[11][x] = "..." + for y in range(12): tmp[y][15] = "..." + Svg(tmp).save("out/fig3-3-11b.png", 20) + test337(lena256bw, mat, ERROR_OMNI, 0.).save("out/lena3-3-11.png") + +# Output 3.4.1: Ostromoukhov's variable error diffusion +def test341(src, serpentine): + m = [[13, 0, 5], [13, 0, 5], [21, 0, 10], [7, 0, 4], + [8, 0, 5], [47, 3, 28], [23, 3, 13], [15, 3, 8], + [22, 6, 11], [43, 15, 20], [7, 3, 3], [501, 224, 211], + [249, 116, 103], [165, 80, 67], [123, 62, 49], [489, 256, 191], + [81, 44, 31], [483, 272, 181], [60, 35, 22], [53, 32, 19], + [237, 148, 83], [471, 304, 161], [3, 2, 1], [481, 314, 185], + [354, 226, 155], [1389, 866, 685], [227, 138, 125], [267, 158, 163], + [327, 188, 220], [61, 34, 45], [627, 338, 505], [1227, 638, 1075], + [20, 10, 19], [1937, 1000, 1767], [977, 520, 855], [657, 360, 551], + [71, 40, 57], [2005, 1160, 1539], [337, 200, 247], [2039, 1240, 1425], + [257, 160, 171], [691, 440, 437], [1045, 680, 627], [301, 200, 171], + [177, 120, 95], [2141, 1480, 1083], [1079, 760, 513], [725, 520, 323], + [137, 100, 57], [2209, 1640, 855], [53, 40, 19], [2243, 1720, 741], + [565, 440, 171], [759, 600, 209], [1147, 920, 285], [2311, 1880, 513], + [97, 80, 19], [335, 280, 57], [1181, 1000, 171], [793, 680, 95], + [599, 520, 57], [2413, 2120, 171], [405, 360, 19], [2447, 2200, 57], + [11, 10, 0], [158, 151, 3], [178, 179, 7], [1030, 1091, 63], + [248, 277, 21], [318, 375, 35], [458, 571, 63], [878, 1159, 147], + [5, 7, 1], [172, 181, 37], [97, 76, 22], [72, 41, 17], + [119, 47, 29], [4, 1, 1], [4, 1, 1], [4, 1, 1], + [4, 1, 1], [4, 1, 1], [4, 1, 1], [4, 1, 1], + [4, 1, 1], [4, 1, 1], [65, 18, 17], [95, 29, 26], + [185, 62, 53], [30, 11, 9], [35, 14, 11], [85, 37, 28], + [55, 26, 19], [80, 41, 29], [155, 86, 59], [5, 3, 2], + [5, 3, 2], [5, 3, 2], [5, 3, 2], [5, 3, 2], + [5, 3, 2], [5, 3, 2], [5, 3, 2], [5, 3, 2], + [5, 3, 2], [5, 3, 2], [5, 3, 2], [5, 3, 2], + [305, 176, 119], [155, 86, 59], [105, 56, 39], [80, 41, 29], + [65, 32, 23], [55, 26, 19], [335, 152, 113], [85, 37, 28], + [115, 48, 37], [35, 14, 11], [355, 136, 109], [30, 11, 9], + [365, 128, 107], [185, 62, 53], [25, 8, 7], [95, 29, 26], + [385, 112, 103], [65, 18, 17], [395, 104, 101], [4, 1, 1]] + (w, h) = src.size() + dest = Image((w, h)) + ey = [0.] * (w + 2) + for y in range(h): + ex = 0 + newey = [0.] * (w + 2) + if serpentine and y & 1: + xrange = range(w - 1, -1, -1) + else: + xrange = range(w) + for x in xrange: + # Set pixel + c = src.getGray(x, y) + ex + ey[x + 1] + d = c > 0.5 + dest.setGray(x, y, d) + error = c - d + i = (int)(c * 255.9999) + if i > 127: + i = 255 - i + (d1, d2, d3) = m[i] + t = d1 + d2 + d3 + # Propagate error + ex = error * d1 / t + if serpentine and y & 1: + newey[x + 2] += error * d3 / t + newey[x + 1] += error * d2 / t + else: + newey[x] += error * d2 / t + newey[x + 1] += error * d3 / t + ey = newey + return dest + +if chapter(3): + mat = [[0, -1, + 'd1(i)'], + ['d2(i)', + 'd3(i)', 0]] + Svg(mat).save("out/fig3-4-1.png", 40) + test341(grad256bw, True).save("out/grad3-4-1.png") + test341(lena256bw, True).save("out/lena3-4-1.png") + +def test351(src, mat, tiles, diff, serpentine, glob): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + ntiles = len(tiles) + ty = len(tiles[0]) + tx = len(tiles[0][0]) + cur = Matrix(tx, ty, 0.) + w, h = w / tx, h / ty + lines = len(mat) + rows = len(mat[0]) + offset = mat[0].index(-1) + ey = Matrix(w + rows - 1, lines, 0.) + for y in range(h): + ex = [0.] * (rows - offset) + if serpentine and y & 1: + xrange = range(w - 1, -1, -1) + else: + xrange = range(w) + for x in xrange: + # Get block value + for i, j in rangexy(tx, ty): + e = ex[0] + ey[0][x + offset] + cur[j][i] = src.getGray(x * tx + i, y * ty + j) + diff[j][i] * e + # Compute closest block and associated error + dist = tx * ty + for n in range(ntiles): + e = 0. + d1 = 0. + d2 = random.random() / 1000. + for i, j in rangexy(tx, ty): + e += cur[j][i] - tiles[n][j][i] + d1 += diff[j][i] * (cur[j][i] - tiles[n][j][i]) + d2 += diff[j][i] * abs(cur[j][i] - tiles[n][j][i]) + if glob: + d = abs(d1) + d2 / 1000. + else: + d = abs(d1) / (tx * ty) + d2 + if d < dist: + dist = d + error = e + best = n + # Set pixel + for i, j in rangexy(tx, ty): + dest.setGray(x * tx + i, y * ty + j, tiles[best][j][i]) + # Propagate first line of error + for dx in range(rows - offset - 2): + ex[dx] = ex[dx + 1] + error * mat[0][offset + 1 + dx] + ex[rows - offset - 2] = error * mat[0][rows - 1] + # Propagate next lines + if serpentine and y & 1: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][rows - 1 - dx] + else: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][dx] + for dy in range(lines - 1): + ey[dy] = ey[dy + 1] + ey[lines - 1] = [0.] * (w + rows - 1) + return dest + +LINES22 = \ + [[[0., 0.], [0., 0.]], + [[0., 1.], [0., 1.]], + [[1., 0.], [1., 0.]], + [[1., 1.], [0., 0.]], + [[0., 0.], [1., 1.]], + [[1., 1.], [1., 1.]]] + +SQUARES33 = \ + [[[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]], + [[1., 0., 0.], [0., 0., 0.], [0., 0., 0.]], + [[0., 1., 0.], [0., 0., 0.], [0., 0., 0.]], + [[0., 0., 1.], [0., 0., 0.], [0., 0., 0.]], + [[0., 0., 0.], [1., 0., 0.], [0., 0., 0.]], + [[0., 0., 0.], [0., 1., 0.], [0., 0., 0.]], + [[0., 0., 0.], [0., 0., 1.], [0., 0., 0.]], + [[0., 0., 0.], [0., 0., 0.], [1., 0., 0.]], + [[0., 0., 0.], [0., 0., 0.], [0., 1., 0.]], + [[0., 0., 0.], [0., 0., 0.], [0., 0., 1.]], + [[1., 1., 0.], [1., 1., 0.], [0., 0., 0.]], + [[0., 1., 1.], [0., 1., 1.], [0., 0., 0.]], + [[0., 0., 0.], [1., 1., 0.], [1., 1., 0.]], + [[0., 0., 0.], [0., 1., 1.], [0., 1., 1.]], + [[1., 1., 1.], [1., 1., 1.], [1., 1., 1.]]] + +TILES22 = [] +for n in range(1 << 4): + mat = Matrix(2, 2) + for x, y in rangexy(2, 2): + if n & (1 << (y * 2 + x)): + mat[y][x] = 1. + TILES22.append(mat) + +DIFF_EVEN22 = \ + [[1./4, 1./4], + [1./4, 1./4]] + +DIFF_EVEN33 = \ + [[1./9, 1./9, 1./9], + [1./9, 1./9, 1./9], + [1./9, 1./9, 1./9]] + +if chapter(3): + def colorise(val): + if type(val) == str: + return '#fbb' + return '#fff' + + mat = [[.25, .25], + [.25, .25]] + Svg(mat).save("out/fig3-5-2b.png", 40) + mat = [[0, 0, 'a', 'b', 7./64, 7./64], + [0, 0, 'c', 'd', 7./64, 7./64], + [3./64, 3./64, 5./64, 5./64, 1./64, 1./64], + [3./64, 3./64, 5./64, 5./64, 1./64, 1./64]] + Svg(mat, colorise).save("out/fig3-5-2.png", 40) + + test351(grad256bw, [[-1, 0]], + LINES22, DIFF_EVEN22, True, True).save("out/grad3-5-1.png") + test351(lena256bw, [[-1, 0]], + LINES22, DIFF_EVEN22, True, True).save("out/lena3-5-1.png") + test351(grad256bw, ERROR_FSTEIN, + LINES22, DIFF_EVEN22, True, True).save("out/grad3-5-2.png") + test351(lena256bw, ERROR_FSTEIN, + LINES22, DIFF_EVEN22, True, True).save("out/lena3-5-2.png") + + test351(grad256bw, ERROR_FSTEIN, + SQUARES33, DIFF_EVEN33, True, True).save("out/grad3-5-3.png") + test351(lena256bw, ERROR_FSTEIN, + SQUARES33, DIFF_EVEN33, True, True).save("out/lena3-5-3.png") + + test351(grad256bw, ERROR_FSTEIN, + TILES22, DIFF_EVEN22, True, True).save("out/grad3-5-4.png") + test351(lena256bw, ERROR_FSTEIN, + TILES22, DIFF_EVEN22, True, True).save("out/lena3-5-4.png") + +DIFF_WEIGHTED22 = \ + [[51./128, 33./128], + [25./128, 19./128]] + +if chapter(3): + mat = [[6./16, 5./16], + [3./16, 2./16]] + Svg(mat).save("out/fig3-5-5b.png", 40) + mat = [[0, 0, 'a', 'b', 6*7./256, 5*7./256], + [0, 0, 'c', 'd', 3*7./256, 2*7./256], + [6*3./256, 5*3./256, 6*5./256, 5*5./256, 6*1./256, 5*1./256], + [3*3./256, 2*3./256, 3*5./256, 2*5./256, 3*1./256, 2*1./256]] + Svg(mat, colorise).save("out/fig3-5-5.png", 40) + + test351(grad256bw, ERROR_FSTEIN, + TILES22, DIFF_WEIGHTED22, True, False).save("out/grad3-5-5.png") + test351(lena256bw, ERROR_FSTEIN, + TILES22, DIFF_WEIGHTED22, True, False).save("out/lena3-5-5.png") + +# Output 3.6.1: sub-block error diffusion +def subblock(src, tiles, propagate, diff, gamma): + (w, h) = src.size() + # Gamma correction + if gamma: + ctoi = Gamma.CtoI + itoc = Gamma.ItoC + else: + ctoi = itoc = lambda x : x + # Propagating the error to a temporary buffer is becoming more and + # more complicated. We decide to use an intermediate matrix instead. + tmp = Matrix(w, h, 0.) + for x, y in rangexy(w, h): + tmp[y][x] = ctoi(src.getGray(x, y)) + dest = Image((w, h)) + # Analyse tile list + ntiles = len(tiles) + ty = len(tiles[0]) + tx = len(tiles[0][0]) + cur = Matrix(tx, ty, 0.) + w, h = w / tx, h / ty + # Analyse error propagate list + for x, y in rangexy(w, h): + # Get block value + for i, j in rangexy(tx, ty): + cur[j][i] = itoc(tmp[y * ty + j][x * tx + i]) + # Select closest block + dist = tx * ty + for n in range(ntiles): + d = 0. + e = 0. + for i, j in rangexy(tx, ty): + d += cur[j][i] - tiles[n][j][i] + e += diff[j][i] * abs(cur[j][i] - tiles[n][j][i]) + if abs(d) / (tx * ty) + e < dist: + dist = abs(d) / (tx * ty) + e + best = n + # Set pixel + for i, j in rangexy(tx, ty): + dest.setGray(x * tx + i, y * ty + j, tiles[best][j][i]) + # Propagate error + for i, j in rangexy(tx, ty): + e = ctoi(cur[j][i]) - ctoi(tiles[best][j][i]) + m = propagate[j][i] + for px, py in rangexy(len(m[0]), len(m)): + if m[py][px] == 0: + continue + if m[py][px] == -1: + cx, cy = px, py + continue + tmpx = x * tx + i + px - cx + tmpy = y * ty + j + py - cy + if tmpx > w * tx - 1 or tmpy > h * ty - 1: + continue + tmp[tmpy][tmpx] += m[py][px] * e + return dest + +ERROR_SUBFS22 = \ + [[[[0, -1, 0, 8./64], + [0, 0, 0, 10./64], + [7./64, 22./64, 15./64, 2./64]], + [[0, 0, -1, 20./64], + [0, 0, 0, 14./64], + [2./64, 11./64, 15./64, 2./64]]], + [[[0, 0, 0, 0./64], + [0, -1, 0, 6./64], + [12./64, 32./64, 13./64, 1./64]], + [[0, 0, 0, 0./64], + [0, 0, -1, 20./64], + [0./64, 12./64, 28./64, 4./64]]]] + +if chapter(3): + subblock(grad256bw, TILES22, + ERROR_SUBFS22, DIFF_WEIGHTED22, False).save("out/grad3-6-1.png") + subblock(lena256bw, TILES22, + ERROR_SUBFS22, DIFF_WEIGHTED22, False).save("out/lena3-6-1.png") + + subblock(grad256bw, LINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22, False).save("out/grad3-6-2.png") + subblock(lena256bw, LINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22, False).save("out/lena3-6-2.png") + + def colorise(val): + if val == '': + return '#ccc' + if type(val) == str: + return '#fbb' + return '#fff' + + # XXX: hack, we modify ERROR_SUBFS22 because it's so much more convenient + for x, y in rangexy(2, 2): + for j in range(2): + for i in range(1, 3): + ERROR_SUBFS22[y][x][j][i] = '' + ERROR_SUBFS22[y][x][y][1 + x] = chr(ord('a') + 2 * y + x) + Svg(ERROR_SUBFS22[0][0], colorise).save("out/fig3-6-1a.png", 40) + Svg(ERROR_SUBFS22[0][1], colorise).save("out/fig3-6-1b.png", 40) + Svg(ERROR_SUBFS22[1][0], colorise).save("out/fig3-6-1c.png", 40) + Svg(ERROR_SUBFS22[1][1], colorise).save("out/fig3-6-1d.png", 40) + for x, y in rangexy(2, 2): + for j in range(2): + for i in range(1, 3): + ERROR_SUBFS22[y][x][j][i] = 0 + ERROR_SUBFS22[y][x][y][1 + x] = -1 + +ERROR_SUBFS33 = \ + [[[[ 0, -1, 0, 0, 2./64], + [ 0, 0, 0, 0, 5./64], + [ 0, 0, 0, 0, 6./64], + [ 5./64, 17./64, 17./64, 9./64, 1./64]], + [[ 0, 0, -1, 0, 6./64], + [ 0, 0, 0, 0, 9./64], + [ 0, 0, 0, 0, 8./64], + [ 2./64, 11./64, 16./64, 11./64, 1./64]], + [[ 0, 0, 0, -1, 20./64], + [ 0, 0, 0, 0, 14./64], + [ 0, 0, 0, 0, 8./64], + [ 0, 3./64, 9./64, 9./64, 1./64]]], + [[[ 0, 0, 0, 0, 0], + [ 0, -1, 0, 0, 2./64], + [ 0, 0, 0, 0, 5./64], + [ 7./64, 23./64, 18./64, 8./64, 1./64]], + [[ 0, 0, 0, 0, 0], + [ 0, 0, -1, 0, 6./64], + [ 0, 0, 0, 0, 9./64], + [ 2./64, 12./64, 21./64, 13./64, 1./64]], + [[ 0, 0, 0, 0, 0], + [ 0, 0, 0, -1, 20./64], + [ 0, 0, 0, 0, 14./64], + [ 0, 2./64, 11./64, 15./64, 2./64]]], + [[[ 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0], + [ 0, -1, 0, 0, 2./64], + [12./64, 32./64, 14./64, 4./64, 0]], + [[ 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0], + [ 0, 0, -1, 0, 6./64], + [ 0, 12./64, 32./64, 13./64, 1./64]], + [[ 0, 0, 0, 0, 0], + [ 0, 0, 0, 0, 0], + [ 0, 0, 0, -1, 20./64], + [ 0, 0, 12./64, 28./64, 4./64]]]] + +TILES33 = [] +for n in range(1 << 9): + mat = Matrix(3, 3) + for x, y in rangexy(3, 3): + if n & (1 << (y * 3 + x)): + mat[y][x] = 1. + TILES33.append(mat) + +DIFF_WEIGHTED33 = \ + [[15./64, 10./64, 6./64], + [10./64, 6./64, 4./64], + [ 6./64, 4./64, 3./64]] + +if chapter(3): + subblock(grad256bw, TILES33, + ERROR_SUBFS33, DIFF_WEIGHTED33, False).save("out/grad3-6-3.png") + subblock(lena256bw, TILES33, + ERROR_SUBFS33, DIFF_WEIGHTED33, False).save("out/lena3-6-3.png") + subblock(grad256bw, SQUARES33, + ERROR_SUBFS33, DIFF_WEIGHTED33, False).save("out/grad3-6-4.png") + subblock(lena256bw, SQUARES33, + ERROR_SUBFS33, DIFF_WEIGHTED33, False).save("out/lena3-6-4.png") + + # XXX: hack, we modify ERROR_SUBFS33 because it's so much more convenient + for x, y in rangexy(3, 3): + for j in range(3): + for i in range(1, 4): + ERROR_SUBFS33[y][x][j][i] = '' + ERROR_SUBFS33[y][x][y][1 + x] = chr(ord('a') + 3 * y + x) + Svg(ERROR_SUBFS33[0][0], colorise).save("out/fig3-6-3a.png", 30) + Svg(ERROR_SUBFS33[0][1], colorise).save("out/fig3-6-3b.png", 30) + Svg(ERROR_SUBFS33[0][2], colorise).save("out/fig3-6-3c.png", 30) + Svg(ERROR_SUBFS33[1][0], colorise).save("out/fig3-6-3d.png", 30) + Svg(ERROR_SUBFS33[1][1], colorise).save("out/fig3-6-3e.png", 30) + Svg(ERROR_SUBFS33[1][2], colorise).save("out/fig3-6-3f.png", 30) + Svg(ERROR_SUBFS33[2][0], colorise).save("out/fig3-6-3g.png", 30) + Svg(ERROR_SUBFS33[2][1], colorise).save("out/fig3-6-3h.png", 30) + Svg(ERROR_SUBFS33[2][2], colorise).save("out/fig3-6-3i.png", 30) + for x, y in rangexy(3, 3): + for j in range(3): + for i in range(1, 4): + ERROR_SUBFS33[y][x][j][i] = 0 + ERROR_SUBFS33[y][x][y][1 + x] = -1 + +############################################################################## +if chapter(4): + print "Chapter 4. Model-based dithering" + +# Output 4.1.1: gaussian HVS applied to 8x8 Bayer dither, sigma = 1 +# Output 4.1.2: gaussian HVS applied to 8x8 Bayer dither, sigma = 2 +def gaussian(n, sigma): + m = Matrix(n, n, 0.) + t = 0. + for x, y in rangexy(n, n): + i = x - (float)(n - 1.) / 2. + j = y - (float)(n - 1.) / 2. + v = math.pow(math.e, - (i * i + j * j) / (2. * sigma * sigma)) + m[y][x] = v + t += v + for x, y in rangexy(n, n): + m[y][x] /= t + return m + +def convolution(src, m): + (w, h) = src.size() + dest = Image((w, h)) + dy = len(m) + dx = len(m[0]) + srcmat = [[src.getGray(x, y) for x in range(w)] for y in range(h)] + for x, y in rangexy(w, h): + c = t = 0. + for i, j in rangexy(dx, dy): + u = i - (dx - 1) / 2 + v = j - (dy - 1) / 2 + if x + u >= w or y + v >= h or x + u < 0 or y + v < 0: + continue + c += srcmat[y + v][x + u] * m[j][i] + t += m[j][i] + dest.setGray(x, y, c / t) + return dest + +if chapter(4): + tmp = Image("out/grad2-3-1b.png") + convolution(tmp, gaussian(11, 1.)).save("out/grad4-1-1.png") + convolution(tmp, gaussian(11, 2.)).save("out/grad4-1-2.png") + tmp = Image("out/lena2-3-1b.png") + convolution(tmp, gaussian(11, 1.)).save("out/lena4-1-1.png") + convolution(tmp, gaussian(11, 2.)).save("out/lena4-1-2.png") + +# Output 4.2.1: direct binary search, iteration 0 +# Output 4.2.2: direct binary search, iteration 1 +# Output 4.2.3: direct binary search, iteration 2 +# Output 4.2.4: direct binary search, iteration 5 +def test42x(src): + random.seed(0) + (w, h) = src.size() + dest = Image((w, h)) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + random.random() - 0.5 + d = c > 0.5 + dest.setGray(x, y, d) + return dest + +def test42y(src, dest, hvs): + threshold = 0.4 + kernel = Matrix(8, 8, 0.) # have two borders of zeroes + for i, j in rangexy(6, 6): + kernel[j][i] = hvs(i * i + j * j) + (w, h) = src.size() + # Build fast pixel lookup tables + srcmat = Matrix(w, h, 0.) + destmat = Matrix(w, h, 0.) + for x, y in rangexy(w, h): + srcmat[y][x] = src.getGray(x, y) + destmat[y][x] = dest.getGray(x, y) + # Build human perception model for both source and destination + srchvs = Matrix(w, h, 0.) + desthvs = Matrix(w, h, 0.) + for x, y in rangexy(w, h): + srcp = destp = 0. + for j in range(-5, 6): + if y + j < 0 or y + j >= h: + continue + for i in range(-3, 4): + if x + i < 0 or x + i >= w: + continue + m = kernel[abs(j)][abs(i)] + srcp += m * srcmat[y + j][x + i] + destp += m * destmat[y + j][x + i] + srchvs[y][x] = srcp + desthvs[y][x] = destp + swaps = toggles = 0 + for x, y in rangexy(w, h): + d = destmat[y][x] + best = 0. + # Compute the effect of a toggle + e = 0. + for j in range(-5, 6): + if y + j < 0 or y + j >= h: + continue + for i in range(-5, 6): + if x + i < 0 or x + i >= w: + continue + m = kernel[abs(j)][abs(i)] + p = srchvs[y + j][x + i] + q1 = desthvs[y + j][x + i] + q2 = q1 - m * d + m * (1. - d) + e += abs(q1 - p) - abs(q2 - p) + if e > best: + best = e + op = False + # Compute the effect of swaps + for dx, dy in [(0, 1), (0, -1), (-1, 0), (1, 0)]: + if y + dy < 0 or y + dy >= h or x + dx < 0 or x + dx >= w: + continue + d2 = destmat[y + dy][x + dx] + if d2 == d: + continue + e = 0. + for j in range(-6, 7): + for i in range(-6, 7): + if y + j < 0 or y + j >= h or x + i < 0 or x + i >= w: + continue + ma = kernel[abs(j)][abs(i)] + mb = kernel[abs(j - dy)][abs(i - dx)] + p = srchvs[y + j][x + i] + q1 = desthvs[y + j][x + i] + q2 = q1 - ma * d + ma * d2 - mb * d2 + mb * d + e += abs(q1 - p) - abs(q2 - p) + if e > best: + best = e + op = (dx, dy) + # Apply the change if interesting + if best <= 0.: + continue + if op: + dx, dy = op + d2 = destmat[y + dy][x + dx] + destmat[y + dy][x + dx] = d + else: + d2 = 1. - d + destmat[y][x] = d2 + for j in range(-5, 6): + for i in range(-5, 6): + m = kernel[abs(j)][abs(i)] + if y + j >= 0 and y + j < h and x + i >= 0 and x + i < w: + desthvs[y + j][x + i] -= m * d + desthvs[y + j][x + i] += m * d2 + if op and y + dy + j >= 0 and y + dy + j < h \ + and x + dx + i >= 0 and x + dx + i < w: + desthvs[y + dy + j][x + dx + i] -= m * d2 + desthvs[y + dy + j][x + dx + i] += m * d + for x, y in rangexy(w, h): + dest.setGray(x, y, destmat[y][x]) + return dest + +if chapter(4): + hvs = lambda x: math.pow(math.e, - math.sqrt(x)) + + tmp = test42x(grad256bw) + tmp.save("out/grad4-2-1.png") + tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-2.png") + tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-3.png") + for n in range(3): tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-4.png") + + tmp = test42x(lena256bw) + tmp.save("out/lena4-2-1.png") + tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-2.png") + tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-3.png") + for n in range(3): tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-4.png") + +if chapter(4): + hvs = lambda x: math.pow(math.e, -x / 2.) + tmp = test42x(grad256bw) + for n in range(5): tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-5.png") + tmp = test42x(lena256bw) + for n in range(5): tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-5.png") + +if chapter(4): + hvs = lambda x: math.pow(math.e, -x / 4.5) + tmp = test42x(grad256bw) + for n in range(5): tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-6.png") + tmp = test42x(lena256bw) + for n in range(5): tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-6.png") + +if chapter(4): + hvs = lambda x: math.pow(math.e, -x / 8.) + tmp = test42x(grad256bw) + for n in range(5): tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-7.png") + tmp = test42x(lena256bw) + for n in range(5): tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-7.png") + +if chapter(4): + hvs = lambda x: math.pow(math.e, -x / 8.) + 2. * math.pow(math.e, -x / 1.5) + tmp = test42x(grad256bw) + for n in range(5): tmp = test42y(grad256bw, tmp, hvs) + tmp.save("out/grad4-2-8.png") + tmp = test42x(lena256bw) + for n in range(5): tmp = test42y(lena256bw, tmp, hvs) + tmp.save("out/lena4-2-8.png") + +# Chapter 4.3: RMSE computations +def rmse(gray, dither): + (w, h) = gray.size() + error = 0. + for y in range(5, h - 5): + for x in range(5, w - 5): + c = gray.getGray(x, y) + d = dither.getGray(x, y) + error += (c - d) * (c - d) + return error / ((w - 10) * (h - 10)) + +if chapter(4): + sigmas = [1., 1.5, 2.] + tmp = [convolution(lena256bw, gaussian(11, s)) for s in sigmas] + for name in ["1-1-1", "1-1-2", "1-1-3", "1-3-1", "1-4-1", "1-4-2", + "2-1-1", "2-3-0", "2-3-1", "2-3-1b", "2-3-2", "2-3-2b", + "2-3-3", "2-4-1", "2-4-2", "2-5-1", "2-5-2", "2-5-3", + "2-5-4", "2-6-1", "2-6-2", "2-6-3", "2-6-4", "2-6-5", + "2-6-6", "2-7-1", "2-7-2", + "3-0-1", "3-1-1", "3-1-2", "3-1-3", "3-2-1", "3-2-1b", + "3-2-1c", "3-2-3", "3-2-4", "3-2-5", "3-2-6", "3-2-7", + "3-2-8", "3-3-3", "3-3-4", "3-3-5", "3-3-6", "3-3-7", + "3-3-8", "3-3-9", "3-3-10", "3-3-11", "3-4-1", "3-5-1", + "3-5-2", "3-5-3", "3-5-4", "3-5-5", "3-6-1", "3-6-2", + "3-6-3", "3-6-4", + "4-2-2", "4-2-3", "4-2-4", "4-2-5", "4-2-6", "4-2-7", + "4-2-8"]: + img = Image("out/lena" + name + ".png") + for i in range(3): + tmp2 = convolution(img, gaussian(11, sigmas[i])) + err = 100. * rmse(tmp[i], tmp2) + print "[ERR] %.5f" % (err,) + +############################################################################## +if chapter(5): + print "Chapter 5. Greyscale dithering" + +# Output 5.0.1: 4x4 Bayer dithering, 3 colours +def test501(src, mat): + (w, h) = src.size() + dest = Image((w, h)) + dx = len(mat[0]) + dy = len(mat) + for x, y in rangexy(w, h): + c = src.getGray(x, y) + threshold = (1. + mat[y % dy][x % dx]) / (dx * dy + 1) + if c < 0.5: + c = 0.5 * (c > threshold / 2) + else: + c = 0.5 + 0.5 * (c > 0.5 + threshold / 2) + dest.setGray(x, y, c) + return dest + +if chapter(5): + test501(grad256bw, DITHER_BAYER88).save("out/grad5-0-1.png") + test501(lena256bw, DITHER_BAYER88).save("out/lena5-0-1.png") + +# Output 5.0.2: standard Floyd-Steinberg, 3 colours +def test502(src, mat, serpentine): + (w, h) = src.size() + dest = Image((w, h)) + lines = len(mat) + rows = len(mat[0]) + offset = mat[0].index(-1) + ey = Matrix(w + rows - 1, lines, 0.) + for y in range(h): + ex = [0.] * (rows - offset) + if serpentine and y & 1: + xrange = range(w - 1, -1, -1) + else: + xrange = range(w) + for x in xrange: + # Set pixel + c = src.getGray(x, y) + ex[0] + ey[0][x + offset] + d = 0.5 * (c > 0.25) + 0.5 * (c > 0.75) + dest.setGray(x, y, d) + error = c - d + # Propagate first line of error + for dx in range(rows - offset - 2): + ex[dx] = ex[dx + 1] + error * mat[0][offset + 1 + dx] + ex[rows - offset - 2] = error * mat[0][rows - 1] + # Propagate next lines + if serpentine and y & 1: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][rows - 1 - dx] + else: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][dx] + for dy in range(lines - 1): + ey[dy] = ey[dy + 1] + ey[lines - 1] = [0.] * (w + rows - 1) + return dest + +if chapter(5): + test502(grad256bw, ERROR_FSTEIN, True).save("out/grad5-0-2.png") + test502(lena256bw, ERROR_FSTEIN, True).save("out/lena5-0-2.png") + +# Pattern 5.1.1: gamma-corrected 50% grey, black-white halftone, 50% grey +if chapter(5): + dest = Image((240, 80)) + for y in range(80): + for x in range(80): + dest.setGray(x, y, Gamma.ItoC(0.5)) + for x in range(80, 160): + c = (x + y) & 1 + dest.setGray(x, y, c) + for x in range(160, 240): + dest.setGray(x, y, 0.5) + dest.save("out/pat5-1-1.png") + +# Output 5.2.1: gamma-corrected 2-colour Floyd-Steinberg +# Output 5.2.2: gamma-corrected 3-colour Floyd-Steinberg +# Output 5.2.3: gamma-corrected 4-colour Floyd-Steinberg +def test52x(src, mat, serpentine, threshold): + (w, h) = src.size() + dest = Image((w, h)) + lines = len(mat) + rows = len(mat[0]) + offset = mat[0].index(-1) + ey = Matrix(w + rows - 1, lines, 0.) + for y in range(h): + ex = [0.] * (rows - offset) + if serpentine and y & 1: + xrange = range(w - 1, -1, -1) + else: + xrange = range(w) + for x in xrange: + # Set pixel + c = Gamma.CtoI(src.getGray(x, y)) + ex[0] + ey[0][x + offset] + d = threshold(c) + dest.setGray(x, y, Gamma.ItoC(d)) + error = c - d + # Propagate first line of error + for dx in range(rows - offset - 2): + ex[dx] = ex[dx + 1] + error * mat[0][offset + 1 + dx] + ex[rows - offset - 2] = error * mat[0][rows - 1] + # Propagate next lines + if serpentine and y & 1: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][rows - 1 - dx] + else: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx] += error * mat[dy][dx] + for dy in range(lines - 1): + ey[dy] = ey[dy + 1] + ey[lines - 1] = [0.] * (w + rows - 1) + return dest + +if chapter(5): + test52x(grad256bw, ERROR_FSTEIN, True, Gamma.Cto2).save("out/grad5-2-1.png") + test52x(lena256bw, ERROR_FSTEIN, True, Gamma.Cto2).save("out/lena5-2-1.png") + test52x(grad256bw, ERROR_FSTEIN, True, Gamma.Cto3).save("out/grad5-2-2.png") + test52x(lena256bw, ERROR_FSTEIN, True, Gamma.Cto3).save("out/lena5-2-2.png") + test52x(grad256bw, ERROR_FSTEIN, True, Gamma.Cto4).save("out/grad5-2-3.png") + test52x(lena256bw, ERROR_FSTEIN, True, Gamma.Cto4).save("out/lena5-2-3.png") + +# Output 5.3.1: full 4-colour block error diffusion +GREY22 = [] +for n in range(4*4*4*4): + vals = [0., 0.333, 0.666, 1.] + a, b, c, d = n & 3, (n >> 2) & 3, (n >> 4) & 3, (n >> 6) & 3 + GREY22.append([[vals[a], vals[b]], [vals[c], vals[d]]]) + +if chapter(5): + subblock(grad256bw, GREY22, + ERROR_SUBFS22, DIFF_WEIGHTED22, True).save("out/grad5-3-1.png") + subblock(lena256bw, GREY22, + ERROR_SUBFS22, DIFF_WEIGHTED22, True).save("out/lena5-3-1.png") + +# Output 5.3.2: 4-colour block error diffusion with only line tiles +GREYLINES22 = [] +for n in range(4*4*4*4): + vals = [0., 0.333, 0.666, 1.] + a, b, c, d = n & 3, (n >> 2) & 3, (n >> 4) & 3, (n >> 6) & 3 + if (a != b or c != d) and (a != c or b != d): + continue + GREYLINES22.append([[vals[a], vals[b]], [vals[c], vals[d]]]) + +if chapter(5): + subblock(grad256bw, GREYLINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22, True).save("out/grad5-3-2.png") + subblock(lena256bw, GREYLINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22, True).save("out/lena5-3-2.png") + +############################################################################## +if chapter(6): + print "Chapter 6. Colour dithering" + +# Pattern 6.1.1: 8-colour palette +if chapter(6): + dest = Image((512, 64)) + for x in range(512): + d = x / 64 + r = (d & 2) >> 1 + g = (d & 4) >> 2 + b = d & 1 + for y in range(64): + dest.setRgb(x, y, r, g, b) + dest.save("out/pat6-1-1.png") + +# Figure 6.1.1: 128x128 Lena +# Figure 6.1.2a: red channel +# Figure 6.1.2b: green channel +# Figure 6.1.2c: blue channel +# Figure 6.1.3a: red channel promoted to greyscale +# Figure 6.1.3b: green channel promoted to greyscale +# Figure 6.1.3c: blue channel promoted to greyscale +# Figure 6.1.4a: dithered red channel +# Figure 6.1.4b: dithered green channel +# Figure 6.1.4c: dithered blue channel +# Figure 6.1.5: combined dithered channels +if chapter(6): + tmp = gammascale(lena256, 2) + tmp.save("out/fig6-1-1.png") + (w, h) = tmp.size() + dst = [Image((w, h), True) for i in range(3)] + for x, y in rangexy(w, h): + rgb = tmp.getRgb(x, y) + dst[0].setRgb(x, y, rgb[0], 0, 0) + dst[1].setRgb(x, y, 0, rgb[1], 0) + dst[2].setRgb(x, y, 0, 0, rgb[2]) + dst[0].save("out/fig6-1-2a.png") + dst[1].save("out/fig6-1-2b.png") + dst[2].save("out/fig6-1-2c.png") + for x, y in rangexy(w, h): + for i in range(3): + rgb = dst[i].getRgb(x, y) + dst[i].setRgb(x, y, rgb[i], rgb[i], rgb[i]) + dst[0].save("out/fig6-1-3a.png") + dst[1].save("out/fig6-1-3b.png") + dst[2].save("out/fig6-1-3c.png") + for i in range(3): + dst[i] = test52x(dst[i], ERROR_FSTEIN, True, Gamma.Cto2) + dst[0].save("out/fig6-1-4a.png") + dst[1].save("out/fig6-1-4b.png") + dst[2].save("out/fig6-1-4c.png") + for x, y in rangexy(w, h): + for i in range(3): + rgb = [0., 0., 0.] + rgb[i] = (dst[i].getRgb(x, y))[i] + dst[i].setRgb(x, y, *rgb) + dst[0].save("out/fig6-1-5a.png") + dst[1].save("out/fig6-1-5b.png") + dst[2].save("out/fig6-1-5c.png") + for x, y in rangexy(w, h): + rgb = [0., 0., 0.] + for i in range(3): + rgb[i] = (dst[i].getRgb(x, y))[i] + tmp.setRgb(x, y, *rgb) + tmp.save("out/fig6-1-6.png") + +# Output 6.1.1: 8-colour Floyd-Steinberg RGB dithering +# Output 6.1.2: 8-colour gamma-corrected Floyd-Steinberg RGB dithering +def test61x(src, mat, func): + (w, h) = src.size() + dest = Image((w, h)) + tmp = [Image((w, h)), Image((w, h)), Image((w, h))] + for x, y in rangexy(w, h): + rgb = src.getRgb(x, y) + for i in range(3): + tmp[i].setGray(x, y, rgb[i]) + for i in range(3): + tmp[i] = func(tmp[i], mat, True, Gamma.Cto2) + for x, y in rangexy(w, h): + (r, g, b) = [tmp[i].getGray(x, y) for i in range(3)] + dest.setRgb(x, y, r, g, b) + return dest + +def test61y(src, mat, serpentine, threshold): + return test3xx(src, mat, serpentine) + +if chapter(6): + test61x(grad256, ERROR_FSTEIN, test61y).save("out/grad6-1-1.png") + test61x(lena256, ERROR_FSTEIN, test61y).save("out/lena6-1-1.png") + test61x(grad256, ERROR_FSTEIN, test52x).save("out/grad6-1-2.png") + test61x(lena256, ERROR_FSTEIN, test52x).save("out/lena6-1-2.png") + +# Pattern 6.2.1: different colours give the same result +if chapter(6): + dest = Image((320, 160)) + for x in range(80): + for y in range(80): + r = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 7 + g = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 13 + b = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 13 + dest.setRgb(x, y, b, g, r) + for y in range(80, 160): + r = DITHER_BAYER44[y % 4][x % 4] > 7 + g = DITHER_BAYER44[y % 4][x % 4] > 13 + b = DITHER_BAYER44[y % 4][x % 4] > 13 + dest.setRgb(x, y, b, g, r) + for x in range(80, 160): + for y in range(80): + r = DITHER_BAYER44[(y / 8) % 4][(x / 8 - 1) % 4] > 7 + g = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 13 + b = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 13 + dest.setRgb(x, y, b, g, r) + for y in range(80, 160): + r = DITHER_BAYER44[y % 4][(x - 1) % 4] > 7 + g = DITHER_BAYER44[y % 4][x % 4] > 13 + b = DITHER_BAYER44[y % 4][x % 4] > 13 + dest.setRgb(x, y, b, g, r) + for x in range(160, 240): + for y in range(80): + r = DITHER_BAYER44[(y / 8 + 1) % 4][(x / 8 + 1) % 4] > 7 + g = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 13 + b = DITHER_BAYER44[(y / 8 + 1) % 4][(x / 8) % 4] > 13 + dest.setRgb(x, y, b, g, r) + for y in range(80, 160): + r = DITHER_BAYER44[(y + 1) % 4][(x + 1) % 4] > 7 + g = DITHER_BAYER44[y % 4][x % 4] > 13 + b = DITHER_BAYER44[(y + 1) % 4][x % 4] > 13 + dest.setRgb(x, y, b, g, r) + for x in range(240, 320): + for y in range(80): + r = DITHER_BAYER44[(y / 8 + 1) % 4][(x / 8) % 4] > 7 + g = DITHER_BAYER44[(y / 8) % 4][(x / 8) % 4] > 13 + b = DITHER_BAYER44[(y / 8) % 4][(x / 8 + 2) % 4] > 13 + dest.setRgb(x, y, b, g, r) + for y in range(80, 160): + r = DITHER_BAYER44[(y + 1) % 4][x % 4] > 7 + g = DITHER_BAYER44[y % 4][x % 4] > 13 + b = DITHER_BAYER44[y % 4][(x + 2) % 4] > 13 + dest.setRgb(x, y, b, g, r) + dest.save("out/pat6-2-1.png") + +# Pattern 6.2.2: 16-colour palette +if chapter(6): + dest = Image((512, 128)) + for x, y in rangexy(64, 64): + dest.setGray(x, y, 0) + dest.setGray(448 + x, y, 0.7) + dest.setGray(x, 64 + y, 0.3) + dest.setGray(448 + x, 64 + y, 1.) + for x in range(64, 448): + d = x / 64 + r = (d & 2) >> 1 + g = (d & 4) >> 2 + b = d & 1 + for y in range(64, 128): + dest.setRgb(x, y, r, g, b) + r /= 2. + g /= 2. + b /= 2. + for y in range(64): + dest.setRgb(x, y, r, g, b) + dest.save("out/pat6-2-2.png") + +# Output 6.2.1: gamma-corrected Floyd-Steinberg with ANSI palette (sigma-abs) +# Output 6.2.2: gamma-corrected Floyd-Steinberg with ANSI palette (euclidian) +def test62x(src, mat, cpal, distance, serpentine): + (w, h) = src.size() + ipal = [[Gamma.CtoI(c[i]) for i in range(3)] for c in cpal] + dest = Image((w, h)) + lines = len(mat) + rows = len(mat[0]) + offset = mat[0].index(-1) + ey = [[[0.] * 3 for n in range(w + rows - 1)] for n in range(lines)] + for y in range(h): + ex = [[0.] * 3 for n in range(rows - offset)] + if serpentine and y & 1: + xrange = range(w - 1, -1, -1) + else: + xrange = range(w) + for x in xrange: + # Get pixel, add error, set pixel + crgb = src.getRgb(x, y) + irgb = [Gamma.CtoI(crgb[i]) + ex[0][i] + ey[0][x + offset][i] \ + for i in range(3)] + crgb = [Gamma.ItoC(irgb[i]) for i in range(3)] + max = 999999. + for n in range(len(cpal)): + d = distance(crgb, cpal[n]) + if d < max: + max = d + cbest = cpal[n] + ibest = ipal[n] + dest.setRgb(x, y, *cbest) + # Compute error and propagate it + for i in range(3): + # Propagate first line of error + error = irgb[i] - ibest[i] + for dx in range(rows - offset - 2): + ex[dx][i] = ex[dx + 1][i] + error * mat[0][offset + 1 + dx] + ex[rows - offset - 2][i] = error * mat[0][rows - 1] + # Propagate next lines + if serpentine and y & 1: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx][i] += error * mat[dy][rows - 1 - dx] + else: + for dy in range(1, lines): + for dx in range(rows): + ey[dy][x + dx][i] += error * mat[dy][dx] + for dy in range(lines - 1): + ey[dy] = ey[dy + 1] + ey[lines - 1] = [[0.] * 3 for n in range(w + rows - 1)] + return dest + +RGB_PALETTE = \ + [[0, 0, 0], + [0, 0, 1], + [0, 1, 0], + [0, 1, 1], + [1, 0, 0], + [1, 0, 1], + [1, 1, 0], + [1, 1, 1]] + +ANSI_PALETTE = \ + [[0, 0, 0], + [0, 0, 0.5], + [0, 0.5, 0], + [0, 0.5, 0.5], + [0.5, 0, 0], + [0.5, 0, 0.5], + [0.5, 0.5, 0], + [0.7, 0.7, 0.7], + [0.3, 0.3, 0.3], + [0, 0, 1], + [0, 1, 0], + [0, 1, 1], + [1, 0, 0], + [1, 0, 1], + [1, 1, 0], + [1, 1, 1]] + +def distmax(u, v): + r, g, b = [abs(u[i] - v[i]) for i in range(3)] + return r + g + b + +def disteuclidian(u, v): + r, g, b = [u[i] - v[i] for i in range(3)] + return r*r + g*g + b*b + +if chapter(6): + test62x(grad256, ERROR_FSTEIN, + ANSI_PALETTE, distmax, True).save("out/grad6-2-1.png") + test62x(lena256, ERROR_FSTEIN, + ANSI_PALETTE, distmax, True).save("out/lena6-2-1.png") + test62x(grad256, ERROR_FSTEIN, + ANSI_PALETTE, disteuclidian, True).save("out/grad6-2-2.png") + test62x(lena256, ERROR_FSTEIN, + ANSI_PALETTE, disteuclidian, True).save("out/lena6-2-2.png") + +def rgb2hsv(r, g, b): + m = (float)(min(r, g, b)) + v = (float)(max(r, g, b)) + if v == m or v == 0: + return 0., 0., v + s = (v - m) / v + if r == v: + h = (g - b) / (v - m) + if h < 0.: + h += 6 + elif g == v: + h = 2. + (b - r) / (v - m) + elif b == v: + h = 4. + (r - g) / (v - m) + return math.pi * h / 3, s, v + +def disthsv(u, v): + u = rgb2hsv(*u) + v = rgb2hsv(*v) + d1 = u[2] - v[2] + d2 = u[2] * u[1] * math.cos(u[0]) - v[2] * v[1] * math.cos(v[0]) + d3 = u[2] * u[1] * math.sin(u[0]) - v[2] * v[1] * math.sin(v[0]) + return d1*d1 + d2*d2 + d3*d3 + +def disthsv3(u, v): + u = rgb2hsv(*u) + v = rgb2hsv(*v) + d1 = u[2] - v[2] + d2 = u[2] * u[1] * math.cos(u[0]) - v[2] * v[1] * math.cos(v[0]) + d3 = u[2] * u[1] * math.sin(u[0]) - v[2] * v[1] * math.sin(v[0]) + return 9*d1*d1 + d2*d2 + d3*d3 + +if chapter(6): + test62x(grad256, ERROR_FSTEIN, + ANSI_PALETTE, disthsv, True).save("out/grad6-2-3.png") + test62x(lena256, ERROR_FSTEIN, + ANSI_PALETTE, disthsv, True).save("out/lena6-2-3.png") + test62x(grad256, ERROR_FSTEIN, + ANSI_PALETTE, disthsv3, True).save("out/grad6-2-4.png") + test62x(lena256, ERROR_FSTEIN, + ANSI_PALETTE, disthsv3, True).save("out/lena6-2-4.png") + +# Output 6.4.1: colour sub-block error diffusion +def colorsubblock(src, tiles, propagate, diff): + (w, h) = src.size() + # Propagating the error to a temporary buffer is becoming more and + # more complicated. We decide to use an intermediate matrix instead. + tmp = Matrix(w, h, None) + for x, y in rangexy(w, h): + tmp[y][x] = Gamma.CtoI3(src.getRgb(x, y)) + dest = Image((w, h)) + # Analyse tile list + ntiles = len(tiles) + ty = len(tiles[0]) + tx = len(tiles[0][0]) + cur = Matrix(tx, ty, None) + w, h = w / tx, h / ty + # Analyse error propagate list + for x, y in rangexy(w, h): + # Get block value + for i, j in rangexy(tx, ty): + cur[j][i] = Gamma.ItoC3(tmp[y * ty + j][x * tx + i]) + # Select closest block + dist = tx * ty + for n in range(ntiles): + d = [0., 0., 0.] + e = 0. + for i, j in rangexy(tx, ty): + tmpe = 0. + for k in range(3): + delta = cur[j][i][k] - tiles[n][j][i][k] + d[k] += delta + tmpe += delta * delta + e += diff[j][i] * math.sqrt(tmpe) + # Without / 3. ugly colour bleeding artifacts appear + absd = (abs(d[0]) + abs(d[1]) + abs(d[2])) / 3. + if absd / (tx * ty) + e < dist: + dist = absd / (tx * ty) + e + best = n + # Set pixel + for i, j in rangexy(tx, ty): + dest.setRgb(x * tx + i, y * ty + j, *(tiles[best][j][i])) + # Propagate error + for i, j in rangexy(tx, ty): + curp = Gamma.CtoI3(cur[j][i]) + bestp = Gamma.CtoI3(tiles[best][j][i]) + m = propagate[j][i] + for k in range(3): + e = curp[k] - bestp[k] + for px, py in rangexy(len(m[0]), len(m)): + if m[py][px] == 0: + continue + if m[py][px] == -1: + cx, cy = px, py + continue + tmpx = x * tx + i + px - cx + tmpy = y * ty + j + py - cy + if tmpx > w * tx - 1 or tmpy > h * ty - 1: + continue + tmp[tmpy][tmpx][k] += m[py][px] * e + return dest + +RGBLINES22 = [] +for n in range(8*8*8*8): + a, b, c, d = n & 7, (n >> 3) & 7, (n >> 6) & 7, (n >> 9) & 7 + if (a != b or c != d) and (a != c or b != d): + continue + RGBLINES22.append([[RGB_PALETTE[a], RGB_PALETTE[b]], + [RGB_PALETTE[c], RGB_PALETTE[d]]]) + +if chapter(6): + colorsubblock(grad256, RGBLINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22).save("out/grad6-4-1.png") + colorsubblock(lena256, RGBLINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22).save("out/lena6-4-1.png") + +ANSILINES22 = [] +for n in range(16*16*16*16): + a, b, c, d = n & 15, (n >> 4) & 15, (n >> 8) & 15, (n >> 12) & 15 + if (a != b or c != d) and (a != c or b != d): + continue + ANSILINES22.append([[ANSI_PALETTE[a], ANSI_PALETTE[b]], + [ANSI_PALETTE[c], ANSI_PALETTE[d]]]) + +if chapter(6): + colorsubblock(grad256, ANSILINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22).save("out/grad6-4-2.png") + colorsubblock(lena256, ANSILINES22, + ERROR_SUBFS22, DIFF_WEIGHTED22).save("out/lena6-4-2.png") + +############################################################################## +if chapter(7): + print "Chapter 7. Photographic mosaics" + +# Output 7.0.1: create a mosaic from Lena +def mosaic_split(src, tnw, tnh): + random.seed(0) + thumbs = [] + (w, h) = src.size() + sw = w / tnw + sh = h / tnh + for x, y in rangexy(sw, sh): + thumbs.append(src.getRegion(x * tnw, y * tnh, tnw, tnh)) + random.shuffle(thumbs) + return thumbs + +def mosaic_analyse(tnlist, dx, dy): + coeffs = [] + for (n, img) in enumerate(tnlist): + tmp = [[[0] * 3 for x in range(dx)] for y in range(dy)] + (w, h) = img.size() + for x, y in rangexy(w, h): + my = y * dy / h + mx = x * dx / w + (r, g, b) = img.getRgb(x, y) + tmp[my][mx][0] += Gamma.CtoI(r) / (w / dx * h / dy) + tmp[my][mx][1] += Gamma.CtoI(g) / (w / dx * h / dy) + tmp[my][mx][2] += Gamma.CtoI(b) / (w / dx * h / dy) + coeffs.append(tmp) + return coeffs + +def test701(tnlist, cols): + (tnw, tnh) = tnlist[0].size() + dw = cols + dh = (len(tnlist) + cols - 1) / cols + dest = Image((dw * tnw + 8 * (dw + 1), dh * tnh + 8 * (dh + 1)), True) + for (n, img) in enumerate(tnlist): + di = 8 + (n % dw) * (tnw + 8) + dj = 8 + (n / dw) * (tnh + 8) + img.copyTo(dest, (di, dj)) + return dest + +if chapter(7): + tnlist = mosaic_split(lena256, 32, 32) + test701(tnlist, 10).save("out/lena7-0-1.png") + +# Output 7.1.1: extract 1 colour feature from mosaic tiles +# Output 7.1.2: crop Lena +# Output 7.1.3: generate a mosaic from the 1-feature database +# Output 7.1.4: extract 4 colour features from mosaic tiles +# Output 7.1.5: generate a mosaic from the 4-feature database +def test71x(coeffs, cols, tnw, tnh): + dx = len(coeffs[0][0]) + dy = len(coeffs[0]) + dw = cols + dh = (len(coeffs) + cols - 1) / cols + dest = Image((dw * tnw + 8 * (dw + 1), dh * tnh + 8 * (dh + 1)), True) + for (n, tab) in enumerate(coeffs): + di = 8 + (n % dw) * (tnw + 8) + dj = 8 + (n / dw) * (tnh + 8) + for x, y in rangexy(tnw, tnh): + (r, g, b) = tab[y * dy / tnh][x * dx / tnw] + dest.setRgb(di + x, dj + y, Gamma.ItoC(r), Gamma.ItoC(g), Gamma.ItoC(b)) + return dest + +def test71y(src, sqw, sqh, tnlist, coeffs): + (w, h) = src.size() + (tnw, tnh) = tnlist[0].size() + dx = len(coeffs[0][0]) + dy = len(coeffs[0]) + nx = w / sqw + ny = h / sqh + dest = Image((nx * tnw, ny * tnh), True) + for X, Y in rangexy(nx, ny): + # 1. create statistics about the current square + cur = [[[0] * 3 for x in range(dx)] for y in range(dy)] + for x, y in rangexy(sqw, sqh): + my = y * dy / sqh + mx = x * dx / sqw + (r, g, b) = src.getRgb(X * sqw + x, Y * sqh + y) + cur[my][mx][0] += Gamma.CtoI(r) / (sqw / dx * sqh / dy) + cur[my][mx][1] += Gamma.CtoI(g) / (sqw / dx * sqh / dy) + cur[my][mx][2] += Gamma.CtoI(b) / (sqw / dx * sqh / dy) + # 2. find the best mosaic part + best = -1 + dist = 5. + for (n, tmp) in enumerate(coeffs): + d = 0 + for i, j in rangexy(dx, dy): + for c in range(3): + t = cur[j][i][c] - tmp[j][i][c] + d += t * t + if d < dist: + dist = d + best = n + # 3. blit mosaic chunk + tnlist[best].copyTo(dest, (X * tnw, Y * tnh)) + return dest + +if chapter(7): + coeffs1x1 = mosaic_analyse(tnlist, 1, 1) + test71x(coeffs1x1, 10, 8, 8).save("out/lena7-1-1.png") + out712 = lena256.getRegion(100, 90, 80, 80) + out712.save("out/lena7-1-2.png") + test71y(out712, 6, 6, tnlist, coeffs1x1).save("out/lena7-1-3.png") + + coeffs2x2 = mosaic_analyse(tnlist, 2, 2) + test71x(coeffs2x2, 10, 16, 16).save("out/lena7-1-4.png") + test71y(out712, 6, 6, tnlist, coeffs2x2).save("out/lena7-1-5.png") + +############################################################################## +print "Finished" + +# Place temporary cruft below this +sys.exit(0) + +def simusubblock(src): + (w, h) = src.size() + dest = Image((w, h)) + tmp = Matrix(w, h, 0.) + for x, y in rangexy(w, h): + tmp[y][x] = src.getRgb(x, y) + dest = Image((w, h)) + # Analyse tile list + ntiles = len(tiles) + ty = len(tiles[0]) + tx = len(tiles[0][0]) + cur = Matrix(tx, ty, None) + w, h = w / tx, h / ty + # Analyse error propagate list + for x, y in rangexy(w, h): + # Get block value + for i, j in rangexy(tx, ty): + cur[j][i] = Gamma.ItoC3(tmp[y * ty + j][x * tx + i]) + # Select closest block + dist = tx * ty + for n in range(ntiles): + d = [0., 0., 0.] + e = 0. + for i, j in rangexy(tx, ty): + tmpe = 0. + for k in range(3): + delta = cur[j][i][k] - tiles[n][j][i][k] + d[k] += delta + tmpe += delta * delta + e += diff[j][i] * math.sqrt(tmpe) + # Without / 3. ugly colour bleeding artifacts appear + absd = (abs(d[0]) + abs(d[1]) + abs(d[2])) / 3. + if absd / (tx * ty) + e < dist: + dist = absd / (tx * ty) + e + best = n + # Set pixel + for i, j in rangexy(tx, ty): + dest.setRgb(x * tx + i, y * ty + j, *(tiles[best][j][i])) + # Propagate error + for i, j in rangexy(tx, ty): + curp = Gamma.CtoI3(cur[j][i]) + bestp = Gamma.CtoI3(tiles[best][j][i]) + m = propagate[j][i] + for k in range(3): + e = curp[k] - bestp[k] + for px, py in rangexy(len(m[0]), len(m)): + if m[py][px] == 0: + continue + if m[py][px] == -1: + cx, cy = px, py + continue + tmpx = x * tx + i + px - cx + tmpy = y * ty + j + py - cy + if tmpx > w * tx - 1 or tmpy > h * ty - 1: + continue + tmp[tmpy][tmpx][k] += m[py][px] * e + return dest + + +# XXX: test -- ranked dither -- it SUCKS +def test26x(src, mat): + (w, h) = src.size() + dest = Image((w, h)) + dx = len(mat[0]) + dy = len(mat) + for x, y in rangexy(w / dx, h / dy): + # Step 1: get the pixels and count groups + groups = {} + for i, j in rangexy(dx, dy): + p = src.getGray(x * dx + i, y * dy + j) + if groups.has_key(p): + groups[p].append((i, j)) + else: + groups[p] = [(i, j)] + # Step 2: create the ranked dither + ranked = Matrix(dx, dy) + for p, g in groups.items(): + n = (int)(round(p * len(g))) + if not n: + continue + v = [(mat[j][i], (i, j)) for (i, j) in g] + v.sort() + v = v[0 : n - 1] + for (k, (i, j)) in v: + ranked[j][i] = 1 + # Step 3: blit the ranked dither + for j in range(dy): + for i in range(dx): + dest.setGray(x * dx + i, y * dy + j, ranked[j][i]) + return dest + +if chapter(2): + #test26x(lena256bw, DITHER_BAYER88).save("out/lena2-6-1.png") + #test26x(grad256bw, DITHER_BAYER88).save("out/grad2-6-1.png") + test26x(lena256bw, DITHER_CLUSTER88).save("out/lena2-6-1.png") + test26x(grad256bw, DITHER_CLUSTER88).save("out/grad2-6-1.png") + +##################### +#CIE-L*a*b* transformation -- euclidian distance doesn't seem to work great +def rgb2lab(r, g, b): + Xw50 = 0.9642; + Yw50 = 1.0000; + Zw50 = 0.8249; + # RGB to sRGB + r = Gamma.CtoI(r) + g = Gamma.CtoI(g) + b = Gamma.CtoI(b) + # sRGB to XYZ(D65) + x65 = 0.4124*r + 0.3576*g + 0.1805*b + y65 = 0.2126*r + 0.7152*g + 0.0722*b + z65 = 0.0193*r + 0.1192*g + 0.9505*b + # XYZ(D65) to XYZ(D50) + x50 = 1.0282015*x65 + 0.0500707*y65 - 0.0579688*z65 + y50 = 0.0197032*x65 + 0.9871848*y65 - 0.0054285*z65 + z50 = -0.0002329*x65 + 0.0006862*y65 + 0.7573070*z65 + # XYZ(D50) to Lab(D50) + if x50 / Xw50 > 0.008856: + xx50 = math.pow(x50 / Xw50, 1. / 3.) + else: + xx50 = 7.78 * (x50 / Xw50) + 16. / 116. + if y50 / Yw50 > 0.008856: + yy50 = math.pow(y50 / Yw50, 1. / 3.) + else: + yy50 = 7.78 * (y50 / Yw50) + 16. / 116. + if z50 / Zw50 > 0.008856: + zz50 = math.pow(z50 / Zw50, 1. / 3.) + else: + zz50 = 7.78 * (z50 / Zw50) + 16. / 116. + lo = 116. * yy50 - 16. + ao = 500. * (xx50 - yy50) + bo = 200. * (yy50 - zz50) + return lo, ao, bo + +def distlab(u, v): + u = rgb2lab(*u) + v = rgb2lab(*v) + l, a, b = u[0] - v[0], u[1] - v[1], u[2] - v[2] + return l*l + a*a + b*b + + diff --git a/static/toilet-sample.png b/static/toilet-sample.png new file mode 100644 index 0000000..d50a6ae Binary files /dev/null and b/static/toilet-sample.png differ diff --git a/static/toilet.html b/static/toilet.html new file mode 100644 index 0000000..17ecf8e --- /dev/null +++ b/static/toilet.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + libcaca - TOIlet + + + + + + + + + +

TOIlet

+ +

The TOIlet project attempts to create a free replacement for the FIGlet utility. TOIlet stands for “The +Other Implementation’s letters”, coined after FIGlet’s “Frank, Ian and +Glen’s letters”.

+ +

TOIlet is in its very early development phase. It uses the powerful +libcucul library to achieve various text-based effects. TOIlet +implements or plans to implement the following features:

+ +
    +
  • The ability to load FIGlet fonts
  • +
  • Support for Unicode input and output
  • +
  • Support for colour output
  • +
  • Support for various output formats: HTML, IRC, ANSI...
  • +
+ +

TOIlet also aims for full FIGlet compatibility. It is currently able +to load FIGlet fonts and perform horizontal smushing.

+ +

Live test

+ + 'Emboss', + 'emboss2' => 'Emboss 2', + 'future' => 'Future', + 'smblock' => 'Small Block', + 'smbraille' => 'Small Braille', + 'circle' => 'Circle', + 'term' => 'Terminal'); + if(!isset($fontlist[$font])) $font = 'smblock'; + $filter = $_POST['filter']; + $filterlist = array('""' => 'No filter', + 'flip' => 'Flip', + 'flop' => 'Flop', + 'rotate' => 'Rotate'); + if(!isset($filterlist[$filter])) $filter = '""'; ?> + +
+

+ + + + +

+
+ + +
+

+
+ + +

Download

+ +

The latest TOIlet version is toilet-0.1.tar.gz.

+ +

Screenshot

+ +

TOIlet sample

+ + + + + diff --git a/static/ttyvaders-sample1.png b/static/ttyvaders-sample1.png new file mode 100644 index 0000000..b4249bf Binary files /dev/null and b/static/ttyvaders-sample1.png differ diff --git a/static/ttyvaders-sample2.png b/static/ttyvaders-sample2.png new file mode 100644 index 0000000..d467f26 Binary files /dev/null and b/static/ttyvaders-sample2.png differ diff --git a/static/ttyvaders.html b/static/ttyvaders.html new file mode 100644 index 0000000..dbbe3c6 --- /dev/null +++ b/static/ttyvaders.html @@ -0,0 +1,39 @@ + + + + + + + + + + + + libcaca - ttyvaders + + + + + + + + + +

ttyvaders

+ +

ttyvaders is a work-in-progress libcaca project. More later.

+ +

Screenshots

+ +

ttyvaders sample 2

+ +

ttyvaders sample 1

+ + + + + diff --git a/trac/README b/trac/README new file mode 100644 index 0000000..7e97d25 --- /dev/null +++ b/trac/README @@ -0,0 +1,2 @@ +This directory contains a Trac environment. +Visit http://trac.edgewall.org/ for more information. diff --git a/trac/VERSION b/trac/VERSION new file mode 100644 index 0000000..44d5dcc --- /dev/null +++ b/trac/VERSION @@ -0,0 +1 @@ +Trac Environment Version 1 diff --git a/trac/cgi-bin/trac.cgi b/trac/cgi-bin/trac.cgi new file mode 100755 index 0000000..ba51ec5 --- /dev/null +++ b/trac/cgi-bin/trac.cgi @@ -0,0 +1,44 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2003-2008 Edgewall Software +# Copyright (C) 2003-2004 Jonas Borgström +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://trac.edgewall.org/wiki/TracLicense. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://trac.edgewall.org/log/. +# +# Author: Jonas Borgström + +try: + import os + import tempfile + if 'TRAC_ENV' not in os.environ and \ + 'TRAC_ENV_PARENT_DIR' not in os.environ: + os.environ['TRAC_ENV'] = '/srv/caca.zoy.org/var/lib/trac' + if 'PYTHON_EGG_CACHE' not in os.environ: + os.environ['PYTHON_EGG_CACHE'] = tempfile.gettempdir() + from trac.web import cgi_frontend + cgi_frontend.run() +except SystemExit: + raise +except Exception, e: + import sys + import traceback + + print>>sys.stderr, e + traceback.print_exc(file=sys.stderr) + + print 'Status: 500 Internal Server Error' + print 'Content-Type: text/plain' + print + print 'Oops...' + print + print 'Trac detected an internal error:', e + print + traceback.print_exc(file=sys.stdout) diff --git a/trac/cgi-bin/trac.fcgi b/trac/cgi-bin/trac.fcgi new file mode 100644 index 0000000..dcc0449 --- /dev/null +++ b/trac/cgi-bin/trac.fcgi @@ -0,0 +1,42 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2003-2008 Edgewall Software +# Copyright (C) 2003-2004 Jonas Borgström +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://trac.edgewall.org/wiki/TracLicense. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://trac.edgewall.org/log/. +# +# Author: Jonas Borgström + +try: + import os + import tempfile + if 'TRAC_ENV' not in os.environ and \ + 'TRAC_ENV_PARENT_DIR' not in os.environ: + os.environ['TRAC_ENV'] = '/srv/caca.zoy.org/var/lib/trac' + if 'PYTHON_EGG_CACHE' not in os.environ: + os.environ['PYTHON_EGG_CACHE'] = tempfile.gettempdir() + from trac.web import fcgi_frontend + fcgi_frontend.run() +except SystemExit: + raise +except Exception, e: + print 'Content-Type: text/plain\r\n\r\n', + print 'Oops...' + print + print 'Trac detected an internal error:' + print + print e + print + import traceback + import StringIO + tb = StringIO.StringIO() + traceback.print_exc(file=tb) + print tb.getvalue() diff --git a/trac/cgi-bin/trac.wsgi b/trac/cgi-bin/trac.wsgi new file mode 100644 index 0000000..ef071ef --- /dev/null +++ b/trac/cgi-bin/trac.wsgi @@ -0,0 +1,27 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright (C) 2008 Edgewall Software +# Copyright (C) 2008 Noah Kantrowitz +# All rights reserved. +# +# This software is licensed as described in the file COPYING, which +# you should have received as part of this distribution. The terms +# are also available at http://trac.edgewall.org/wiki/TracLicense. +# +# This software consists of voluntary contributions made by many +# individuals. For the exact contribution history, see the revision +# history and logs, available at http://trac.edgewall.org/log/. +# +# Author: Noah Kantrowitz +import os +import tempfile + +from trac.web.main import dispatch_request +import pkg_resources + +def application(environ, start_request): + environ['trac.env_path'] = '/srv/caca.zoy.org/var/lib/trac' + if 'PYTHON_EGG_CACHE' not in os.environ: + pkg_resources.set_extraction_path(tempfile.gettempdir()) + return dispatch_request(environ, start_request) diff --git a/trac/conf/trac.ini b/trac/conf/trac.ini new file mode 100644 index 0000000..9df5337 --- /dev/null +++ b/trac/conf/trac.ini @@ -0,0 +1,125 @@ +# -*- coding: utf-8 -*- + +[attachment] +max_size = 26214400 +render_unsafe_content = false + +[browser] +downloadable_paths = /trunk, /branches/*, /tags/* +hide_properties = svk:merge +render_unsafe_content = false + +[changeset] +max_diff_bytes = 10000000 +max_diff_files = 0 +wiki_format_messages = true + +[header_logo] +alt = +height = -1 +link = http://caca.zoy.org/ +src = /browser/www/img/trac_banner.png?format=raw +width = -1 + +[logging] +log_file = trac.log +log_level = DEBUG +log_type = none + +[mimeviewer] +enscript_modes = text/x-dylan:dylan:4 +enscript_path = enscript +max_preview_size = 2621440 +mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb +php_path = php +silvercity_modes = +tab_width = 8 + +[notification] +always_notify_owner = false +always_notify_reporter = false +always_notify_updater = false +mime_encoding = qp +smtp_always_bcc = +smtp_always_cc = libcaca-trac@lists.zoy.org +smtp_default_domain = +smtp_enabled = true +smtp_from = sam+trac@zoy.org +smtp_from_name = Caca Labs Trac +smtp_password = +smtp_port = 25 +smtp_server = localhost +smtp_subject_prefix = +smtp_user = +use_public_cc = true +use_short_addr = false +use_tls = false + +[project] +descr = Caca Labs +footer = Visit the Caca Labs at
http://caca.zoy.org/ +icon = /favicon.ico +name = caca labs +url = http://caca.zoy.org/ + +[search] +min_query_length = 3 + +[ticket] +default_component = libcaca +default_milestone = 1.0 +default_priority = major +default_type = defect +default_version = SVN +restrict_owner = false + +[ticket-workflow] +accept = new -> assigned +accept.operations = set_owner_to_self +accept.permissions = TICKET_MODIFY +leave = * -> * +leave.default = 1 +leave.operations = leave_status +reassign = new,assigned,reopened -> new +reassign.operations = set_owner +reassign.permissions = TICKET_MODIFY +reopen = closed -> reopened +reopen.operations = del_resolution +reopen.permissions = TICKET_CREATE +resolve = new,assigned,reopened -> closed +resolve.operations = set_resolution +resolve.permissions = TICKET_MODIFY + +[timeline] +changeset_long_messages = false +changeset_show_files = 0 +default_daysback = 30 +ticket_show_details = false + +[trac] +authz_file = +authz_module_name = +check_auth_ip = true +database = sqlite:db/trac.db +default_charset = utf-8 +default_handler = WikiModule +htdocs_location = +ignore_auth_case = false +mainnav = wiki,timeline,tickets,newticket,browser,search +metanav = login,logout,settings,help,about +permission_store = DefaultPermissionStore +repository_dir = /srv/caca.zoy.org/var/lib/svn +repository_type = svn +timeout = 20 +show_email_addresses = true + +[mainnav] +wiki.label = Home +tickets.label = Bug reports +tickets.href = /report/1 +newticket.label = Report a bug + +[wiki] +ignore_missing_pages = false +split_page_names = false + diff --git a/trac/conf/trac.ini.sample b/trac/conf/trac.ini.sample new file mode 100644 index 0000000..7c3c806 --- /dev/null +++ b/trac/conf/trac.ini.sample @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- + +[attachment] +max_size = 262144 +render_unsafe_content = false + +[browser] +color_scale = True +downloadable_paths = /trunk, /branches/*, /tags/* +hide_properties = svk:merge +intermediate_color = +intermediate_point = +newest_color = (255, 136, 136) +oldest_color = (136, 136, 255) +oneliner_properties = trac:summary +render_unsafe_content = false +wiki_properties = trac:description + +[changeset] +max_diff_bytes = 10000000 +max_diff_files = 0 +wiki_format_messages = true + +[header_logo] +alt = (please configure the [header_logo] section in trac.ini) +height = -1 +link = +src = site/your_project_logo.png +width = -1 + +[inherit] +plugins_dir = +templates_dir = + +[logging] +log_file = trac.log +# log_format = +log_level = DEBUG +log_type = none + +[milestone] +stats_provider = DefaultTicketGroupStatsProvider + +[mimeviewer] +enscript_modes = text/x-dylan:dylan:4 +enscript_path = enscript +max_preview_size = 262144 +mime_map = text/x-dylan:dylan,text/x-idl:ice,text/x-ada:ads:adb +php_path = php +silvercity_modes = +tab_width = 8 + +[notification] +admit_domains = +always_notify_owner = false +always_notify_reporter = false +always_notify_updater = true +ignore_domains = +mime_encoding = base64 +smtp_always_bcc = +smtp_always_cc = +smtp_default_domain = +smtp_enabled = false +smtp_from = trac@localhost +smtp_from_name = +smtp_password = +smtp_port = 25 +smtp_replyto = trac@localhost +smtp_server = localhost +smtp_subject_prefix = __default__ +smtp_user = +ticket_subject_template = $prefix #$ticket.id: $summary +use_public_cc = false +use_short_addr = false +use_tls = false + +[project] +admin = +descr = My example project +footer = Visit the Trac open source project at
http://trac.edgewall.org/ +icon = common/trac.ico +name = My Project +url = + +[query] +default_anonymous_query = status!=closed&cc~=$USER +default_query = status!=closed&owner=$USER +items_per_page = 100 + +[report] +items_per_page = 100 +items_per_page_rss = 0 + +[revisionlog] +default_log_limit = 100 + +[roadmap] +stats_provider = DefaultTicketGroupStatsProvider + +[search] +min_query_length = 3 + +[svn] +branches = trunk,branches/* +tags = tags/* + +[ticket] +default_component = +default_milestone = +default_priority = major +default_resolution = fixed +default_type = defect +default_version = +max_description_size = 262144 +preserve_newlines = default +restrict_owner = false +workflow = ConfigurableTicketWorkflow + +[timeline] +abbreviated_messages = true +changeset_collapse_events = false +changeset_long_messages = false +changeset_show_files = 0 +default_daysback = 30 +max_daysback = 90 +newticket_formatter = oneliner +ticket_show_details = false + +[trac] +authz_file = +authz_module_name = +auto_reload = False +base_url = +check_auth_ip = true +database = sqlite:db/trac.db +default_charset = iso-8859-15 +default_handler = WikiModule +htdocs_location = +ignore_auth_case = false +mainnav = wiki,timeline,roadmap,browser,tickets,newticket,search +metanav = login,logout,prefs,help,about +permission_policies = DefaultPermissionPolicy, LegacyAttachmentPolicy +permission_store = DefaultPermissionStore +repository_dir = +repository_type = svn +request_filters = None +show_email_addresses = false +templates_dir = /usr/share/trac/templates +timeout = 20 +use_base_url_for_redirect = False + +[wiki] +ignore_missing_pages = false +render_unsafe_content = false +split_page_names = false + diff --git a/trac/htdocs/common/README b/trac/htdocs/common/README new file mode 100644 index 0000000..96c5745 --- /dev/null +++ b/trac/htdocs/common/README @@ -0,0 +1,5 @@ +This directory contains files used by Trac's default clearsilver templates. + +Local modifications to these files might be lost during the installation of +a new Trac version. This can be avoided by making a copy of this entire +directory before beginning modifications. diff --git a/trac/htdocs/common/asc.png b/trac/htdocs/common/asc.png new file mode 100644 index 0000000..486b731 Binary files /dev/null and b/trac/htdocs/common/asc.png differ diff --git a/trac/htdocs/common/attachment.png b/trac/htdocs/common/attachment.png new file mode 100644 index 0000000..a4d2124 Binary files /dev/null and b/trac/htdocs/common/attachment.png differ diff --git a/trac/htdocs/common/changeset.png b/trac/htdocs/common/changeset.png new file mode 100644 index 0000000..31c0356 Binary files /dev/null and b/trac/htdocs/common/changeset.png differ diff --git a/trac/htdocs/common/closedticket.png b/trac/htdocs/common/closedticket.png new file mode 100644 index 0000000..43f7a84 Binary files /dev/null and b/trac/htdocs/common/closedticket.png differ diff --git a/trac/htdocs/common/collapsed.png b/trac/htdocs/common/collapsed.png new file mode 100644 index 0000000..4a2ac19 Binary files /dev/null and b/trac/htdocs/common/collapsed.png differ diff --git a/trac/htdocs/common/css/about.css b/trac/htdocs/common/css/about.css new file mode 100644 index 0000000..f778bc9 --- /dev/null +++ b/trac/htdocs/common/css/about.css @@ -0,0 +1,18 @@ +/* About page */ +#content.about p.copyright { color: #999; font-size: 90%; } +#content.about h2 { margin-top: 2em; } +#content.about table { margin-top: 0; width: auto; } +#content.about table th, #content.about table td { font-size: 90%; } + +#content.about th { background: #f7f7f0; font-weight: bold; text-align: right; + vertical-align: top; +} + +#content.about #config th { text-align: left; } +#content.about #config th.section { text-align: right; } +#content.about #config th, #content.about #config td { border: 1px solid #ddd; + padding: 3px; +} +#content.about #config tr.modified { background: #ffd; } +#content.about #config tr.modified td.value { font-style: italic; } +#content.about #config td.doc { padding: 3px 1em; } diff --git a/trac/htdocs/common/css/admin.css b/trac/htdocs/common/css/admin.css new file mode 100644 index 0000000..9bb40b4 --- /dev/null +++ b/trac/htdocs/common/css/admin.css @@ -0,0 +1,66 @@ +#content.admin h1 { float: left; } + +#tabs { background: #f7f7f0; border: 1px solid black; + border-color: #ccc #666 #666 #ccc; clear: left; + margin: 1em 0 2em; padding: .5em 0 0; float: left; width: 12em; +} +#tabs ul { list-style: none; margin: 0 0 .5em; padding: 0; } +#tabs li { color: #999; font-size: 90%; font-weight: bold; margin: 0; + padding: 0.1em 5px; +} +#tabs li li { color: #000; font-size: 110%; font-weight: normal; + margin: 0 -3px; padding: 1px 0 1px 10px; +} +#tabs li li.active { background: #ddc; border: 1px solid; + border-color: #ccc #000 #666 #ccc; padding: 0 0 0 9px; +} +#tabs :link, #tabs :visited { border: none; display: block } +#tabs :link:hover, #tabs :visited:hover { background: transparent; + color: #000; +} + +#tabcontent { padding: 0.4em 2em; margin-left: 12em; min-height: 300px; } +#tabcontent h2 { color: #333; margin-top: 0; } +p.help { color: #666; font-size: 90%; margin: 1em .5em .5em; } + +#enumlist tbody td { vertical-align: middle; } + +form.addnew { clear: right; float: right; margin: -2em 0 4em; width: 33% } +form.mod { margin-top: 1em; } +form.mod .field { margin: .5em 0; } +form .field em { color: #888; font-size: smaller } +form .field .disabled em { color: #d7d7d7 } + +table.listing { clear: none; width: 64% } +table.listing .sel, table.listing .default { text-align: center; width: 1% } + +/* Plugins panel */ +form#addplug { width: 35% } +.plugin { background: #f7f7f7; border: 1px solid #d7d7d7; margin: 0 0 2em; + padding: 2px .5em; text-align: left; width: 60%; +} +.plugin h3 { margin: .5em 0; color: #bb0000;} +.plugin h3 a { + padding: 2px .5em; text-align: left; width: 60%; +} +.plugin h3 a { background: url(../expanded.png) 0 50% no-repeat; + padding-left: 16px; +} +.collapsed h3 a { background-image: url(../collapsed.png); } +.plugin .buttons { margin-top: 0; text-align: right } +.plugin .uninstall { margin-top: -2.6em; padding: 0 } +.plugin .summary, .plugin .info { color: #999; font-size: 80%; + padding-left: 16px; +} +.plugin .summary { margin: -.5em 0 .5em } +.plugin .info { margin: 1em 0 .5em; } +.plugin .info dt { float: left; width: 7em; } +.plugin .info dd { padding: 0; margin: 0; } +.plugin .listing { width: 100% } +.collapsed .info, .collapsed .listing, .collapsed .update { display: none } +.plugin .listing td { background: #fff } +.plugin .listing .name p { color: #999; font-size: 80%; margin: 0 } + +/* Perm Panel */ +#permlist div { width: 13em; float: left; } +fieldset tr.field th { text-align: right; } diff --git a/trac/htdocs/common/css/browser.css b/trac/htdocs/common/css/browser.css new file mode 100644 index 0000000..8dfa37d --- /dev/null +++ b/trac/htdocs/common/css/browser.css @@ -0,0 +1,183 @@ +#prefs { margin-top: -0.6em } +* html #prefs { width: 34em } /* Set width only for IE */ +#prefs fieldset { margin: 0; } +#prefs fieldset label { display: block } +#prefs .buttons { margin-top: -2.3em } +#prefs .choice { + float: left; + margin: 0 .6em 0 .3em; + border-right: 1px dotted #d7d7d7; +} + +#file-legend { margin-top: 3em; } + +/* Browser */ +h1 { margin: 0; padding: 0 0 .5em } +h1 :link, h1 :visited, h1 .filename { border: none; padding: 0 .2em } +h1 :link, h1 :visited { color: #b00 } +h1 .first:link, h1 .first:visited { color: #998 } +h1 .sep { color: #666; padding: 0 .1em } +h1 .pathentry { float: left } + +#jumprev, #jumploc { float: right; font-size: 10px; margin: 0 0 0.6em } +#jumprev form, #jumploc form { margin: 0 } +#jumprev input, #jumploc select, #jumploc input { + font-size: 10px; + margin: 0; +} +#jumploc div.buttons { margin: 0;} +#jumploc { margin-right: 2em;} + +/* Browser file annotations */ +table.code th.blame { width: 5em; } +table.code th.blame a { color: #ddd; } + +div.message { + background: #f7f7f0; + border: 3px double #d7d7d7; + margin: 0; + padding: 8px; + /* Note: border width and padding must be compensated for in the placement */ +} + +div.message div.inlinebuttons { float: right; } + +/* Styles for the directory entries table + (extends the styles for "table.listing") */ +#dirlist { margin-top: 0 } +#dirlist td.rev, #dirlist td.age, #dirlist td.change { + color: #888; + white-space: nowrap; + vertical-align: baseline; +} +#dirlist td.rev { + font-family: monospace; + letter-spacing: -0.08em; + font-size: 90%; + text-align: right; +} +#dirlist td.size { + color: #888; + white-space: nowrap; + text-align: right; + vertical-align: middle; + font-size: 70%; +} +#dirlist td.age { + border-width: 0 2px 0 0; + border-style: solid; + font-size: 85%; +} +#dirlist td.name { width: 100% } +#dirlist td.name a, #dirlist td.name span { + background-position: 0% 50%; + background-repeat: no-repeat; + padding-left: 20px; +} +#dirlist td.name a.parent { background-image: url(../parent.png) } +#dirlist td.name div { white-space: pre } +#dirlist tr span.expander { + background-image: url(../expander_normal.png); + cursor: pointer; + padding-left: 8px; + margin-left: 4px; +} +#dirlist tr span.expander:hover { + background-image: url(../expander_normal_hover.png); +} +#dirlist tr.expanded span.expander { + background-image: url(../expander_open.png); + padding-left: 12px; + margin-left: 0; +} +#dirlist tr.expanded span.expander:hover { + background-image: url(../expander_open_hover.png); +} +#dirlist td.name a.dir { background-image: url(../folder.png) } +#dirlist td.name a.file { background-image: url(../file.png); display: block } +#dirlist td.name a, #dirlist td.rev a { border-bottom: none } +#dirlist td.rev { text-align: right } +#dirlist td.change { + font-size: 85%; + vertical-align: middle; + white-space: nowrap +} + +#dirlist td span.loading { + background-image: url(../loading.gif); + font-style: italic +} + +/* Style for the ''View Changes'' button and the diff preparation form */ +#anydiff { margin: 0 0 1em; float: left } +#anydiff form, #anydiff div, #anydiff h2 { display: inline } +#anydiff form th { text-align: right } +#anydiff input { vertical-align: baseline; margin: 0 -0.5em 0 1em } +@media print { + #anydiff form { display: none } +} + +/* Log */ +tr.diff input { padding: 0 1em; margin: 0 } + +@media print { + th.diff, td.diff { display: none } +} + +/* Styles for the revision log table (extends the styles for "table.listing") */ +#chglist { margin-top: 0 } +#chglist td.change span { + border: 1px solid #999; + display: block; + margin: .2em .5em 0 0; + width: .8em; height: .8em; +} +#chglist td.diff { white-space: nowrap } +#chglist td.change .comment { display: none } +#chglist td.old_path { font-style: italic } +#chglist td.date { + font-size: 85%; + vertical-align: top; + padding-top: 0.55em; + white-space: nowrap; +} +#chglist td.author { font-size: 85%; vertical-align: top; padding-top: 0.55em } +#chglist td.rev, #chglist td.chgset { + font-family: monospace; + letter-spacing: -0.08em; + font-size: 90%; + text-align: right; +} +#chglist td.rev a, #chglist td.chgset a { border-bottom: none } +#chglist td.summary { + width: 100%; + font-size: 85%; + vertical-align: middle; + white-space: nowrap; +} +#chglist tr.verbose td.summary { + border: none; + color: #333; + padding: .5em 1em 1em 2em; + white-space: normal; +} + +#chglist td.summary * { margin-top: 0 } + +#paging { margin: 1em 0 } + +/* Styles for the revision info in the file view (see also trac.css) */ +#info { margin: 0; } +#info .props { + color: #666; + list-style: square; + margin: 0 0 .4em 1.6em; + padding: 0; +} +#info .props li { padding: 0; overflow: auto; } + +/* Styles for the HTML preview */ +#preview { background: #fff; clear: both; margin: 0 } +#preview .code-block { border-top: 1px solid #999; margin: 0 } +#preview .image-file { overflow: hidden } +#preview .image-file img { max-width: 100% } diff --git a/trac/htdocs/common/css/changeset.css b/trac/htdocs/common/css/changeset.css new file mode 100644 index 0000000..74642de --- /dev/null +++ b/trac/htdocs/common/css/changeset.css @@ -0,0 +1,42 @@ +/* Changeset overview */ +#overview .files { padding-top: 1em } +#overview .files ul { margin: 0; padding: 0 } +#overview .files li { list-style-type: none } +#overview .files li .comment { display: none } +#overview .files li div { + border: 1px solid #999; + float: left; + margin: .2em .5em 0 0; + overflow: hidden; + width: .8em; height: .8em; +} +#overview div.add div, #overview div.cp div, #overview div.mv div { + border: 0; + margin: 0; + float: right; + width: .35em; +} + +#overview .changeset { padding: 0 0 1px } +#overview dd.changeset p { + margin-bottom: 0; + margin-top: 0; +} +#overview .files { padding: 1px 0 } + +.diff ul.props { + font-size: 90%; + list-style: disc; + margin: .5em 0 0; + padding: 0 .5em 1em 2em; +} +.diff ul.props li { margin: 0; padding: 0 } + +#title dl { display: inline; font-size: 110% } +#title dt { + display: inline; + font-size: 110%; + font-weight: bold; + margin-left: 3em; +} +#title dd { display: inline; margin-left: 0.4em } diff --git a/trac/htdocs/common/css/code.css b/trac/htdocs/common/css/code.css new file mode 100644 index 0000000..015e02c --- /dev/null +++ b/trac/htdocs/common/css/code.css @@ -0,0 +1,164 @@ +div.code { + background: #f7f7f7; + border: 1px solid #d7d7d7; + margin: 1em 1.75em; + padding: .25em; + overflow: auto +} + +div.code pre { margin: 0; } + +table.code { + border: 1px solid #ddd; + border-spacing: 0; + border-top: 0; + border-collapse: collapse; + empty-cells: show; + font-size: 12px; + line-height: 130%; + padding: 0; + margin: 0 auto; + table-layout: fixed; + width: 100%; +} +table.code th { + border-right: 1px solid #d7d7d7; + border-bottom: 1px solid #998; + font-size: 11px; +} +table.code th.lineno { width: 4em } +table.code thead th { + background: #eee; + border-top: 1px solid #d7d7d7; + color: #999; + padding: 0 .25em; + text-align: center; + white-space: nowrap; +} +table.code tbody th { + background: #eed; + color: #886; + font-weight: normal; + padding: 0 .5em; + text-align: right; + vertical-align: top; +} +table.code tbody th :link, table.code tbody th :visited { + border: none; + color: #886; + text-decoration: none; +} +table.code tbody th :link:hover, table.code tbody th :visited:hover { + color: #000; +} +table.code td { + font: normal 11px monospace; + overflow: hidden; + padding: 1px 2px; + vertical-align: top; +} +table.code tr.hilite th { + background: #ccf; +} +table.code tr.hilite td { + background: #ddf; +} +.image-file { background: #eee; padding: .3em } +.image-file img { background: url(../imggrid.png) } + +/* Default */ +.code-block span { font-family: monospace; } + +/* Comments */ +.code-comment, .css_comment, .c_comment, .c_commentdoc, .c_commentline, +.c_commentlinedoc, .h_comment,.pl_commentline, .p_commentblock, +.p_commentline, .hphp_comment, .hphp_commentblock, .hphp_commentline, +.yaml_comment { + color: #998; + font-style: italic; +} + +/* Language keyword */ +.code-keyword, .pl_word { color: #789; font-weight: bold } + +/* Type */ +.code-type, .c_word, .c_word2, .p_classname, .hphp_classname{ + color: #468; + font-weight: bold; +} + +/* Function */ +.code-func, .p_defname { + color: #900; + font-weight: bold; + border-bottom: none; +} + +/* Pre-processor */ +.code-prep, .c_preprocessor, .pl_preprocessor, .yaml_identifier { + color: #999; + font-weight: bold; +} + +/* Language construct */ +.code-lang, .p_word { color: #000; font-weight: bold } + +/* String */ +.code-string, .c_string, .c_stringeol, .css_doublestring, .css_singlestring, +.h_singlestring, .h_doublestring, .pl_string, .pl_string_q, .pl_string_qq, +.pl_string_qr, .pl_string_qw, .pl_string_qx, .pl_backticks, .pl_character, +.p_string, .p_stringeol, .hphp_string, .hphp_stringeol, .hphp_triple, +.hphp_tripledouble, .p_character, .p_triple, .p_tripledouble { + color: #b84; + font-weight: normal; +} + +/* Variable name */ +.code-var { color: #f9f } + +/* SilverCity-specific styles */ +.css_id, .css_class, .css_pseudoclass, .css_tag { color: #900000 } +.css_directive { color: #009000; font-weight: bold } +.css_important { color: blue } +.css_operator { color: #000090; font-weight: bold } +.css_tag { font-weight: bold } +.css_unknown_identifier, .css_unknown_pseudoclass { color: red } +.css_value { color: navy } +.c_commentdockeyword { color: navy; font-weight: bold } +.c_commentdockeyworderror { color: red; font-weight: bold } +.c_character, .c_regex, .c_uuid, .c_verbatim { color: olive } +.c_number { color: #099 } +.h_asp { color: #ff0 } +.h_aspat { color: #ffdf00 } +.h_attribute { color: teal } +.h_attributeunknown { color: red } +.h_cdata { color: #373 } +.h_entity { color: purple } +.h_number { color: #099 } +.h_other { color: purple } +.h_script, .h_tag, .h_tagend { color: navy } +.h_tagunknown { color: red } +.h_xmlend, .h_xmlstart { color: blue } +.pl_datasection { color: olive } +.pl_error { color: red; font-weight: bold } +.pl_hash { color: #000 } +.pl_here_delim, .pl_here_q, .pl_here_qq, .pl_here_qx, .pl_longquote { color: olive } +.pl_number { color: #099 } +.pl_pod { font-style: italic } +.pl_regex, .pl_regsubst { color: olive } +.p_number { color: #099 } +.hphp_character { color: olive } +.hphp_defname { color: #099; font-weight: bold } +.hphp_number { color: #099 } +.hphp_word { color: navy; font-weight: bold } +.yaml_document { color: gray; font-style: italic } +.yaml_keyword { color: #808 } +.yaml_number { color: #800 } +.yaml_reference { color: #088 } +.v_comment { color: gray; font-style: italic } +.v_commentline, .v_commentlinebang { color: red; font-style: italic } +.v_number, .v_preprocessor { color: #099 } +.v_string, .v_stringeol { color: olive } +.v_user{ color: blue; font-weight: bold } +.v_word, .v_word3 { color: navy; font-weight: bold } +.v_word2 { color: green; font-weight: bold } diff --git a/trac/htdocs/common/css/diff.css b/trac/htdocs/common/css/diff.css new file mode 100644 index 0000000..349b665 --- /dev/null +++ b/trac/htdocs/common/css/diff.css @@ -0,0 +1,186 @@ +/* Diff preferences */ +#prefs fieldset { margin: 1em .5em .5em; padding: .5em 1em 0 } + +/* Diff/change overview */ +#overview { line-height: 130%; margin-top: 1em; padding: .5em } +#overview dt.property { + font-weight: bold; + padding-right: .25em; + position: absolute; + left: 0; + text-align: right; + width: 7.75em; +} +#overview dd { margin-left: 8em } + +#overview .message { padding: 1em 0 1px } +#overview dd.message p, #overview dd.message ul, #overview dd.message ol, +#overview dd.message pre { margin-bottom: 1em; margin-top: 0; } + +/* Colors for change types */ +#chglist .edit, #overview .mod, .diff .legend .mod { background: #fd8 } +#chglist .delete, #overview .rem, .diff .legend .rem { background: #f88 } +#chglist .add, #overview .add, .diff .legend .add { background: #bfb } +#chglist .copy, #overview .cp, .diff .legend .cp { background: #88f } +#chglist .move, #overview .mv, .diff .legend .mv { background: #ccc } +#chglist .unknown { background: #fff } + +/* Legend for diff and file colors */ +.legend { + font-size: 9px; + line-height: 1em; + padding: .5em 0; +} +.legend h3 { display: none; } +.legend dt { + background: #fff; + border: 1px solid #999; + float: left; + margin: .1em .5em .1em 0; + overflow: hidden; + width: .8em; height: .8em; +} +.legend dl { + display: inline; + padding: 0; + margin: 0; + margin-right: .5em; +} +.legend dd { + display: inline; + float: left; + padding: 0; + margin: 0; + margin-right: 2em; +} + +#diff-legend { + float: left; + clear: right; + margin: 1em .5em; +} + +#file-legend dd { margin-left: 0; } + +/* Styles for the list of diffs */ +.diff ul.entries { clear: both; margin: 0; padding: 0 } + +.diff li.entry { + background: #f7f7f7; + border: 1px solid #d7d7d7; + list-style-type: none; + margin: 0 0 2em; + padding: 2px; + position: relative; + width: 100%; +} +.diff h2 { + color: #333; + font-size: 14px; + letter-spacing: normal; + margin: 0 auto; + padding: .1em 0 .25em .5em; +} +.diff h2 .switch { color: #999; float: right; font-size: 75%; + line-height: 1.6; +} +.diff h2 .switch span { border-left: 1px solid #ccc; cursor: pointer; + padding: 0 1em; +} +.diff h2 .switch span:first-child { border: none; } +.diff h2 .switch span.active { color: #333; cursor: default; } + +/* Styles for the actual diff tables (side-by-side and inline) */ +.diff table { + border: 1px solid #ddd; + border-spacing: 0; + border-top: 0; + empty-cells: show; + font-size: 12px; + line-height: 130%; + padding: 0; + margin: 0 auto; + table-layout: fixed; + width: 100%; +} +.diff table col.lineno { width: 4em } +.diff table th { + border-right: 1px solid #d7d7d7; + border-bottom: 1px solid #998; + font-size: 11px; +} +.diff table thead th { + background: #eee; + border-top: 1px solid #d7d7d7; + color: #999; + padding: 0 .25em; + text-align: center; + white-space: nowrap; +} +.diff table tbody th { + background: #eed; + color: #886; + font-weight: normal; + padding: 0 .5em; + text-align: right; + vertical-align: top; +} +.diff table tbody td { + background: #fff; + font: normal 11px monospace; + overflow: visible; + padding: 1px 2px; + vertical-align: top; +} +.diff table tbody.skipped td { + background: #f7f7f7; + border: 1px solid #d7d7d7; +} +.diff td ins, .diff td del {text-decoration: none;} + +/* Styles for the inline diff */ +.diff table.inline tbody.mod td.l, .diff table.inline tbody.rem td.l { + background: #fdd; + border-color: #c00; + border-style: solid; + border-width: 0 1px 0 1px; +} +.diff table.inline tbody.mod td.r, .diff table.inline tbody.add td.r { + background: #dfd; + border-color: #0a0; + border-style: solid; + border-width: 0 1px 0 1px; +} +.diff table.inline tbody.mod tr.first td.l, +.diff table.inline tbody.rem tr.first td.l { border-top-width: 1px } +.diff table.inline tbody.mod tr.last td.l, +.diff table.inline tbody.rem tr.last td.l { border-bottom-width: 1px } +.diff table.inline tbody.mod tr.first td.r, +.diff table.inline tbody.add tr.first td.r { border-top-width: 1px } +.diff table.inline tbody.mod tr.last td.r, +.diff table.inline tbody.add tr.last td.r { border-bottom-width: 1px } +.diff table.inline tbody.mod td del { + background: #e99; + color: #000; +} +.diff table.inline tbody.mod td ins { + background: #9e9; + color: #000; +} + +/* Styles for the side-by-side diff */ +.diff table.sidebyside colgroup.content { width: 50% } +.diff table.sidebyside tbody.mod td.l { background: #fe9 } +.diff table.sidebyside tbody.mod td.r { background: #fd8 } +.diff table.sidebyside tbody.add td.l { background: #dfd } +.diff table.sidebyside tbody.add td.r { background: #cfc } +.diff table.sidebyside tbody.rem td.l { background: #f88 } +.diff table.sidebyside tbody.rem td.r { background: #faa } +.diff table.sidebyside tbody.mod del, .diff table.sidebyside tbody.mod ins { + background: #fc0; +} + +/* Styles for the plain-text diff view */ +.diff pre { background: #fff; border: 1px solid #ddd; font-size: 85%; + margin: 0; +} diff --git a/trac/htdocs/common/css/prefs.css b/trac/htdocs/common/css/prefs.css new file mode 100644 index 0000000..a844e44 --- /dev/null +++ b/trac/htdocs/common/css/prefs.css @@ -0,0 +1,25 @@ +#content.prefs #tabs { list-style: none; margin: 2em 1em 0; padding: 1px; } +#content.prefs #tabs li { background: #e6e6e6; border: 1px solid; + border-color: #ccc #666 #ccc #ccc; color: #666; position: relative; + bottom: -1px; float: left; font-size: 90%; margin: 0 .5em; + padding: .2em 1em .3em; +} +#content.prefs #tabs :link, #content.prefs #tabs :visited { + border: none; color: #999; +} +#content.prefs #tabs :link:hover, #content.prefs #tabs :visited:hover { + background: transparent; color: #333; +} +#content.prefs #tabs li.active { background: #fff; + border-bottom: 1px solid #fff; +} +#content.prefs #tabs #tab_advanced { float: right; } +#content.prefs #tabcontent { background: url(../vgradient.png) 0 1px repeat-x; + border-top: 1px solid #ccc; clear: left; padding: 20px 5px; +} +* html #content.prefs #tabcontent { padding-top: 0; } + +#content.prefs div.field { margin-bottom: 1em; } +#content.prefs tr.field th { text-align: right; vertical-align: middle; + white-space: nowrap; +} diff --git a/trac/htdocs/common/css/report.css b/trac/htdocs/common/css/report.css new file mode 100644 index 0000000..6f971ba --- /dev/null +++ b/trac/htdocs/common/css/report.css @@ -0,0 +1,127 @@ +@import url(code.css); + +h1 .numrows, h2 .numrows { + margin-left: 1em; + color: #999; + font-size: 65%; + font-weight: normal; +} +h2 { + background: #f7f7f7; + border-bottom: 1px solid #d7d7d7; + margin: 2em 0 0; + padding: 0 .33em; +} +#report-descr { margin: 0 2em; font-size: 90% } +#report-notfound { margin: 2em; font-size: 110% } +#content.report .field { margin: 1em 0; } +#content.report .field label { padding-bottom: .3em; } + +#query { clear: right } +#query fieldset, #query fieldset input, #query fieldset select { font-size: 11px } +#query fieldset { margin-top: 1em } +#query fieldset.collapsed { + border-width: 0; + margin-bottom: 0pt; + padding: 0pt .5em; +} +#query .option, #query .option input, #query .option select { font-size: 11px } +#query .option { float: left; line-height: 2em; margin: .9em 2.5em 0 .5em; padding: 0 0 .1em } +#query .buttons { float: right; margin-top: .5em } +#query .buttons input { margin: .5em } +#query hr { clear: both; margin: 0; visibility: hidden } + +#filters table { width: 100% } +#filters tr { height: 2em } +#filters th, #filters td { padding: 0 .2em; vertical-align: middle } +#filters th { font-size: 11px; text-align: right; white-space: nowrap; } +#filters td label { font-size: 11px } +#filters td.mode { text-align: right } +#filters td.filter { width: 100% } +#filters td.filter label { padding-right: 1em } +#filters td.actions { text-align: right; white-space: nowrap } + +#columns div label { + display: block; + float: left; + padding: 0pt 1em .5em 0pt; +} + +/* Styles for the report list and the report results table + (extends the styles for "table.listing") */ +.reports td.title { width: 100% } +.reports tbody td :link, .reports tbody td :visited, +.tickets tbody td :link, .tickets tbody td :visited { display: block } +.tickets { border-bottom: none } +.tickets thead th { text-transform: capitalize; white-space: nowrap; } +.tickets tbody td, .reports tbody td { padding: .1em .5em !important } +.tickets tbody td a, .reports tbody td a { border-bottom: none } +.tickets tbody td.id :link, .tickets tbody td.id :visited { + font-weight: bold; +} +.tickets tbody td.time a, .tickets tbody td.changetime a { white-space: nowrap } +.tickets tbody tr:hover { background: #eed; color: #000 } +.tickets tr.color1-odd { background: #fdc; border-color: #e88; color: #a22 } +.tickets tr.color1-even { background: #fed; border-color: #e99; color: #a22 } +.tickets tr.color2-odd { background: #ffb; border-color: #eea; color: #880 } +.tickets tr.color2-even { background: #ffd; border-color: #dd8; color: #880 } +.tickets tr.color3-odd { background: #fbfbfb; border-color: #ddd; color: #444 } +.tickets tr.color3-even { background: #f6f6f6; border-color: #ccc; color: #333 } +.tickets tr.color4-odd { background: #e7ffff; border-color: #cee; color: #099 } +.tickets tr.color4-even { background: #dff; border-color: #bee; color: #099 } +.tickets tr.color5-odd { background: #e7eeff; border-color: #cde; color: #469 } +.tickets tr.color5-even { background: #dde7ff; border-color: #cde; color: #469 } +.tickets tr.color6-odd { background: #f0f0f0; border-color: #ddd; color: #888 } +.tickets tr.color6-even { background: #f7f7f7; border-color: #ddd; color: #888 } +.tickets tr.color6-odd a, .color6-even a { color: #b66 } +.tickets tbody tr.fullrow td, .tickets tbody td.fullrow { + border: none; + color: #333; + background: transparent; + padding: 0 1em !important; /* Opera 9 is *very* sensitive with this */ + font-size: 85%; +} +.tickets tbody tr.fullrow:hover { background: transparent !important } +.tickets .fullrow :link, .tickets .fullrow :visited { display: inline } +.tickets .fullrow .meta { color: #999; } +.tickets .fullrow hr { display: none } + +fieldset legend :link, fieldset legend :visited { + background: url(../expanded.png) 0 50% no-repeat; + border: none; + color: #666; + font-size: 110%; + padding-left: 16px; +} +fieldset legend :link:hover, fieldset legend :visited:hover { + background-color: transparent; +} + +fieldset.collapsed legend :link, fieldset.collapsed legend :visited { + background-image: url(../collapsed.png); +} +fieldset.collapsed table, fieldset.collapsed div { display: none } + +/* Query results table */ + +table.tickets tbody tr.added td { font-weight: bold } +table.tickets tbody tr.changed td { font-style: italic } +table.tickets tbody tr.removed td { color: #999 } +table.tickets tbody tr.prio1 { background: #fdc; border-color: #e88 } +table.tickets tbody tr.even.prio1 { background: #fed; border-color: #e99 } +table.tickets tbody tr.prio2 { background: #ffb; border-color: #eea } +table.tickets tbody tr.even.prio2 { background: #ffd; border-color: #dd8 } +table.tickets tbody tr.prio3 { background: #fbfbfb; border-color: #ddd } +table.tickets tbody tr.even.prio3 { background: #f6f6f6; border-color: #ccc } +table.tickets tbody tr.prio4 { background: #e7ffff; border-color: #cee } +table.tickets tbody tr.even.prio4 { background: #dff; border-color: #bee } +table.tickets tbody tr.prio5 { background: #e7eeff; border-color: #cde } +table.tickets tbody tr.even.prio5 { background: #dde7ff } +table.tickets tbody tr.prio6 { background: #f0f0f0; border-color: #ddd } +table.tickets tbody tr.even.prio6 { background: #f7f7f7 } +table.tickets tbody tr.fullrow th { + border: none; + vertical-align: middle; + text-align: center; + font-size: 85%; +} diff --git a/trac/htdocs/common/css/roadmap.css b/trac/htdocs/common/css/roadmap.css new file mode 100644 index 0000000..0acf34f --- /dev/null +++ b/trac/htdocs/common/css/roadmap.css @@ -0,0 +1,84 @@ +/* General styles for the progress bars */ +table.progress { + border: 1px solid #d7d7d7; + border-collapse: collapse; + border-spacing: 0; + float: left; + margin: 0; + padding: 0; + empty-cells: show; +} +table.progress a, table.progress :link, table.progress :visited, +table.progress :link:hover, table.progress :visited:hover { + border: none; + display: block; + width: 100%; + height: 1.2em; + padding: 0; + margin: 0; + text-decoration: none +} +table.progress td { background: #fff; padding: 0 } +table.progress td.new { background: #f5f5b5 } +table.progress td.closed { background: #bae0ba } +table.progress td :hover { background: none } +p.percent { font-size: 10px; line-height: 2.4em; margin: 0.9em 0 0 } + +/* Styles for the roadmap view */ +ul.milestones { margin: 2em 0 0; padding: 0 } +li.milestone { list-style: none; margin-bottom: 4em } +.milestone .info { white-space: nowrap } +.milestone .info h2 { + background: #f7f7f7; + border-bottom: 1px solid #d7d7d7; + margin: 0; +} +.milestone .info h2 :link, .milestone .info h2 :visited { + color: #000; + display: block; + border-bottom: none; +} +.milestone .info h2 :link:hover, .milestone .info h2 :visited:hover { + color: #000; +} +.milestone .info h2 em { color: #b00; font-style: normal } +.milestone .info .date { + color: #888; + font-size: 11px; + font-style: italic; + margin: 0; +} +.milestone .info .progress { margin: 1em 1em 0; width: 40em; max-width: 70% } +.milestone .info dl { + font-size: 10px; + font-style: italic; + margin: 0 1em 2em; + white-space: nowrap; +} +.milestone .info dt { display: inline; margin-left: .5em } +.milestone .info dd { display: inline; margin: 0 1em 0 .5em } +.milestone .description { margin-left: 1em } + +/* Styles for the milestone view */ +.milestone .date { color: #888; font-style: italic; margin: 0 } +.milestone .description { margin: 1em 0 2em } + +/* Styles for the milestone statistics table */ +#stats { float: right; margin: 0 0 2em 2em; width: 400px; max-width: 40% } +#stats legend { white-space: nowrap } +#stats table { border-collapse: collapse; width: 100% } +#stats th, #stats td { font-size: 10px; padding: 0; white-space: nowrap } +#stats th { text-align: right; } +#stats th :link, #stats th :visited { border: none } +#stats td { padding-left: 0.5em; width: 100% } +#stats td table.progress { margin: 3px 4px 3px 0 } +#stats td table.progress td { padding: 0 } +#stats td p.percent { line-height: 1.2em; margin-top: 3px } + +/* Styles for the milestone edit form */ +#edit fieldset { margin: 1em 0 } +#edit em { color: #888; font-size: smaller } +#edit .disabled em { color: #d7d7d7 } +#edit .field { margin-top: 1.3em } +#edit label { padding-left: .2em } +#edit textarea#description { width: 97% } diff --git a/trac/htdocs/common/css/search.css b/trac/htdocs/common/css/search.css new file mode 100644 index 0000000..e7fdd53 --- /dev/null +++ b/trac/htdocs/common/css/search.css @@ -0,0 +1,14 @@ +#content.search .filters { color: #333; font-size: 85%; } + +#content.search form { margin: 1em 0 0 } +#content.search form p { margin: .5em 0 } +#content.search hr { clear: left; margin-bottom: 0 } +#content.search #notfound { margin: 2em; font-size: 110% } + +#content.search #results { margin-right: 3em } +#content.search #results dt { margin: 1.5em 0 0 } +#content.search #results dt a { color: #33c } +#content.search #results dd { font-size: 80%; margin: 0; padding: 0 } +#content.search #results .author, #results .date { color: #090; } + +#content.search #quickjump { font-style: italic; font-weight: bold; } diff --git a/trac/htdocs/common/css/ticket.css b/trac/htdocs/common/css/ticket.css new file mode 100644 index 0000000..08c64bc --- /dev/null +++ b/trac/htdocs/common/css/ticket.css @@ -0,0 +1,115 @@ +@import url(code.css); + +#content.ticket { width: 700px; max-width: 100% } + +#newticket #field-description { width: 100% } +#newticket #properties { width: 100% } + +#ticket { + background: #ffd; + border: 1px outset #996; + margin-top: 1em; + padding: .5em 1em; + position: relative; +} + +div#ticket.ticketdraft { + background: #f4f4f4 url(../draft.png); +} +div#ticketchange.ticketdraft { + padding: 0 1em; + margin: 1em 0; +} +div#ticketchange.ticketdraft h3 { + margin-top: .5em; +} +.preview-notice { font-weight: bold; } + +.ticketdraft { + background: #f4f4f4 url(../draft.png); + border: 1px outset #996; + padding: 0 .2em; +} + +h1 .status { color: #444; } +#ticket h2.summary { margin: 0 0 .8em 0 } +#ticket .date { color: #996; float: right; font-size: 85%; position: relative } +#ticket .date p { margin: .3em } + +#ticket table.properties { + clear: both; + border-top: 1px solid #dd9; + border-collapse: collapse; + table-layout: fixed; + width: 100%; +} +#ticket table.properties tr { border-bottom: 1px dotted #eed } +#ticket table.properties td, #ticket table.properties th { + font-size: 80%; + padding: .5em 1em; + vertical-align: top; +} +#ticket table.properties th { + color: #663; + font-weight: normal; + text-align: left; + width: 20%; +} +#ticket table.properties td { width: 30% } +#ticket table.properties .description { border-top: 1px solid #dd9 } + +#ticket .description h3 { + border-bottom: 1px solid #dd9; + color: #663; + font-size: 100%; + font-weight: normal; +} +#ticket .description h3 .lastmod { + font-size: 90%; +} +#ticket .inlinebuttons { + float: right; + position: relative; + bottom: 0.3em; +} + +#changelog { border: 1px outset #996; padding: 1em } +#preview { border: 1px solid #d7d7d7; padding: 1em } +#preview h3, #changelog h3 { + border-bottom: 1px solid #d7d7d7; + color: #999; + font-size: 100%; + font-weight: normal; +} +.threading, #changelog .inlinebuttons { float: right; } +.threading { font-size: 90%; } + +#preview .changes, #changelog .changes { list-style: square; margin-left: 2em; padding: 0 } +#preview .comment, #changelog .comment { margin-left: 2em } + +form .field { margin-top: .75em; width: 100% } +form #comment { width: 100% } + +#properties { white-space: nowrap; line-height: 160%; padding: .5em } +#properties table { border-spacing: 0; width: 100%; } +#properties table th { + padding: .4em; + text-align: right; + width: 20%; + vertical-align: top; +} +#properties table th.col2 { border-left: 1px dotted #d7d7d7 } +#properties table td { vertical-align: middle; width: 30% } +#properties table td.fullrow { vertical-align: middle; width: 80% } + +#action { line-height: 2em } + +fieldset.radio { border: none; margin: 0; padding: 0 } +fieldset.radio legend { + color: #000; + float: left; + font-size: 100%; + font-weight: normal; + padding: 0 1em 0 0; +} +fieldset.radio label { padding-right: 1em } diff --git a/trac/htdocs/common/css/timeline.css b/trac/htdocs/common/css/timeline.css new file mode 100644 index 0000000..c0af15c --- /dev/null +++ b/trac/htdocs/common/css/timeline.css @@ -0,0 +1,77 @@ +/* Timeline */ + +* html #prefs { width: 34em } /* Set width only for IE */ +#prefs fieldset label { display: block } +#prefs .buttons { margin-top: -1.6em } + +h2 { + background: #f7f7f7; + border-bottom: 1px solid #d7d7d7; + font-size: 105%; + margin: 2em 0 .5em; +} +dl { line-height: 1.3em; margin-left: 1em } +dt { background: 3px 4px no-repeat; padding: 0 } +dt :link, dt :visited { + background: 3px 3px no-repeat; + border: none; + color: #000; + padding: 0 4px 2px 22px; +} +dt>:link, dt>:visited { + /* Hide from IE/Win */ + background-position: 3px 4px; +} +dt :link:hover, dt :visited:hover { background-color: #eed; color: #000 } +dt em { + border-bottom: 1px dotted #bbb; + color: #b00; + font-style: normal; + text-decoration: none; +} +dt .time { color: #999; font-size: 80%; } +dt .author { color: #666; } +dt.highlight { background-color: #ffa; } +dd { + font-size: 80%; + margin: 0 0 .75em 5.5em; + padding: 0; + color: #776; +} + +/* Apply icon background-image twice to avoid hover-flicker in IE/Win */ +dt.changeset, dt.changeset a { background-image: url(../changeset.png) !important } +dt.newticket, dt.newticket a { background-image: url(../newticket.png) !important } +dt.reopenedticket, dt.reopenedticket a { background-image: url(../newticket.png) !important } +dt.editedticket, dt.editedticket a { background-image: url(../editedticket.png) !important } +dt.closedticket, dt.closedticket a { background-image: url(../closedticket.png) !important } +dt.wiki, dt.wiki a { background-image: url(../wiki.png) !important } +dt.milestone, dt.milestone a { background-image: url(../milestone.png) !important } +dt.attachment, dt.attachment a { background-image: url(../attachment.png) !important } + +/* styles for the 'changeset_long_messages' option */ +dd.changeset p { margin: 0; padding: 0 } +dd.changeset ul { padding-left: 15px; } + +/* Styles for the 'changeset_show_files' option */ +dd.changeset .changes { color: #aaa; font-size: 90%; } +dd.changeset ul.changes { + padding-left: 0; + list-style-type: none; +} +dd.changeset .changes li div { + border: 1px solid #999; + float: left; + margin: .5em .5em 0 0; + overflow: hidden; + width: .8em; height: .8em; +} +dd.changeset .changes li span { + float: left; + margin-right: .8em; +} +dd.changeset .changes .add { background: #bfb } +dd.changeset .changes .delete { background: #f88 } +dd.changeset .changes .edit { background: #fd8 } +dd.changeset .changes .copy { background: #88f } +dd.changeset .changes .move { background: #ccc } diff --git a/trac/htdocs/common/css/trac.css b/trac/htdocs/common/css/trac.css new file mode 100644 index 0000000..9c1021c --- /dev/null +++ b/trac/htdocs/common/css/trac.css @@ -0,0 +1,574 @@ +body { background: #fff; color: #000; margin: 10px; padding: 0; } +body, th, td { + font: normal 13px Verdana,Arial,'Bitstream Vera Sans',Helvetica,sans-serif; +} +h1, h2, h3, h4 { + font-family: Arial,Verdana,'Bitstream Vera Sans',Helvetica,sans-serif; + font-weight: bold; + letter-spacing: -0.018em; + page-break-after: avoid; +} +h1 { font-size: 19px; margin: .15em 1em 0.5em 0 } +h2 { font-size: 16px } +h3 { font-size: 14px } +hr { border: none; border-top: 1px solid #ccb; margin: 2em 0 } +address { font-style: normal } +img { border: none } + +.underline { text-decoration: underline } +ol.loweralpha { list-style-type: lower-alpha } +ol.upperalpha { list-style-type: upper-alpha } +ol.lowerroman { list-style-type: lower-roman } +ol.upperroman { list-style-type: upper-roman } +ol.arabic { list-style-type: decimal } + +/* Link styles */ +:link, :visited { + text-decoration: none; + color: #b00; + border-bottom: 1px dotted #bbb; +} +:link:hover, :visited:hover { background-color: #eee; color: #555 } +h1 :link, h1 :visited ,h2 :link, h2 :visited, h3 :link, h3 :visited, +h4 :link, h4 :visited, h5 :link, h5 :visited, h6 :link, h6 :visited { + color: inherit; +} + +/* Heading anchors */ +.anchor:link, .anchor:visited { + border: none; + color: #d7d7d7; + font-size: .8em; + vertical-align: text-top; +} +* > .anchor:link, * > .anchor:visited { + visibility: hidden; +} +h1:hover .anchor, h2:hover .anchor, h3:hover .anchor, +h4:hover .anchor, h5:hover .anchor, h6:hover .anchor { + visibility: visible; +} + +@media screen { + a.ext-link .icon { + background: url(../extlink.gif) left center no-repeat; + padding-left: 16px; + } + a.mail-link .icon { + background: url(../envelope.png) left center no-repeat; + padding-left: 16px; + } +} + +/* Forms */ +input, textarea, select { margin: 2px } +input, select { vertical-align: middle } +input[type=button], input[type=submit], input[type=reset] { + background: #eee; + color: #222; + border: 1px outset #ccc; + padding: .1em .5em; +} +input[type=button]:hover, input[type=submit]:hover, input[type=reset]:hover { + background: #ccb; +} +input[type=button][disabled], input[type=submit][disabled], +input[type=reset][disabled] { + background: #f6f6f6; + border-style: solid; + color: #999; +} +input[type=text], input.textwidget, textarea { border: 1px solid #d7d7d7 } +input[type=text], input.textwidget { padding: .25em .5em } +input[type=text]:focus, input.textwidget:focus, textarea:focus { + border: 1px solid #886; +} +option { border-bottom: 1px dotted #d7d7d7 } +fieldset { border: 1px solid #d7d7d7; padding: .5em; margin: 1em 0 } +form p.hint, form span.hint { color: #666; font-size: 85%; font-style: italic; margin: .5em 0; + padding-left: 1em; +} +fieldset.iefix { + background: transparent; + border: none; + padding: 0; + margin: 0; +} +* html fieldset.iefix { width: 98% } +fieldset.iefix p { margin: 0 } +legend { color: #999; padding: 0 .25em; font-size: 90%; font-weight: bold } +label.disabled { color: #d7d7d7 } +.buttons { margin: .5em .5em .5em 0 } +.buttons form, .buttons form div { display: inline } +.buttons input { margin: 1em .5em .1em 0 } +.inlinebuttons input { + font-size: 70%; + border-width: 1px; + border-style: dotted; + margin: 0 .1em; + padding: 0.1em; + background: none; +} + +/* Header */ +#header hr { display: none } +#header h1 { margin: 1.5em 0 -1.5em; } +#header img { border: none; margin: 0 0 -3em } +#header :link, #header :visited, #header :link:hover, #header :visited:hover { + background: transparent; + color: #555; + margin-bottom: 2px; + border: none; +} +#header h1 :link:hover, #header h1 :visited:hover { color: #000 } + +/* Quick search */ +#search { + clear: both; + font-size: 10px; + height: 2.2em; + margin: 0 0 1em; + text-align: right; +} +#search input { font-size: 10px } +#search label { display: none } + +/* Navigation */ +.nav h2, .nav hr { display: none } +.nav ul { font-size: 10px; list-style: none; margin: 0; text-align: right } +.nav li { + border-right: 1px solid #d7d7d7; + display: inline; + padding: 0 .75em; + white-space: nowrap; +} +.nav li.last { border-right: none } + +/* Main navigation bar */ +#mainnav { + background: #f7f7f7 url(../topbar_gradient.png) 0 0; + border: 1px solid #000; + font: normal 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif; + margin: .66em 0 .33em; + padding: .2em 0; +} +#mainnav li { border-right: none; padding: .25em 0 } +#mainnav :link, #mainnav :visited { + background: url(../dots.gif) 0 0 no-repeat; + border-right: 1px solid #fff; + border-bottom: none; + border-left: 1px solid #555; + color: #000; + padding: .2em 20px; +} +* html #mainnav :link, * html #mainnav :visited { background-position: 1px 0 } +#mainnav :link:hover, #mainnav :visited:hover { + background-color: #ccc; + border-right: 1px solid #ddd; +} +#mainnav .active :link, #mainnav .active :visited { + background: #333 url(../topbar_gradient2.png) 0 0 repeat-x; + border-top: none; + border-right: 1px solid #000; + color: #eee; + font-weight: bold; +} +#mainnav .active :link:hover, #mainnav .active :visited:hover { + border-right: 1px solid #000; +} + +/* Context-dependent navigation links */ +#ctxtnav { height: 1em } +#ctxtnav li ul { + background: #f7f7f7; + color: #ccc; + border: 1px solid; + padding: 0; + display: inline; + margin: 0; +} +#ctxtnav li li { padding: 0; } +#ctxtnav li li :link, #ctxtnav li li :visited { padding: 0 1em } +#ctxtnav li li :link:hover, #ctxtnav li li :visited:hover { + background: #bba; + color: #fff; +} + +/* Alternate links */ +#altlinks { clear: both; text-align: center } +#altlinks h3 { font-size: 12px; letter-spacing: normal; margin: 0 } +#altlinks ul { list-style: none; margin: 0; padding: 0 0 1em } +#altlinks li { + border-right: 1px solid #d7d7d7; + display: inline; + font-size: 11px; + line-height: 1.5; + padding: 0 1em; + white-space: nowrap; +} +#altlinks li.last { border-right: none } +#altlinks li :link, #altlinks li :visited { + background-repeat: no-repeat; + color: #666; + border: none; + padding: 0 0 2px; +} +#altlinks li a.ics { background-image: url(../ics.png); padding-left: 22px } +#altlinks li a.rss { background-image: url(../feed.png); padding-left: 20px } + +/* Footer */ +#footer { + clear: both; + color: #bbb; + font-size: 10px; + border-top: 1px solid; + height: 31px; + padding: .25em 0; +} +#footer :link, #footer :visited { color: #bbb; } +#footer hr { display: none } +#footer #tracpowered { border: 0; float: left } +#footer #tracpowered:hover { background: transparent } +#footer p { margin: 0 } +#footer p.left { + float: left; + margin-left: 1em; + padding: 0 1em; + border-left: 1px solid #d7d7d7; + border-right: 1px solid #d7d7d7; +} +#footer p.right { + float: right; + text-align: right; +} + +#content { padding-bottom: 2em; position: relative } + +#help { + clear: both; + color: #999; + font-size: 90%; + margin: 1em; + text-align: right; +} +#help :link, #help :visited { cursor: help } +#help hr { display: none } + +/* Page preferences form */ +#prefs { + background: #f7f7f0; + border: 1px outset #998; + float: right; + font-size: 9px; + padding: .8em; + position: relative; + margin: 0 1em 1em; +} +* html #prefs { width: 26em } /* Set width only for IE */ +#prefs input, #prefs select { font-size: 9px; vertical-align: middle } +#prefs fieldset { + background: transparent; + border: none; + margin: .5em; + padding: 0; +} +#prefs fieldset legend { + background: transparent; + color: #000; + font-size: 9px; + font-weight: normal; + margin: 0 0 0 -1.5em; + padding: 0; +} +#prefs .buttons { text-align: right } + +/* Version information (browser, wiki, attachments) */ +#info { + margin: 1em 0 0 0; + background: #f7f7f0; + border: 1px solid #d7d7d7; + border-collapse: collapse; + border-spacing: 0; + clear: both; + width: 100%; +} +#info th, #info td { font-size: 85%; padding: 2px .5em; vertical-align: top } +#info th { font-weight: bold; text-align: left; white-space: nowrap } +#info td.message { width: 100% } +#info .message ul { padding: 0; margin: 0 2em } +#info .message p { margin: 0; padding: 0 } + +/* Wiki */ +.wikipage { padding-left: 18px } +.wikipage h1, .wikipage h2, .wikipage h3 { margin-left: -18px } + +a.missing:link, a.missing:visited, span.missing { color: #998 } +a.missing:link, a.missing:visited { background: #fafaf0 } +a.missing:hover { color: #000 } +a.closed:link, a.closed:visited { text-decoration: line-through } +span.closed { text-decoration: line-through } +span.forbidden, a.forbidden { background: #fafaf0; color: #998; } + +/* User-selectable styles for blocks */ +.important { + background: #fcb; + border: 1px dotted #d00; + color: #500; + padding: 0 .5em 0 .5em; + margin: .5em; +} + +dl.wiki dt { font-weight: bold } +dl.compact dt { float: left; padding-right: .5em } +dl.compact dd { margin: 0; padding: 0 } + +pre.wiki, pre.literal-block { + background: #f7f7f7; + border: 1px solid #d7d7d7; + margin: 1em 1.75em; + padding: .25em; + overflow: auto; +} + +blockquote.citation { + margin: -0.6em 0; + border-style: solid; + border-width: 0 0 0 2px; + padding-left: .5em; + border-color: #b44; +} +.citation blockquote.citation { border-color: #4b4; } +.citation .citation blockquote.citation { border-color: #44b; } +.citation .citation .citation blockquote.citation { border-color: #c55; } + +table.wiki { + border: 2px solid #ccc; + border-collapse: collapse; + border-spacing: 0; +} +table.wiki td { border: 1px solid #ccc; padding: .1em .25em; } + +.wikitoolbar { + border: solid #d7d7d7; + border-width: 1px 1px 1px 0; + height: 18px; + width: 234px; +} +.wikitoolbar :link, .wikitoolbar :visited { + background: transparent url(../edit_toolbar.png) no-repeat; + border: 1px solid #fff; + border-left-color: #d7d7d7; + cursor: default; + display: block; + float: left; + width: 24px; + height: 16px; +} +.wikitoolbar :link:hover, .wikitoolbar :visited:hover { + background-color: transparent; + border: 1px solid #fb2; +} +.wikitoolbar a#em { background-position: 0 0 } +.wikitoolbar a#strong { background-position: 0 -16px } +.wikitoolbar a#heading { background-position: 0 -32px } +.wikitoolbar a#link { background-position: 0 -48px } +.wikitoolbar a#code { background-position: 0 -64px } +.wikitoolbar a#hr { background-position: 0 -80px } +.wikitoolbar a#np { background-position: 0 -96px } +.wikitoolbar a#br { background-position: 0 -112px } +.wikitoolbar a#img { background-position: 0 -128px } + +/* Styles for the form for adding attachments. */ +#attachment .field { margin-top: 1.3em } +#attachment label { padding-left: .2em } +#attachment fieldset { margin-top: 2em } +#attachment fieldset .field { float: left; margin: 0 1em .5em 0 } +#attachment .options { float: left; padding: 0 0 1em 1em } +#attachment br { clear: left } +.attachment #preview { margin-top: 1em } + +/* Styles for the list of attachments. */ +#attachments { border: 1px outset #996; padding: 1em } +#attachments .attachments { margin-left: 2em; padding: 0 } +#attachments dt { display: list-item; list-style: square; } +#attachments dd { font-style: italic; margin-left: 0; padding-left: 0; } + +/* Styles for tabular listings such as those used for displaying directory + contents and report results. */ +table.listing { + clear: both; + border-bottom: 1px solid #d7d7d7; + border-collapse: collapse; + border-spacing: 0; + margin-top: 1em; + width: 100%; +} +table.listing th { text-align: left; padding: 0 1em .1em 0; font-size: 12px } +table.listing thead { background: #f7f7f0 } +table.listing thead th { + border: 1px solid #d7d7d7; + border-bottom-color: #999; + font-size: 11px; + font-weight: bold; + padding: 2px .5em; + vertical-align: bottom; +} +table.listing thead th :link:hover, table.listing thead th :visited:hover { + background-color: transparent; +} +table.listing thead th a { border: none; padding-right: 12px } +table.listing th.asc a, table.listing th.desc a { font-weight: bold } +table.listing th.asc a, table.listing th.desc a { + background-position: 100% 50%; + background-repeat: no-repeat; +} +table.listing th.asc a { background-image: url(../asc.png) } +table.listing th.desc a { background-image: url(../desc.png) } +table.listing tbody td, table.listing tbody th { + border: 1px dotted #ddd; + padding: .3em .5em; + vertical-align: top; +} +table.listing tbody td a:hover, table.listing tbody th a:hover { + background-color: transparent; +} +table.listing tbody tr { border-top: 1px solid #ddd } +table.listing tbody tr.even { background-color: #fcfcfc } +table.listing tbody tr.odd { background-color: #f7f7f7 } +table.listing tbody tr:hover { background: #eed !important } +table.listing tbody tr.focus { background: #ddf !important } + +/* Styles for the page history table + (extends the styles for "table.listing") */ +#fieldhist td { padding: 0 .5em } +#fieldhist td.date, #fieldhist td.diff, #fieldhist td.version, +#fieldhist td.author { + white-space: nowrap; +} +#fieldhist td.version { text-align: center } +#fieldhist td.comment { width: 100% } + +/* Auto-completion interface */ +.suggestions { background: #fff; border: 1px solid #886; color: #222; } +.suggestions ul { + font-family: sans-serif; + max-height: 20em; + min-height: 3em; + list-style: none; + margin: 0; + overflow: auto; + padding: 0; + width: 440px; +} +* html .suggestions ul { height: 10em; } +.suggestions li { background: #fff; cursor: pointer; padding: 2px 5px } +.suggestions li.selected { background: #b9b9b9 } + +/* Styles for the error page (and rst errors) */ +#content.error .message, div.system-message { + background: #fdc; + border: 2px solid #d00; + color: #500; + padding: .5em; + margin: 1em 0; +} +#content.error div.message pre, div.system-message pre { + margin-left: 1em; + overflow: hidden; + white-space: normal; +} +div.system-message p { margin: 0; } +div.system-message p.system-message-title { font-weight: bold; } + +#warning.system-message { background: #ffa; border: 2px solid #886; } +#warning.system-message li { list-style-type: square; } + +#notice.system-message { background: #bfb; border: 2px solid #484; } +#notice.system-message li { list-style-type: square; } + +#content.error form.newticket { display: inline; } +#content.error form.newticket textarea { display: none; } + +#content.error #systeminfo { margin: 1em; width: auto; } +#content.error #systeminfo th { font-weight: bold; text-align: right; } + +#content.error #traceback { margin-left: 1em; } +#content.error #traceback :link, #content.error #traceback :visited { + border: none; +} +#content.error #tbtoggle { font-size: 80%; } +#content.error #traceback div { margin-left: 1em; } +#content.error #traceback h3 { font-size: 95%; margin: .5em 0 0; } +#content.error #traceback :link var, #content.error #traceback :visited var { + font-family: monospace; + font-style: normal; + font-weight: bold; +} +#content.error #traceback span.file { color: #666; font-size: 85%; } +#content.error #traceback ul { list-style: none; margin: .5em 0; padding: 0; } +#content.error #traceback ol { + border: 1px dotted #d7d7d7; + color: #999; + font-size: 85%; + line-height: 1; + margin: .5em 0; +} +#content.error #traceback ol li { white-space: pre; } +#content.error #traceback ol li.current { background: #e6e6e6; color: #333; } +#content.error #traceback ol li code { color: #666; } +#content.error #traceback ol li.current code { color: #000; } +#content.error #traceback table { margin: .5em 0 1em; } +#content.error #traceback th, #content.error #traceback td { + font-size: 85%; padding: 1px; +} +#content.error #traceback th var { + font-family: monospace; + font-style: normal; +} +#content.error #traceback td code { white-space: pre; } +#content.error #traceback pre { font-size: 95%; } + +#content .paging { margin: 0 0 2em; padding: .5em 0 0; + font-size: 85%; line-height: 2em; text-align: center; +} +#content .paging .current { + padding: .1em .3em; + border: 1px solid #333; + background: #999; color: #fff; +} + +#content .paging :link, #content .paging :visited { + padding: .1em .3em; + border: 1px solid #666; + background: transparent; color: #666; +} +#content .paging :link:hover, #content .paging :visited:hover { + background: #999; color: #fff; border-color: #333; +} +#content .paging .previous a, +#content .paging .next a { + font-size: 150%; font-weight: bold; border: none; +} +#content .paging .previous a:hover, +#content .paging .next a:hover { + background: transparent; color: #666; +} + +#content h2 .numresults { color: #666; font-size: 90%; } + +/* Styles for search word highlighting */ +@media screen { + .searchword0 { background: #ff9 } + .searchword1 { background: #cfc } + .searchword2 { background: #cff } + .searchword3 { background: #ccf } + .searchword4 { background: #fcf } +} + +@media print { + #header, #altlinks, #footer, #help { display: none } + .nav, form, .buttons form, form .buttons, form .inlinebuttons { + display: none; + } + form.printableform { display: block } +} diff --git a/trac/htdocs/common/css/wiki.css b/trac/htdocs/common/css/wiki.css new file mode 100644 index 0000000..90f5dee --- /dev/null +++ b/trac/htdocs/common/css/wiki.css @@ -0,0 +1,44 @@ +@import url(code.css); + +/* Styles for the page editing form */ +#edit #rows { float: right; font-size: 80% } +#edit #rows select { font-size: 90% } +#edit #text { clear: both; width: 100% } +#edit .wikitoolbar { float: left; } +#changeinfo { padding: .5em } +#changeinfo .field { float: left; margin: 0 1em .5em 0 } +#changeinfo br { clear: left } +#changeinfo .options { padding: 0 0 1em 1em } +#changeinfo .options, #changeinfo .buttons { clear: left } +#delete, #save { margin-left: 6em } +#preview { + background: #f4f4f4 url(../draft.png); + margin: 1em 0 2em; + overflow: auto; +} +#template { vertical-align: middle; padding-top: 1em; } + +/* Diff view */ +#overview .multi { color: #999 } +#overview .ipnr { color: #999; font-size: 80% } +#overview .comment { padding: 1em 0 0 } + +@media print { + th.diff, td.diff { display: none } +} + +/* Styles for the TracGuideToc wikimacro */ +.wiki-toc { + padding: .5em 1em; + margin: 0 0 2em 1em; + float: right; + border: 1px outset #ddc; + background: #ffd; + font-size: 85%; + position: relative; +} +.wiki-toc h4 { font-size: 12px; margin: 0 } +.wiki-toc ul, .wiki-toc ol { list-style: none; padding: 0; margin: 0 } +.wiki-toc ul ul, .wiki-toc ol ol { padding-left: 1.2em } +.wiki-toc li { margin: 0; padding: 0 } +.wiki-toc .active { background: #ff9; position: relative; } diff --git a/trac/htdocs/common/desc.png b/trac/htdocs/common/desc.png new file mode 100644 index 0000000..2070185 Binary files /dev/null and b/trac/htdocs/common/desc.png differ diff --git a/trac/htdocs/common/dots.gif b/trac/htdocs/common/dots.gif new file mode 100644 index 0000000..c6ae052 Binary files /dev/null and b/trac/htdocs/common/dots.gif differ diff --git a/trac/htdocs/common/draft.png b/trac/htdocs/common/draft.png new file mode 100644 index 0000000..cd6a67a Binary files /dev/null and b/trac/htdocs/common/draft.png differ diff --git a/trac/htdocs/common/edit_toolbar.png b/trac/htdocs/common/edit_toolbar.png new file mode 100644 index 0000000..1269b3f Binary files /dev/null and b/trac/htdocs/common/edit_toolbar.png differ diff --git a/trac/htdocs/common/editedticket.png b/trac/htdocs/common/editedticket.png new file mode 100644 index 0000000..9d12a91 Binary files /dev/null and b/trac/htdocs/common/editedticket.png differ diff --git a/trac/htdocs/common/envelope.png b/trac/htdocs/common/envelope.png new file mode 100644 index 0000000..74676b3 Binary files /dev/null and b/trac/htdocs/common/envelope.png differ diff --git a/trac/htdocs/common/expanded.png b/trac/htdocs/common/expanded.png new file mode 100644 index 0000000..4f8a587 Binary files /dev/null and b/trac/htdocs/common/expanded.png differ diff --git a/trac/htdocs/common/expander_normal.png b/trac/htdocs/common/expander_normal.png new file mode 100644 index 0000000..fb580df Binary files /dev/null and b/trac/htdocs/common/expander_normal.png differ diff --git a/trac/htdocs/common/expander_normal_hover.png b/trac/htdocs/common/expander_normal_hover.png new file mode 100644 index 0000000..e3a866c Binary files /dev/null and b/trac/htdocs/common/expander_normal_hover.png differ diff --git a/trac/htdocs/common/expander_open.png b/trac/htdocs/common/expander_open.png new file mode 100644 index 0000000..a4c90a2 Binary files /dev/null and b/trac/htdocs/common/expander_open.png differ diff --git a/trac/htdocs/common/expander_open_hover.png b/trac/htdocs/common/expander_open_hover.png new file mode 100644 index 0000000..255064b Binary files /dev/null and b/trac/htdocs/common/expander_open_hover.png differ diff --git a/trac/htdocs/common/extlink.gif b/trac/htdocs/common/extlink.gif new file mode 100644 index 0000000..d47e14c Binary files /dev/null and b/trac/htdocs/common/extlink.gif differ diff --git a/trac/htdocs/common/feed.png b/trac/htdocs/common/feed.png new file mode 100644 index 0000000..fec919d Binary files /dev/null and b/trac/htdocs/common/feed.png differ diff --git a/trac/htdocs/common/file.png b/trac/htdocs/common/file.png new file mode 100644 index 0000000..f35fc99 Binary files /dev/null and b/trac/htdocs/common/file.png differ diff --git a/trac/htdocs/common/folder.png b/trac/htdocs/common/folder.png new file mode 100644 index 0000000..d26c06c Binary files /dev/null and b/trac/htdocs/common/folder.png differ diff --git a/trac/htdocs/common/guide/basic-workflow.png b/trac/htdocs/common/guide/basic-workflow.png new file mode 100644 index 0000000..0074ef1 Binary files /dev/null and b/trac/htdocs/common/guide/basic-workflow.png differ diff --git a/trac/htdocs/common/guide/original-workflow.png b/trac/htdocs/common/guide/original-workflow.png new file mode 100644 index 0000000..8213652 Binary files /dev/null and b/trac/htdocs/common/guide/original-workflow.png differ diff --git a/trac/htdocs/common/ics.png b/trac/htdocs/common/ics.png new file mode 100644 index 0000000..69b9193 Binary files /dev/null and b/trac/htdocs/common/ics.png differ diff --git a/trac/htdocs/common/imggrid.png b/trac/htdocs/common/imggrid.png new file mode 100644 index 0000000..d1e60d9 Binary files /dev/null and b/trac/htdocs/common/imggrid.png differ diff --git a/trac/htdocs/common/js/blame.js b/trac/htdocs/common/js/blame.js new file mode 100644 index 0000000..187dd67 --- /dev/null +++ b/trac/htdocs/common/js/blame.js @@ -0,0 +1,102 @@ + +(function($){ + + window.enableBlame = function(url, original_path) { + var message = null; + var message_rev = null; + + /* for each blame cell containing a changeset link... */ + var rev_paths = {}; + $("table.code th.blame a").each(function() { + href = $(this).attr("href"); + $(this).removeAttr("href"); + rev_href = href.substr(href.indexOf("changeset/") + 10); + elts = rev_href.split("/"); + var path = elts.slice(1).join("/"); + if (path != original_path) + rev_paths["r"+elts[0]] = path; + }); + + /* for each blame cell... */ + $("table.code th.blame").each(function() { + var rev = $(this).attr("class").split(" ")[1]; // "blame r123" + var path = rev_paths[rev] || original_path; // only found if != orig + + if (!rev) + return; + + $(this).css("cursor", "pointer").click(function() { + var row = this.parentNode; + var message_is_visible = message && message.css("display") == "block"; + var highlight_rev = null; + + function show() { + /* Display commit message for the selected revision */ + + var message_w = message.get(0).offsetWidth; + + // limit message panel width to 3/5 of the row width + var row_w = row.offsetWidth; + var max_w = (3.0 * row_w / 5.0); + if (!message_w || message_w > max_w) { + message_w = max_w; + var borderw = (3+8)*2; // borderwidth + padding on both sides + message.css({width: message_w - borderw + "px"}); + } + + var row_offset = $(row).offset(); + var left = row_offset.left + row.offsetWidth - message_w; + message.css({display: "block", top: row_offset.top+"px", left: left-2+"px"}); + } + + function hide() { + /* Hide commit message */ + message.css({display: "none"}); + + /* Remove highlighting for lines of the current revision */ + $("table.code th."+message_rev).each(function() { + $(this.parentNode).removeClass("hilite") + }); + } + + if (message_rev != rev) { // fetch a new revision + if (message_is_visible) { + hide(); + } + message_rev = rev; + highlight_rev = message_rev; + + $.get(url + rev.substr(1), {annotate: path}, function(data) { + // remove former message panel if any + if (message) + message.remove(); + // create new message panel + message = $('
').css("position", "absolute") + .append($('
') + .append($('').click(hide))) + .append($('
').html(data || "(no changeset information)")) + .appendTo("body"); + + // workaround non-clickable "Close" issue in Firefox + if ($.browser.mozilla) + message.find("div.inlinebuttons").next().css("clear", "right"); + + show(); + }); + } else if (message_is_visible) { + hide(); + } else { + show(); + highlight_rev = message_rev; + } + + /* Highlight all lines of the current revision */ + $("table.code th."+highlight_rev).each(function() { + $(this.parentNode).addClass("hilite") + }); + + }); + }); + } + +})(jQuery); diff --git a/trac/htdocs/common/js/diff.js b/trac/htdocs/common/js/diff.js new file mode 100644 index 0000000..14f8bf9 --- /dev/null +++ b/trac/htdocs/common/js/diff.js @@ -0,0 +1,113 @@ +(function($){ + + function convertDiff(name, table) { + var inline = table.className == 'inline'; + var ths = table.tHead.rows[0].cells; + var afile, bfile; + if ( inline ) { + afile = ths[0].title; + bfile = ths[1].title; + } else { + afile = $(ths[0]).find('a').text(); + bfile = $(ths[1]).find('a').text(); + } + if ( afile.match(/^Revision /) ) { + afile = 'a/' + name; + bfile = 'b/' + name; + } + var lines = [ + "Index: " + name, + "===================================================================", + "--- " + afile.replace(/File /, ''), + "+++ " + bfile.replace(/File /, ''), + ]; + var sepIndex = 0; + var oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + + for (var i = 0; i < table.tBodies.length; i++) { + var tBody = table.tBodies[i]; + if (i == 0 || tBody.className == "skipped") { + if (i > 0) { + if (!oldOffset && oldLength) oldOffset = 1 + if (!newOffset && newLength) newOffset = 1 + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength); + } + sepIndex = lines.length; + lines.push("@@ -{1},{2} +{3},{4} @@"); + oldOffset = 0, oldLength = 0, newOffset = 0, newLength = 0; + if (tBody.className == "skipped") continue; + } + var tmpLines = []; + for (var j = 0; j < tBody.rows.length; j++) { + var cells = tBody.rows[j].cells; + var oldLineNo = parseInt($(cells[0]).text()); + var newLineNo = parseInt($(cells[inline ? 1 : 2]).text()); + if (tBody.className == 'unmod') { + lines.push(" " + $(cells[inline ? 2 : 1]).text()); + oldLength += 1; + newLength += 1; + if (!oldOffset) oldOffset = oldLineNo; + if (!newOffset) newOffset = newLineNo; + } else { + var oldLine; + var newLine; + if (inline) { + oldLine = newLine = $(cells[2]).text(); + } else { + oldLine = $(cells[1]).text(); + newLine = $(cells[3]).text(); + } + if (!isNaN(oldLineNo)) { + lines.push("-" + oldLine); + oldLength += 1; + } + if (!isNaN(newLineNo)) { + tmpLines.push("+" + newLine); + newLength += 1; + } + } + } + if (tmpLines.length > 0) { + lines = lines.concat(tmpLines); + } + } + + if (!oldOffset && oldLength) oldOffset = 1; + if (!newOffset && newLength) newOffset = 1; + lines[sepIndex] = lines[sepIndex] + .replace("{1}", oldOffset).replace("{2}", oldLength) + .replace("{3}", newOffset).replace("{4}", newLength); + + /* remove trailing   and join lines (with CR for IExplorer) */ + for ( var i = 0; i < lines.length; i++ ) + if ( lines[i] ) + lines[i] = lines[i].replace(/\xa0$/, ''); + return lines.join($.browser.msie ? "\r" : "\n"); + } + + $(document).ready(function($) { + $("div.diff h2").each(function() { + var switcher = $("").prependTo(this); + var name = $.trim($(this).text()); + var table = $(this).siblings("table").get(0); + if (! table) return; + var pre = $("
").hide().insertAfter(table);
+      $("Tabular").click(function() {
+        $(pre).hide();
+        $(table).show();
+        $(this).addClass("active").siblings("span").removeClass("active");
+        return false;
+      }).addClass("active").appendTo(switcher);
+      $("Unified").click(function() {
+        $(table).hide();
+        if (!pre.get(0).firstChild) pre.text(convertDiff(name, table));
+        $(pre).fadeIn("fast")
+        $(this).addClass("active").siblings("span").removeClass("active");
+        return false;
+      }).appendTo(switcher);
+    });
+  });
+
+})(jQuery);
diff --git a/trac/htdocs/common/js/expand_dir.js b/trac/htdocs/common/js/expand_dir.js
new file mode 100644
index 0000000..223eefb
--- /dev/null
+++ b/trac/htdocs/common/js/expand_dir.js
@@ -0,0 +1,116 @@
+// Enable expanding/folding folders in TracBrowser
+
+(function($){
+  var FOLDERID_COUNTER = 0;
+  var SUBFOLDER_INDENT = 20;
+  
+  // enableExpandDir adds the capability to folder rows to be expanded and folded
+  // It also teach the rows about their ancestors. It expects:
+  //  - `parent_tr`, the logical parent row (`null` if there's no ancestor)
+  //  - a `rows` jQuery object matching the newly created entry rows
+  //  - `qargs`, additional parameters to send to the server when expanding
+  
+  window.enableExpandDir = function(parent_tr, rows, qargs) {
+    // the ancestors folder ids are present in the parent_tr class attribute
+    var ancestor_folderids = [];
+    if (parent_tr)
+      ancestor_folderids = $.grep(parent_tr.attr("class").split(" "), 
+                                  function(c) { return c.match(/^f\d+$/)});
+    rows.each(function () {
+      var a = $(this).find("a.dir");
+  
+      if (a.length) { // then the entry is a folder
+        // create new folder id
+        var folderid = "f" + FOLDERID_COUNTER++;
+        this.id = folderid;
+        $(this).addClass(folderid);
+  
+        // add the expander icon
+        a.wrap('
'); + var expander = a.before(' ').prev(); + expander.attr("title", "Expand sub-directory in place") + .click(function() { toggleDir($(this), qargs); }); + } + + // tie that row to ancestor folders + if (parent_tr) + $(this).addClass(ancestor_folderids.join(" ")); + }); + } + + // handler for click event on the expander icons + window.toggleDir = function(expander, qargs) { + var tr = expander.parents("tr"); + var folderid = tr.get(0).id; + + if ( tr.filter(".expanded").length ) { // then *fold* + tr.removeClass("expanded").addClass("collapsed"); + tr.siblings("tr."+folderid).hide(); + expander.attr("title", "Re-expand directory"); + return; + } + + if ( tr.filter(".collapsed").length ) { // then *expand* + tr.removeClass("collapsed").addClass("expanded"); + tr.siblings("tr."+folderid).show(); + // Note that the above will show all the already fetched subtree, + // so we have to fold again the folders which were already collapsed. + tr.siblings("tr.collapsed").each(function() { + tr.siblings("tr."+this.id).not(this).hide(); + }); + } else { // then *fetch* + var td = expander.parents("td"); + var td_class = td.attr("class"); + var a = expander.next("a"); + var depth = + parseFloat(td.css("padding-left").replace(/^(\d*\.\d*).*$/, "$1")) + + SUBFOLDER_INDENT; + + tr.addClass("expanded"); + // insert "Loading ..." row + tr.after(''); + var loading_row = tr.next(); + loading_row.children("td").addClass(td_class) + .attr("colspan", tr.children("td").length) + .css("padding-left", depth); + loading_row.find("span.loading").text("Loading " + a.text() + "..."); + + // XHR for getting the rows corresponding to the folder entries + $.ajax({ + type: "GET", + url: a.attr("href"), + data: qargs, + dataType: "html", + success: function(data) { + // Safari 3.1.1 has some trouble reconstructing HTML snippets + // bigger than 50k - splitting in rows before building DOM nodes + var rows = data.replace(/^]+>/, "").split(""); + if (rows.length) { + // insert entry rows + $(rows).each(function() { + row = $(this+""); + row.children("td."+td_class).css("padding-left", depth); + // make all entry rows collapsible but only subdir rows expandable + enableExpandDir(tr, row, qargs); + loading_row.before(row); + }); + // remove "Loading ..." row + loading_row.remove(); + } else { + loading_row.find("span.loading").text("").append("(empty)") + .removeClass("loading"); + // make the (empty) row collapsible + enableExpandDir(tr, loading_row, qargs); + } + }, + error: function(req, err, exc) { + loading_row.find("span.loading").text("").append("(error)") + .removeClass("loading"); + enableExpandDir(tr, loading_row, qargs); + } + }); + } + expander.attr("title", "Fold directory"); + } + +})(jQuery); diff --git a/trac/htdocs/common/js/folding.js b/trac/htdocs/common/js/folding.js new file mode 100644 index 0000000..0f16a2d --- /dev/null +++ b/trac/htdocs/common/js/folding.js @@ -0,0 +1,26 @@ +(function($){ + + $.fn.enableFolding = function(autofold) { + var fragId = document.location.hash; + if (fragId && /^#no\d+$/.test(fragId)) { + fragId = parseInt(fragId.substr(3)); + } + + var count = 1; + return this.each(function() { + var t = $(this).text(); + $(this).text(""); + var trigger = $(this).append("").children(); + trigger.text(t); + + trigger.click(function() { + if (fragId == count) { fragId = 0; return; } + $(this.parentNode.parentNode).toggleClass("collapsed"); + }); + if ( autofold ) + trigger.click(); + count++; + }).css("cursor", "pointer"); + } + +})(jQuery); \ No newline at end of file diff --git a/trac/htdocs/common/js/ie_pre7_hacks.js b/trac/htdocs/common/js/ie_pre7_hacks.js new file mode 100644 index 0000000..a2701ad --- /dev/null +++ b/trac/htdocs/common/js/ie_pre7_hacks.js @@ -0,0 +1,7 @@ +jQuery(function($) { // onload + $('select').bind('focusin', function() { + this.tmpIndex = this.selectedIndex; + }).bind('focus', function() { + this.selectedIndex = this.tmpIndex; + }); +}); diff --git a/trac/htdocs/common/js/keyboard_nav.js b/trac/htdocs/common/js/keyboard_nav.js new file mode 100644 index 0000000..9719888 --- /dev/null +++ b/trac/htdocs/common/js/keyboard_nav.js @@ -0,0 +1,61 @@ +(function($){ + var SELECTED_FILE_ELEM = null; + var ENABLE_KEY_NAV = true; + + $(document).keydown(function(event) { + if (!ENABLE_KEY_NAV) + return true; + var selection = SELECTED_FILE_ELEM; + switch (event.keyCode) { + case 74: // j + if (selection == null) { + selection = $('#f0'); + } else { + do { + selection = selection.next(); + } while (selection.length > 0 && selection.css('display') == 'none'); + } + break; + case 75: // k + if (selection == null) { + selection = $('#f0'); + } else { + do { + selection = selection.prev(); + } while (selection.length > 0 && selection.css('display') == 'none'); + } + break; + case 13: // Enter + case 79: // o + if (selection != null) { + var expander = selection.find('.expander'); + if (expander.length > 0) { + expander.click(); + } else { + window.location = selection.find('a.file').attr('href'); + } + } + return false; + break; + default: + return true; + } + if (selection.length > 0) { + if (SELECTED_FILE_ELEM != null) + SELECTED_FILE_ELEM.removeClass('focus'); + selection.addClass('focus'); + SELECTED_FILE_ELEM = selection; + } + return false; + }); + + $(function() { + $('a,input,select,textarea,button') + .focus(function(event) { + ENABLE_KEY_NAV = false; + }) + .blur(function(event) { + ENABLE_KEY_NAV = true; + }); + }); +})(jQuery); diff --git a/trac/htdocs/common/js/noconflict.js b/trac/htdocs/common/js/noconflict.js new file mode 100644 index 0000000..8e4a663 --- /dev/null +++ b/trac/htdocs/common/js/noconflict.js @@ -0,0 +1,3 @@ +jQuery.noConflict(); // jQuery is now removed from the $ namespace + // to use the $ shorthand, use (function($){ ... })(jQuery); + // and for the onload handler: jQuery(function($){ ... }); \ No newline at end of file diff --git a/trac/htdocs/common/js/query.js b/trac/htdocs/common/js/query.js new file mode 100644 index 0000000..a8b97d9 --- /dev/null +++ b/trac/htdocs/common/js/query.js @@ -0,0 +1,278 @@ + +(function($){ + + window.initializeFilters = function() { + + // Bail early for Konqueror and IE5.2/Mac, which don't fully support dynamic + // creation of form controls + try { + var test = document.createElement("input"); + test.type = "button"; + if (test.type != "button") throw Error(); + } catch (e) { + return; + } + + // Removes an existing row from the filters table + function removeRow(button, propertyName) { + var tr = getAncestorByTagName(button, "tr"); + + var mode = null; + var selects = tr.getElementsByTagName("select"); + for (var i = 0; i < selects.length; i++) { + if (selects[i].name == propertyName + "_mode") { + mode = selects[i]; + break; + } + } + if (mode && (getAncestorByTagName(mode, "tr") == tr)) { + // Check whether there are more 'or' rows for this filter + var next = tr.nextSibling; + if (next && (next.className == propertyName)) { + function getChildElementAt(e, idx) { + e = e.firstChild; + var cur = 0; + while (cur <= idx) { + while (e && e.nodeType != 1) e = e.nextSibling; + if (cur++ == idx) break; + e = e.nextSibling; + } + return e; + } + + var thisTh = getChildElementAt(tr, 0); + var nextTh = getChildElementAt(next, 0); + next.insertBefore(thisTh, nextTh); + nextTh.colSpan = 1; + + thisTd = getChildElementAt(tr, 0); + nextTd = getChildElementAt(next, 1); + next.replaceChild(thisTd, nextTd); + } + } + + var tBody = tr.parentNode; + tBody.deleteRow(tr.sectionRowIndex); + if (!tBody.rows.length) { + tBody.parentNode.removeChild(tBody); + } + + if (propertyName) { + var select = document.forms["query"].elements["add_filter"]; + for (var i = 0; i < select.options.length; i++) { + var option = select.options[i]; + if (option.value == propertyName) option.disabled = false; + } + } + } + + // Initializes a filter row, the 'input' parameter is the submit + // button for removing the filter + function initializeFilter(input) { + var removeButton = document.createElement("input"); + removeButton.type = "button"; + removeButton.value = input.value; + if (input.name.substr(0, 10) == "rm_filter_") { + removeButton.onclick = function() { + var endIndex = input.name.search(/_\d+$/); + if (endIndex < 0) endIndex = input.name.length; + removeRow(removeButton, input.name.substring(10, endIndex)); + return false; + } + } else { + removeButton.onclick = function() { + removeRow(removeButton); + return false; + } + } + input.parentNode.replaceChild(removeButton, input); + } + + // Make the submit buttons for removing filters client-side triggers + var filters = document.getElementById("filters"); + var inputs = filters.getElementsByTagName("input"); + for (var i = 0; i < inputs.length; i++) { + var input = inputs[i]; + if (input.type == "submit" && input.name + && input.name.match(/^rm_filter_/)) { + initializeFilter(input); + } + } + + // Make the drop-down menu for adding a filter a client-side trigger + var addButton = document.forms["query"].elements["add"]; + addButton.parentNode.removeChild(addButton); + var select = document.getElementById("add_filter"); + select.onchange = function() { + if (select.selectedIndex < 1) return; + + if (select.options[select.selectedIndex].disabled) { + // Neither IE nor Safari supported disabled options at the time this was + // written, so alert the user + alert("A filter already exists for that property"); + return; + } + + // Convenience function for creating a