]> mj.ucw.cz Git - moe.git/commitdiff
MO: Project templater
authorMartin Mares <mj@ucw.cz>
Sat, 23 Mar 2013 10:41:26 +0000 (11:41 +0100)
committerMartin Mares <mj@ucw.cz>
Sat, 23 Mar 2013 10:41:26 +0000 (11:41 +0100)
mop/project/templater.pl [new file with mode: 0755]
mop/project/templater/template-c.cbp [new file with mode: 0644]
mop/project/templater/template-cpp.cbp [new file with mode: 0644]
mop/project/templater/template-pas.lpi [new file with mode: 0644]
mop/project/templater/template.layout [new file with mode: 0644]
mop/project/templater/templater.xpm [new file with mode: 0644]

diff --git a/mop/project/templater.pl b/mop/project/templater.pl
new file mode 100755 (executable)
index 0000000..e9a500c
--- /dev/null
@@ -0,0 +1,227 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Glib qw(TRUE FALSE);
+use Gtk2 -init;
+
+my ($where,$taskdir,$home)=('/mo/public/templater/','/mo/templates/',$ENV{'HOME'});
+my @tasks = map { s#.*/##; $_ } (glob "$taskdir/*");
+my $contestName = "MO-P";
+
+sub create_template($$$$) {
+    my ($path,$task,$name,$ext)=@_;
+    return "Project cannot be created!" unless -d $path;
+    return "Specified project already exist!" if -d "$path/$name";
+    mkdir "$path/$name" or return "Can not create project directory!";
+    my %files = (
+       c => {
+               "$where/template-c.cbp" => "$task.cbp",
+               "$where/template.layout" => "$task.layout",
+               "$taskdir/$task/$task.c" => "$task.c",
+               "$taskdir/$task/$task-main.c" => "$task-main.c",
+               "$taskdir/$task/$task.h" => "$task.h",
+       },
+       cpp => {
+               "$where/template-cpp.cbp" => "$task.cbp",
+               "$where/template.layout" => "$task.layout",
+               "$taskdir/$task/$task.cpp" => "$task.cpp",
+               "$taskdir/$task/$task-main.cpp" => "$task-main.cpp",
+               "$taskdir/$task/$task.h" => "$task.h",
+       },
+       pas => {
+               "$where/template-pas.lpi" => "${task}_main.lpi",
+               "$taskdir/$task/$task.pas" => "$task.pas",
+               "$taskdir/$task/${task}_main.pas" => "${task}_main.lpr",
+       }
+    );
+    my $files = $files{$ext} // die "Unknown ext $ext\n";
+    while (my ($file, $target) = each %$files) {
+       $target="$path/$name/$target";
+       # FUJ! S tímhle by se něco mělo dělat.
+       system("sed 's#fILENAMe#$name#;
+                     s#fILENAMEEXt#$name.$ext#;
+                     s#tASk#$task#;
+                     s#tASKEXt#$task.$ext#;
+                    s#pATHFILENAMe#$path/$name/$name#;
+                    s#pATHFILENAMEEXt#$path/$name/$name.$ext#;
+                   ' < '$file' > '$target'");
+    }
+    return "";
+}
+
+sub open_project($) {
+    my ($p)=@_;
+    my $cmd;
+    my @files = glob "$home/$p/*.cbp";
+    if (@files) {
+       $cmd = 'codeblocks';
+    } else {
+        $cmd = 'lazarus-ide';
+        @files = ((glob "$home/$p/*.lpi"), (glob "$home/$p/*.pas"));
+    }
+    print("@files\n");
+    system("$cmd @files &");
+}
+
+sub existing_projects($) {
+    my ($lopen_data,$lang)=@_;
+    foreach ((glob "$home/*/*.cbp"), (glob "$home/*/*.lpr")) {
+       my ($name, $task) = m#.*/(.*?)/(.*)(_main\.lpr|\.cbp)#;
+       print "$name $task\n";
+       $lang=-f "$home/$name/$task.c" ? 'C' : -f "$home/$name/$task.cpp" ? 'C++' : -f "$home/$name/$task.pas" ? 'Pascal' : '';
+       $lopen_data->set($lopen_data->append, 0, "$1", 1, $lang);
+    }
+}
+
+sub main_window() {
+    my $retcode='';
+
+    my $w=Gtk2::Window->new('toplevel');
+    $w->signal_connect('destroy' => sub { $retcode='quit' unless length $retcode; Gtk2->main_quit; });
+    $w->set_default_icon_from_file("$where/templater.xpm");
+    $w->set_position('center');
+    $w->set_default_size(600,-1);
+    $w->set_title("$contestName project management");
+    my $b=Gtk2::VBox->new(FALSE,0);
+    $b->set_border_width(10);
+    $w->add($b);
+
+    my $fnew=Gtk2::Frame->new("Create new $contestName contest project");
+    my $xnew=Gtk2::HBox->new(FALSE,0);
+    $xnew->set_border_width(10);
+    my $inew=Gtk2::Image->new_from_file("$where/templater.xpm");
+    my $bnew=Gtk2::Button->new_with_label("Create new $contestName contest project");
+    $bnew->signal_connect('clicked' => sub { $retcode='new'; $w->destroy; });
+    $xnew->pack_start($inew,FALSE,TRUE,10);
+    $xnew->pack_start($bnew,TRUE,TRUE,10);
+    $fnew->add($xnew);
+    $b->pack_start($fnew,FALSE,TRUE,10);
+
+    my $fopen=Gtk2::Frame->new("Open existing $contestName contest project");
+    my $yopen=Gtk2::VBox->new(FALSE,0);    $yopen->set_border_width(5);
+    my $xopen=Gtk2::HBox->new(FALSE,0);    $xopen->set_border_width(5);
+    my $lopen_data=Gtk2::ListStore->new(('Glib::String','Glib::String'));
+    existing_projects($lopen_data);
+    my $lopen=Gtk2::TreeView->new_with_model($lopen_data);
+    my $lopen_c1=Gtk2::TreeViewColumn->new_with_attributes('Project name',Gtk2::CellRendererText->new, text=>0);    
+    my $lopen_c2=Gtk2::TreeViewColumn->new_with_attributes('Language',Gtk2::CellRendererText->new, text=>1);
+    $lopen_c1->set_expand(TRUE); $lopen->append_column($lopen_c1); $lopen->append_column($lopen_c2);
+    my $iopen=Gtk2::Image->new_from_file("$where/templater.xpm");
+    my $bopen=Gtk2::Button->new_with_label("Open existing $contestName contest project");
+    $bopen->signal_connect('clicked' => sub { open_project $lopen_data->get(scalar($lopen->get_selection->get_selected),0),
+                                              $w->destroy; });
+    $bopen->set_sensitive(FALSE);
+    $lopen->signal_connect('row-activated' => sub { $bopen->clicked });
+    $lopen->get_selection->set_mode('single');
+    $lopen->get_selection->signal_connect('changed' => sub { $bopen->set_sensitive(TRUE) } );
+    $xopen->pack_start($iopen,FALSE,TRUE,10);
+    $xopen->pack_start($bopen,TRUE,TRUE,10);
+    $yopen->pack_start($lopen,TRUE,TRUE,5);
+    $yopen->pack_start($xopen,FALSE,TRUE,5);
+    $fopen->add($yopen);
+    $b->pack_start($fopen,TRUE,TRUE,10);
+
+    my $bquit=Gtk2::Button->new_from_stock('gtk-quit');
+    $bquit->signal_connect('clicked' => sub { $w->destroy; });
+    $b->pack_start($bquit,FALSE,TRUE,5);
+
+    $w->show_all;
+    Gtk2->main;
+    $retcode;
+}
+
+sub message($$$) {
+    my $m=Gtk2::MessageDialog->new($_[0], 'modal', $_[2], 'ok', $_[1]);
+    $m->run;
+    $m->destroy;
+    1
+}
+
+sub new_window() {
+    my $retcode='';
+
+    my $w=Gtk2::Window->new('toplevel');
+    $w->signal_connect('destroy' => sub { $retcode='quit' unless length $retcode; Gtk2->main_quit; });
+    $w->set_default_icon_from_file("$where/templater.xpm");
+    $w->set_position('center');
+    $w->set_default_size(500,-1);
+    $w->set_title("Create new $contestName project");
+
+    my $b=Gtk2::VBox->new(FALSE,0);
+    $b->set_border_width(10);
+    $w->add($b);
+
+    my $flang=Gtk2::Frame->new('Choose project language');
+    my $xlang=Gtk2::HBox->new(FALSE,0);
+    $xlang->set_border_width(10);
+    my $r_c=Gtk2::RadioButton->new_with_label(undef, 'C');
+    my $r_cpp=Gtk2::RadioButton->new_with_label($r_c->get_group(), 'C++');
+    my $r_pas=Gtk2::RadioButton->new_with_label($r_c->get_group(), 'Pascal');
+    $r_c->set_active(TRUE);
+    $xlang->pack_start($r_c,TRUE,TRUE,5); 
+    $xlang->pack_start($r_cpp,TRUE,TRUE,5);
+    $xlang->pack_start($r_pas,TRUE,TRUE,5);
+    $flang->add($xlang);
+    $b->pack_start($flang,FALSE,TRUE,10);
+
+    my $ftask=Gtk2::Frame->new('Choose task');
+    my $xtask=Gtk2::HBox->new(FALSE,0);
+    $xtask->set_border_width(10);
+    my $group;
+    my $task = $tasks[0];
+    for my $t (@tasks) {
+           my $rb=Gtk2::RadioButton->new_with_label($group, $t);
+           $rb->signal_connect(clicked => sub {
+               $task = $t;
+           });
+           unless ($group) {
+               $rb->set_active(TRUE);
+               $group=$rb->get_group();
+           }
+           $xtask->pack_start($rb,TRUE,TRUE,5);
+    }
+    $ftask->add($xtask);
+    $b->pack_start($ftask,FALSE,TRUE,10);
+
+    my $fprj=Gtk2::Frame->new('Enter project name');
+    my $eprj=Gtk2::Entry->new;
+    $fprj->add($eprj);
+    $b->pack_start(Gtk2::HBox->new(),TRUE,TRUE,0);
+    $b->pack_start($fprj,FALSE,TRUE,10);
+
+    my $xcreate=Gtk2::HBox->new(FALSE,0);
+    $xcreate->set_border_width(10);
+    my $icreate=Gtk2::Image->new_from_file("$where/templater.xpm");
+    my $bcreate=Gtk2::Button->new_from_stock('gtk-new');
+    my $qcreate=Gtk2::Button->new_from_stock('gtk-cancel');
+    $bcreate->signal_connect('clicked' => sub {
+       my $p=$eprj->get_text; $p =~ s/^\s*//; $p =~ s/\s*$//;
+       if ($p =~ /\W/) {
+           message($w, 'Sorry, but be nice with the project name!', 'error');
+           return;
+       }
+       if (not length $p) {
+           message($w, 'No project name specified!', 'error');
+           return;
+       }
+       my $ret=create_template $home, $task, $p, ($r_c->get_active ? 'c' : $r_cpp->get_active ? 'cpp' : 'pas');
+       length $ret and message($w,$ret,'error') and return;
+       open_project $p;
+       $retcode='new';
+       $w->destroy;
+    });
+    $qcreate->signal_connect('clicked' => sub { $w->destroy; });
+    $xcreate->pack_start($icreate,FALSE,TRUE,10);
+    $xcreate->pack_start($bcreate,TRUE,TRUE,10);
+    $xcreate->pack_start($qcreate,TRUE,TRUE,10);
+    $b->pack_start(Gtk2::HBox->new(),TRUE,TRUE,0);
+    $b->pack_start($xcreate,FALSE,TRUE,10);
+    
+    $w->show_all;
+    Gtk2->main;
+    $retcode;
+}
+
+while (main_window eq 'new') {
+    new_window eq 'quit' or exit 0;
+}
diff --git a/mop/project/templater/template-c.cbp b/mop/project/templater/template-c.cbp
new file mode 100644 (file)
index 0000000..08f7b7f
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+       <FileVersion major="1" minor="6" />
+       <Project>
+               <Option title="fILENAMe" />
+               <Option pch_mode="2" />
+               <Option compiler="gcc" />
+               <Build>
+                       <Target title="Debug">
+                               <Option output="bin/Debug/fILENAMe" prefix_auto="1" extension_auto="1" />
+                               <Option object_output="obj/Debug/" />
+                               <Option type="1" />
+                               <Option compiler="gcc" />
+                               <Compiler>
+                                       <Add option="-g" />
+                               </Compiler>
+                       </Target>
+                       <Target title="Release">
+                               <Option output="bin/Release/fILENAMe" prefix_auto="1" extension_auto="1" />
+                               <Option object_output="obj/Release/" />
+                               <Option type="1" />
+                               <Option compiler="gcc" />
+                               <Compiler>
+                                       <Add option="-O2" />
+                               </Compiler>
+                               <Linker>
+                                       <Add option="-s" />
+                               </Linker>
+                       </Target>
+               </Build>
+               <Compiler>
+                       <Add option="-Wall" />
+                       <Add option="-Wextra" />
+                       <Add option="-std=gnu99" />
+               </Compiler>
+               <Linker>
+                       <Add option="-lm" />
+               </Linker>
+               <Unit filename="tASk-main.c">
+                       <Option compilerVar="CC" />
+               </Unit>
+               <Unit filename="tASk.c">
+                       <Option compilerVar="CC" />
+               </Unit>
+               <Unit filename="tASk.h" />
+               <Extensions>
+                       <envvars />
+                       <code_completion />
+                       <lib_finder disable_auto="1" />
+                       <debugger />
+               </Extensions>
+       </Project>
+</CodeBlocks_project_file>
diff --git a/mop/project/templater/template-cpp.cbp b/mop/project/templater/template-cpp.cbp
new file mode 100644 (file)
index 0000000..3dab2e1
--- /dev/null
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+       <FileVersion major="1" minor="6" />
+       <Project>
+               <Option title="fILENAMe" />
+               <Option pch_mode="2" />
+               <Option compiler="gcc" />
+               <Build>
+                       <Target title="Debug">
+                               <Option output="bin/Debug/fILENAMe" prefix_auto="1" extension_auto="1" />
+                               <Option object_output="obj/Debug/" />
+                               <Option type="1" />
+                               <Option compiler="gcc" />
+                               <Compiler>
+                                       <Add option="-g" />
+                               </Compiler>
+                       </Target>
+                       <Target title="Release">
+                               <Option output="bin/Release/fILENAMe" prefix_auto="1" extension_auto="1" />
+                               <Option object_output="obj/Release/" />
+                               <Option type="1" />
+                               <Option compiler="gcc" />
+                               <Compiler>
+                                       <Add option="-O2" />
+                               </Compiler>
+                               <Linker>
+                                       <Add option="-s" />
+                               </Linker>
+                       </Target>
+               </Build>
+               <Compiler>
+                       <Add option="-Wall" />
+                       <Add option="-Wextra" />
+                       <Add option="-std=gnu++11" />
+               </Compiler>
+               <Linker>
+                       <Add option="-lm" />
+               </Linker>
+               <Unit filename="tASk-main.cpp">
+                       <Option compilerVar="CPP" />
+               </Unit>
+               <Unit filename="tASk.cpp">
+                       <Option compilerVar="CPP" />
+               </Unit>
+               <Unit filename="tASk.h" />
+               <Extensions>
+                       <envvars />
+                       <code_completion />
+                       <lib_finder disable_auto="1" />
+                       <debugger />
+               </Extensions>
+       </Project>
+</CodeBlocks_project_file>
diff --git a/mop/project/templater/template-pas.lpi b/mop/project/templater/template-pas.lpi
new file mode 100644 (file)
index 0000000..d4ba0af
--- /dev/null
@@ -0,0 +1,100 @@
+<?xml version="1.0"?>
+<CONFIG>
+  <ProjectOptions>
+    <Version Value="9"/>
+    <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
+      </Flags>
+      <SessionStorage Value="InProjectDir"/>
+      <MainUnit Value="0"/>
+      <Title Value="tASk_main"/>
+      <ResourceType Value="res"/>
+      <UseXPManifest Value="True"/>
+    </General>
+    <i18n>
+      <EnableI18N LFM="False"/>
+    </i18n>
+    <VersionInfo>
+      <StringTable ProductVersion=""/>
+    </VersionInfo>
+    <BuildModes Count="1">
+      <Item1 Name="Default" Default="True"/>
+    </BuildModes>
+    <PublishOptions>
+      <Version Value="2"/>
+      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+      <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
+    </PublishOptions>
+    <RunParams>
+      <local>
+        <FormatVersion Value="1"/>
+        <LaunchingApplication PathPlusParams="/usr/bin/rxvt-unicode -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+      </local>
+    </RunParams>
+    <RequiredPackages Count="1">
+      <Item1>
+        <PackageName Value="LCL"/>
+      </Item1>
+    </RequiredPackages>
+    <Units Count="2">
+      <Unit0>
+        <Filename Value="tASk_main.lpr"/>
+        <IsPartOfProject Value="True"/>
+        <UnitName Value="tASk_main"/>
+      </Unit0>
+      <Unit1>
+        <Filename Value="tASk.pas"/>
+        <IsPartOfProject Value="True"/>
+        <ComponentName Value="Form1"/>
+        <ResourceBaseClass Value="Form"/>
+        <UnitName Value="tASk"/>
+      </Unit1>
+    </Units>
+  </ProjectOptions>
+  <CompilerOptions>
+    <Version Value="11"/>
+    <Target>
+      <Filename Value="tASk"/>
+    </Target>
+    <SearchPaths>
+      <IncludeFiles Value="$(ProjOutDir)"/>
+      <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
+    </SearchPaths>
+    <Parsing>
+      <SyntaxOptions>
+        <SyntaxMode Value="fpc"/>
+        <CStyleOperator Value="False"/>
+        <CPPInline Value="False"/>
+        <UseAnsiStrings Value="False"/>
+      </SyntaxOptions>
+    </Parsing>
+    <CodeGeneration>
+      <Checks>
+        <IOChecks Value="True"/>
+        <RangeChecks Value="True"/>
+      </Checks>
+    </CodeGeneration>
+    <Other>
+      <WriteFPCLogo Value="False"/>
+      <CompilerMessages>
+        <MsgFileName Value=""/>
+      </CompilerMessages>
+      <CompilerPath Value="$(CompPath)"/>
+    </Other>
+  </CompilerOptions>
+  <Debugging>
+    <Exceptions Count="3">
+      <Item1>
+        <Name Value="EAbort"/>
+      </Item1>
+      <Item2>
+        <Name Value="ECodetoolError"/>
+      </Item2>
+      <Item3>
+        <Name Value="EFOpenError"/>
+      </Item3>
+    </Exceptions>
+  </Debugging>
+</CONFIG>
diff --git a/mop/project/templater/template.layout b/mop/project/templater/template.layout
new file mode 100644 (file)
index 0000000..96dcbd6
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_layout_file>
+       <ActiveTarget name="Debug" />
+       <File name="tASKEXt" open="1" top="0" tabpos="1">
+               <Cursor position="0" topLine="0" />
+       </File>
+</CodeBlocks_layout_file>
diff --git a/mop/project/templater/templater.xpm b/mop/project/templater/templater.xpm
new file mode 100644 (file)
index 0000000..348a956
--- /dev/null
@@ -0,0 +1,295 @@
+/* XPM */
+static char *kdevelop[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 257 2",
+"   c #000000",
+".  c #04040C",
+"X  c #000D00",
+"o  c #0B0B0E",
+"O  c #0D0D10",
+"+  c #071700",
+"@  c #001A00",
+"#  c #131316",
+"$  c #14141A",
+"%  c #19191D",
+"&  c #1B1B24",
+"*  c #1F1F2C",
+"=  c #15152A",
+"-  c #002B00",
+";  c #003E00",
+":  c #0A3000",
+">  c #153D03",
+",  c #212126",
+"<  c #22222C",
+"1  c #2C2C35",
+"2  c #2D2D3B",
+"3  c #34343F",
+"4  c #373748",
+"5  c #383844",
+"6  c #004F00",
+"7  c #005600",
+"8  c #015900",
+"9  c #095C00",
+"0  c #164A02",
+"q  c #195502",
+"w  c #006500",
+"e  c #006C00",
+"r  c #404047",
+"t  c #40404A",
+"y  c gray29",
+"u  c #424252",
+"i  c #484852",
+"p  c #4A4A5C",
+"a  c #535355",
+"s  c #54545C",
+"d  c #5C5C5D",
+"f  c #5C5C6B",
+"g  c #5B5B71",
+"h  c #636363",
+"j  c #63636C",
+"k  c #6B6B6B",
+"l  c #686776",
+"z  c #70707C",
+"x  c #7C7C7C",
+"c  c #747474",
+"v  c #727283",
+"b  c #7D7C8C",
+"n  c #79778C",
+"m  c #7B7B93",
+"M  c #7F7FBF",
+"N  c #0A8A04",
+"B  c #029B00",
+"V  c #079906",
+"C  c #108F0A",
+"Z  c #118D00",
+"A  c #189207",
+"S  c #1F9C1C",
+"D  c #0DA400",
+"F  c #07A300",
+"G  c #14A301",
+"H  c #1DAD01",
+"J  c #1DA91B",
+"K  c #29911F",
+"L  c #298E28",
+"P  c #309A29",
+"I  c #20AD00",
+"U  c #23A716",
+"Y  c #2AB300",
+"T  c #2EB802",
+"R  c #27B601",
+"E  c #39AC01",
+"W  c #33B902",
+"Q  c #3CB200",
+"!  c #37B716",
+"~  c #2AA920",
+"^  c #30AA2C",
+"/  c #30A828",
+"(  c #34B027",
+")  c #3BC102",
+"_  c #439A3E",
+"`  c #40A71D",
+"'  c #42BC05",
+"]  c #5ABB0E",
+"[  c #47A726",
+"{  c #4EBD35",
+"}  c #46B63C",
+"|  c #58A82C",
+" . c #78B93D",
+".. c #69B42A",
+"X. c #49B449",
+"o. c #50BB4C",
+"O. c #5BBF54",
+"+. c #5FBE58",
+"@. c #55BB51",
+"#. c #61AF4E",
+"$. c #64B440",
+"%. c #62BD5C",
+"&. c #72B544",
+"*. c #77B46F",
+"=. c #4DCA01",
+"-. c #48C408",
+";. c #4BC31C",
+":. c #54CE07",
+">. c #54CB1C",
+",. c #5ED700",
+"<. c #68D800",
+"1. c #75C91A",
+"2. c #7DD610",
+"3. c #6AC714",
+"4. c #6CD233",
+"5. c #71D634",
+"6. c #7AE200",
+"7. c #61C252",
+"8. c #72C35C",
+"9. c #7BD541",
+"0. c #6DC46B",
+"q. c #65C463",
+"w. c #75C96C",
+"e. c #73C76F",
+"r. c #73C672",
+"t. c #7CC878",
+"y. c #84CD27",
+"u. c #89CB36",
+"i. c #81EA15",
+"p. c #87F000",
+"a. c #90EC18",
+"s. c #98F90D",
+"d. c #80E136",
+"f. c GreenYellow",
+"g. c #ABFF24",
+"h. c #A6F832",
+"j. c #8DC949",
+"k. c #8ADF4D",
+"l. c #95C85B",
+"z. c #83C47F",
+"x. c #91C577",
+"c. c #8CE245",
+"v. c #9BEF43",
+"b. c #9FE960",
+"n. c #A3CB7B",
+"m. c #A3E276",
+"M. c #B0F263",
+"N. c #BCF678",
+"B. c #838383",
+"V. c #83838B",
+"C. c #8A8A8A",
+"Z. c #8A8A9D",
+"A. c #848497",
+"S. c #90909E",
+"D. c #9A9A9B",
+"F. c #929293",
+"G. c #8E8DA4",
+"H. c #9494A3",
+"J. c #9A9AAC",
+"K. c #9594A7",
+"L. c #9E9EB2",
+"P. c #A9A8AD",
+"I. c #A5A3B9",
+"U. c #AEABB3",
+"Y. c #ABABBB",
+"T. c #A6A5BA",
+"R. c #B2AEBE",
+"E. c #B1B1B1",
+"W. c #ACAAC0",
+"Q. c #AAA5C1",
+"!. c #B2B2C4",
+"~. c #B6B4CA",
+"^. c #BCBBCB",
+"/. c #BEBCD1",
+"(. c #85CE85",
+"). c #89CF89",
+"_. c #8CCD85",
+"`. c #89D086",
+"'. c #8AD089",
+"]. c #87D082",
+"[. c #96C588",
+"{. c #97C295",
+"}. c #92D293",
+"|. c #A8C596",
+" X c #A7DE93",
+".X c #AACFA1",
+"XX c #A6D0A0",
+"oX c #A7D1A8",
+"OX c #A4DAA4",
+"+X c #A7DDA8",
+"@X c #AAD3A5",
+"#X c #A8DBA8",
+"$X c #B3D0A1",
+"%X c #B3DEB2",
+"&X c #B0D5B0",
+"*X c #BDF288",
+"=X c #AFE2AE",
+"-X c #B4E5B4",
+";X c #C3BFD6",
+":X c #C7F2A5",
+">X c #D6FBB1",
+",X c #C3C2C5",
+"<X c #C0C0CD",
+"1X c #C4C9CA",
+"2X c #C8C8C9",
+"3X c #C4C4D2",
+"4X c #CBCAD6",
+"5X c #CBCBD9",
+"6X c #C8C4D6",
+"7X c #C2D9C5",
+"8X c #CCDCC6",
+"9X c #CBDCCE",
+"0X c #CED4D6",
+"qX c #CFDBD0",
+"wX c #D0CDDE",
+"eX c #D1DDCD",
+"rX c #D2D1D5",
+"tX c #D3D3DD",
+"yX c #D8D8DB",
+"uX c #D5D3E4",
+"iX c #D9D4E6",
+"pX c #DBDBE4",
+"aX c #DDDBEB",
+"sX c #C0E6C0",
+"dX c #CCE9C8",
+"fX c #DAE2DC",
+"gX c #D5E1D5",
+"hX c #D6F1D6",
+"jX c #DEF2DE",
+"kX c #DEE0E3",
+"lX c #E4DEEE",
+"zX c #E1DFE4",
+"xX c #E6FFC8",
+"cX c #E3FDC0",
+"vX c #E9F6DD",
+"bX c #E2E2E5",
+"nX c #E4E2EA",
+"mX c #E8E5ED",
+"MX c #EAEAEE",
+"NX c #E0EAE0",
+"BX c #EAE3F2",
+"VX c #ECEBF1",
+"CX c #EEECF8",
+"ZX c #E4F4E4",
+"AX c #EBF5EB",
+"SX c #EAF8EA",
+"DX c #F2EDF8",
+"FX c #F9FFEF",
+"GX c #F5FDEA",
+"HX c #F2F2F5",
+"JX c #F6F6F9",
+"KX c #F4FAF3",
+"LX c #F7FDF8",
+"PX c #F9F5FC",
+"IX c #FAFCF7",
+"UX c #FDFCFD",
+"YX c None",
+/* pixels */
+"YXYXYX# B.  YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYX  A.UXV.v z   YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYX1 Y.pXpXpXb & YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYXk nXUXUXMXJ.4 = S.b YXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYXf MXUXUXUXUX!.J.BXK.- e e w 8 9 - YXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYX. H.JXUXUXMXnXJX{.L C ^ X.X.( K N 8 @ YXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYX1 <XUXMXBXfX_ P `.hXSXLXLXKXSX-Xq.C ;   YXYXYXYXYXYXYX",
+"YXYXYXYXYX  f 5XnXgXK %.hXSXZXjXjXjXjXjXAXSX=X^ 6   YXYXYXYXYXYX",
+"YXYXYXYXYXYX$ ~.AXP %.dXsXsXsXsXsXsXsXsXsXsXdX=XU ; YXYXYXYXYXYX",
+"YXYXYXYXYXYXa PX*.U #X#XOXOXOXOXOXOXOXOXOXOXOX%Xt.C @ YXYXYXYXYX",
+"YXYXYXYXYXYXP.kXA @.}.).].].`.).`.].`.`.'.'.).).].J 9   YXYXYXYX",
+"YXM I.J.J.G.lX[.B X.r.0.z.oX7X9X7X&X`.w.w.r.e.r.0.J Z + YXYXYXYX",
+"f <X<X4XyXtXVX#.B ^ @.[.pXJXUXUXUXUXMXoX7.7.7.+.@.V G : YXYXYXYX",
+"s JXUXUXUXnXbX[ B V (.mXPXJXJXUXUXHXmXlXXX{ { } ( B H 0 YXYXYXYX",
+"s UXUXUXUXnXkX` D ~ rXDXJXHXMXyX,XE.P.zXBX8.! ! H D I q   YXYXYX",
+"a aXHXUXUXnXbX[ D z.VXMXrXU.F.B.B.x D.mXBX.XW Y I G R 0   YXYXYX",
+"$ i l A.Y.~.aX .I $XU.k h h h k k h E.MXlXeX' W Y I T > YXYXYXYX",
+"YX    . $ u aXx.Y %X6Xa y d d h d h rXMXMXfX-.W W W E + YXYXYXYX",
+"YXYXYXYXYX  R.dXQ  XUXrXc d k c k F.HXMXDX8X=.-.;.) | n * YXYXYX",
+"YXYXYXYXYXYXs DX&.9.UXUXbXC.c x x 2XIXHXPXm.:.5.>.' |.~.$ YXYXYX",
+"YXYXYXYXYXYX1 6XeX] :XUXUXMXD.C.D.HXUXUXvXc.k.5.=.&.wXv   YXYXYX",
+"YXYXYXYXYX  J.<XpX$X3.>XUXUXUX,XrXIXUXGX*Xb.5.<...1XT.L.t YXYXYX",
+"YXYXYXYXYXk tXJX5XiX$X1.M.xXIXLXKXFXcXN.v.i.<. .1XQ.<XtXA.. YXYX",
+"YXYXYXYX3 ~.HXUXJX5XuXeXj.2.a.h.f.g.s.p.6.1.[.rXQ.^.VXnX~.p   YX",
+"YXYXYX  H.MXUXJXUXnXK.I.aX9Xn.j.y.y.u.l.|.0X/.G.!.bXmXkXpXG.& YX",
+"YXYXYX  z nXUXJX5Xb 2 o 5 G.;X5X6X3X6X3XQ.l & % v W.tXnXpXJ.* YX",
+"YXYXYXYX  f tXY.p o   YX    b ^.3X^.^.G.<     YX  3 A./.L.3XH.o ",
+"YXYXYXYXYX  4 <     YXYXYXYXj iXHXHXnXA.. YXYXYXYXYXo u 2 H.aX1 ",
+"YXYXYXYXYXYX    YXYXYXYXYXYX5 3XMXMXwXg   YXYXYXYXYXYX    # 3   ",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX< Y.HXHX3X4   YXYXYXYXYXYXYXYXYX  YX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX. Z.3X<XK.& YXYXYXYXYXYXYXYXYXYXYXYX",
+"YXYXYXYXYXYXYXYXYXYXYXYXYXYX  & , & & . YXYXYXYXYXYXYXYXYXYXYXYX"
+};