michael 21 éve
szülő
commit
04167f8385

+ 71 - 0
fcl/fpcunit/README.txt

@@ -0,0 +1,71 @@
+FPCUnit 
+   
+   This is a port to Free Pascal of the JUnit core framework.
+   see http://www.junit.org
+   A great thank you goes to Kent Beck and Erich Gamma:
+   "Never in the field of software development was so much owed by so many to 
+   so few lines of code." (M.Fowler)
+   
+I've tried to follow as closely as possible the original JUnit code base,
+so, as a side effect, developers already familiar with JUnit will find themselves
+at home with this port to Free Pascal. If you are new to unit testing and test driven 
+development, you can find a huge reference to articles and
+howto's on the JUnit home page:
+http://junit.sourceforge.net/#Documentation
+http://www.junit.org/news/article/index.htm.
+
+A simple example of a console test runner application that was used to write FPCUnit itself
+is included in the demo directory. The tests are located in fpcunitests.pp, they can be used as
+examples to see how to construct the tests and the test suites.
+
+To be able to trace the line numbers of the
+test errors (unhandled exceptions) it is required to use the -gl option 
+to compile the project:. 
+eg. $ fpc -Sd -gl testrunner.pp
+If you don't like this additional feature you can disable the {$SHOWLINEINFO} directive
+in the testresults.pp unit.
+
+Usage:
+-l or --list to show a list of registered tests
+default format is xml, add --format=latex to output the list as latex source
+-a or --all to run all the tests and show the results in xml format
+The results can be redirected to an xml file,
+for example: ./testrunner --all > results.xml
+use --suite=MyTestSuiteName to run only the tests in a single test suite class
+
+To use the simple console test runner in your own project, you can just edit the 
+suiteconfig.pp unit to include your own units containing your tests instead of the unit
+fpcunittests and register your tests in the RegisterUnitTests procedure like this:
+
+unit suiteconfig;
+
+interface
+
+uses
+  >>> Add the unit(s) containing your tests here;
+
+procedure RegisterUnitTests;
+
+implementation
+
+uses
+  testregistry;
+
+procedure RegisterUnitTests;
+begin
+  //register your tests here
+>>>  RegisterTests([TYourFirstTest, TYourSecondTest, TYourThirdTest,... ]);
+end;
+
+end.
+
+
+
+Happy coding,
+Dean Zobec
+
+
+
+
+   
+    

+ 34 - 0
fcl/fpcunit/demo/consolerunner/suiteconfig.pp

@@ -0,0 +1,34 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    a unit to register the tests to be runned. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit suiteconfig;
+
+interface
+
+uses
+  fpcunittests, testregistry;
+
+procedure RegisterUnitTests;
+
+implementation
+
+procedure RegisterUnitTests;
+begin
+  RegisterTests([TTestCaseTest, TTestSuiteTest, TAssertTest, TListenerTest]);
+end;
+
+end.

+ 134 - 0
fcl/fpcunit/demo/consolerunner/testrunner.pp

@@ -0,0 +1,134 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    an example of a console test runner of FPCUnit tests. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program testrunner;
+
+uses 
+  custapp, classes, SysUtils, fpcunit, suiteconfig, testreport, testregistry;
+  
+Const 
+  ShortOpts = 'alh';
+  Longopts : Array[1..5] of String = (
+    'all','list','format:','suite:','help');
+  Version = 'Version 0.1'; 
+
+Type
+  TTestRunner = Class(TCustomApplication)
+  private
+    FXMLResultsWriter: TXMLResultsWriter;
+  protected  
+    procedure DoRun ; Override;
+    procedure doTestRun(aTest: TTest); virtual;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+  end;
+  
+  
+constructor TTestRunner.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FXMLResultsWriter := TXMLResultsWriter.Create;
+end;
+
+destructor TTestRunner.Destroy;
+begin
+  FXMLResultsWriter.Free;
+end;
+
+procedure TTestRunner.doTestRun(aTest: TTest);
+var
+  testResult: TTestResult;
+begin
+  testResult := TTestResult.Create;
+  try
+    testResult.AddListener(FXMLResultsWriter); 
+    FXMLResultsWriter.WriteHeader;   
+    aTest.Run(testResult);
+    FXMLResultsWriter.WriteResult(testResult);
+  finally  
+    testResult.Free;
+  end;    
+end;
+  
+procedure TTestRunner.DoRun;
+var
+  I : Integer;
+  S : String;
+begin
+  S:=CheckOptions(ShortOpts,LongOpts);
+  If (S<>'') then
+    Writeln(S);
+  if HasOption('h', 'help') or (ParamCount = 0) then
+  begin
+    writeln(Title);
+    writeln(Version);
+    writeln('Usage: ');
+    writeln('-l or --list to show a list of registered tests');
+    writeln('default format is xml, add --format=latex to output the list as latex source');
+    writeln('-a or --all to run all the tests and show the results in xml format');
+    writeln('The results can be redirected to an xml file,');
+    writeln('for example: ./testrunner --all > results.xml');
+    writeln('use --suite=MyTestSuiteName to run only the tests in a single test suite class');
+  end 
+  else;
+    if HasOption('l', 'list') then
+    begin
+      if HasOption('format') then
+      begin
+        if GetOptionValue('format') = 'latex' then
+          writeln(GetSuiteAsLatex(GetTestRegistry))
+        else
+          writeln(GetSuiteAsXML(GetTestRegistry));
+      end
+      else
+        writeln(GetSuiteAsXML(GetTestRegistry));   
+    end;
+  if HasOption('a', 'all') then
+  begin
+    doTestRun(GetTestRegistry)
+  end
+  else
+    if HasOption('suite') then
+    begin
+      S := '';
+      S:=GetOptionValue('suite');
+      if S = '' then
+        for I := 0 to GetTestRegistry.Tests.count - 1 do
+          writeln(GetTestRegistry[i].TestName)
+      else
+      for I := 0 to GetTestRegistry.Tests.count - 1 do
+        if GetTestRegistry[i].TestName = S then
+        begin    
+          doTestRun(GetTestRegistry[i]);   
+        end;      
+    end;  
+  Terminate;
+end;
+
+
+Var
+  App : TTestRunner;
+ 
+begin
+  RegisterUnitTests;
+  App:=TTestRunner.Create(Nil);
+  App.Initialize;
+  App.Title := 'FPCUnit Console Test Case runner.';
+  App.Run;
+  App.Free;
+end.

+ 14 - 0
fcl/fpcunit/demo/lazarusguiunner/guirunner.lpr

@@ -0,0 +1,14 @@
+program guirunner;
+
+{$mode objfpc}{$H+}
+
+uses
+  Interfaces,
+  Forms, main;
+
+begin
+  Application.Initialize;
+  Application.CreateForm(TGuiTestRunner, GuiTestRunner);
+  Application.Run;
+end.
+

+ 2165 - 0
fcl/fpcunit/demo/lazarusguiunner/main.lfm

@@ -0,0 +1,2165 @@
+object GUITestRunner: TGUITestRunner
+  Caption = 'fpcUnit - run unit tests'
+  ClientHeight = 768
+  ClientWidth = 646
+  Icon.Data = {
+    C50100002F2A2058504D202A2F0A7374617469632063686172202A2062746E5F
+    72756E5F78706D5B5D203D207B0A22313620313420382031222C0A2220096320
+    4E6F6E65222C0A222E09632023424130453738222C0A222B0963202331343636
+    3030222C0A224009632023463937324341222C0A222309632023323642323030
+    222C0A222409632023463930394135222C0A222509632023303030303030222C
+    0A222609632023323735393139222C0A222E2E2020202020202B202020202020
+    20222C0A222E402E20202020202B2B202020202020222C0A222E40402E202020
+    202B232B2020202020222C0A222E4040402E2020202B23232B20202020222C0A
+    222E404040402E20202B2323232B202020222C0A222E40404040402E202B2323
+    23232B2020222C0A222E4040404040402E2B23232323232B20222C0A222E4040
+    40404024252B23232323232B2B222C0A222E404040402425202B232323232625
+    20222C0A222E404040242520202B23232326252020222C0A222E404024252020
+    202B23232625202020222C0A222E402425202020202B23262520202020222C0A
+    222E242520202020202B26252020202020222C0A222525202020202020252520
+    2020202020227D3B0A
+  }
+  OnCreate = GUITestRunnerCreate
+  OnDestroy = GUITestRunnerDestroy
+  PixelsPerInch = 95
+  HorzScrollBar.Page = 647
+  VertScrollBar.Page = 769
+  Left = 372
+  Height = 768
+  Top = 142
+  Width = 646
+  object Panel1: TPanel
+    Align = alTop
+    ClientHeight = 82
+    ClientWidth = 646
+    FullRepaint = False
+    TabOrder = 0
+    TabStop = True
+    Height = 82
+    Width = 646
+    object btnRun: TBitBtn
+      Caption = '&Run'
+      Glyph.Data = {
+        191C00002F2A2058504D202A2F0A7374617469632063686172202A2062746E5F
+        72756E33325F78706D5B5D203D207B0A223332203238203332372032222C0A22
+        20200963204E6F6E65222C0A222E2009632023424130453738222C0A222B2009
+        632023313436363030222C0A22402009632023434132373843222C0A22232009
+        632023444134304131222C0A22242009632023434532453932222C0A22252009
+        632023463837314339222C0A22262009632023433231423833222C0A222A2009
+        632023444234324133222C0A223D2009632023463937324341222C0A222D2009
+        632023463036344246222C0A223B2009632023433431453835222C0A223E2009
+        632023313837393030222C0A222C2009632023314438433030222C0A22272009
+        632023314137463030222C0A22292009632023424230463739222C0A22212009
+        632023453034414139222C0A227E2009632023454636344245222C0A227B2009
+        632023433131463833222C0A225D2009632023414530453731222C0A225E2009
+        632023323642323030222C0A222F2009632023424431333743222C0A22282009
+        632023453635344231222C0A225F2009632023463937314341222C0A223A2009
+        632023463737304338222C0A223C2009632023454636324244222C0A225B2009
+        632023433031463833222C0A227D2009632023414430453730222C0A227C2009
+        632023323239463030222C0A22312009632023433131393831222C0A22322009
+        632023453935384234222C0A22332009632023463737314339222C0A22342009
+        632023463837374342222C0A22352009632023463737324338222C0A22362009
+        632023454536324243222C0A22372009632023323742323030222C0A22382009
+        632023433532303836222C0A22392009632023453835374234222C0A22302009
+        632023463637374341222C0A22612009632023463739324431222C0A22622009
+        632023463738304343222C0A22632009632023463737454344222C0A22642009
+        632023463736464338222C0A22652009632023443933464130222C0A22662009
+        632023414330463730222C0A22672009632023333342383035222C0A22682009
+        632023333142363031222C0A22692009632023323842333031222C0A226A2009
+        632023433832353841222C0A226B2009632023453735364233222C0A226C2009
+        632023463637374339222C0A226D2009632023463639304431222C0A226E2009
+        632023463639374434222C0A226F2009632023463638384345222C0A22702009
+        632023463737384341222C0A22712009632023463436444336222C0A22722009
+        632023454335464239222C0A22732009632023443833453946222C0A22742009
+        632023424332303831222C0A22752009632023413230463641222C0A22762009
+        632023314638443030222C0A22772009632023344143303037222C0A22782009
+        632023353243333042222C0A22792009632023334142423037222C0A227A2009
+        632023324242343032222C0A22412009632023433932363842222C0A22422009
+        632023453635354232222C0A22432009632023463637304337222C0A22442009
+        632023463638394345222C0A22452009632023463639364433222C0A22462009
+        632023463639314431222C0A22472009632023463738304344222C0A22482009
+        632023463436454335222C0A22492009632023463236374330222C0A224A2009
+        632023453735384233222C0A224B2009632023443533443944222C0A224C2009
+        632023423132323743222C0A224D2009632023383831303541222C0A224E2009
+        632023313235433030222C0A224F2009632023313436373030222C0A22502009
+        632023324139313030222C0A22512009632023363443343034222C0A22522009
+        632023363443373042222C0A22532009632023344643343045222C0A22542009
+        632023334242433038222C0A22552009632023324242343031222C0A22562009
+        632023323441303031222C0A22572009632023323439313032222C0A22582009
+        632023314237463030222C0A22592009632023424231303741222C0A225A2009
+        632023424331313742222C0A22602009632023463436444334222C0A22202E09
+        632023463538354342222C0A222E2E09632023463639384434222C0A222B2E09
+        632023463741314438222C0A22402E09632023463538384346222C0A22232E09
+        632023463437344338222C0A22242E09632023463336434334222C0A22252E09
+        632023463136364246222C0A22262E09632023453735394234222C0A222A2E09
+        632023443133433941222C0A223D2E09632023414531463737222C0A222D2E09
+        632023384431333545222C0A223B2E09632023314535333039222C0A223E2E09
+        632023313636383030222C0A222C2E09632023323038443030222C0A22272E09
+        632023364143363035222C0A22292E09632023373943423039222C0A22212E09
+        632023373243433043222C0A227E2E09632023354243353039222C0A227B2E09
+        632023343242443037222C0A225D2E09632023334342443039222C0A225E2E09
+        632023324442353033222C0A222F2E09632023314538433030222C0A22282E09
+        632023454636374246222C0A225F2E09632023463438314342222C0A223A2E09
+        632023463639394435222C0A223C2E09632023463539374434222C0A225B2E09
+        632023463741354439222C0A227D2E09632023463538454346222C0A227C2E09
+        632023463437444338222C0A22312E09632023463436444335222C0A22322E09
+        632023463036364245222C0A22332E09632023453335324145222C0A22342E09
+        632023434633423939222C0A22352E09632023423432393745222C0A22362E09
+        632023384132323541222C0A22372E09632023343634323235222C0A22382E09
+        632023314336373034222C0A22392E09632023353642463034222C0A22302E09
+        632023364243393042222C0A22612E09632023374143453042222C0A22622E09
+        632023374643453041222C0A22632E09632023353043343043222C0A22642E09
+        632023343843303041222C0A22652E09632023333542383033222C0A22662E09
+        632023324241343033222C0A22672E09632023424331323742222C0A22682E09
+        632023443733443945222C0A22692E09632023454536354245222C0A226A2E09
+        632023463437454341222C0A226B2E09632023463438444345222C0A226C2E09
+        632023463638464431222C0A226D2E09632023463741444443222C0A226E2E09
+        632023463541314435222C0A226F2E09632023463539314346222C0A22702E09
+        632023463437354338222C0A22712E09632023463336384333222C0A22722E09
+        632023454435444242222C0A22732E09632023444634434141222C0A22742E09
+        632023433133323842222C0A22752E09632023393232313630222C0A22762E09
+        632023353833413332222C0A22772E09632023323036343037222C0A22782E09
+        632023314438423030222C0A22792E09632023343942423033222C0A227A2E09
+        632023353343323038222C0A22412E09632023374643443041222C0A22422E09
+        632023373843423038222C0A22432E09632023363143373039222C0A22442E09
+        632023353643373046222C0A22452E09632023334542423037222C0A22462E09
+        632023333742413036222C0A22472E09632023333142373034222C0A22482E09
+        632023443633433944222C0A22492E09632023454536334244222C0A224A2E09
+        632023463437394338222C0A224B2E09632023463637354338222C0A224C2E09
+        632023463639464437222C0A224D2E09632023463542334444222C0A224E2E09
+        632023463541334438222C0A224F2E09632023463438364345222C0A22502E09
+        632023463436384332222C0A22512E09632023454535314237222C0A22522E09
+        632023443833384130222C0A22532E09632023413432323734222C0A22542E09
+        632023363531413431222C0A22552E09632023333833363145222C0A22562E09
+        632023314236333034222C0A22572E09632023334142353031222C0A22582E09
+        632023343342443037222C0A22592E09632023364643413042222C0A225A2E09
+        632023363743393043222C0A22602E09632023364443423043222C0A22202B09
+        632023373543433042222C0A222E2B09632023354443353039222C0A222B2B09
+        632023333442383035222C0A22402B09632023424531353745222C0A22232B09
+        632023454536314243222C0A22242B09632023463436464336222C0A22252B09
+        632023463538304342222C0A22262B09632023463641324439222C0A222A2B09
+        632023463741464443222C0A223D2B09632023463641374441222C0A222D2B09
+        632023463639444435222C0A223B2B09632023463437364337222C0A223E2B09
+        632023454435384241222C0A222C2B09632023444533394135222C0A22272B09
+        632023424631433835222C0A22292B09632023373730453532222C0A22212B09
+        632023324531333143222C0A227E2B09632023313633353037222C0A227B2B09
+        632023313636333030222C0A225D2B09632023323441443030222C0A225E2B09
+        632023343743303039222C0A222F2B09632023363943393042222C0A22282B09
+        632023364243423042222C0A225F2B09632023363643373041222C0A223A2B09
+        632023363143353038222C0A223C2B09632023343942443036222C0A225B2B09
+        632023324342353032222C0A227D2B09632023424631363746222C0A227C2B09
+        632023463536454336222C0A22312B09632023463638304343222C0A22322B09
+        632023463739354434222C0A22332B09632023463641334439222C0A22342B09
+        632023463538464431222C0A22352B09632023463035324238222C0A22362B09
+        632023423232313830222C0A22372B09632023374230423533222C0A22382B09
+        632023343830353246222C0A22392B09632023313631323043222C0A22302B09
+        632023304433443030222C0A22612B09632023314338423030222C0A22622B09
+        632023324542363033222C0A22632B09632023343442453038222C0A22642B09
+        632023353943353042222C0A22652B09632023363043353039222C0A22662B09
+        632023354143373045222C0A22672B09632023343643303042222C0A22682B09
+        632023323739433036222C0A22692B09632023323638363043222C0A226A2B09
+        632023313835433036222C0A226B2B09632023304133333030222C0A226C2B09
+        632023304434343030222C0A226D2B09632023443733433945222C0A226E2B09
+        632023463537324337222C0A226F2B09632023463638364346222C0A22702B09
+        632023463739454438222C0A22712B09632023463538424346222C0A22722B09
+        632023463436374333222C0A22732B09632023433031423837222C0A22742B09
+        632023374330423533222C0A22752B09632023333630343234222C0A22762B09
+        632023313430333043222C0A22772B09632023304534443030222C0A22782B09
+        632023313436383030222C0A22792B09632023323641443030222C0A227A2B09
+        632023333042363033222C0A22412B09632023334342433038222C0A22422B09
+        632023334442443039222C0A22432B09632023343042433036222C0A22442B09
+        632023323735393139222C0A22452B09632023313432433043222C0A22462B09
+        632023303030303030222C0A22472B09632023463537394339222C0A22482B09
+        632023463638464432222C0A22492B09632023463539334433222C0A224A2B09
+        632023463436424335222C0A224B2B09632023343830323330222C0A224C2B09
+        632023313630303045222C0A224D2B09632023304534463030222C0A224E2B09
+        632023313436413030222C0A224F2B09632023323441433030222C0A22502B09
+        632023323942333031222C0A22512B09632023333842423037222C0A22522B09
+        632023334342423037222C0A22532B09632023334242413034222C0A22542B09
+        632023323839443036222C0A22552B09632023314435393043222C0A22562B09
+        632023304431453038222C0A22572B09632023424531343744222C0A22582B09
+        632023443733433944222C0A22592B09632023463538304343222C0A225A2B09
+        632023463436434335222C0A22602B09632023333630333234222C0A22204009
+        632023323541433030222C0A222E4009632023333042373034222C0A222B4009
+        632023454636354244222C0A22404009632023463437464343222C0A22234009
+        632023323941453032222C0A22244009632023324642363033222C0A22254009
+        632023323639433036222C0A22264009632023463036354245222C0A222A4009
+        632023463436394333222C0A223D4009632023323641443031222C0A222D4009
+        632023324642353033222C0A223B4009632023424130463739222C0A223E4009
+        632023454635454242222C0A222C4009632023463235334241222C0A22274009
+        632023453333414138222C0A22294009632023423432313831222C0A22214009
+        632023374330413533222C0A227E4009632023313330303043222C0A227B4009
+        632023323441413030222C0A225D4009632023323639423036222C0A225E4009
+        632023444133443946222C0A222F4009632023454235364236222C0A22284009
+        632023453333414139222C0A225F4009632023433631413842222C0A223A4009
+        632023333130323231222C0A223C4009632023313436393030222C0A225B4009
+        632023314338383030222C0A227D4009632023323541383031222C0A227C4009
+        632023323638353043222C0A22314009632023444132363938222C0A22324009
+        632023454133364142222C0A22334009632023423731463831222C0A22344009
+        632023374230413533222C0A22354009632023343730323330222C0A22364009
+        632023314337343036222C0A22374009632023323538333043222C0A22384009
+        632023444130433845222C0A22394009632023463130394131222C0A22304009
+        632023374330363534222C0A22614009632023323930323142222C0A22624009
+        632023313230303042222C0A22634009632023304434433030222C0A22644009
+        632023313235463030222C0A22654009632023314435463043222C0A22664009
+        632023354430373343222C0A22674009632023364430363437222C0A22684009
+        632023374330343532222C0A22694009632023353230333336222C0A226A4009
+        632023303630303034222C0A226B4009632023303832453030222C0A226C4009
+        632023304633303036222C0A222E202020202020202020202020202020202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        20202020202020202020202020222C0A222E202E202E202E202E202020202020
+        20202020202020202020202020202020202B202B202020202020202020202020
+        2020202020202020202020202020202020222C0A222E202E204020232024202E
+        2020202020202020202020202020202020202020202B202B202B202020202020
+        202020202020202020202020202020202020202020222C0A222E202E20232025
+        20232026202E202020202020202020202020202020202020202B202B202B202B
+        202B2020202020202020202020202020202020202020202020222C0A222E202E
+        202A203D202D2023203B202E20202020202020202020202020202020202B202B
+        203E202C2027202B202020202020202020202020202020202020202020222C0A
+        222E20292021203D203D207E2023207B205D2020202020202020202020202020
+        202B202B202C205E202C202B202B202020202020202020202020202020202020
+        20222C0A222E202F2028205F2025203A203C2023205B207D2020202020202020
+        20202020202B202B202C205E207C202C2027202B202020202020202020202020
+        2020202020222C0A222E20312032203320342033203520362023205B207D2020
+        2020202020202020202B202B202C205E2037205E202C202B202B202020202020
+        202020202020202020222C0A222E2038203920302061206220632064203C2065
+        205B20662020202020202020202B202B202C206720682069207C202C2027202B
+        20202020202020202020202020222C0A222E206A206B206C206D206E206F2070
+        20712072207320742075202020202020202B202B2076207720782079207A205E
+        202C202B202B2020202020202020202020222C0A222920412042204320442045
+        2046204720482049204A204B204C204D20202020204E204F2050205120522053
+        20542055205620572058202B202020202020202020222C0A2259205A20232060
+        20202E2E2E2B2E402E232E242E252E262E2A2E3D2E2D2E20203B2E3E2E2C2E27
+        2E292E212E7E2E7B2E5D2E5E2E2F2E2B202B20202020202020222C0A225A205A
+        206520282E5F2E3A2E3C2E5B2E7D2E7C2E312E322E332E342E352E362E372E38
+        2E2C20392E302E612E622E632E642E652E662E2C2027202B2020202020222C0A
+        225A20672E682E692E6A2E6B2E6C2E6D2E6E2E6F2E702E712E722E732E742E75
+        2E762E772E782E792E7A2E412E422E432E442E452E462E472E2C202B20202020
+        20222C0A225A202F20482E492E4A2E4B2E2E2E4C2E4D2E4E2E4F2E502E512E52
+        2E532E542E552E562E782E572E582E592E5A2E602E202B2E2B54202B2B2C202B
+        202B202020222C0A225A20402B482E232B242B252B262B2A2B3D2B2D2B3B2B3E
+        2B2C2B272B292B212B7E2B7B2B782E5D2B5E2B2F2B282B5F2B3A2B3C2B5B2B37
+        202C202B202B202B20222C0A2259207D2B482E232B7C2B312B322B332B342B23
+        2E352B2C2B362B372B382B392B302B2B20612B5D2B622B632B642B652B662B67
+        2B682B692B6A2B6B2B6C2B2B20222C0A2229207D2B6D2B232B6E2B6F2B702B71
+        2B722B3E2B2C2B732B742B752B762B2020772B782B612B792B7A2B412B422B2F
+        2B432B3720692B442B452B462B462B2020222C0A222E207D2B6D2B232B472B48
+        2B492B4A2B352B2C2B362B742B4B2B4C2B202020204D2B4E2B612B4F2B502B51
+        2B522B532B542B692B552B452B562B462B20202020222C0A222E20572B582B36
+        20592B6C2E5A2B3E2B2C2B732B742B602B4C2B2020202020204D2B4E2B612B20
+        402E40472E502B5E20692B442B452B462B462B202020202020222C0A222E202F
+        20682E2B4040404820352B2C2B362B742B4B2B4C2B20202020202020204D2B4E
+        2B612B2340622B24402540692B552B452B562B462B2020202020202020222C0A
+        222E205A20682E26402A403E2B2C2B732B742B602B4C2B202020202020202020
+        204D2B4E2B612B3D402D403720692B442B452B462B462B202020202020202020
+        20222C0A222E203B40682E3E402C402740294021404B2B7E4020202020202020
+        20202020204D2B4E2B612B7B405D40692B552B452B562B462B20202020202020
+        2020202020222C0A222E202E205E402F4028405F4021403A407E402020202020
+        2020202020202020204D2B3C405B407D407C40442B452B462B462B2020202020
+        202020202020202020222C0A222E202E20314032403340344035407E40202020
+        202020202020202020202020204D2B4F2036403740552B452B562B462B202020
+        20202020202020202020202020222C0A222E202E203840394030406140624020
+        2020202020202020202020202020202020634064406540442B452B462B462B20
+        2020202020202020202020202020202020222C0A22664066406740684069406A
+        4020202020202020202020202020202020202020206B406B2B6C40452B562B20
+        202020202020202020202020202020202020202020222C0A22462B462B462B20
+        20462B20202020202020202020202020202020202020202020462B2020462B20
+        20202020202020202020202020202020202020202020202020227D3B0A
+      }
+      OnClick = btnRunClick
+      TabOrder = 0
+      Left = 16
+      Height = 47
+      Top = 16
+      Width = 103
+    end
+    object BitBtn1: TBitBtn
+      Caption = '&Exit'
+      Glyph.Data = {
+        B42500002F2A2058504D202A2F0A7374617469632063686172202A2065786974
+        5F78706D5B5D203D207B0A223332203332203436342032222C0A222020096320
+        4E6F6E65222C0A222E2009632023394530303030222C0A222B20096320233943
+        30303030222C0A22402009632023394230303030222C0A222320096320233939
+        30303030222C0A22242009632023393630303030222C0A222520096320233934
+        30303030222C0A22262009632023413430303030222C0A222A20096320234133
+        30303030222C0A223D2009632023423331393135222C0A222D20096320234339
+        34443437222C0A223B2009632023443636463639222C0A223E20096320234444
+        37433736222C0A222C2009632023444237383733222C0A222720096320234434
+        36363630222C0A22292009632023433334363431222C0A222120096320234139
+        31433139222C0A227E2009632023393130303030222C0A227B20096320233843
+        30303030222C0A225D2009632023413530303030222C0A225E20096320234331
+        33373331222C0A222F2009632023453539413934222C0A222820096320234643
+        44464441222C0A225F2009632023464646344632222C0A223A20096320234646
+        46434642222C0A223C2009632023464646414641222C0A225B20096320234646
+        45454546222C0A227D2009632023464644444444222C0A227C20096320234646
+        43334332222C0A22312009632023464341394135222C0A223220096320234532
+        37353730222C0A22332009632023423433313243222C0A223420096320233841
+        30313030222C0A22352009632023414530423038222C0A223620096320234446
+        38333742222C0A22372009632023464645454541222C0A223820096320234646
+        46464646222C0A22392009632023464646384638222C0A223020096320234533
+        43334334222C0A22612009632023423037333733222C0A226220096320234144
+        36433643222C0A22632009632023443939453945222C0A226420096320234643
+        43324332222C0A22652009632023463842324232222C0A226620096320234644
+        41424143222C0A22672009632023464639393935222C0A226820096320234439
+        35433535222C0A22692009632023393431303044222C0A226A20096320233831
+        30303030222C0A226B2009632023413630303030222C0A226C20096320234232
+        30463044222C0A226D2009632023454341424135222C0A226E20096320234646
+        46434643222C0A226F2009632023464546324632222C0A227020096320234642
+        45384538222C0A22712009632023414136423642222C0A227220096320234330
+        39443944222C0A22732009632023433941444144222C0A227420096320234131
+        35383538222C0A22752009632023454641374137222C0A227620096320234634
+        41394138222C0A22772009632023463239433943222C0A227820096320234635
+        39323932222C0A22792009632023464638433842222C0A227A20096320234539
+        36343630222C0A22412009632023393631353132222C0A224220096320233743
+        30303030222C0A22432009632023414430443041222C0A224420096320234544
+        41444136222C0A22452009632023464646354635222C0A224620096320234644
+        45384538222C0A22472009632023463644354435222C0A224820096320234234
+        37343734222C0A22492009632023463946354635222C0A224A20096320234146
+        36433643222C0A224B2009632023453539303930222C0A224C20096320234635
+        39463946222C0A224D2009632023463339333933222C0A224E20096320234545
+        38373837222C0A224F2009632023454637423743222C0A225020096320234645
+        37343734222C0A22512009632023454135383533222C0A225220096320233844
+        30453043222C0A22532009632023374230303030222C0A225420096320234446
+        38323742222C0A22552009632023464646444644222C0A225620096320234634
+        44454445222C0A22572009632023464345304530222C0A225820096320234637
+        43434343222C0A22592009632023423737303730222C0A225A20096320234635
+        45454545222C0A22602009632023423336383638222C0A22202E096320234536
+        38383838222C0A222E2E09632023463539373937222C0A222B2E096320234541
+        37423742222C0A22402E09632023463237453745222C0A22232E096320234543
+        37333733222C0A22242E09632023454336353635222C0A22252E096320234646
+        36303546222C0A22262E09632023443633453342222C0A222A2E096320233741
+        30333032222C0A223D2E09632023433233373331222C0A222D2E096320234645
+        46304545222C0A223B2E09632023434439323932222C0A223E2E096320234144
+        35433543222C0A222C2E09632023433737443744222C0A22272E096320234638
+        43364336222C0A22292E09632023424336453645222C0A22212E096320234636
+        45464546222C0A227E2E09632023423736373637222C0A227B2E096320234541
+        38333833222C0A225D2E09632023433935413541222C0A225E2E096320234141
+        34453445222C0A222F2E09632023424434303430222C0A22282E096320234545
+        36363636222C0A225F2E09632023454135443544222C0A223A2E096320234545
+        35303530222C0A223C2E09632023464634423439222C0A225B2E096320234139
+        31463143222C0A227D2E09632023373230303030222C0A227C2E096320234536
+        39373930222C0A22312E09632023464646424642222C0A22322E096320234344
+        38443844222C0A22332E09632023424237313731222C0A22342E096320234630
+        45334533222C0A22352E09632023424637413741222C0A22362E096320234436
+        38323832222C0A22372E09632023433337323732222C0A22382E096320234635
+        46304630222C0A22392E09632023464446464646222C0A22302E096320234245
+        36393639222C0A22612E09632023443335363536222C0A22622E096320234241
+        36373637222C0A22632E09632023463245434543222C0A22642E096320234334
+        38453845222C0A22652E09632023424132413241222C0A22662E096320234544
+        35343534222C0A22672E09632023453534363436222C0A22682E096320234639
+        33423343222C0A22692E09632023444433323246222C0A226A2E096320233735
+        30323032222C0A226B2E09632023423331413136222C0A226C2E096320234643
+        41393938222C0A226D2E09632023464545464544222C0A226E2E096320234536
+        42384238222C0A226F2E09632023423835463546222C0A22702E096320234641
+        46374637222C0A22712E09632023443541364136222C0A22722E096320234245
+        34443444222C0A22732E09632023433837313731222C0A22742E096320234634
+        45464546222C0A22752E09632023464346464646222C0A22762E096320234334
+        36393639222C0A22772E09632023424233303330222C0A22782E096320234343
+        39373937222C0A22792E09632023464546464646222C0A227A2E096320234245
+        37313731222C0A22412E09632023434332343234222C0A22422E096320234541
+        34303430222C0A22432E09632023453933313331222C0A22442E096320234537
+        34303339222C0A22452E09632023393031343132222C0A22462E096320233946
+        30303030222C0A22472E09632023433934413432222C0A22482E096320234646
+        39363745222C0A22492E09632023463637373544222C0A224A2E096320234644
+        45424541222C0A224B2E09632023433336383639222C0A224C2E096320234535
+        43364336222C0A224D2E09632023453943464346222C0A224E2E096320234241
+        34433443222C0A224F2E09632023453638413841222C0A22502E096320234339
+        36413641222C0A22512E09632023463346314631222C0A22522E096320234642
+        46464646222C0A22532E09632023433536353635222C0A22542E096320234446
+        35353535222C0A22552E09632023424133363336222C0A22562E096320234532
+        43314331222C0A22572E09632023454645374537222C0A22582E096320234242
+        33313332222C0A22592E09632023453532393239222C0A225A2E096320234342
+        31433134222C0A22602E09632023443733383245222C0A22202B096320234141
+        32313145222C0A222E2B09632023364130303030222C0A222B2B096320233944
+        30303030222C0A22402B09632023443736313537222C0A22232B096320234645
+        38383644222C0A22242B09632023454531453030222C0A22252B096320234533
+        35333432222C0A22262B09632023434237423744222C0A222A2B096320234639
+        46424642222C0A223D2B09632023463846384638222C0A222D2B096320234334
+        35463546222C0A223B2B09632023453338323832222C0A223E2B096320234636
+        39453945222C0A222C2B09632023433936313631222C0A22272B096320234641
+        46464646222C0A22292B09632023433736313631222C0A22212B096320234536
+        35383538222C0A227E2B09632023453334413441222C0A227B2B096320234245
+        34303430222C0A225D2B09632023463446304630222C0A225E2B096320234346
+        38303831222C0A222F2B09632023424430363032222C0A22282B096320234233
+        30423030222C0A225F2B09632023443032413230222C0A223A2B096320234238
+        32373233222C0A223C2B09632023363930303030222C0A225B2B096320234443
+        36413545222C0A227D2B09632023464237413545222C0A227C2B096320234542
+        32333030222C0A22312B09632023434630373030222C0A22322B096320234437
+        39363938222C0A22332B09632023453342434243222C0A22342B096320234343
+        35323532222C0A22352B09632023463841364136222C0A22362B096320234545
+        38363836222C0A22372B09632023434435463546222C0A22382B096320234638
+        46464646222C0A22392B09632023434236303630222C0A22302B096320234531
+        34383438222C0A22612B09632023454435353535222C0A22622B096320234341
+        32313231222C0A22632B09632023444341384138222C0A22642B096320234530
+        42324232222C0A22652B09632023414230343033222C0A22662B096320234230
+        30383030222C0A22672B09632023434232333141222C0A22682B096320234244
+        32373232222C0A22692B09632023394130303030222C0A226A2B096320234442
+        36363543222C0A226B2B09632023463837363542222C0A226C2B096320234539
+        32303030222C0A226D2B09632023434431303033222C0A226E2B096320234530
+        42314233222C0A226F2B09632023443939343934222C0A22702B096320234442
+        36323632222C0A22712B09632023463639464131222C0A22722B096320234546
+        38313832222C0A22732B09632023443136303631222C0A22742B096320234637
+        46464646222C0A22752B09632023443036333633222C0A22762B096320234533
+        34303431222C0A22772B09632023454434433444222C0A22782B096320234436
+        32303146222C0A22792B09632023443438313831222C0A227A2B096320234541
+        43394339222C0A22412B09632023423030453044222C0A22422B096320234143
+        30353030222C0A22432B09632023433832303138222C0A22442B096320234243
+        32333146222C0A22452B09632023363830303030222C0A22462B096320233937
+        30303030222C0A22472B09632023443335413531222C0A22482B096320234637
+        37393631222C0A22492B09632023453632303030222C0A224A2B096320234346
+        31303033222C0A224B2B09632023453342334235222C0A224C2B096320234444
+        39353935222C0A224D2B09632023434432313138222C0A224E2B096320234533
+        35353437222C0A224F2B09632023453736333544222C0A22502B096320234430
+        34333431222C0A22512B09632023444338433845222C0A22522B096320234530
+        39373939222C0A22532B09632023434333423341222C0A22542B096320234444
+        33353330222C0A22552B09632023443432423232222C0A22562B096320234246
+        30373036222C0A22572B09632023443837463745222C0A22582B096320234639
+        46464646222C0A22592B09632023454343414342222C0A225A2B096320234233
+        30463045222C0A22602B09632023413830343030222C0A222040096320234341
+        31463138222C0A222E4009632023423431443142222C0A222B40096320233634
+        30303030222C0A22404009632023433334333343222C0A222340096320234638
+        38373732222C0A22244009632023453332413039222C0A222540096320234430
+        30393030222C0A22264009632023453139443945222C0A222A40096320234635
+        46464646222C0A223D4009632023453842424242222C0A222D40096320234336
+        30363030222C0A223B4009632023434531323030222C0A223E40096320234343
+        31393032222C0A222C4009632023433931373033222C0A222740096320234246
+        30333030222C0A22294009632023424430323030222C0A222140096320234331
+        30463030222C0A227E4009632023433031333031222C0A227B40096320234238
+        30443030222C0A225D4009632023423530303030222C0A225E40096320234534
+        41304131222C0A222F4009632023453942364237222C0A222840096320234232
+        30363036222C0A225F4009632023413730353030222C0A223A40096320234430
+        32313143222C0A223C4009632023413431353133222C0A225B40096320233546
+        30303030222C0A227D4009632023413931453141222C0A227C40096320234635
+        38383738222C0A22314009632023453433453231222C0A223240096320234434
+        30363030222C0A22334009632023444637303646222C0A223440096320234632
+        46464646222C0A22354009632023463446344635222C0A223640096320234435
+        33463345222C0A22374009632023433830373030222C0A223840096320234341
+        31423030222C0A22394009632023433731373030222C0A223040096320234335
+        31363030222C0A22614009632023433331353030222C0A226240096320234330
+        31333030222C0A22634009632023424231323030222C0A226440096320234234
+        30333030222C0A22654009632023434132383236222C0A226640096320234633
+        45374537222C0A22674009632023463346464646222C0A226840096320234533
+        38393838222C0A22694009632023414130303030222C0A226A40096320234144
+        30423035222C0A226B4009632023443632343146222C0A226C40096320233838
+        30423041222C0A226D4009632023354530303030222C0A226E40096320234444
+        36393545222C0A226F4009632023454436313441222C0A227040096320234435
+        31323030222C0A22714009632023443632333230222C0A227240096320234632
+        45324533222C0A22734009632023454546454644222C0A227440096320234630
+        43324333222C0A22754009632023434531313130222C0A227640096320234334
+        30383030222C0A22774009632023433231363030222C0A227840096320234246
+        31363030222C0A22794009632023424431343030222C0A227A40096320234241
+        31323030222C0A22414009632023423430353030222C0A224240096320234333
+        30353036222C0A22434009632023454441434143222C0A224440096320234546
+        46464645222C0A22454009632023463546314631222C0A224640096320234346
+        33363336222C0A22474009632023413030303030222C0A224840096320234245
+        31353130222C0A22494009632023433531433139222C0A224A40096320233636
+        30313030222C0A224B4009632023423332453238222C0A224C40096320234635
+        37463730222C0A224D4009632023444333353141222C0A224E40096320234345
+        30303030222C0A224F4009632023453737303731222C0A225040096320234631
+        46464646222C0A22514009632023454446414641222C0A225240096320234631
+        42464330222C0A22534009632023444133373338222C0A225440096320234337
+        30303030222C0A22554009632023433030313030222C0A225640096320234245
+        30303030222C0A22574009632023433030303030222C0A225840096320234433
+        32413242222C0A22594009632023454641444145222C0A225A40096320234545
+        46394639222C0A22604009632023463046464646222C0A222023096320234545
+        38443845222C0A222E2309632023423030303030222C0A222B23096320234138
+        30393034222C0A22402309632023443531453141222C0A222323096320233937
+        30453043222C0A22242309632023354130303030222C0A222523096320233842
+        30313031222C0A22262309632023443335363444222C0A222A23096320234546
+        36413539222C0A223D2309632023434631443036222C0A222D23096320234431
+        30343031222C0A223B2309632023463239383941222C0A223E23096320234541
+        46444644222C0A222C2309632023463145394539222C0A222723096320234546
+        41364138222C0A22292309632023454137463831222C0A222123096320234541
+        37443746222C0A227E2309632023454641304132222C0A227B23096320234633
+        45324532222C0A225D2309632023454246444644222C0A225E23096320234545
+        46464646222C0A222F2309632023463842314231222C0A222823096320234334
+        30413041222C0A225F2309632023413030333031222C0A223A23096320234341
+        31393135222C0A223C2309632023424531373134222C0A225B23096320233634
+        30313031222C0A227D2309632023393531303045222C0A227C23096320234530
+        36323538222C0A22312309632023453735383437222C0A223223096320234339
+        31363035222C0A22332309632023443130343034222C0A223423096320234633
+        37383741222C0A22352309632023463545384538222C0A223623096320234542
+        46454645222C0A22372309632023453846464646222C0A223823096320234543
+        46464646222C0A22392309632023453946464646222C0A223023096320234541
+        46464646222C0A22612309632023463638443845222C0A226223096320234337
+        30453045222C0A22632309632023413030313030222C0A226423096320234333
+        31363132222C0A22652309632023434331413137222C0A226623096320233737
+        30343034222C0A22672309632023393731333132222C0A226823096320234446
+        35413531222C0A22692309632023453735363437222C0A226A23096320234338
+        31463046222C0A226B2309632023433630303030222C0A226C23096320234531
+        32383237222C0A226D2309632023463538303831222C0A226E23096320234637
+        42354235222C0A226F2309632023463543434344222C0A227023096320234636
+        43454345222C0A22712309632023463742384239222C0A227223096320234636
+        38413841222C0A22732309632023453033343333222C0A227423096320234237
+        30303030222C0A22752309632023413630363031222C0A227623096320234344
+        31413137222C0A22772309632023374430363035222C0A227823096320233539
+        30303030222C0A22792309632023374430303030222C0A227A23096320233845
+        30453044222C0A22412309632023434434353345222C0A224223096320234538
+        35363442222C0A22432309632023443333363238222C0A224423096320234330
+        31343038222C0A22452309632023433330303030222C0A224623096320234346
+        30303030222C0A22472309632023443430353032222C0A224823096320234433
+        30363033222C0A22492309632023434230303030222C0A224A23096320234241
+        30303030222C0A224B2309632023414430333030222C0A224C23096320234241
+        31343045222C0A224D2309632023373630353034222C0A224E23096320233538
+        30303030222C0A224F2309632023374330323032222C0A225023096320234135
+        32323145222C0A22512309632023443034303339222C0A225223096320234530
+        34363344222C0A22532309632023443833413246222C0A225423096320234343
+        32423231222C0A22552309632023433632323139222C0A225623096320234334
+        31453137222C0A22572309632023433532303139222C0A225823096320234342
+        32323144222C0A22592309632023443532343146222C0A225A23096320233737
+        30313031222C0A22602309632023393231343132222C0A222024096320233838
+        30423039222C0A222E2409632023363630313031222C0A222B24096320233642
+        30303030222C0A22402409632023363030303030222C0A222020202020202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        202020202020202020202020202020202020202020202020222C0A2220202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        20202020202020202020202020202020202020202020202020202020222C0A22
+        2020202020202020202020202020202020202020202020202020202020202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        222C0A2220202020202020202020202020202020202020202020202020202E20
+        2B20402023202420252020202020202020202020202020202020202020202020
+        20202020222C0A22202020202020202020202020202020202020202026202A20
+        3D202D203B203E202C202720292021207E207B20202020202020202020202020
+        2020202020202020222C0A222020202020202020202020202020202020205D20
+        5E202F2028205F203A203C205B207D207C203120322033203420202020202020
+        202020202020202020202020222C0A2220202020202020202020202020205D20
+        3520362037203820382039203020612062206320642065206620672068206920
+        6A202020202020202020202020202020222C0A22202020202020202020202020
+        6B206C206D20382038206E206F20702071207220732074207520762077207820
+        79207A2041204220202020202020202020202020222C0A222020202020202020
+        2020202043204420382038206E204520462047204820492038204A204B204C20
+        4D204E204F20502051205220532020202020202020202020222C0A2220202020
+        2020202020205D2054203820382055203C2056205720582059205A2038206020
+        202E2E2E2B2E402E232E242E252E262E2A2E20202020202020202020222C0A22
+        202020202020202026203D2E2D2E3820552055203B2E3E2E2C2E272E292E212E
+        38207E2E7B2E5D2E5E2E2F2E282E5F2E3A2E3C2E5B2E7D2E2020202020202020
+        222C0A2220202020202020202A207C2E3820312E3820322E332E342E352E362E
+        372E382E392E302E612E622E632E642E652E662E672E682E692E6A2E20202020
+        20202020222C0A2220202020202020206B2E6C2E6D2E38206E2E6F2E702E3820
+        712E722E732E742E752E762E772E782E3820792E7A2E412E422E432E442E452E
+        2020202020202020222C0A22202020202020462E472E482E492E4A2E4B2E4C2E
+        752E4D2E4E2E4F2E502E512E522E532E542E552E562E752E572E582E592E5A2E
+        602E202B2E2B202020202020222C0A222020202020202B2B402B232B242B252B
+        262B2A2B3D2B2D2B3B2B3E2B2C2B512E272B292B212B7E2B7B2B5D2B752E5E2B
+        2F2B282B5F2B3A2B3C2B202020202020222C0A222020202020202B205B2B7D2B
+        7C2B312B322B752E332B342B352B362B372B512E382B392B302B612B622B632B
+        752E642B652B662B672B682B2E2B202020202020222C0A22202020202020692B
+        6A2B6B2B6C2B6D2B6E2B272B6F2B702B712B722B732B742B522E752B762B772B
+        782B792B272B7A2B412B422B432B442B452B202020202020222C0A2220202020
+        2020462B472B482B492B4A2B4B2B382B4C2B4D2B4E2B4F2B502B512B522B532B
+        542B552B562B572B582B592B5A2B602B20402E402B40202020202020222C0A22
+        2020202020202520404023402440254026402A403D402D403B403E402C402740
+        294021407E407B405D405E402A402F4028405F403A403C405B40202020202020
+        222C0A2220202020202020207D407C4031403240334034403540364037403840
+        394030406140624063406440654066406740684069406A406B406C406D402020
+        20202020222C0A2220202020202020207E206E406F4070407140724073407440
+        754076407740784079407A404140424043404440454046404740484049404A40
+        2020202020202020222C0A2220202020202020207B204B404C404D404E404F40
+        50405140524053405440554056405740584059405A40604020232E232B234023
+        232324232020202020202020222C0A2220202020202020202020252326232A23
+        3D232D233B2360403E232C232723292321237E237B235D235E232F2328235F23
+        3A233C235B2320202020202020202020222C0A22202020202020202020202020
+        7D237C2331233223332334233523362337233823382339233023382E61236223
+        6323642365236623242320202020202020202020222C0A222020202020202020
+        202020206A206723682369236A236B236C236D236E236F237023712372237323
+        742375233A23762377237823202020202020202020202020222C0A2220202020
+        2020202020202020202079237A23412342234323442345234623472348234923
+        4A234B234C2340233C234D234E232020202020202020202020202020222C0A22
+        2020202020202020202020202020202053204F23502351235223532354235523
+        5623572358235923494023235B23242320202020202020202020202020202020
+        222C0A2220202020202020202020202020202020202020207D2E5A236023202B
+        3A2B682B442B2E403C4020242E24242320202020202020202020202020202020
+        20202020222C0A22202020202020202020202020202020202020202020202020
+        20202E2B2E2B2B243C2B2B4040246D4020202020202020202020202020202020
+        2020202020202020222C0A222020202020202020202020202020202020202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        202020202020202020202020222C0A2220202020202020202020202020202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        20202020202020202020202020202020222C0A22202020202020202020202020
+        2020202020202020202020202020202020202020202020202020202020202020
+        2020202020202020202020202020202020202020227D3B0A
+      }
+      OnClick = BitBtn1Click
+      TabOrder = 1
+      Left = 536
+      Height = 48
+      Top = 16
+      Width = 96
+    end
+    object ComboBox1: TComboBox
+      Items.Strings = (
+        'All'
+      )
+      MaxLength = 0
+      TabOrder = 2
+      Text = 'All'
+      Left = 160
+      Height = 24
+      Top = 32
+      Width = 276
+    end
+    object Label1: TLabel
+      Caption = 'Selected Test Suite:'
+      Left = 160
+      Height = 17
+      Top = 16
+      Width = 176
+    end
+  end
+  object Panel2: TPanel
+    Align = alClient
+    Caption = 'Panel2'
+    ClientHeight = 686
+    ClientWidth = 646
+    FullRepaint = False
+    TabOrder = 1
+    TabStop = True
+    Height = 686
+    Top = 82
+    Width = 646
+    object PageControl1: TPageControl
+      ActivePage = tsTestTree
+      Align = alClient
+      TabIndex = 0
+      TabOrder = 0
+      Left = 1
+      Height = 684
+      Top = 1
+      Width = 644
+      object tsTestTree: TTabSheet
+        Caption = 'Testcase tree'
+        ClientHeight = 662
+        ClientWidth = 644
+        Height = 662
+        Top = 22
+        Width = 644
+        object TreeView1: TTreeView
+          Align = alTop
+          AutoExpand = True
+          BackgroundColor = clBtnFace
+          DefaultItemHeight = 17
+          Images = ImageList1
+          ParentCtl3D = False
+          ScrollBars = ssAutoBoth
+          TabOrder = 0
+          OnClick = TreeView1Click
+          Options = [tvoAutoExpand, tvoAutoItemHeight, tvoHideSelection, tvoKeepCollapsedNodes, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips]
+          Height = 480
+          Top = 63
+          Width = 644
+        end
+        object Panel4: TPanel
+          Align = alTop
+          ClientHeight = 63
+          ClientWidth = 644
+          FullRepaint = False
+          TabOrder = 1
+          Height = 63
+          Width = 644
+          object PaintBox1: TPaintBox
+            ParentColor = True
+            OnClick = PaintBox1Click
+            OnPaint = PaintBox1Paint
+            Left = 22
+            Height = 32
+            Top = 15
+            Width = 601
+          end
+        end
+        object Splitter1: TSplitter
+          Align = alTop
+          Cursor = crVSplit
+          Height = 10
+          MinSize = 400
+          ParentColor = True
+          Width = 644
+          Cursor = crVSplit
+          Height = 10
+          Top = 543
+          Width = 644
+        end
+        object Memo1: TMemo
+          Align = alClient
+          PopupMenu = PopupMenu2
+          TabOrder = 3
+          Height = 109
+          Top = 553
+          Width = 644
+        end
+      end
+      object tsResultsXML: TTabSheet
+        Caption = 'Results XML'
+        ClientHeight = 662
+        ClientWidth = 644
+        Height = 662
+        Top = 22
+        Width = 644
+        object Panel3: TPanel
+          Align = alClient
+          Caption = 'Panel3'
+          ClientHeight = 662
+          ClientWidth = 644
+          FullRepaint = False
+          TabOrder = 0
+          TabStop = True
+          Height = 662
+          Width = 644
+          object Panel5: TPanel
+            Align = alTop
+            BorderWidth = 1
+            ClientHeight = 42
+            ClientWidth = 642
+            FullRepaint = False
+            TabOrder = 0
+            Left = 1
+            Height = 42
+            Top = 1
+            Width = 642
+            object SpeedButton1: TSpeedButton
+              Action = actCopy
+              Flat = True
+              Glyph.Data = {
+                880D00002F2A2058504D202A2F0A7374617469632063686172202A2065646974
+                636F70795F78706D5B5D203D207B0A223136203136203137372032222C0A2220
+                200963204E6F6E65222C0A222E2009632023343036453941222C0A222B200963
+                2023373139384244222C0A22402009632023364339344241222C0A2223200963
+                2023364239344241222C0A22242009632023364239334241222C0A2225200963
+                2023364539364244222C0A22262009632023333236303846222C0A222A200963
+                2023423643444533222C0A223D2009632023464646464646222C0A222D200963
+                2023393242354431222C0A223B2009632023423243384530222C0A223E200963
+                2023464446454646222C0A222C2009632023464246434646222C0A2227200963
+                2023463746424646222C0A22292009632023463546414646222C0A2221200963
+                2023463146374646222C0A227E2009632023464246464646222C0A227B200963
+                2023384642334430222C0A225D2009632023414443354444222C0A225E200963
+                2023464446444645222C0A222F2009632023464446454645222C0A2228200963
+                2023464446464646222C0A225F2009632023463646424646222C0A223A200963
+                2023463346414646222C0A223C2009632023463046384646222C0A225B200963
+                2023454346354646222C0A227D2009632023463646464646222C0A227C200963
+                2023384442314346222C0A22312009632023323034383741222C0A2232200963
+                2023323334393743222C0A22332009632023364439314235222C0A2234200963
+                2023393541444334222C0A22352009632023384641384331222C0A2236200963
+                2023384441374331222C0A22372009632023383941324245222C0A2238200963
+                2023433944364532222C0A22392009632023464246454646222C0A2230200963
+                2023454446374646222C0A22612009632023454146344646222C0A2262200963
+                2023463346454646222C0A22632009632023374441374345222C0A2264200963
+                2023364138424145222C0A22652009632023453345444635222C0A2266200963
+                2023444645414632222C0A22672009632023443044434537222C0A2268200963
+                2023433844374534222C0A22692009632023434244394535222C0A226A200963
+                2023434444424537222C0A226B2009632023414142464433222C0A226C200963
+                2023383039454241222C0A226D2009632023463046344638222C0A226E200963
+                2023463046394646222C0A226F2009632023453746334646222C0A2270200963
+                2023463046434646222C0A22712009632023363939434342222C0A2272200963
+                2023383339464242222C0A22732009632023453145434633222C0A2274200963
+                2023383941364330222C0A22752009632023453945464634222C0A2276200963
+                2023454446384646222C0A22772009632023453446314646222C0A2278200963
+                2023454446414646222C0A22792009632023364239434342222C0A227A200963
+                2023374439414238222C0A22412009632023464246444646222C0A2242200963
+                2023463046374646222C0A22432009632023463346434646222C0A2244200963
+                2023443045334545222C0A22452009632023383341324245222C0A2246200963
+                2023453846314635222C0A22472009632023454146364646222C0A2248200963
+                2023453346314646222C0A22492009632023453046304646222C0A224A200963
+                2023453946394646222C0A224B2009632023463546424646222C0A224C200963
+                2023463146384646222C0A224D2009632023454346364646222C0A224E200963
+                2023463046414646222C0A224F2009632023433844454544222C0A2250200963
+                2023373739434244222C0A22512009632023453646304635222C0A2252200963
+                2023453846354646222C0A22532009632023453146304646222C0A2254200963
+                2023444545464646222C0A22552009632023453746384646222C0A2256200963
+                2023363839434342222C0A22572009632023463646414646222C0A2258200963
+                2023454446364646222C0A22592009632023453746344646222C0A225A200963
+                2023454346374646222C0A22602009632023433444434544222C0A22202E0963
+                2023373639424244222C0A222E2E09632023453346304635222C0A222B2E0963
+                2023453446334646222C0A22402E09632023444445464646222C0A22232E0963
+                2023444145444646222C0A22242E09632023453346364646222C0A22252E0963
+                2023363639424342222C0A22262E09632023463846424646222C0A222A2E0963
+                2023453846344646222C0A223D2E09632023453246314646222C0A222D2E0963
+                2023453746354646222C0A223B2E09632023433044414544222C0A223E2E0963
+                2023373439414244222C0A222C2E09632023444645454635222C0A22272E0963
+                2023453146324646222C0A22292E09632023443745424646222C0A22212E0963
+                2023453046344646222C0A227E2E09632023363539414342222C0A227B2E0963
+                2023374539424238222C0A225D2E09632023463246394646222C0A225E2E0963
+                2023453246334646222C0A222F2E09632023424344384544222C0A22282E0963
+                2023373239394244222C0A225F2E09632023444345434635222C0A223A2E0963
+                2023444446304646222C0A223C2E09632023443445394646222C0A225B2E0963
+                2023444346324646222C0A227D2E09632023363439414342222C0A227C2E0963
+                2023364539314234222C0A22312E09632023454646374646222C0A22322E0963
+                2023453346324646222C0A22332E09632023453045464646222C0A22342E0963
+                2023443945444646222C0A22352E09632023444446314646222C0A22362E0963
+                2023423844364544222C0A22372E09632023373039384244222C0A22382E0963
+                2023443945424635222C0A22392E09632023444145454646222C0A22302E0963
+                2023443345414646222C0A22612E09632023443145384646222C0A22622E0963
+                2023443946314646222C0A22632E09632023363339394342222C0A22642E0963
+                2023363638434232222C0A22652E09632023454446354646222C0A22662E0963
+                2023453646324646222C0A22672E09632023444445454646222C0A22682E0963
+                2023444145464646222C0A22692E09632023423544354544222C0A226A2E0963
+                2023443845414635222C0A226B2E09632023443945434646222C0A226C2E0963
+                2023443245384646222C0A226D2E09632023443045354646222C0A226E2E0963
+                2023443746304646222C0A226F2E09632023363239394343222C0A22702E0963
+                2023364239304235222C0A22712E09632023463546464646222C0A22722E0963
+                2023454546454646222C0A22732E09632023453946434646222C0A22742E0963
+                2023453546384646222C0A22752E09632023444646354646222C0A22762E0963
+                2023453246414646222C0A22772E09632023424144454633222C0A22782E0963
+                2023373339454333222C0A22792E09632023453046354642222C0A227A2E0963
+                2023453146374646222C0A22412E09632023444146334646222C0A22422E0963
+                2023443746314646222C0A22432E09632023444646414646222C0A22442E0963
+                2023363339444346222C0A22452E09632023323335353836222C0A22462E0963
+                2023363138434237222C0A22472E09632023354338384234222C0A22482E0963
+                2023353938364233222C0A22492E09632023353638354233222C0A224A2E0963
+                2023353538354233222C0A224B2E09632023353438344233222C0A224C2E0963
+                2023353638364235222C0A224D2E09632023343437374138222C0A224E2E0963
+                2023324236323939222C0A224F2E09632023353538444246222C0A22502E0963
+                2023353338434332222C0A22512E09632023353238424332222C0A22522E0963
+                2023353138434332222C0A22532E09632023353238464333222C0A22542E0963
+                2023314535383931222C0A222020202020202E202B2040204020402040204020
+                402023202420232025202620222C0A222020202020202A203D203D203D203D20
+                3D203D203D203D203D203D203D202D20222C0A222020202020203B203D203D20
+                3D203D203D203E202C202720292021207E207B20222C0A222020202020205D20
+                5E205E205E205E202F2028205F203A203C205B207D207C20222C0A2220203120
+                3220332034203520352036203720382039203C203020612062206320222C0A22
+                64206520662067206820692069206A206B206C206D206E2061206F2070207120
+                222C0A2272203D203D203D203D203D203D203D2073207420752076206F207720
+                78207920222C0A227A203D203D203D2041202920422043204420452046204720
+                482049204A207120222C0A227A203D203D2039204B204C204D204E204F205020
+                512052205320542055205620222C0A227A203D20412057204C20582059205A20
+                6020202E2E2E2B2E402E232E242E252E222C0A227A203D20262E4C204D202A2E
+                3D2E2D2E3B2E3E2E2C2E272E232E292E212E7E2E222C0A227B2E3D205D2E5820
+                2A2E772054205E2E2F2E282E5F2E3A2E292E3C2E5B2E7D2E222C0A227C2E3D20
+                312E5920322E332E342E352E362E372E382E392E302E612E622E632E222C0A22
+                642E3D20652E662E5320672E292E682E692E372E6A2E6B2E6C2E6D2E6E2E6F2E
+                222C0A22702E3D20712E722E732E742E752E762E772E782E792E7A2E412E422E
+                432E442E222C0A22452E462E472E482E492E4A2E4B2E4C2E4D2E4E2E4F2E502E
+                512E522E532E542E227D3B0A
+              }
+              NumGlyphs = 0
+              ShowHint = True
+              ParentShowHint = False
+              Left = 16
+              Height = 30
+              Hint = 'Copy results to clipboard'
+              Top = 7
+              Width = 31
+            end
+            object SpeedButton2: TSpeedButton
+              Action = actCut
+              Flat = True
+              Glyph.Data = {
+                CC0500002F2A2058504D202A2F0A7374617469632063686172202A2065646974
+                6375745F58706D5B5D203D207B0A2231362031362037342031222C0A22200963
+                204E6F6E65222C0A222E09632023383138313831222C0A222B09632023393839
+                383938222C0A224009632023383838383838222C0A2223096320234645464546
+                45222C0A222409632023363836383638222C0A22250963202346374637463722
+                2C0A222609632023433643364336222C0A222A09632023454445444544222C0A
+                223D09632023374237423742222C0A222D09632023434443444344222C0A223B
+                09632023423442334233222C0A223E09632023453745374537222C0A222C0963
+                2023413141314131222C0A222709632023343634363436222C0A222909632023
+                374437443744222C0A222109632023394639463946222C0A227E096320234330
+                43304330222C0A227B09632023424142414241222C0A225D0963202338333346
+                3346222C0A225E09632023424334393439222C0A222F09632023453435333533
+                222C0A222809632023373534453445222C0A225F09632023443044334433222C
+                0A223A09632023434143414341222C0A223C09632023393939393939222C0A22
+                5B09632023433843384338222C0A227D09632023424642464246222C0A227C09
+                632023384438443844222C0A223109632023384334373437222C0A2232096320
+                23433235333533222C0A223309632023394532453245222C0A22340963202344
+                3134303430222C0A223509632023414632453245222C0A223609632023443539
+                333933222C0A223709632023413442334233222C0A2238096320233937393939
+                39222C0A223909632023393739373937222C0A22300963202339363936393622
+                2C0A226109632023364136413641222C0A226209632023443636363636222C0A
+                226309632023433035423542222C0A226409632023413733443344222C0A2265
+                09632023464634373437222C0A226609632023383131323132222C0A22670963
+                2023384137413741222C0A226809632023453743434343222C0A226909632023
+                374237303730222C0A226A09632023373433363336222C0A226B096320234638
+                37373737222C0A226C09632023453036373637222C0A226D0963202344373435
+                3435222C0A226E09632023343530423042222C0A226F09632023424335353535
+                222C0A227009632023424434313431222C0A227109632023363131463146222C
+                0A227209632023433636363636222C0A227309632023464638373837222C0A22
+                7409632023393132393239222C0A227509632023424436313631222C0A227609
+                632023443736373637222C0A227709632023383633303330222C0A2278096320
+                23454435323532222C0A227909632023393532353235222C0A227A0963202346
+                4638413841222C0A224109632023353931413141222C0A224209632023413833
+                443344222C0A224309632023423032343234222C0A2244096320234534364336
+                43222C0A224509632023454235423542222C0A22460963202342363335333522
+                2C0A224709632023434632463246222C0A224809632023394633343334222C0A
+                224909632023394632373237222C0A2220202020202020202020202020202020
+                222C0A22202020202020202020202E2B20202020222C0A222020202020202020
+                2040232420202020222C0A2220202020202020202025262020202020222C0A22
+                2020202020202020262A3D2020202020222C0A2220202020202020202A2D2020
+                20202020222C0A22202020202020203B3E2C2729217E7B20222C0A22205D5E2F
+                2020285F3A3C7E5B7D7C2020222C0A2231322033343536373839306120202020
+                222C0A2262632064656667686920202020202020222C0A226A6B6C6D6E206F70
+                2020202020202020222C0A2220207120207273742020202020202020222C0A22
+                20202020757677787920202020202020222C0A22202020207A41204243202020
+                20202020222C0A2220202020444546472020202020202020222C0A2220202020
+                204849202020202020202020227D3B0A
+              }
+              NumGlyphs = 0
+              ShowHint = True
+              ParentShowHint = False
+              Left = 54
+              Height = 30
+              Hint = 'Cut results to clipboard'
+              Top = 7
+              Width = 31
+            end
+          end
+          object XMLMemo: TMemo
+            Align = alClient
+            OnChange = XMLMemoChange
+            PopupMenu = PopupMenu1
+            TabOrder = 1
+            Left = 1
+            Height = 618
+            Top = 43
+            Width = 642
+          end
+        end
+      end
+    end
+  end
+  object ImageList1: TImageList
+    left = 20
+    top = 464
+    Bitmap = {
+      6C690C00000010000000100000009D0E00002F2A2058504D202A2F0A73746174
+      69632063686172202A206C65646C69676874677265656E5F78706D5B5D203D20
+      7B0A223136203136203139342032222C0A2220200963204E6F6E65222C0A222E
+      2009632023303234323046222C0A222B2009632023313934383334222C0A2240
+      2009632023324535333443222C0A22232009632023333035333444222C0A2224
+      2009632023314234323343222C0A22252009632023303332423239222C0A2226
+      2009632023303035433030222C0A222A2009632023333637463331222C0A223D
+      2009632023393442373936222C0A222D2009632023443445324438222C0A223B
+      2009632023454246334544222C0A223E2009632023454446334545222C0A222C
+      2009632023443745334443222C0A22272009632023394142314134222C0A2229
+      2009632023334236313534222C0A22212009632023303032353235222C0A227E
+      2009632023303135373032222C0A227B2009632023364342303546222C0A225D
+      2009632023454146364443222C0A225E2009632023464646464646222C0A222F
+      2009632023454546364530222C0A22282009632023373739453744222C0A225F
+      2009632023303532463245222C0A223A2009632023303034373039222C0A223C
+      2009632023354541383445222C0A225B2009632023453646464346222C0A227D
+      2009632023454646464532222C0A227C2009632023463046464537222C0A2231
+      2009632023463546464632222C0A22322009632023464146464638222C0A2233
+      2009632023463646464632222C0A22342009632023463146464539222C0A2235
+      2009632023454646464531222C0A22362009632023454146464431222C0A2237
+      2009632023364141313641222C0A22382009632023303032353239222C0A2239
+      2009632023313736423141222C0A22302009632023393045363635222C0A2261
+      2009632023444146464332222C0A22622009632023444546464345222C0A2263
+      2009632023453846464443222C0A22642009632023454646464537222C0A2265
+      2009632023463246464543222C0A22662009632023453846464445222C0A2267
+      2009632023444646464346222C0A22682009632023444346464334222C0A2269
+      2009632023394145443645222C0A226A2009632023314435433331222C0A226B
+      2009632023303334383142222C0A226C2009632023344241363335222C0A226D
+      2009632023374345353432222C0A226E2009632023423846373938222C0A226F
+      2009632023443946464335222C0A22702009632023444446464343222C0A2271
+      2009632023453346464436222C0A22722009632023453646464442222C0A2273
+      2009632023453746464441222C0A22742009632023453446464435222C0A2275
+      2009632023444446464345222C0A22762009632023443946464337222C0A2277
+      2009632023424346383945222C0A22782009632023374545383433222C0A2279
+      2009632023353141353346222C0A227A2009632023303432463335222C0A2241
+      2009632023313335433231222C0A22422009632023373044313439222C0A2243
+      2009632023373945343431222C0A22442009632023383545373534222C0A2245
+      2009632023423546393932222C0A22462009632023434646464237222C0A2247
+      2009632023443646464333222C0A22482009632023444146464337222C0A2249
+      2009632023443746464333222C0A224A2009632023434646464238222C0A224B
+      2009632023423846393936222C0A224C2009632023383845383538222C0A224D
+      2009632023373945343346222C0A224E2009632023373544353442222C0A224F
+      2009632023313834383344222C0A22502009632023314636463234222C0A2251
+      2009632023374445313446222C0A22522009632023383345413445222C0A2253
+      2009632023383345423446222C0A22542009632023384246323537222C0A2255
+      2009632023394646413730222C0A22562009632023423146453842222C0A2257
+      2009632023424146463937222C0A22582009632023424146463938222C0A2259
+      2009632023423246463843222C0A225A2009632023413046423733222C0A2260
+      2009632023384446333539222C0A22202E09632023383345413443222C0A222E
+      2E09632023374645353445222C0A222B2E09632023323435413431222C0A2240
+      2E09632023323137373231222C0A22232E09632023383445373536222C0A2224
+      2E09632023383946313534222C0A22252E09632023384546343542222C0A2226
+      2E09632023393446413546222C0A222A2E09632023393646453633222C0A223D
+      2E09632023394146463639222C0A222D2E09632023394346463644222C0A223B
+      2E09632023394346463645222C0A223E2E09632023394146463641222C0A222C
+      2E09632023393446423630222C0A22272E09632023384646353544222C0A2229
+      2E09632023383946323534222C0A22212E09632023383645423534222C0A227E
+      2E09632023323635423432222C0A227B2E09632023313637323133222C0A225D
+      2E09632023383245343541222C0A225E2E09632023393346423543222C0A222F
+      2E09632023393446423631222C0A22282E09632023394346463642222C0A225F
+      2E09632023413246463737222C0A223A2E09632023413646463830222C0A223C
+      2E09632023413846463835222C0A225B2E09632023413846463834222C0A227D
+      2E09632023413746463830222C0A227C2E09632023413346463738222C0A2231
+      2E09632023394446463643222C0A22322E09632023393546433633222C0A2233
+      2E09632023393246423541222C0A22342E09632023383845363544222C0A2235
+      2E09632023314234413430222C0A22362E09632023303435433037222C0A2237
+      2E09632023363643303443222C0A22382E09632023394646463636222C0A2239
+      2E09632023394246463639222C0A22302E09632023413446463739222C0A2261
+      2E09632023413946463835222C0A22622E09632023414646463930222C0A2263
+      2E09632023423146463937222C0A22642E09632023414646463932222C0A2265
+      2E09632023414146463836222C0A22662E09632023413446463741222C0A2267
+      2E09632023394246463641222C0A22682E09632023394546463632222C0A2269
+      2E09632023364642453546222C0A226A2E09632023303732463335222C0A226B
+      2E09632023324637373335222C0A226C2E09632023413046373645222C0A226D
+      2E09632023413346463732222C0A226E2E09632023413746463832222C0A226F
+      2E09632023423646464130222C0A22702E09632023424146464139222C0A2271
+      2E09632023423646464131222C0A22722E09632023423146463933222C0A2273
+      2E09632023413246463732222C0A22742E09632023413346433645222C0A2275
+      2E09632023333736443445222C0A22762E09632023303033353230222C0A2277
+      2E09632023363341323546222C0A22782E09632023423246463831222C0A2279
+      2E09632023414546463841222C0A227A2E09632023423246463941222C0A2241
+      2E09632023424346464143222C0A22422E09632023433346464239222C0A2243
+      2E09632023433446464242222C0A22442E09632023424346464145222C0A2245
+      2E09632023423346463942222C0A22462E09632023414646463842222C0A2247
+      2E09632023423246463832222C0A22482E09632023364341423635222C0A2249
+      2E09632023303432393332222C0A224A2E09632023303932453336222C0A224B
+      2E09632023364241313643222C0A224C2E09632023423646393935222C0A224D
+      2E09632023433346464136222C0A224E2E09632023433546464234222C0A224F
+      2E09632023434246464336222C0A22502E09632023434446464336222C0A2251
+      2E09632023433746464236222C0A22522E09632023433446464137222C0A2253
+      2E09632023423946423937222C0A22542E09632023373241413646222C0A2255
+      2E09632023304533323337222C0A22562E09632023303232363246222C0A2257
+      2E09632023333936373534222C0A22582E09632023383642383836222C0A2259
+      2E09632023423745414142222C0A225A2E09632023433746414243222C0A2260
+      2E09632023433746414244222C0A22202B09632023423945434145222C0A222E
+      2B09632023384342443841222C0A222B2B09632023343036433538222C0A2240
+      2B09632023303432383330222C0A22232B09632023303832443332222C0A2224
+      2B09632023323034393435222C0A22252B09632023333435443532222C0A2226
+      2B09632023333435453533222C0A222A2B09632023323234423437222C0A223D
+      2B09632023303932453333222C0A22202020202020202020202E202B20402023
+      202420252020202020202020202020222C0A2220202020202026202A203D202D
+      203B203E202C20272029202120202020202020222C0A22202020207E207B205D
+      205E205E205E205E205E205E202F2028205F2020202020222C0A2220203A203C
+      205B207D207C203120322032203320342035203620372038202020222C0A2220
+      20392030206120622063206420652065207C2066206720682069206A20202022
+      2C0A226B206C206D206E206F2070207120722073207420752076207720782079
+      207A20222C0A2241204220432044204520462047207620482049204A204B204C
+      204D204E204F20222C0A2250205120522053205420552056205720582059205A
+      2060205320202E2E2E2B2E222C0A22402E232E242E252E262E2A2E3D2E2D2E3B
+      2E3E2E2A2E2C2E272E292E212E7E2E222C0A227B2E5D2E5E2E2F2E282E5F2E3A
+      2E3C2E5B2E7D2E7C2E312E322E332E342E352E222C0A22362E372E382E392E30
+      2E612E622E632E632E642E652E662E672E682E692E6A2E222C0A2220206B2E6C
+      2E6D2E6E2E642E6F2E702E702E712E722E5B2E732E742E752E2020222C0A2220
+      20762E772E782E792E7A2E412E422E432E442E452E462E472E482E492E202022
+      2C0A22202020204A2E4B2E4C2E4D2E4E2E4F2E502E512E522E532E542E552E20
+      202020222C0A22202020202020562E572E582E592E5A2E602E202B2E2B2B2B40
+      2B202020202020222C0A2220202020202020202020232B242B252B262B2A2B3D
+      2B20202020202020202020227D3B0A280100002F2A2058504D202A2F0A737461
+      7469632063686172202A206D656E755F72756E5F78706D5B5D203D207B0A2238
+      20313420352031222C0A22200963204E6F6E65222C0A222E0963202331343636
+      3030222C0A222B09632023323642323030222C0A224009632023323735393139
+      222C0A222309632023303030303030222C0A222E2E202020202020222C0A222E
+      2B2E2020202020222C0A222E2B2B2E20202020222C0A222E2B2B2B2E20202022
+      2C0A222E2B2B2B2B2E2020222C0A222E2B2B2B2B2B2E20222C0A222E2B2B2B2B
+      2B2B2E222C0A222E2B2B2B2B2B4023222C0A222E2B2B2B2B402320222C0A222E
+      2B2B2B40232020222C0A222E2B2B4023202020222C0A222E2B40232020202022
+      2C0A222E40232020202020222C0A222323202020202020227D3B0AC60D00002F
+      2A2058504D202A2F0A7374617469632063686172202A206C65647265645F7870
+      6D5B5D203D207B0A223136203136203138312032222C0A2220200963204E6F6E
+      65222C0A222E2009632023363530303030222C0A222B20096320233645313331
+      33222C0A22402009632023373932383238222C0A222320096320233739323932
+      39222C0A22242009632023364231343134222C0A222520096320233539303030
+      30222C0A22262009632023373130303030222C0A222A20096320233932323832
+      38222C0A223D2009632023433538323832222C0A222D20096320234538434243
+      42222C0A223B2009632023463545374537222C0A223E20096320234636453845
+      38222C0A222C2009632023453943454345222C0A222720096320234332384138
+      41222C0A22292009632023383432443244222C0A222120096320233535303030
+      30222C0A227E2009632023373030303030222C0A227B20096320234239344134
+      41222C0A225D2009632023463743334333222C0A225E20096320234646463746
+      37222C0A222F2009632023464646464646222C0A222820096320234646463946
+      39222C0A225F2009632023463843384338222C0A223A20096320234233353235
+      32222C0A223C2009632023354430303030222C0A225B20096320233636303030
+      30222C0A227D2009632023423532443244222C0A227C20096320234646413541
+      35222C0A22312009632023464643384338222C0A223220096320234646443744
+      37222C0A22332009632023464645394539222C0A223420096320234646463346
+      33222C0A22352009632023464645414541222C0A223620096320234646444144
+      41222C0A22372009632023464643414341222C0A223820096320234646414141
+      41222C0A22392009632023423533383338222C0A223020096320233536303030
+      30222C0A22612009632023383430303030222C0A226220096320234537324432
+      44222C0A22632009632023464639323932222C0A226420096320234646414341
+      43222C0A22652009632023464643344334222C0A226620096320234646443644
+      36222C0A22672009632023464644454445222C0A226820096320234646444644
+      46222C0A22692009632023464643364336222C0A226A20096320234646414641
+      46222C0A226B2009632023464639363936222C0A226C20096320234544333633
+      36222C0A226D2009632023374630303030222C0A226E20096320233639303330
+      33222C0A226F2009632023423230393039222C0A227020096320234534303830
+      38222C0A22712009632023463735453545222C0A227220096320234646393939
+      39222C0A22732009632023464641424142222C0A227420096320234646423942
+      39222C0A22752009632023464643314331222C0A227620096320234646433243
+      32222C0A22772009632023464642424242222C0A227820096320234646394239
+      42222C0A22792009632023463836363636222C0A227A20096320234536304130
+      41222C0A22412009632023423530383038222C0A224220096320233544303530
+      35222C0A22432009632023373830423042222C0A224420096320234436313031
+      30222C0A22452009632023453630303030222C0A224620096320234541304530
+      45222C0A22472009632023464135333533222C0A224820096320234646383538
+      35222C0A22492009632023464641314131222C0A224A20096320234646394339
+      43222C0A224B2009632023464638383838222C0A224C20096320234642353735
+      37222C0A224D2009632023454231313131222C0A224E20096320234535303030
+      30222C0A224F2009632023443930443044222C0A225020096320233730304330
+      43222C0A22512009632023383630453045222C0A225220096320234533304430
+      44222C0A22532009632023454330303030222C0A225420096320234545303030
+      30222C0A22552009632023463630333033222C0A225620096320234643314531
+      45222C0A22572009632023464633463346222C0A225820096320234646353335
+      33222C0A22592009632023464635343534222C0A225A20096320234646343334
+      33222C0A22602009632023464432303230222C0A22202E096320234636303430
+      34222C0A222E2E09632023454630303030222C0A222B2E096320233745304430
+      44222C0A22402E09632023384130463046222C0A22232E096320234541304430
+      44222C0A22242E09632023463430303030222C0A22252E096320234638303030
+      30222C0A22262E09632023464530303030222C0A222A2E096320234646303030
+      30222C0A223D2E09632023464630363036222C0A222D2E096320234646304330
+      43222C0A223B2E09632023464630373037222C0A223E2E096320234646303130
+      31222C0A222C2E09632023464430303030222C0A22272E096320234544304130
+      41222C0A22292E09632023374530463046222C0A22212E096320233834304630
+      46222C0A227E2E09632023453731343134222C0A227B2E096320234644303130
+      31222C0A225D2E09632023464630423042222C0A225E2E096320234646313731
+      37222C0A222F2E09632023464631463146222C0A22282E096320234646323232
+      32222C0A225F2E09632023464632303230222C0A223A2E096320234646313831
+      38222C0A223C2E09632023464530323032222C0A225B2E096320234543313231
+      32222C0A227D2E09632023373331303130222C0A227C2E096320233734303730
+      37222C0A22312E09632023434131393139222C0A22322E096320234646303930
+      39222C0A22332E09632023464632353235222C0A22342E096320234646324532
+      45222C0A22352E09632023464633353335222C0A22362E096320234646324632
+      46222C0A22372E09632023464632363236222C0A22382E096320234646314131
+      41222C0A22392E09632023464630413041222C0A22302E096320234343313931
+      39222C0A22612E09632023354330393039222C0A22622E096320233846313531
+      35222C0A22632E09632023463931303130222C0A22642E096320234646304530
+      45222C0A22652E09632023464632313231222C0A22662E096320234646333033
+      30222C0A22672E09632023464633443344222C0A22682E096320234646343534
+      35222C0A22692E09632023464634363436222C0A226A2E096320234646334533
+      45222C0A226B2E09632023464633313331222C0A226C2E096320234646323332
+      33222C0A226D2E09632023464631303130222C0A226E2E096320234643304630
+      46222C0A226F2E09632023384431363136222C0A22702E096320233544303630
+      36222C0A22712E09632023423632323232222C0A22722E096320234646314531
+      45222C0A22732E09632023464633373337222C0A22742E096320234646343834
+      38222C0A22752E09632023464635353535222C0A22762E096320234646353735
+      37222C0A22772E09632023464634413441222C0A22782E096320234646333933
+      39222C0A22792E09632023464632373237222C0A227A2E096320234646314431
+      44222C0A22412E09632023424432323232222C0A22422E096320233538303830
+      38222C0A22432E09632023354330423042222C0A22442E096320234235324332
+      43222C0A22452E09632023464133353335222C0A22462E096320234646344334
+      43222C0A22472E09632023464635453545222C0A22482E096320234646344434
+      44222C0A22492E09632023464333363336222C0A224A2E096320234243324332
+      43222C0A224B2E09632023354630443044222C0A224C2E096320233536303730
+      37222C0A224D2E09632023383832323232222C0A224E2E096320234338334433
+      44222C0A224F2E09632023454635343534222C0A22502E096320234642354235
+      42222C0A22512E09632023463035333533222C0A22522E096320234343343034
+      30222C0A22532E09632023384432333233222C0A22542E096320233537303830
+      38222C0A22552E09632023354230383038222C0A22562E096320233732313931
+      39222C0A22572E09632023383131463146222C0A22582E096320233832314631
+      46222C0A22202020202020202020202E202B2040202320242025202020202020
+      2020202020222C0A2220202020202026202A203D202D203B203E202C20272029
+      202120202020202020222C0A22202020207E207B205D205E202F202F202F202F
+      2028205F203A203C2020202020222C0A2220205B207D207C2031203220332034
+      2034203520362037203820392030202020222C0A222020612062206320642065
+      20662067206820322069206A206B206C206D202020222C0A226E206F20702071
+      207220732074207520762077207320782079207A2041204220222C0A22432044
+      2045204620472048207820492049204A204B204C204D204E204F205020222C0A
+      225120522053205420552056205720582059205A206020202E2E2E53207A202B
+      2E222C0A22402E232E242E252E262E2A2E3D2E2D2E2D2E3B2E3E2E2C2E252E24
+      2E272E292E222C0A22212E7E2E2C2E7B2E5D2E5E2E2F2E282E282E5F2E3A2E2D
+      2E3C2E262E5B2E7D2E222C0A227C2E312E3E2E322E3A2E332E342E352E352E36
+      2E372E382E392E3E2E302E612E222C0A222020622E632E642E652E662E672E68
+      2E692E6A2E6B2E6C2E6D2E6E2E6F2E2020222C0A222020702E712E722E372E73
+      2E742E752E762E772E782E792E7A2E412E422E2020222C0A2220202020432E44
+      2E452E672E462E472E472E482E5720492E4A2E4B2E20202020222C0A22202020
+      2020204C2E4D2E4E2E4F2E502E502E512E522E532E542E202020202020222C0A
+      2220202020202020202020552E562E572E582E562E612E202020202020202020
+      20227D3B0A150F00002F2A2058504D202A2F0A7374617469632063686172202A
+      206C6564707572706C655B5D203D207B0A223136203136203230322032222C0A
+      2220200963204E6F6E65222C0A222E2009632023334634313737222C0A222B20
+      09632023343534353737222C0A22402009632023344634463745222C0A222320
+      09632023353135313746222C0A22242009632023334634303731222C0A222520
+      09632023324132423630222C0A22262009632023353735443846222C0A222A20
+      09632023373837314135222C0A223D2009632023423141384342222C0A222D20
+      09632023444544444539222C0A223B2009632023463046304635222C0A223E20
+      09632023463146314636222C0A222C2009632023444644464541222C0A222720
+      09632023414341364335222C0A22292009632023354435363838222C0A222120
+      09632023323432393542222C0A227E2009632023353335413841222C0A227B20
+      09632023413438414336222C0A225D2009632023463343414639222C0A225E20
+      09632023464646304646222C0A222F2009632023464646454646222C0A222820
+      09632023464646464646222C0A225F2009632023464646354646222C0A223A20
+      09632023463343454638222C0A223C2009632023393637394236222C0A225B20
+      09632023324533343633222C0A227D2009632023343634443743222C0A227C20
+      09632023393536424242222C0A22312009632023463841324641222C0A223220
+      09632023464143334641222C0A22332009632023463944374641222C0A223420
+      09632023464245394643222C0A22352009632023464446334644222C0A223620
+      09632023464245414643222C0A22372009632023463844394641222C0A223820
+      09632023463943364642222C0A22392009632023464541414646222C0A223020
+      09632023384636314232222C0A22612009632023323632443543222C0A226220
+      09632023354334383845222C0A22632009632023424333374430222C0A226420
+      09632023463238434634222C0A22652009632023463141444635222C0A226620
+      09632023463543344638222C0A22672009632023463844364641222C0A226820
+      09632023464144454642222C0A22692009632023464144464642222C0A226A20
+      09632023463844374641222C0A226B2009632023463543364638222C0A226C20
+      09632023463141464635222C0A226D2009632023463439314636222C0A226E20
+      09632023433633444436222C0A226F2009632023344433313744222C0A227020
+      09632023343835333743222C0A22712009632023383733364144222C0A227220
+      09632023423230344339222C0A22732009632023444435444536222C0A227420
+      09632023454639394632222C0A22752009632023463041424634222C0A227620
+      09632023463342394637222C0A22772009632023463443314637222C0A227820
+      09632023463443324637222C0A22792009632023463442424636222C0A227A20
+      09632023463041434634222C0A22412009632023463039424632222C0A224220
+      09632023453036354538222C0A22432009632023423830384344222C0A224420
+      09632023383432394139222C0A22452009632023333033413635222C0A224620
+      09632023353835383841222C0A22472009632023413932364337222C0A224820
+      09632023423730304432222C0A22492009632023433130454442222C0A224A20
+      09632023444535334542222C0A224B2009632023453938354544222C0A224C20
+      09632023454339414546222C0A224D2009632023454441314631222C0A224E20
+      09632023454439424546222C0A224F2009632023454138374545222C0A225020
+      09632023444635374543222C0A22512009632023433231314444222C0A225220
+      09632023423830304432222C0A22532009632023414331434338222C0A225420
+      09632023343333453735222C0A22552009632023363635413936222C0A225620
+      09632023423931374434222C0A22572009632023433230304446222C0A225820
+      09632023433630304536222C0A22592009632023443030334630222C0A225A20
+      09632023444331454636222C0A22602009632023453234324634222C0A22202E
+      09632023453435364632222C0A222E2E09632023453435374632222C0A222B2E
+      09632023453234344633222C0A22402E09632023444332304636222C0A22232E
+      09632023443030344631222C0A22242E09632023433730304537222C0A22252E
+      09632023433330304530222C0A22262E09632023424231304436222C0A222A2E
+      09632023353233423746222C0A223D2E09632023364535463944222C0A222D2E
+      09632023433131374444222C0A223B2E09632023434230304539222C0A223E2E
+      09632023443330324634222C0A222C2E09632023444130324644222C0A22272E
+      09632023444530414646222C0A22292E09632023453131364646222C0A22212E
+      09632023453131464646222C0A227E2E09632023453132304646222C0A227B2E
+      09632023453031364646222C0A225D2E09632023444630414646222C0A225E2E
+      09632023444230324644222C0A222F2E09632023443430314635222C0A22282E
+      09632023434330304542222C0A225F2E09632023433331304530222C0A223A2E
+      09632023353333433831222C0A223C2E09632023364336433943222C0A225B2E
+      09632023433232374532222C0A227D2E09632023443730304637222C0A227C2E
+      09632023444230354645222C0A22312E09632023453031384646222C0A22322E
+      09632023453432464646222C0A22332E09632023453733464646222C0A22342E
+      09632023453834384646222C0A22352E09632023453634304646222C0A22362E
+      09632023453533304646222C0A22372E09632023453131394646222C0A22382E
+      09632023443930304639222C0A22392E09632023433531424534222C0A22302E
+      09632023343633463736222C0A22612E09632023354236383846222C0A22622E
+      09632023414134314430222C0A22632E09632023453430304646222C0A22642E
+      09632023453131334646222C0A22652E09632023453433324646222C0A22662E
+      09632023453934414646222C0A22672E09632023454335454646222C0A22682E
+      09632023454536414646222C0A22692E09632023454336304646222C0A226A2E
+      09632023453934444646222C0A226B2E09632023453533344646222C0A226C2E
+      09632023453031374646222C0A226D2E09632023453630304646222C0A226E2E
+      09632023413832464343222C0A226F2E09632023324633423632222C0A22702E
+      09632023364535323945222C0A22712E09632023453331364641222C0A22722E
+      09632023453831464646222C0A22732E09632023453734354646222C0A22742E
+      09632023454436314646222C0A22752E09632023463037424646222C0A22762E
+      09632023463438424646222C0A22772E09632023463438434646222C0A22782E
+      09632023463237434646222C0A22792E09632023454436344646222C0A227A2E
+      09632023453734374646222C0A22412E09632023453832344646222C0A22422E
+      09632023453831364643222C0A22432E09632023363533443932222C0A22442E
+      09632023333634363641222C0A22452E09632023393634344241222C0A22462E
+      09632023463433344646222C0A22472E09632023454634454646222C0A22482E
+      09632023454637314646222C0A22492E09632023463439314646222C0A224A2E
+      09632023463941424646222C0A224B2E09632023464141434646222C0A224C2E
+      09632023463539344646222C0A224D2E09632023454637334646222C0A224E2E
+      09632023454635324646222C0A224F2E09632023463733354646222C0A22502E
+      09632023413034304330222C0A22512E09632023323933393545222C0A22522E
+      09632023324633413632222C0A22532E09632023394135304237222C0A22542E
+      09632023463435454641222C0A22552E09632023464637414646222C0A22562E
+      09632023464539424646222C0A22572E09632023464642444646222C0A22582E
+      09632023464642464646222C0A22592E09632023464639454646222C0A225A2E
+      09632023464637434646222C0A22602E09632023463636304643222C0A22202B
+      09632023413235314246222C0A222E2B09632023333233433636222C0A222B2B
+      09632023323733353542222C0A22402B09632023363434443844222C0A22232B
+      09632023423636464341222C0A22242B09632023453939344630222C0A22252B
+      09632023463941424642222C0A22262B09632023463941434642222C0A222A2B
+      09632023454339354631222C0A223D2B09632023424437314345222C0A222D2B
+      09632023364134463930222C0A223B2B09632023323833363544222C0A223E2B
+      09632023324433343632222C0A222C2B09632023343834343737222C0A22272B
+      09632023354334463836222C0A22292B09632023354434463836222C0A22212B
+      09632023344134353737222C0A227E2B09632023324633343633222C0A222020
+      20202020202020202E202B20402023202420252020202020202020202020222C
+      0A2220202020202026202A203D202D203B203E202C2027202920212020202020
+      2020222C0A22202020207E207B205D205E202F202820282028205F203A203C20
+      5B2020202020222C0A2220207D207C2031203220332034203520352036203720
+      38203920302061202020222C0A22202062206320642065206620672068206920
+      6A206B206C206D206E206F202020222C0A227020712072207320742075207620
+      7720782079207A2041204220432044204520222C0A2246204720482049204A20
+      4B204C204D204D204E204F2050205120522053205420222C0A22552056205720
+      582059205A206020202E2E2E2B2E402E232E242E252E262E2A2E222C0A223D2E
+      2D2E3B2E3E2E2C2E272E292E212E7E2E7B2E5D2E5E2E2F2E282E5F2E3A2E222C
+      0A223C2E5B2E7D2E7C2E312E322E332E342E342E352E362E372E7C2E382E392E
+      302E222C0A22612E622E632E642E652E662E672E682E682E692E6A2E6B2E6C2E
+      6D2E6E2E6F2E222C0A222020702E712E722E732E742E752E762E772E782E792E
+      7A2E412E422E432E2020222C0A222020442E452E462E472E482E492E4A2E4B2E
+      4C2E4D2E4E2E4F2E502E512E2020222C0A2220202020522E532E542E552E562E
+      572E582E592E5A2E602E202B2E2B20202020222C0A222020202020202B2B402B
+      232B242B252B262B2A2B3D2B2D2B3B2B202020202020222C0A22202020202020
+      202020203E2B2C2B272B292B212B7E2B20202020202020202020227D3B0AF20B
+      00002F2A2058504D202A2F0A7374617469632063686172202A206D6573736167
+      65626F785F7761726E696E675F78706D5B5D203D207B0A223136203136203135
+      312032222C0A2220200963204E6F6E65222C0A222E2009632023423431373135
+      222C0A222B2009632023423331423139222C0A22402009632023413730333032
+      222C0A22232009632023453839373933222C0A22242009632023453939463941
+      222C0A22252009632023413030353035222C0A22262009632023433133413337
+      222C0A222A2009632023464644384436222C0A223D2009632023464643444343
+      222C0A222D2009632023424533423338222C0A223B2009632023413730353034
+      222C0A223E2009632023453539303843222C0A222C2009632023464643434343
+      222C0A22272009632023464642344235222C0A22292009632023453437423738
+      222C0A22212009632023393630373036222C0A227E2009632023433033393335
+      222C0A227B2009632023464543304245222C0A225D2009632023464644374437
+      222C0A225E2009632023464643384339222C0A222F2009632023464638463845
+      222C0A22282009632023423632463244222C0A225F2009632023413330343033
+      222C0A223A2009632023453538353832222C0A223C2009632023454645364536
+      222C0A225B2009632023454445364536222C0A227D2009632023464639363936
+      222C0A227C2009632023453335333531222C0A22312009632023384230363035
+      222C0A22322009632023464542344232222C0A22332009632023464644464446
+      222C0A22342009632023364637353735222C0A22352009632023363437303730
+      222C0A22362009632023464343304330222C0A22372009632023464535443543
+      222C0A22382009632023414632333231222C0A22392009632023413330413039
+      222C0A22302009632023453738323746222C0A22612009632023464642434244
+      222C0A22622009632023464646424642222C0A22632009632023353035343534
+      222C0A22642009632023343134363436222C0A22652009632023464546364636
+      222C0A22662009632023464636443644222C0A22672009632023453233313330
+      222C0A22682009632023383330383037222C0A22692009632023424533373332
+      222C0A226A2009632023464441323945222C0A226B2009632023464643464346
+      222C0A226C2009632023464646464646222C0A226D2009632023373537353735
+      222C0A226E2009632023363336333633222C0A226F2009632023464641374137
+      222C0A22702009632023464532363235222C0A22712009632023413931393137
+      222C0A22722009632023413030433043222C0A22732009632023444534323330
+      222C0A22742009632023463535463442222C0A22752009632023464345454544
+      222C0A22762009632023384338433843222C0A22772009632023374537453745
+      222C0A22782009632023464545424541222C0A22792009632023444633373330
+      222C0A227A2009632023433031393130222C0A22412009632023373930413041
+      222C0A22422009632023424333303237222C0A22432009632023454432463133
+      222C0A22442009632023453838333735222C0A22452009632023463746464646
+      222C0A22462009632023424342434243222C0A22472009632023423542354235
+      222C0A22482009632023464346464646222C0A22492009632023443539343930
+      222C0A224A2009632023433030443034222C0A224B2009632023394331363132
+      222C0A224C2009632023394630453045222C0A224D2009632023444533433239
+      222C0A224E2009632023453833443236222C0A224F2009632023453544384436
+      222C0A22502009632023463246394641222C0A22512009632023464546444644
+      222C0A22522009632023443744354435222C0A22532009632023443344324432
+      222C0A22542009632023463546414641222C0A22552009632023453545324531
+      222C0A22562009632023424333303244222C0A22572009632023423530443038
+      222C0A22582009632023373230383037222C0A22592009632023424232443237
+      222C0A225A2009632023454133303134222C0A22602009632023443738383743
+      222C0A22202E09632023443946354639222C0A222E2E09632023454146364638
+      222C0A222B2E09632023464246464646222C0A22402E09632023354536413641
+      222C0A22232E09632023353435463546222C0A22242E09632023463946464646
+      222C0A22252E09632023454646414641222C0A22262E09632023453246424642
+      222C0A222A2E09632023433538463844222C0A223D2E09632023423530373034
+      222C0A222D2E09632023393330443042222C0A223B2E09632023413031323131
+      222C0A223E2E09632023444233443241222C0A222C2E09632023453431433034
+      222C0A22272E09632023443137323633222C0A22292E09632023443041464142
+      222C0A22212E09632023443941454139222C0A227E2E09632023453042374233
+      222C0A227B2E09632023433739463943222C0A225D2E09632023433439433941
+      222C0A225E2E09632023444342364234222C0A222F2E09632023443341454143
+      222C0A22282E09632023434242304146222C0A225F2E09632023424137323730
+      222C0A223A2E09632023413430343034222C0A223C2E09632023414230423039
+      222C0A225B2E09632023364530353035222C0A227D2E09632023423532373231
+      222C0A227C2E09632023454534393245222C0A22312E09632023453433313136
+      222C0A22322E09632023453032413131222C0A22332E09632023444132393134
+      222C0A22342E09632023443532353132222C0A22352E09632023434632303046
+      222C0A22362E09632023443632383141222C0A22372E09632023443232343141
+      222C0A22382E09632023433131343044222C0A22392E09632023424431313044
+      222C0A22302E09632023423930463042222C0A22612E09632023423530383035
+      222C0A22622E09632023414630383036222C0A22632E09632023423930413039
+      222C0A22642E09632023383830383037222C0A22652E09632023394330413038
+      222C0A22662E09632023414632333145222C0A22672E09632023414332353230
+      222C0A22682E09632023413831463141222C0A22692E09632023413531413135
+      222C0A226A2E09632023413131383133222C0A226B2E09632023394531353131
+      222C0A226C2E09632023394131323044222C0A226D2E09632023393530463043
+      222C0A226E2E09632023393230443041222C0A226F2E09632023384630423039
+      222C0A22702E09632023384330393036222C0A22712E09632023383930413038
+      222C0A22722E09632023383830413039222C0A22732E09632023383430373036
+      222C0A22742E09632023364130323032222C0A22202020202020202020202020
+      20202E202B202020202020202020202020202020222C0A222020202020202020
+      202020204020232024202520202020202020202020202020222C0A2220202020
+      202020202020202026202A203D202D20202020202020202020202020222C0A22
+      202020202020202020203B203E202C2027202920212020202020202020202020
+      222C0A22202020202020202020207E207B205D205E202F202820202020202020
+      20202020222C0A2220202020202020205F203A205E203C205B207D207C203120
+      2020202020202020222C0A2220202020202020207E2032203320342035203620
+      372038202020202020202020222C0A2220202020202039203020612062206320
+      64206520662067206820202020202020222C0A2220202020202069206A206B20
+      6C206D206E206C206F2070207120202020202020222C0A222020202072207320
+      742075206C20762077206C20782079207A20412020202020222C0A2220202020
+      42204320442045206C20462047206C20482049204A204B2020202020222C0A22
+      20204C204D204E204F2050205120522053205120542055205620572058202020
+      222C0A22202059205A206020202E2E2E2B2E402E232E242E252E262E2A2E3D2E
+      2D2E2020222C0A223B2E3E2E2C2E272E292E212E7E2E7B2E5D2E5E2E2F2E282E
+      5F2E3A2E3C2E5B2E222C0A227D2E7C2E312E322E332E342E352E362E372E382E
+      392E302E612E622E632E642E222C0A22652E662E672E682E692E6A2E6B2E6C2E
+      6D2E6E2E6F2E702E712E722E732E742E227D3B0A070D00002F2A2058504D202A
+      2F0A7374617469632063686172202A206D6573736167655F78706D5B5D203D20
+      7B0A223136203136203136392032222C0A2220200963204E6F6E65222C0A222E
+      2009632023373830343034222C0A222B2009632023433331343134222C0A2240
+      2009632023443932353235222C0A22232009632023364630373034222C0A2224
+      2009632023423331303130222C0A22252009632023454331443144222C0A2226
+      2009632023463432453330222C0A222A2009632023434331373130222C0A223D
+      2009632023454642453746222C0A222D2009632023464142423644222C0A223B
+      2009632023463641333437222C0A223E2009632023463038413239222C0A222C
+      2009632023454137333130222C0A22272009632023453335433030222C0A2229
+      2009632023443934353030222C0A22212009632023424632313236222C0A227E
+      2009632023463433363336222C0A227B2009632023453732343234222C0A225D
+      2009632023433630363037222C0A225E2009632023454545454444222C0A222F
+      2009632023464646464632222C0A22282009632023464646464445222C0A225F
+      2009632023464646464341222C0A223A2009632023464646464146222C0A223C
+      2009632023464646463845222C0A225B2009632023464546343642222C0A227D
+      2009632023464345333533222C0A227C2009632023463943453346222C0A2231
+      2009632023443937433132222C0A22322009632023424633323044222C0A2233
+      2009632023444231363133222C0A22342009632023433830303030222C0A2235
+      2009632023434137323638222C0A22362009632023464446464541222C0A2237
+      2009632023464646464444222C0A22382009632023464646464434222C0A2239
+      2009632023464646464344222C0A22302009632023464646464336222C0A2261
+      2009632023464646464245222C0A22622009632023464646464236222C0A2263
+      2009632023464646464142222C0A22642009632023464646463936222C0A2265
+      2009632023433439313233222C0A22662009632023463237453233222C0A2267
+      2009632023454544384242222C0A22682009632023453543424245222C0A2269
+      2009632023464346464536222C0A226A2009632023464646464342222C0A226B
+      2009632023464646464331222C0A226C2009632023464646464237222C0A226D
+      2009632023464646464143222C0A226E2009632023463746414132222C0A226F
+      2009632023463246343935222C0A22702009632023464646463738222C0A2271
+      2009632023413736423136222C0A22722009632023463138303241222C0A2273
+      2009632023464646464533222C0A22742009632023464646464631222C0A2275
+      2009632023464546464332222C0A22762009632023464646464131222C0A2277
+      2009632023454245463936222C0A22782009632023434244323841222C0A2279
+      2009632023464646433633222C0A227A2009632023383934453130222C0A2241
+      2009632023463638423332222C0A22422009632023453546304436222C0A2243
+      2009632023464446454530222C0A22442009632023464646464436222C0A2245
+      2009632023464646464343222C0A22462009632023454346324332222C0A2247
+      2009632023423943454239222C0A22482009632023453945464146222C0A2249
+      2009632023423543394138222C0A224A2009632023414443304130222C0A224B
+      2009632023433743463842222C0A224C2009632023443744393737222C0A224D
+      2009632023464645463531222C0A224E2009632023363933343041222C0A224F
+      2009632023464239383338222C0A22502009632023433945304346222C0A2251
+      2009632023443045304433222C0A22522009632023423543444339222C0A2253
+      2009632023423643444331222C0A22542009632023413242464241222C0A2255
+      2009632023393542344232222C0A22562009632023413442444142222C0A2257
+      2009632023413342414130222C0A22582009632023433143433845222C0A2259
+      2009632023434343443741222C0A225A2009632023454245343631222C0A2260
+      2009632023464644463432222C0A22202E09632023344331463037222C0A222E
+      2E09632023464441333344222C0A222B2E09632023443545414344222C0A2240
+      2E09632023393042354338222C0A22232E09632023423043414332222C0A2224
+      2E09632023414143344241222C0A22252E09632023424244304231222C0A2226
+      2E09632023443645314137222C0A222A2E09632023443545303942222C0A223D
+      2E09632023453945413837222C0A222D2E09632023464246333731222C0A223B
+      2E09632023464646323543222C0A223E2E09632023464646313437222C0A222C
+      2E09632023464643463336222C0A22272E09632023333230463035222C0A2229
+      2E09632023463841393346222C0A22212E09632023464146454342222C0A227E
+      2E09632023453445444335222C0A227B2E09632023463046354242222C0A225D
+      2E09632023464546454230222C0A225E2E09632023464646464135222C0A222F
+      2E09632023464646463938222C0A22282E09632023464646463836222C0A225F
+      2E09632023464646383731222C0A223A2E09632023464646323545222C0A223C
+      2E09632023464645463441222C0A225B2E09632023464646303336222C0A227D
+      2E09632023464142453243222C0A227C2E09632023314430343033222C0A2231
+      2E09632023463742343431222C0A22322E09632023464646464334222C0A2233
+      2E09632023464646464244222C0A22342E09632023464646464231222C0A2235
+      2E09632023464646464136222C0A22362E09632023464646463941222C0A2237
+      2E09632023464646423838222C0A22382E09632023464646363733222C0A2239
+      2E09632023464646323546222C0A22302E09632023464445363442222C0A2261
+      2E09632023464543463331222C0A22622E09632023464644413142222C0A2263
+      2E09632023463641303232222C0A22642E09632023304430303031222C0A2265
+      2E09632023464343373434222C0A22662E09632023464646464338222C0A2267
+      2E09632023464646464243222C0A22682E09632023464646464130222C0A2269
+      2E09632023464646453844222C0A226A2E09632023464646373736222C0A226B
+      2E09632023464646323631222C0A226C2E09632023464646303444222C0A226D
+      2E09632023454143423337222C0A226E2E09632023464641353230222C0A226F
+      2E09632023464637453030222C0A22702E09632023373031463032222C0A2271
+      2E09632023454541443142222C0A22722E09632023464145303535222C0A2273
+      2E09632023464645383630222C0A22742E09632023464645463637222C0A2275
+      2E09632023464646333639222C0A22762E09632023464646333633222C0A2277
+      2E09632023464646333541222C0A22782E09632023464646313445222C0A2279
+      2E09632023464646303343222C0A227A2E09632023463243383331222C0A2241
+      2E09632023453737423144222C0A22422E09632023343030453030222C0A2243
+      2E09632023323230423030222C0A22442E09632023324631323030222C0A2245
+      2E09632023343131443030222C0A22462E09632023353632393030222C0A2247
+      2E09632023364333373036222C0A22482E09632023383234353044222C0A2249
+      2E09632023393935343134222C0A224A2E09632023423236363143222C0A224B
+      2E09632023413835323141222C0A224C2E09632023314430343032222C0A222E
+      202B204020232020202020202020202020202020202020202020202020202022
+      2C0A222420252026202A203D202D203B203E202C202720292020202020202020
+      202020222C0A2221207E207B205D205E202F2028205F203A203C205B207D207C
+      20312020202020222C0A22322033203420352036203720382039203020612062
+      2063206420652020202020222C0A226620672068206920282038206A206B206C
+      206D206E206F207020712020202020222C0A22722073207420282038206A2075
+      206C206D2076207720782079207A2020202020222C0A22412042204320442045
+      2046204720482049204A204B204C204D204E2020202020222C0A224F20502051
+      20522053205420552056205720582059205A206020202E20202020222C0A222E
+      2E2B2E402E232E242E252E262E2A2E3D2E2D2E3B2E3E2E2C2E272E2020202022
+      2C0A22292E212E7E2E7B2E5D2E5E2E2F2E282E5F2E3A2E3C2E5B2E7D2E7C2E20
+      202020222C0A22312E322E332E342E352E362E372E382E392E302E612E622E63
+      2E642E20202020222C0A22652E662E672E3A20682E692E6A2E6B2E6C2E6D2E6E
+      2E6F2E702E202020202020222C0A22712E722E732E742E752E762E772E782E79
+      2E7A2E412E422E2020202020202020222C0A222020432E442E452E462E472E48
+      2E492E4A2E4B2E4C2E20202020202020202020222C0A22202020202020202020
+      2020202020202020202020202020202020202020202020222C0A222020202020
+      202020202020202020202020202020202020202020202020202020227D3B0A2F
+      0100002F2A2058504D202A2F0A7374617469632063686172202A20496E76616C
+      6964427265616B506F696E745F78706D5B5D203D207B0A223131203131203520
+      31222C0A22200963204E6F6E65222C0A222E09632023303030303030222C0A22
+      2B09632023464630303030222C0A224009632023464630343030222C0A222309
+      632023464646463030222C0A222020202E2E2E2E2E202020222C0A2220202E2B
+      2B2B2B2B2E2020222C0A22202E2B2B2B2B2B2B402E20222C0A222E2B2B232B2B
+      2B23402B2E222C0A222E2B2B2B232323402B2B2E222C0A222E2B2B2B2B234040
+      2B2B2E222C0A222E2B402B2323232B2B2B2E222C0A222E2B2B232B4040232B2B
+      2E222C0A22202E2B2B40402B2B2B2E20222C0A2220202E2B2B2B2B2B2E202022
+      2C0A222020202E2E2E2E2E202020227D3B0A120100002F2A2058504D202A2F0A
+      7374617469632063686172202A20496E616374697665427265616B506F696E74
+      5F78706D5B5D203D207B0A22313120313120332031222C0A22200963204E6F6E
+      65222C0A222E09632023303030303030222C0A222B0963202330444135303022
+      2C0A222020202E2E2E2E2E202020222C0A2220202E2B2B2B2B2B2E2020222C0A
+      22202E2B2B2B2B2B2B2B2E20222C0A222E2B2B2B2B2B2B2B2B2B2E222C0A222E
+      2B2B2B2B2B2B2B2B2B2E222C0A222E2B2B2B2B2B2B2B2B2B2E222C0A222E2B2B
+      2B2B2B2B2B2B2B2E222C0A222E2B2B2B2B2B2B2B2B2B2E222C0A22202E2B2B2B
+      2B2B2B2B2E20222C0A2220202E2B2B2B2B2B2E2020222C0A222020202E2E2E2E
+      2E202020227D3B0A120200002F2A2058504D202A2F0A73746174696320636861
+      72202A206D656E755F64656275676765725F78706D5B5D203D207B0A22313620
+      31362031302031222C0A22200963204E6F6E65222C0A222E0963202345443135
+      4535222C0A222B09632023443032324339222C0A224009632023364533413641
+      222C0A222309632023434431454336222C0A222409632023414432384137222C
+      0A222509632023434431434338222C0A222609632023423232334232222C0A22
+      2A09632023434431424336222C0A223D09632023384532373839222C0A222020
+      2020202020202020202020202020222C0A222020202020202020202020202020
+      2020222C0A2220202020202020202020202020202020222C0A222020202E2020
+      2E202020202020202020222C0A222020202E20202B202E2E2E2020202020222C
+      0A22202020402E2E2B202B20202020202020222C0A2220202E2E2E2E2E2E2E20
+      20202E2E2020222C0A22202E2E2E2E2E2E2E2E2E2E2E2E2E2E20222C0A22202E
+      23242E2E2E2E2E2E23252E2E2E20222C0A2220262E2E2E2A2E3D2E2626262E2E
+      2E20222C0A222020262E26262E262E262620262E2020222C0A22202020262626
+      2E2E2E20202020202020222C0A222020202620202E202E2E2E2020202020222C
+      0A2220202026202026202020202020202020222C0A2220202020202020202020
+      202020202020222C0A2220202020202020202020202020202020227D3B0A4C02
+      00002F2A2058504D202A2F0A7374617469632063686172202A2064656275676F
+      75747075745F78706D5B5D203D207B0A2231362031362031342031222C0A2220
+      0963204E6F6E65222C0A222E09632023343234313432222C0A222B0963202336
+      3636364343222C0A224009632023393939394232222C0A222309632023413541
+      354245222C0A222409632023423342334343222C0A2225096320234343434345
+      36222C0A222609632023443544354546222C0A222A0963202345374537464622
+      2C0A223D09632023383343373843222C0A222D09632023314138323141222C0A
+      223B09632023354541423545222C0A223E09632023464646464646222C0A222C
+      09632023303030303030222C0A2220202020202020202020202020202020222C
+      0A222020202C2C2C2C2C2C2C2C2C2C2C2020222C0A222020202C2B2B2B2B2B2B
+      2B2B2B2E3E20222C0A222020202C3E2A263E2A3E2A262A2E3E20222C0A222020
+      202C3E263E2A3E2A262A252E3E20222C0A2220202C2C3E3E2C3E2A262A252A2E
+      3E20222C0A2220203E2C2C2C3E2A262A252A242E3E20222C0A222020202C3D2C
+      2A262A252A23262E3E20222C0A22202C3E2C2C2C262C252A2326402E3E20222C
+      0A2220202C3D3D3D2C252A402640252E3E20222C0A22202C2C3D3B2D2C2C2E2E
+      2E2E2E2E3E20222C0A22203E2C3D3B2D2C3E3E3E3E3E3E3E3E20222C0A222020
+      2C3D2D2D2C3E2020202020202020222C0A22202C3E2C2C2C3E2C3E2020202020
+      2020222C0A22203E20203E3E20203E20202020202020222C0A22202020202020
+      20202020202020202020227D3B0A530C00002F2A2058504D202A2F0A73746174
+      69632063686172202A206D657373616765626F785F637269746963616C5F7870
+      6D5B5D203D207B0A223136203136203135372032222C0A2220200963204E6F6E
+      65222C0A222E2009632023423332353236222C0A222B20096320234335363336
+      35222C0A22402009632023413831343134222C0A222320096320233938304430
+      44222C0A22242009632023423936333633222C0A222520096320233946324432
+      44222C0A22262009632023423533333334222C0A222A20096320234631444344
+      42222C0A223D2009632023464645374446222C0A222D20096320234538433843
+      41222C0A223B2009632023413231383139222C0A223E20096320233936313231
+      33222C0A222C2009632023444642464330222C0A222720096320234644453244
+      44222C0A22292009632023463045314446222C0A222120096320234130343034
+      31222C0A227E2009632023423332373238222C0A227B20096320234632444244
+      42222C0A225D2009632023464639453836222C0A225E20096320234639323931
+      37222C0A222F2009632023464642444145222C0A222820096320234537434443
+      46222C0A225F2009632023394131343135222C0A223A20096320233933304230
+      43222C0A223C2009632023453143344335222C0A225B20096320234635433342
+      42222C0A227D2009632023443131383136222C0A227C20096320234533383037
+      35222C0A22312009632023454345334532222C0A223220096320233937333033
+      31222C0A22332009632023433636343636222C0A223420096320234646453944
+      46222C0A22352009632023463932393046222C0A223620096320234632314130
+      30222C0A22372009632023454432313036222C0A223820096320234639423941
+      44222C0A22392009632023453243354337222C0A223020096320234445424642
+      46222C0A22612009632023463343304241222C0A226220096320234431313730
+      44222C0A22632009632023434130393030222C0A226420096320234332303630
+      33222C0A22652009632023463544344431222C0A226620096320234234373437
+      34222C0A22672009632023413931413142222C0A226820096320234537433443
+      35222C0A22692009632023454432313038222C0A226A20096320234538314130
+      30222C0A226B2009632023453131423036222C0A226C20096320234631423641
+      45222C0A226D2009632023454643304239222C0A226E20096320234431313730
+      43222C0A226F2009632023434230433030222C0A227020096320234333304130
+      32222C0A22712009632023453641313943222C0A227220096320234533434643
+      46222C0A22732009632023383832313232222C0A227420096320234132313931
+      41222C0A22752009632023453744314433222C0A227620096320234641423841
+      43222C0A22772009632023453031423036222C0A227820096320234443313430
+      30222C0A22792009632023443832303041222C0A227A20096320234433314630
+      44222C0A22412009632023434330443030222C0A224220096320234333303930
+      30222C0A22432009632023453439443939222C0A224420096320234536444244
+      42222C0A22452009632023383832333233222C0A224620096320233941313131
+      31222C0A22472009632023453143354336222C0A224820096320234631423441
+      43222C0A22492009632023443832303044222C0A224A20096320234430313430
+      30222C0A224B2009632023434331323030222C0A224C20096320234336313430
+      37222C0A224D2009632023453141323946222C0A224E20096320234446434543
+      46222C0A224F2009632023383531383138222C0A225020096320233934304330
+      43222C0A22512009632023444543304332222C0A225220096320234546424342
+      36222C0A22532009632023443131463130222C0A225420096320234343313130
+      30222C0A22552009632023433630463030222C0A225620096320234330313330
+      39222C0A22572009632023453141424138222C0A225820096320234444434143
+      42222C0A22592009632023374431303130222C0A225A20096320233936313331
+      34222C0A22602009632023453243344336222C0A22202E096320234431313930
+      43222C0A222E2E09632023434230443030222C0A222B2E096320234336313330
+      35222C0A22402E09632023433131323037222C0A22232E096320234242303430
+      30222C0A22242E09632023423430373035222C0A22252E096320234445413641
+      35222C0A22262E09632023444544304430222C0A222A2E096320233742314131
+      41222C0A223D2E09632023393831353136222C0A222D2E096320234446424442
+      44222C0A223B2E09632023463443314239222C0A223E2E096320234432313830
+      43222C0A222C2E09632023433330413030222C0A22272E096320234531413139
+      45222C0A22292E09632023453141424139222C0A22212E096320234234303630
+      35222C0A227E2E09632023414630313030222C0A227B2E096320234138303630
+      36222C0A225D2E09632023444241374137222C0A225E2E096320234438433443
+      34222C0A222F2E09632023373831423142222C0A22282E096320234239363336
+      34222C0A225F2E09632023464345344446222C0A223A2E096320234430313531
+      30222C0A223C2E09632023433930383030222C0A225B2E096320234333303930
+      33222C0A227D2E09632023453439453942222C0A227C2E096320234530443044
+      30222C0A22312E09632023444343394339222C0A22322E096320234444413841
+      37222C0A22332E09632023413930353035222C0A22342E096320234132303030
+      30222C0A22352E09632023394230343034222C0A22362E096320234535443044
+      30222C0A22372E09632023413737333733222C0A22382E096320234130324432
+      45222C0A22392E09632023463045304531222C0A22302E096320234532374637
+      35222C0A22612E09632023433330453044222C0A22622E096320234536413139
+      42222C0A22632E09632023453544384438222C0A22642E096320233836314431
+      44222C0A22652E09632023374431343134222C0A22662E096320234445434443
+      44222C0A22672E09632023394130433043222C0A22682E096320234244363336
+      33222C0A22692E09632023453545314531222C0A226A2E096320233834333833
+      38222C0A226B2E09632023413034313432222C0A226C2E096320234544453245
+      31222C0A226D2E09632023463544324430222C0A226E2E096320234533443144
+      31222C0A226F2E09632023383932323232222C0A22702E096320233743313931
+      39222C0A22712E09632023443843374338222C0A22722E096320234535434543
+      46222C0A22732E09632023453545304530222C0A22742E096320233844344534
+      45222C0A22752E09632023393632463246222C0A22762E096320234234373237
+      33222C0A22772E09632023383831433143222C0A22782E096320233738313531
+      34222C0A22792E09632023413737313731222C0A227A2E096320233834333733
+      37222C0A22202020202020202020202020202020202020202020202020202020
+      2020202020222C0A222020202020202E202B2040202020202020202020232024
+      202520202020202020222C0A222020202026202A203D202D203B20202020203E
+      202C2027202920212020202020222C0A2220207E207B205D205E202F2028205F
+      203A203C205B207D207C20312032202020222C0A222020332034203520362037
+      203820392030206120622063206420652066202020222C0A222020672068202F
+      2069206A206B206C206D206E206F2070207120722073202020222C0A22202020
+      207420752076207720782079207A204120422043204420452020202020222C0A
+      2220202020202046204720482049204A204B204C204D204E204F202020202020
+      20222C0A22202020202020502051205220532054205520562057205820592020
+      2020202020222C0A22202020205A2060206120202E2E2E2B2E402E232E242E25
+      2E262E2A2E20202020222C0A2220203D2E2D2E3B2E3E2E41202C2E272E292E21
+      2E7E2E7B2E5D2E5E2E2F2E2020222C0A222020282E5F2E3A2E3C2E5B2E7D2E7C
+      2E312E322E332E342E352E362E372E2020222C0A222020382E392E302E612E62
+      2E632E642E652E662E5D2E672E682E692E6A2E2020222C0A22202020206B2E6C
+      2E6D2E6E2E6F2E20202020702E712E722E732E742E20202020222C0A22202020
+      202020752E762E772E2020202020202020782E792E7A2E202020202020222C0A
+      2220202020202020202020202020202020202020202020202020202020202020
+      20227D3B0A6F0C00002F2A2058504D202A2F0A7374617469632063686172202A
+      206D657373616765626F785F696E666F5F78706D5B5D203D207B0A2231362031
+      36203135392032222C0A2220200963204E6F6E65222C0A222E20096320233031
+      32423934222C0A222B2009632023313634324136222C0A224020096320233237
+      35334233222C0A22232009632023323434454233222C0A222420096320233133
+      33414134222C0A22252009632023303231463845222C0A222620096320233232
+      34464146222C0A222A2009632023364639434445222C0A223D20096320233934
+      43304641222C0A222D2009632023383642344634222C0A223B20096320233741
+      41414632222C0A223E2009632023373341364637222C0A222C20096320233443
+      38304446222C0A22272009632023313733444142222C0A222920096320233336
+      36354246222C0A22212009632023413343444639222C0A227E20096320234231
+      44364646222C0A227B2009632023393642414632222C0A225D20096320234245
+      43444539222C0A225E2009632023423843384537222C0A222F20096320233732
+      39444537222C0A22282009632023364139454632222C0A225F20096320233535
+      39314635222C0A223A2009632023314634394242222C0A223C20096320233234
+      35304230222C0A225B2009632023413343434641222C0A227D20096320234145
+      44324646222C0A227C2009632023393042414641222C0A223120096320233846
+      42314537222C0A22322009632023463446364638222C0A223320096320234633
+      46344638222C0A22342009632023373139394445222C0A223520096320233445
+      38324530222C0A22362009632023344438324530222C0A223720096320233346
+      37464633222C0A22382009632023313033314138222C0A223920096320233031
+      32413935222C0A22302009632023364639424530222C0A226120096320234236
+      44414646222C0A22622009632023393742454641222C0A226320096320233843
+      42354637222C0A22642009632023364339424541222C0A226520096320233832
+      41354532222C0A22662009632023373839444446222C0A226720096320233443
+      37464445222C0A22682009632023344337454446222C0A226920096320233344
+      37314436222C0A226A2009632023333337304530222C0A226B20096320233230
+      35414438222C0A226C2009632023303130463835222C0A226D20096320233130
+      33464135222C0A226E2009632023353839434639222C0A226F20096320233932
+      42454643222C0A22702009632023393142384637222C0A227120096320233733
+      41304542222C0A22722009632023383841424537222C0A227320096320233830
+      41344534222C0A22742009632023373739444530222C0A227520096320233532
+      38334443222C0A22762009632023334137304439222C0A227720096320233330
+      36384435222C0A22782009632023323135434346222C0A227920096320233142
+      35444431222C0A227A2009632023303931453935222C0A224120096320233231
+      34464233222C0A22422009632023323737454638222C0A224320096320233234
+      37324543222C0A22442009632023373941364630222C0A224520096320233641
+      39384537222C0A22462009632023383441374532222C0A224720096320234631
+      46344635222C0A22482009632023463346364635222C0A224920096320233631
+      38434443222C0A224A2009632023323435464433222C0A224B20096320233233
+      35444346222C0A224C2009632023303634374242222C0A224D20096320233044
+      35324332222C0A224E2009632023304232373945222C0A224F20096320233230
+      34434231222C0A22502009632023324237464634222C0A225120096320233030
+      35354532222C0A22522009632023313036304445222C0A225320096320233344
+      37414531222C0A22542009632023343037414442222C0A225520096320234434
+      44444545222C0A22562009632023463746384632222C0A225720096320233534
+      38334438222C0A22582009632023304434424336222C0A225920096320233035
+      34364239222C0A225A2009632023303033464145222C0A226020096320233044
+      34464246222C0A22202E09632023304232333943222C0A222E2E096320233135
+      33434133222C0A222B2E09632023333237444544222C0A22402E096320233031
+      35394530222C0A22232E09632023303035344438222C0A22242E096320233030
+      34374430222C0A22252E09632023313535364346222C0A22262E096320234434
+      44454544222C0A222A2E09632023463646374631222C0A223D2E096320233433
+      37324344222C0A222D2E09632023303033354232222C0A223B2E096320233030
+      34314232222C0A223E2E09632023303033454143222C0A222C2E096320233043
+      34434244222C0A22272E09632023303631373931222C0A22292E096320233036
+      32343930222C0A22212E09632023333336464436222C0A227E2E096320233046
+      36324531222C0A227B2E09632023303035314432222C0A225D2E096320233030
+      34384342222C0A225E2E09632023313035314341222C0A222F2E096320234432
+      44434542222C0A22282E09632023463546354546222C0A225F2E096320233432
+      36464339222C0A223A2E09632023303033344145222C0A223C2E096320233030
+      33444143222C0A225B2E09632023303334314144222C0A227D2E096320233044
+      34304237222C0A227C2E09632023303230363831222C0A22312E096320233139
+      33464139222C0A22322E09632023324437374535222C0A22332E096320233034
+      35324345222C0A22342E09632023303034334333222C0A22352E096320233139
+      35324338222C0A22362E09632023444245324542222C0A22372E096320234642
+      46394546222C0A22382E09632023344537344339222C0A22392E096320233030
+      32454136222C0A22302E09632023303033424135222C0A22612E096320233042
+      34434244222C0A22622E09632023303631443939222C0A22632E096320233146
+      34384234222C0A22642E09632023323336434443222C0A22652E096320233041
+      35304339222C0A22662E09632023364639434531222C0A22672E096320234433
+      44464545222C0A22682E09632023443645304541222C0A22692E096320233945
+      42454542222C0A226A2E09632023313334464242222C0A226B2E096320233036
+      34374241222C0A226C2E09632023303932414135222C0A226D2E096320233030
+      30303738222C0A226E2E09632023313233324133222C0A226F2E096320233230
+      35384337222C0A22702E09632023324436444434222C0A22712E096320233146
+      36314345222C0A22722E09632023314235434339222C0A22732E096320233234
+      36314343222C0A22742E09632023313234364242222C0A22752E096320233036
+      31433938222C0A22762E09632023303030303739222C0A22772E096320233034
+      30463835222C0A22782E09632023303331393934222C0A22792E096320233033
+      31463942222C0A227A2E09632023303131433939222C0A22412E096320233030
+      30453845222C0A22422E09632023303030353830222C0A222020202020202020
+      202020202020202020202020202020202020202020202020222C0A2220202020
+      2020202020202E202B20402023202420252020202020202020202020222C0A22
+      202020202020202026202A203D202D203B203E202C2027202020202020202020
+      222C0A22202020202020292021207E207B205D205E202F2028205F203A202020
+      20202020222C0A22202020203C205B207D207C20312032203320342035203620
+      3720382020202020222C0A222020392030206120622063206420652066206720
+      682069206A206B206C202020222C0A2220206D206E206F207020712072207320
+      7420752076207720782079207A202020222C0A22202041204220432044204520
+      46204720482049204A204B204C204D204E202020222C0A2220204F2050205120
+      522053205420552056205720582059205A206020202E2020222C0A2220202E2E
+      2B2E402E232E242E252E262E2A2E3D2E2D2E3B2E3E2E2C2E272E2020222C0A22
+      2020292E212E7E2E7B2E5D2E5E2E2F2E282E5F2E3A2E3C2E5B2E7D2E7C2E2020
+      222C0A2220202020312E322E332E342E352E362E372E382E392E302E612E622E
+      20202020222C0A22202020202020632E642E652E662E672E682E692E6A2E6B2E
+      6C2E6D2E20202020222C0A2220202020202020206E2E6F2E702E712E722E732E
+      742E752E762E202020202020222C0A2220202020202020202020772E782E792E
+      7A2E412E422E20202020202020202020222C0A22202020202020202020202020
+      2020202020202020202020202020202020202020227D3B0A
+    }
+  end
+  object ActionList1: TActionList
+    Images = ImageList2
+    left = 112
+    top = 288
+    object actCopy: TAction
+      Hint = 'Copy results to clipboard'
+      OnExecute = actCopyExecute
+      Category = 'edit'
+    end
+    object actCut: TAction
+      ImageIndex = 1
+      OnExecute = actCutExecute
+      Category = 'edit'
+    end
+  end
+  object ImageList2: TImageList
+    left = 116
+    top = 362
+    Bitmap = {
+      6C69030000001000000010000000880D00002F2A2058504D202A2F0A73746174
+      69632063686172202A2065646974636F70795F78706D5B5D203D207B0A223136
+      203136203137372032222C0A2220200963204E6F6E65222C0A222E2009632023
+      343036453941222C0A222B2009632023373139384244222C0A22402009632023
+      364339344241222C0A22232009632023364239344241222C0A22242009632023
+      364239334241222C0A22252009632023364539364244222C0A22262009632023
+      333236303846222C0A222A2009632023423643444533222C0A223D2009632023
+      464646464646222C0A222D2009632023393242354431222C0A223B2009632023
+      423243384530222C0A223E2009632023464446454646222C0A222C2009632023
+      464246434646222C0A22272009632023463746424646222C0A22292009632023
+      463546414646222C0A22212009632023463146374646222C0A227E2009632023
+      464246464646222C0A227B2009632023384642334430222C0A225D2009632023
+      414443354444222C0A225E2009632023464446444645222C0A222F2009632023
+      464446454645222C0A22282009632023464446464646222C0A225F2009632023
+      463646424646222C0A223A2009632023463346414646222C0A223C2009632023
+      463046384646222C0A225B2009632023454346354646222C0A227D2009632023
+      463646464646222C0A227C2009632023384442314346222C0A22312009632023
+      323034383741222C0A22322009632023323334393743222C0A22332009632023
+      364439314235222C0A22342009632023393541444334222C0A22352009632023
+      384641384331222C0A22362009632023384441374331222C0A22372009632023
+      383941324245222C0A22382009632023433944364532222C0A22392009632023
+      464246454646222C0A22302009632023454446374646222C0A22612009632023
+      454146344646222C0A22622009632023463346454646222C0A22632009632023
+      374441374345222C0A22642009632023364138424145222C0A22652009632023
+      453345444635222C0A22662009632023444645414632222C0A22672009632023
+      443044434537222C0A22682009632023433844374534222C0A22692009632023
+      434244394535222C0A226A2009632023434444424537222C0A226B2009632023
+      414142464433222C0A226C2009632023383039454241222C0A226D2009632023
+      463046344638222C0A226E2009632023463046394646222C0A226F2009632023
+      453746334646222C0A22702009632023463046434646222C0A22712009632023
+      363939434342222C0A22722009632023383339464242222C0A22732009632023
+      453145434633222C0A22742009632023383941364330222C0A22752009632023
+      453945464634222C0A22762009632023454446384646222C0A22772009632023
+      453446314646222C0A22782009632023454446414646222C0A22792009632023
+      364239434342222C0A227A2009632023374439414238222C0A22412009632023
+      464246444646222C0A22422009632023463046374646222C0A22432009632023
+      463346434646222C0A22442009632023443045334545222C0A22452009632023
+      383341324245222C0A22462009632023453846314635222C0A22472009632023
+      454146364646222C0A22482009632023453346314646222C0A22492009632023
+      453046304646222C0A224A2009632023453946394646222C0A224B2009632023
+      463546424646222C0A224C2009632023463146384646222C0A224D2009632023
+      454346364646222C0A224E2009632023463046414646222C0A224F2009632023
+      433844454544222C0A22502009632023373739434244222C0A22512009632023
+      453646304635222C0A22522009632023453846354646222C0A22532009632023
+      453146304646222C0A22542009632023444545464646222C0A22552009632023
+      453746384646222C0A22562009632023363839434342222C0A22572009632023
+      463646414646222C0A22582009632023454446364646222C0A22592009632023
+      453746344646222C0A225A2009632023454346374646222C0A22602009632023
+      433444434544222C0A22202E09632023373639424244222C0A222E2E09632023
+      453346304635222C0A222B2E09632023453446334646222C0A22402E09632023
+      444445464646222C0A22232E09632023444145444646222C0A22242E09632023
+      453346364646222C0A22252E09632023363639424342222C0A22262E09632023
+      463846424646222C0A222A2E09632023453846344646222C0A223D2E09632023
+      453246314646222C0A222D2E09632023453746354646222C0A223B2E09632023
+      433044414544222C0A223E2E09632023373439414244222C0A222C2E09632023
+      444645454635222C0A22272E09632023453146324646222C0A22292E09632023
+      443745424646222C0A22212E09632023453046344646222C0A227E2E09632023
+      363539414342222C0A227B2E09632023374539424238222C0A225D2E09632023
+      463246394646222C0A225E2E09632023453246334646222C0A222F2E09632023
+      424344384544222C0A22282E09632023373239394244222C0A225F2E09632023
+      444345434635222C0A223A2E09632023444446304646222C0A223C2E09632023
+      443445394646222C0A225B2E09632023444346324646222C0A227D2E09632023
+      363439414342222C0A227C2E09632023364539314234222C0A22312E09632023
+      454646374646222C0A22322E09632023453346324646222C0A22332E09632023
+      453045464646222C0A22342E09632023443945444646222C0A22352E09632023
+      444446314646222C0A22362E09632023423844364544222C0A22372E09632023
+      373039384244222C0A22382E09632023443945424635222C0A22392E09632023
+      444145454646222C0A22302E09632023443345414646222C0A22612E09632023
+      443145384646222C0A22622E09632023443946314646222C0A22632E09632023
+      363339394342222C0A22642E09632023363638434232222C0A22652E09632023
+      454446354646222C0A22662E09632023453646324646222C0A22672E09632023
+      444445454646222C0A22682E09632023444145464646222C0A22692E09632023
+      423544354544222C0A226A2E09632023443845414635222C0A226B2E09632023
+      443945434646222C0A226C2E09632023443245384646222C0A226D2E09632023
+      443045354646222C0A226E2E09632023443746304646222C0A226F2E09632023
+      363239394343222C0A22702E09632023364239304235222C0A22712E09632023
+      463546464646222C0A22722E09632023454546454646222C0A22732E09632023
+      453946434646222C0A22742E09632023453546384646222C0A22752E09632023
+      444646354646222C0A22762E09632023453246414646222C0A22772E09632023
+      424144454633222C0A22782E09632023373339454333222C0A22792E09632023
+      453046354642222C0A227A2E09632023453146374646222C0A22412E09632023
+      444146334646222C0A22422E09632023443746314646222C0A22432E09632023
+      444646414646222C0A22442E09632023363339444346222C0A22452E09632023
+      323335353836222C0A22462E09632023363138434237222C0A22472E09632023
+      354338384234222C0A22482E09632023353938364233222C0A22492E09632023
+      353638354233222C0A224A2E09632023353538354233222C0A224B2E09632023
+      353438344233222C0A224C2E09632023353638364235222C0A224D2E09632023
+      343437374138222C0A224E2E09632023324236323939222C0A224F2E09632023
+      353538444246222C0A22502E09632023353338434332222C0A22512E09632023
+      353238424332222C0A22522E09632023353138434332222C0A22532E09632023
+      353238464333222C0A22542E09632023314535383931222C0A22202020202020
+      2E202B2040204020402040204020402023202420232025202620222C0A222020
+      202020202A203D203D203D203D203D203D203D203D203D203D203D202D20222C
+      0A222020202020203B203D203D203D203D203D203E202C202720292021207E20
+      7B20222C0A222020202020205D205E205E205E205E202F2028205F203A203C20
+      5B207D207C20222C0A2220203120322033203420352035203620372038203920
+      3C203020612062206320222C0A2264206520662067206820692069206A206B20
+      6C206D206E2061206F2070207120222C0A2272203D203D203D203D203D203D20
+      3D2073207420752076206F20772078207920222C0A227A203D203D203D204120
+      2920422043204420452046204720482049204A207120222C0A227A203D203D20
+      39204B204C204D204E204F205020512052205320542055205620222C0A227A20
+      3D20412057204C20582059205A206020202E2E2E2B2E402E232E242E252E222C
+      0A227A203D20262E4C204D202A2E3D2E2D2E3B2E3E2E2C2E272E232E292E212E
+      7E2E222C0A227B2E3D205D2E58202A2E772054205E2E2F2E282E5F2E3A2E292E
+      3C2E5B2E7D2E222C0A227C2E3D20312E5920322E332E342E352E362E372E382E
+      392E302E612E622E632E222C0A22642E3D20652E662E5320672E292E682E692E
+      372E6A2E6B2E6C2E6D2E6E2E6F2E222C0A22702E3D20712E722E732E742E752E
+      762E772E782E792E7A2E412E422E432E442E222C0A22452E462E472E482E492E
+      4A2E4B2E4C2E4D2E4E2E4F2E502E512E522E532E542E227D3B0ACC0500002F2A
+      2058504D202A2F0A7374617469632063686172202A20656469746375745F5870
+      6D5B5D203D207B0A2231362031362037342031222C0A22200963204E6F6E6522
+      2C0A222E09632023383138313831222C0A222B09632023393839383938222C0A
+      224009632023383838383838222C0A222309632023464546454645222C0A2224
+      09632023363836383638222C0A222509632023463746374637222C0A22260963
+      2023433643364336222C0A222A09632023454445444544222C0A223D09632023
+      374237423742222C0A222D09632023434443444344222C0A223B096320234234
+      42334233222C0A223E09632023453745374537222C0A222C0963202341314131
+      4131222C0A222709632023343634363436222C0A222909632023374437443744
+      222C0A222109632023394639463946222C0A227E09632023433043304330222C
+      0A227B09632023424142414241222C0A225D09632023383333463346222C0A22
+      5E09632023424334393439222C0A222F09632023453435333533222C0A222809
+      632023373534453445222C0A225F09632023443044334433222C0A223A096320
+      23434143414341222C0A223C09632023393939393939222C0A225B0963202343
+      3843384338222C0A227D09632023424642464246222C0A227C09632023384438
+      443844222C0A223109632023384334373437222C0A2232096320234332353335
+      33222C0A223309632023394532453245222C0A22340963202344313430343022
+      2C0A223509632023414632453245222C0A223609632023443539333933222C0A
+      223709632023413442334233222C0A223809632023393739393939222C0A2239
+      09632023393739373937222C0A223009632023393639363936222C0A22610963
+      2023364136413641222C0A226209632023443636363636222C0A226309632023
+      433035423542222C0A226409632023413733443344222C0A2265096320234646
+      34373437222C0A226609632023383131323132222C0A22670963202338413741
+      3741222C0A226809632023453743434343222C0A226909632023374237303730
+      222C0A226A09632023373433363336222C0A226B09632023463837373737222C
+      0A226C09632023453036373637222C0A226D09632023443734353435222C0A22
+      6E09632023343530423042222C0A226F09632023424335353535222C0A227009
+      632023424434313431222C0A227109632023363131463146222C0A2272096320
+      23433636363636222C0A227309632023464638373837222C0A22740963202339
+      3132393239222C0A227509632023424436313631222C0A227609632023443736
+      373637222C0A227709632023383633303330222C0A2278096320234544353235
+      32222C0A227909632023393532353235222C0A227A0963202346463841384122
+      2C0A224109632023353931413141222C0A224209632023413833443344222C0A
+      224309632023423032343234222C0A224409632023453436433643222C0A2245
+      09632023454235423542222C0A224609632023423633353335222C0A22470963
+      2023434632463246222C0A224809632023394633343334222C0A224909632023
+      394632373237222C0A2220202020202020202020202020202020222C0A222020
+      20202020202020202E2B20202020222C0A222020202020202020204023242020
+      2020222C0A2220202020202020202025262020202020222C0A22202020202020
+      2020262A3D2020202020222C0A2220202020202020202A2D202020202020222C
+      0A22202020202020203B3E2C2729217E7B20222C0A22205D5E2F2020285F3A3C
+      7E5B7D7C2020222C0A2231322033343536373839306120202020222C0A226263
+      2064656667686920202020202020222C0A226A6B6C6D6E206F70202020202020
+      2020222C0A2220207120207273742020202020202020222C0A22202020207576
+      77787920202020202020222C0A22202020207A4120424320202020202020222C
+      0A2220202020444546472020202020202020222C0A2220202020204849202020
+      202020202020227D3B0AF90E00002F2A2058504D202A2F0A7374617469632063
+      686172202A206564697470617374655F78706D5B5D203D207B0A223136203136
+      203230302032222C0A2220200963204E6F6E65222C0A222E2009632023363641
+      323938222C0A222B2009632023383342333846222C0A22402009632023364641
+      463737222C0A22232009632023333839363444222C0A22242009632023464633
+      383036222C0A22252009632023464334383134222C0A22262009632023463934
+      383133222C0A222A2009632023463433433045222C0A223D2009632023373537
+      363530222C0A222D2009632023413046364232222C0A223B2009632023424546
+      464237222C0A223E2009632023424646464243222C0A222C2009632023393646
+      314133222C0A22272009632023343835463238222C0A22292009632023443833
+      323044222C0A22212009632023443633413133222C0A227E2009632023434533
+      373136222C0A227B2009632023433632333036222C0A225D2009632023464435
+      423145222C0A225E2009632023464641423337222C0A222F2009632023464639
+      313039222C0A22282009632023423737463139222C0A225F2009632023333941
+      433437222C0A223A2009632023333344313344222C0A223C2009632023333243
+      383338222C0A225B2009632023333543393339222C0A227D2009632023333744
+      343345222C0A227C2009632023313539343239222C0A22312009632023394636
+      423130222C0A22322009632023464439343038222C0A22332009632023464541
+      463339222C0A22342009632023443735333233222C0A22352009632023464436
+      323230222C0A22362009632023463642323245222C0A22372009632023414638
+      443545222C0A22382009632023363339333638222C0A22392009632023323239
+      353245222C0A22302009632023314538393235222C0A22612009632023314538
+      323242222C0A22622009632023314537463245222C0A22632009632023314637
+      463331222C0A22642009632023314237383332222C0A22652009632023344636
+      453544222C0A22662009632023414138313543222C0A22672009632023463842
+      363246222C0A22682009632023444135433235222C0A22692009632023464636
+      323141222C0A226A2009632023443541373331222C0A226B2009632023393241
+      464344222C0A226C2009632023444546324642222C0A226D2009632023443745
+      324434222C0A226E2009632023443945314441222C0A226F2009632023443944
+      444444222C0A22702009632023443944434446222C0A22712009632023443944
+      394531222C0A22722009632023443844414446222C0A22732009632023444245
+      424643222C0A22742009632023383839444344222C0A22752009632023443041
+      303333222C0A22762009632023444235413145222C0A22772009632023464236
+      343142222C0A22782009632023443441443337222C0A22792009632023413242
+      354336222C0A227A2009632023464146454646222C0A22412009632023464646
+      464646222C0A22422009632023464146444646222C0A22432009632023394241
+      414430222C0A22442009632023443041463534222C0A22452009632023444135
+      383145222C0A22462009632023463836373142222C0A22472009632023443542
+      373530222C0A22482009632023413142354344222C0A22492009632023463946
+      444646222C0A224A2009632023464346444646222C0A224B2009632023463946
+      434646222C0A224C2009632023463546424646222C0A224D2009632023463046
+      384646222C0A224E2009632023454646414646222C0A224F2009632023384341
+      344436222C0A22502009632023443042413646222C0A22512009632023443735
+      373145222C0A22522009632023463536393143222C0A22532009632023443642
+      423630222C0A22542009632023413242354432222C0A22552009632023464546
+      464646222C0A22562009632023464246454646222C0A22572009632023463846
+      424646222C0A22582009632023463646424646222C0A22592009632023463046
+      374646222C0A225A2009632023453546324646222C0A22602009632023453246
+      344646222C0A22202E09632023383339444434222C0A222E2E09632023443042
+      393642222C0A222B2E09632023443335413145222C0A22402E09632023463336
+      423144222C0A22232E09632023443742423545222C0A22242E09632023413442
+      334430222C0A22252E09632023454646374646222C0A22262E09632023453646
+      314646222C0A222A2E09632023444645464646222C0A223D2E09632023444546
+      324646222C0A222D2E09632023383439424433222C0A223B2E09632023443242
+      393641222C0A223E2E09632023443235413146222C0A222C2E09632023463036
+      453145222C0A22272E09632023443742443630222C0A22292E09632023413542
+      334430222C0A22212E09632023463946424646222C0A227E2E09632023463546
+      414646222C0A227B2E09632023454346364646222C0A225D2E09632023453045
+      464646222C0A225E2E09632023444145434646222C0A222F2E09632023443946
+      304646222C0A22282E09632023383339414433222C0A225F2E09632023443242
+      413642222C0A223A2E09632023434535443230222C0A223C2E09632023454436
+      463146222C0A225B2E09632023443743353641222C0A227D2E09632023413342
+      334434222C0A227C2E09632023463846434646222C0A22312E09632023454146
+      354646222C0A22322E09632023453446314646222C0A22332E09632023444646
+      304646222C0A22342E09632023444145454646222C0A22352E09632023443545
+      424646222C0A22362E09632023443345454646222C0A22372E09632023383239
+      384431222C0A22382E09632023443342433643222C0A22392E09632023434235
+      453230222C0A22302E09632023454137323146222C0A22612E09632023443743
+      373644222C0A22622E09632023413042334433222C0A22632E09632023463346
+      424646222C0A22642E09632023453946354646222C0A22652E09632023453646
+      344646222C0A22662E09632023453246304646222C0A22672E09632023444345
+      464646222C0A22682E09632023443745444646222C0A22692E09632023443245
+      414646222C0A226A2E09632023443045434646222C0A226B2E09632023383339
+      384432222C0A226C2E09632023443442433642222C0A226D2E09632023433936
+      313231222C0A226E2E09632023453737353230222C0A226F2E09632023443543
+      363641222C0A22702E09632023393841434436222C0A22712E09632023454646
+      384646222C0A22722E09632023453746364646222C0A22732E09632023453246
+      354646222C0A22742E09632023444346314646222C0A22752E09632023443745
+      464646222C0A22762E09632023443245434646222C0A22772E09632023434245
+      394646222C0A22782E09632023433945434646222C0A22792E09632023374139
+      314434222C0A227A2E09632023443242393639222C0A22412E09632023433636
+      343231222C0A22422E09632023453237343234222C0A22432E09632023454644
+      363646222C0A22442E09632023393639354141222C0A22452E09632023413041
+      434434222C0A22462E09632023413141444430222C0A22472E09632023394441
+      414346222C0A22482E09632023393941374345222C0A22492E09632023393641
+      354345222C0A224A2E09632023393241314343222C0A224B2E09632023384539
+      444343222C0A224C2E09632023383839424346222C0A224D2E09632023383438
+      314137222C0A224E2E09632023454644303646222C0A224F2E09632023433136
+      353236222C0A22502E09632023444437393238222C0A22512E09632023464646
+      463839222C0A22522E09632023454445343833222C0A22532E09632023443344
+      323832222C0A22542E09632023443544333831222C0A22552E09632023443544
+      333832222C0A22562E09632023443544313831222C0A22572E09632023443644
+      313831222C0A22582E09632023443643463830222C0A22592E09632023443743
+      463830222C0A225A2E09632023443543433746222C0A22602E09632023454444
+      453831222C0A22202B09632023464646453839222C0A222E2B09632023424136
+      383239222C0A222B2B09632023434234433045222C0A22402B09632023453039
+      453243222C0A22232B09632023453039363241222C0A22242B09632023453239
+      363237222C0A22252B09632023444639353237222C0A22262B09632023444339
+      343237222C0A222A2B09632023444239313236222C0A223D2B09632023443938
+      463236222C0A222D2B09632023443738443236222C0A223B2B09632023443538
+      423235222C0A223E2B09632023443338393234222C0A222C2B09632023434438
+      343236222C0A22272B09632023434338353238222C0A22292B09632023394333
+      353043222C0A222020202020202020202020202E202B20402023202020202020
+      20202020202020222C0A2220202420252026202A203D202D203B203E202C2027
+      20292021207E207B202020222C0A2220205D205E202F2028205F203A203C205B
+      207D207C2031203220332034202020222C0A2220203520362037203820392030
+      20612062206320642065206620672068202020222C0A22202069206A206B206C
+      206D206E206F2070207120722073207420752076202020222C0A222020772078
+      2079207A2041204120412041204120412042204320442045202020222C0A2220
+      204620472048204920412041204A204B204C204D204E204F2050205120202022
+      2C0A2220205220532054204920552056205720582059205A206020202E2E2E2B
+      2E2020222C0A222020402E232E242E49204A204B205820252E262E2A2E3D2E2D
+      2E3B2E3E2E2020222C0A2220202C2E272E292E4B20212E7E2E7B2E5A205D2E5E
+      2E2F2E282E5F2E3A2E2020222C0A2220203C2E5B2E7D2E7C2E5920312E322E33
+      2E342E352E362E372E382E392E2020222C0A222020302E612E622E632E642E65
+      2E662E672E682E692E6A2E6B2E6C2E6D2E2020222C0A2220206E2E6F2E702E71
+      2E722E732E742E752E762E772E782E792E7A2E412E2020222C0A222020422E43
+      2E442E452E462E472E482E492E4A2E4B2E4C2E4D2E4E2E4F2E2020222C0A2220
+      20502E512E522E532E542E552E562E572E582E592E5A2E602E202B2E2B202022
+      2C0A2220202B2B402B232B242B252B262B2A2B3D2B2D2B3B2B3E2B2C2B272B29
+      2B2020227D3B0A
+    }
+  end
+  object PopupMenu1: TPopupMenu
+    Images = ImageList2
+    left = 112
+    top = 528
+    object MenuItem1: TMenuItem
+      Action = actCopy
+      Caption = '&Copy '
+      ImageIndex = 0
+      OnClick = actCopyExecute
+    end
+    object MenuItem2: TMenuItem
+      Action = actCut
+      Caption = 'C&ut'
+      OnClick = actCutExecute
+    end
+  end
+  object PopupMenu2: TPopupMenu
+    left = 688
+    top = 72
+    object MenuItem3: TMenuItem
+      Caption = 'Copy to clipboard'
+      Bitmap.Data = {
+        880D00002F2A2058504D202A2F0A7374617469632063686172202A2065646974
+        636F70795F78706D5B5D203D207B0A223136203136203137372032222C0A2220
+        200963204E6F6E65222C0A222E2009632023343036453941222C0A222B200963
+        2023373139384244222C0A22402009632023364339344241222C0A2223200963
+        2023364239344241222C0A22242009632023364239334241222C0A2225200963
+        2023364539364244222C0A22262009632023333236303846222C0A222A200963
+        2023423643444533222C0A223D2009632023464646464646222C0A222D200963
+        2023393242354431222C0A223B2009632023423243384530222C0A223E200963
+        2023464446454646222C0A222C2009632023464246434646222C0A2227200963
+        2023463746424646222C0A22292009632023463546414646222C0A2221200963
+        2023463146374646222C0A227E2009632023464246464646222C0A227B200963
+        2023384642334430222C0A225D2009632023414443354444222C0A225E200963
+        2023464446444645222C0A222F2009632023464446454645222C0A2228200963
+        2023464446464646222C0A225F2009632023463646424646222C0A223A200963
+        2023463346414646222C0A223C2009632023463046384646222C0A225B200963
+        2023454346354646222C0A227D2009632023463646464646222C0A227C200963
+        2023384442314346222C0A22312009632023323034383741222C0A2232200963
+        2023323334393743222C0A22332009632023364439314235222C0A2234200963
+        2023393541444334222C0A22352009632023384641384331222C0A2236200963
+        2023384441374331222C0A22372009632023383941324245222C0A2238200963
+        2023433944364532222C0A22392009632023464246454646222C0A2230200963
+        2023454446374646222C0A22612009632023454146344646222C0A2262200963
+        2023463346454646222C0A22632009632023374441374345222C0A2264200963
+        2023364138424145222C0A22652009632023453345444635222C0A2266200963
+        2023444645414632222C0A22672009632023443044434537222C0A2268200963
+        2023433844374534222C0A22692009632023434244394535222C0A226A200963
+        2023434444424537222C0A226B2009632023414142464433222C0A226C200963
+        2023383039454241222C0A226D2009632023463046344638222C0A226E200963
+        2023463046394646222C0A226F2009632023453746334646222C0A2270200963
+        2023463046434646222C0A22712009632023363939434342222C0A2272200963
+        2023383339464242222C0A22732009632023453145434633222C0A2274200963
+        2023383941364330222C0A22752009632023453945464634222C0A2276200963
+        2023454446384646222C0A22772009632023453446314646222C0A2278200963
+        2023454446414646222C0A22792009632023364239434342222C0A227A200963
+        2023374439414238222C0A22412009632023464246444646222C0A2242200963
+        2023463046374646222C0A22432009632023463346434646222C0A2244200963
+        2023443045334545222C0A22452009632023383341324245222C0A2246200963
+        2023453846314635222C0A22472009632023454146364646222C0A2248200963
+        2023453346314646222C0A22492009632023453046304646222C0A224A200963
+        2023453946394646222C0A224B2009632023463546424646222C0A224C200963
+        2023463146384646222C0A224D2009632023454346364646222C0A224E200963
+        2023463046414646222C0A224F2009632023433844454544222C0A2250200963
+        2023373739434244222C0A22512009632023453646304635222C0A2252200963
+        2023453846354646222C0A22532009632023453146304646222C0A2254200963
+        2023444545464646222C0A22552009632023453746384646222C0A2256200963
+        2023363839434342222C0A22572009632023463646414646222C0A2258200963
+        2023454446364646222C0A22592009632023453746344646222C0A225A200963
+        2023454346374646222C0A22602009632023433444434544222C0A22202E0963
+        2023373639424244222C0A222E2E09632023453346304635222C0A222B2E0963
+        2023453446334646222C0A22402E09632023444445464646222C0A22232E0963
+        2023444145444646222C0A22242E09632023453346364646222C0A22252E0963
+        2023363639424342222C0A22262E09632023463846424646222C0A222A2E0963
+        2023453846344646222C0A223D2E09632023453246314646222C0A222D2E0963
+        2023453746354646222C0A223B2E09632023433044414544222C0A223E2E0963
+        2023373439414244222C0A222C2E09632023444645454635222C0A22272E0963
+        2023453146324646222C0A22292E09632023443745424646222C0A22212E0963
+        2023453046344646222C0A227E2E09632023363539414342222C0A227B2E0963
+        2023374539424238222C0A225D2E09632023463246394646222C0A225E2E0963
+        2023453246334646222C0A222F2E09632023424344384544222C0A22282E0963
+        2023373239394244222C0A225F2E09632023444345434635222C0A223A2E0963
+        2023444446304646222C0A223C2E09632023443445394646222C0A225B2E0963
+        2023444346324646222C0A227D2E09632023363439414342222C0A227C2E0963
+        2023364539314234222C0A22312E09632023454646374646222C0A22322E0963
+        2023453346324646222C0A22332E09632023453045464646222C0A22342E0963
+        2023443945444646222C0A22352E09632023444446314646222C0A22362E0963
+        2023423844364544222C0A22372E09632023373039384244222C0A22382E0963
+        2023443945424635222C0A22392E09632023444145454646222C0A22302E0963
+        2023443345414646222C0A22612E09632023443145384646222C0A22622E0963
+        2023443946314646222C0A22632E09632023363339394342222C0A22642E0963
+        2023363638434232222C0A22652E09632023454446354646222C0A22662E0963
+        2023453646324646222C0A22672E09632023444445454646222C0A22682E0963
+        2023444145464646222C0A22692E09632023423544354544222C0A226A2E0963
+        2023443845414635222C0A226B2E09632023443945434646222C0A226C2E0963
+        2023443245384646222C0A226D2E09632023443045354646222C0A226E2E0963
+        2023443746304646222C0A226F2E09632023363239394343222C0A22702E0963
+        2023364239304235222C0A22712E09632023463546464646222C0A22722E0963
+        2023454546454646222C0A22732E09632023453946434646222C0A22742E0963
+        2023453546384646222C0A22752E09632023444646354646222C0A22762E0963
+        2023453246414646222C0A22772E09632023424144454633222C0A22782E0963
+        2023373339454333222C0A22792E09632023453046354642222C0A227A2E0963
+        2023453146374646222C0A22412E09632023444146334646222C0A22422E0963
+        2023443746314646222C0A22432E09632023444646414646222C0A22442E0963
+        2023363339444346222C0A22452E09632023323335353836222C0A22462E0963
+        2023363138434237222C0A22472E09632023354338384234222C0A22482E0963
+        2023353938364233222C0A22492E09632023353638354233222C0A224A2E0963
+        2023353538354233222C0A224B2E09632023353438344233222C0A224C2E0963
+        2023353638364235222C0A224D2E09632023343437374138222C0A224E2E0963
+        2023324236323939222C0A224F2E09632023353538444246222C0A22502E0963
+        2023353338434332222C0A22512E09632023353238424332222C0A22522E0963
+        2023353138434332222C0A22532E09632023353238464333222C0A22542E0963
+        2023314535383931222C0A222020202020202E202B2040204020402040204020
+        402023202420232025202620222C0A222020202020202A203D203D203D203D20
+        3D203D203D203D203D203D203D202D20222C0A222020202020203B203D203D20
+        3D203D203D203E202C202720292021207E207B20222C0A222020202020205D20
+        5E205E205E205E202F2028205F203A203C205B207D207C20222C0A2220203120
+        3220332034203520352036203720382039203C203020612062206320222C0A22
+        64206520662067206820692069206A206B206C206D206E2061206F2070207120
+        222C0A2272203D203D203D203D203D203D203D2073207420752076206F207720
+        78207920222C0A227A203D203D203D2041202920422043204420452046204720
+        482049204A207120222C0A227A203D203D2039204B204C204D204E204F205020
+        512052205320542055205620222C0A227A203D20412057204C20582059205A20
+        6020202E2E2E2B2E402E232E242E252E222C0A227A203D20262E4C204D202A2E
+        3D2E2D2E3B2E3E2E2C2E272E232E292E212E7E2E222C0A227B2E3D205D2E5820
+        2A2E772054205E2E2F2E282E5F2E3A2E292E3C2E5B2E7D2E222C0A227C2E3D20
+        312E5920322E332E342E352E362E372E382E392E302E612E622E632E222C0A22
+        642E3D20652E662E5320672E292E682E692E372E6A2E6B2E6C2E6D2E6E2E6F2E
+        222C0A22702E3D20712E722E732E742E752E762E772E782E792E7A2E412E422E
+        432E442E222C0A22452E462E472E482E492E4A2E4B2E4C2E4D2E4E2E4F2E502E
+        512E522E532E542E227D3B0A
+      }
+      OnClick = MenuItem3Click
+    end
+  end
+end

+ 1169 - 0
fcl/fpcunit/demo/lazarusguiunner/main.lrs

@@ -0,0 +1,1169 @@
+{ This is an automatically generated lazarus resource file }
+
+LazarusResources.Add('TGUITestRunner','FORMDATA',[
+  'TPF0'#14'TGUITestRunner'#13'GUITestRunner'#7'Caption'#6#24'fpcUnit - run uni'
+  +'t tests'#12'ClientHeight'#3#0#3#11'ClientWidth'#3#134#2#9'Icon.Data'#10#201
+  +#1#0#0#197#1#0#0'/* XPM */'#10'static char * btn_run_xpm[] = {'#10'"16 14 8 '
+  +'1",'#10'" '#9'c None",'#10'".'#9'c #BA0E78",'#10'"+'#9'c #146600",'#10'"@'#9
+  +'c #F972CA",'#10'"#'#9'c #26B200",'#10'"$'#9'c #F909A5",'#10'"%'#9'c #000000'
+  +'",'#10'"&'#9'c #275919",'#10'"..      +       ",'#10'".@.     ++      ",'#10
+  +'".@@.    +#+     ",'#10'".@@@.   +##+    ",'#10'".@@@@.  +###+   ",'#10'".@'
+  +'@@@@. +####+  ",'#10'".@@@@@@.+#####+ ",'#10'".@@@@@$%+#####++",'#10'".@@@@'
+  +'$% +####&% ",'#10'".@@@$%  +###&%  ",'#10'".@@$%   +##&%   ",'#10'".@$%    '
+  +'+#&%    ",'#10'".$%     +&%     ",'#10'"%%      %%      "};'#10#8'OnCreate'
+  +#7#19'GUITestRunnerCreate'#9'OnDestroy'#7#20'GUITestRunnerDestroy'#13'Pixels'
+  +'PerInch'#2'_'#18'HorzScrollBar.Page'#3#135#2#18'VertScrollBar.Page'#3#1#3#4
+  +'Left'#3't'#1#6'Height'#3#0#3#3'Top'#3#142#0#5'Width'#3#134#2#0#6'TPanel'#6
+  +'Panel1'#5'Align'#7#5'alTop'#12'ClientHeight'#2'R'#11'ClientWidth'#3#134#2#11
+  +'FullRepaint'#8#8'TabOrder'#2#0#7'TabStop'#9#6'Height'#2'R'#5'Width'#3#134#2
+  +#0#7'TBitBtn'#6'btnRun'#7'Caption'#6#4'&Run'#10'Glyph.Data'#10#29#28#0#0#25
+  +#28#0#0'/* XPM */'#10'static char * btn_run32_xpm[] = {'#10'"32 28 327 2",'
+  +#10'"  '#9'c None",'#10'". '#9'c #BA0E78",'#10'"+ '#9'c #146600",'#10'"@ '#9
+  +'c #CA278C",'#10'"# '#9'c #DA40A1",'#10'"$ '#9'c #CE2E92",'#10'"% '#9'c #F87'
+  +'1C9",'#10'"& '#9'c #C21B83",'#10'"* '#9'c #DB42A3",'#10'"= '#9'c #F972CA",'
+  +#10'"- '#9'c #F064BF",'#10'"; '#9'c #C41E85",'#10'"> '#9'c #187900",'#10'", '
+  +#9'c #1D8C00",'#10'"'' '#9'c #1A7F00",'#10'") '#9'c #BB0F79",'#10'"! '#9'c #'
+  +'E04AA9",'#10'"~ '#9'c #EF64BE",'#10'"{ '#9'c #C11F83",'#10'"] '#9'c #AE0E71'
+  +'",'#10'"^ '#9'c #26B200",'#10'"/ '#9'c #BD137C",'#10'"( '#9'c #E654B1",'#10
+  +'"_ '#9'c #F971CA",'#10'": '#9'c #F770C8",'#10'"< '#9'c #EF62BD",'#10'"[ '#9
+  +'c #C01F83",'#10'"} '#9'c #AD0E70",'#10'"| '#9'c #229F00",'#10'"1 '#9'c #C11'
+  +'981",'#10'"2 '#9'c #E958B4",'#10'"3 '#9'c #F771C9",'#10'"4 '#9'c #F877CB",'
+  +#10'"5 '#9'c #F772C8",'#10'"6 '#9'c #EE62BC",'#10'"7 '#9'c #27B200",'#10'"8 '
+  +#9'c #C52086",'#10'"9 '#9'c #E857B4",'#10'"0 '#9'c #F677CA",'#10'"a '#9'c #F'
+  +'792D1",'#10'"b '#9'c #F780CC",'#10'"c '#9'c #F77ECD",'#10'"d '#9'c #F76FC8"'
+  +','#10'"e '#9'c #D93FA0",'#10'"f '#9'c #AC0F70",'#10'"g '#9'c #33B805",'#10
+  +'"h '#9'c #31B601",'#10'"i '#9'c #28B301",'#10'"j '#9'c #C8258A",'#10'"k '#9
+  +'c #E756B3",'#10'"l '#9'c #F677C9",'#10'"m '#9'c #F690D1",'#10'"n '#9'c #F69'
+  +'7D4",'#10'"o '#9'c #F688CE",'#10'"p '#9'c #F778CA",'#10'"q '#9'c #F46DC6",'
+  +#10'"r '#9'c #EC5FB9",'#10'"s '#9'c #D83E9F",'#10'"t '#9'c #BC2081",'#10'"u '
+  +#9'c #A20F6A",'#10'"v '#9'c #1F8D00",'#10'"w '#9'c #4AC007",'#10'"x '#9'c #5'
+  +'2C30B",'#10'"y '#9'c #3ABB07",'#10'"z '#9'c #2BB402",'#10'"A '#9'c #C9268B"'
+  +','#10'"B '#9'c #E655B2",'#10'"C '#9'c #F670C7",'#10'"D '#9'c #F689CE",'#10
+  +'"E '#9'c #F696D3",'#10'"F '#9'c #F691D1",'#10'"G '#9'c #F780CD",'#10'"H '#9
+  +'c #F46EC5",'#10'"I '#9'c #F267C0",'#10'"J '#9'c #E758B3",'#10'"K '#9'c #D53'
+  +'D9D",'#10'"L '#9'c #B1227C",'#10'"M '#9'c #88105A",'#10'"N '#9'c #125C00",'
+  +#10'"O '#9'c #146700",'#10'"P '#9'c #2A9100",'#10'"Q '#9'c #64C404",'#10'"R '
+  +#9'c #64C70B",'#10'"S '#9'c #4FC40E",'#10'"T '#9'c #3BBC08",'#10'"U '#9'c #2'
+  +'BB401",'#10'"V '#9'c #24A001",'#10'"W '#9'c #249102",'#10'"X '#9'c #1B7F00"'
+  +','#10'"Y '#9'c #BB107A",'#10'"Z '#9'c #BC117B",'#10'"` '#9'c #F46DC4",'#10
+  +'" .'#9'c #F585CB",'#10'"..'#9'c #F698D4",'#10'"+.'#9'c #F7A1D8",'#10'"@.'#9
+  +'c #F588CF",'#10'"#.'#9'c #F474C8",'#10'"$.'#9'c #F36CC4",'#10'"%.'#9'c #F16'
+  +'6BF",'#10'"&.'#9'c #E759B4",'#10'"*.'#9'c #D13C9A",'#10'"=.'#9'c #AE1F77",'
+  +#10'"-.'#9'c #8D135E",'#10'";.'#9'c #1E5309",'#10'">.'#9'c #166800",'#10'",.'
+  +#9'c #208D00",'#10'"''.'#9'c #6AC605",'#10'").'#9'c #79CB09",'#10'"!.'#9'c #'
+  +'72CC0C",'#10'"~.'#9'c #5BC509",'#10'"{.'#9'c #42BD07",'#10'"].'#9'c #3CBD09'
+  +'",'#10'"^.'#9'c #2DB503",'#10'"/.'#9'c #1E8C00",'#10'"(.'#9'c #EF67BF",'#10
+  +'"_.'#9'c #F481CB",'#10'":.'#9'c #F699D5",'#10'"<.'#9'c #F597D4",'#10'"[.'#9
+  +'c #F7A5D9",'#10'"}.'#9'c #F58ECF",'#10'"|.'#9'c #F47DC8",'#10'"1.'#9'c #F46'
+  +'DC5",'#10'"2.'#9'c #F066BE",'#10'"3.'#9'c #E352AE",'#10'"4.'#9'c #CF3B99",'
+  +#10'"5.'#9'c #B4297E",'#10'"6.'#9'c #8A225A",'#10'"7.'#9'c #464225",'#10'"8.'
+  +#9'c #1C6704",'#10'"9.'#9'c #56BF04",'#10'"0.'#9'c #6BC90B",'#10'"a.'#9'c #7'
+  +'ACE0B",'#10'"b.'#9'c #7FCE0A",'#10'"c.'#9'c #50C40C",'#10'"d.'#9'c #48C00A"'
+  +','#10'"e.'#9'c #35B803",'#10'"f.'#9'c #2BA403",'#10'"g.'#9'c #BC127B",'#10
+  +'"h.'#9'c #D73D9E",'#10'"i.'#9'c #EE65BE",'#10'"j.'#9'c #F47ECA",'#10'"k.'#9
+  +'c #F48DCE",'#10'"l.'#9'c #F68FD1",'#10'"m.'#9'c #F7ADDC",'#10'"n.'#9'c #F5A'
+  +'1D5",'#10'"o.'#9'c #F591CF",'#10'"p.'#9'c #F475C8",'#10'"q.'#9'c #F368C3",'
+  +#10'"r.'#9'c #ED5DBB",'#10'"s.'#9'c #DF4CAA",'#10'"t.'#9'c #C1328B",'#10'"u.'
+  +#9'c #922160",'#10'"v.'#9'c #583A32",'#10'"w.'#9'c #206407",'#10'"x.'#9'c #1'
+  ,'D8B00",'#10'"y.'#9'c #49BB03",'#10'"z.'#9'c #53C208",'#10'"A.'#9'c #7FCD0A"'
+  +','#10'"B.'#9'c #78CB08",'#10'"C.'#9'c #61C709",'#10'"D.'#9'c #56C70F",'#10
+  +'"E.'#9'c #3EBB07",'#10'"F.'#9'c #37BA06",'#10'"G.'#9'c #31B704",'#10'"H.'#9
+  +'c #D63C9D",'#10'"I.'#9'c #EE63BD",'#10'"J.'#9'c #F479C8",'#10'"K.'#9'c #F67'
+  +'5C8",'#10'"L.'#9'c #F69FD7",'#10'"M.'#9'c #F5B3DD",'#10'"N.'#9'c #F5A3D8",'
+  +#10'"O.'#9'c #F486CE",'#10'"P.'#9'c #F468C2",'#10'"Q.'#9'c #EE51B7",'#10'"R.'
+  +#9'c #D838A0",'#10'"S.'#9'c #A42274",'#10'"T.'#9'c #651A41",'#10'"U.'#9'c #3'
+  +'8361E",'#10'"V.'#9'c #1B6304",'#10'"W.'#9'c #3AB501",'#10'"X.'#9'c #43BD07"'
+  +','#10'"Y.'#9'c #6FCA0B",'#10'"Z.'#9'c #67C90C",'#10'"`.'#9'c #6DCB0C",'#10
+  +'" +'#9'c #75CC0B",'#10'".+'#9'c #5DC509",'#10'"++'#9'c #34B805",'#10'"@+'#9
+  +'c #BE157E",'#10'"#+'#9'c #EE61BC",'#10'"$+'#9'c #F46FC6",'#10'"%+'#9'c #F58'
+  +'0CB",'#10'"&+'#9'c #F6A2D9",'#10'"*+'#9'c #F7AFDC",'#10'"=+'#9'c #F6A7DA",'
+  +#10'"-+'#9'c #F69DD5",'#10'";+'#9'c #F476C7",'#10'">+'#9'c #ED58BA",'#10'",+'
+  +#9'c #DE39A5",'#10'"''+'#9'c #BF1C85",'#10'")+'#9'c #770E52",'#10'"!+'#9'c #'
+  +'2E131C",'#10'"~+'#9'c #163507",'#10'"{+'#9'c #166300",'#10'"]+'#9'c #24AD00'
+  +'",'#10'"^+'#9'c #47C009",'#10'"/+'#9'c #69C90B",'#10'"(+'#9'c #6BCB0B",'#10
+  +'"_+'#9'c #66C70A",'#10'":+'#9'c #61C508",'#10'"<+'#9'c #49BD06",'#10'"[+'#9
+  +'c #2CB502",'#10'"}+'#9'c #BF167F",'#10'"|+'#9'c #F56EC6",'#10'"1+'#9'c #F68'
+  +'0CC",'#10'"2+'#9'c #F795D4",'#10'"3+'#9'c #F6A3D9",'#10'"4+'#9'c #F58FD1",'
+  +#10'"5+'#9'c #F052B8",'#10'"6+'#9'c #B22180",'#10'"7+'#9'c #7B0B53",'#10'"8+'
+  +#9'c #48052F",'#10'"9+'#9'c #16120C",'#10'"0+'#9'c #0D3D00",'#10'"a+'#9'c #1'
+  +'C8B00",'#10'"b+'#9'c #2EB603",'#10'"c+'#9'c #44BE08",'#10'"d+'#9'c #59C50B"'
+  +','#10'"e+'#9'c #60C509",'#10'"f+'#9'c #5AC70E",'#10'"g+'#9'c #46C00B",'#10
+  +'"h+'#9'c #279C06",'#10'"i+'#9'c #26860C",'#10'"j+'#9'c #185C06",'#10'"k+'#9
+  +'c #0A3300",'#10'"l+'#9'c #0D4400",'#10'"m+'#9'c #D73C9E",'#10'"n+'#9'c #F57'
+  +'2C7",'#10'"o+'#9'c #F686CF",'#10'"p+'#9'c #F79ED8",'#10'"q+'#9'c #F58BCF",'
+  +#10'"r+'#9'c #F467C3",'#10'"s+'#9'c #C01B87",'#10'"t+'#9'c #7C0B53",'#10'"u+'
+  +#9'c #360424",'#10'"v+'#9'c #14030C",'#10'"w+'#9'c #0E4D00",'#10'"x+'#9'c #1'
+  +'46800",'#10'"y+'#9'c #26AD00",'#10'"z+'#9'c #30B603",'#10'"A+'#9'c #3CBC08"'
+  +','#10'"B+'#9'c #3DBD09",'#10'"C+'#9'c #40BC06",'#10'"D+'#9'c #275919",'#10
+  +'"E+'#9'c #142C0C",'#10'"F+'#9'c #000000",'#10'"G+'#9'c #F579C9",'#10'"H+'#9
+  +'c #F68FD2",'#10'"I+'#9'c #F593D3",'#10'"J+'#9'c #F46BC5",'#10'"K+'#9'c #480'
+  +'230",'#10'"L+'#9'c #16000E",'#10'"M+'#9'c #0E4F00",'#10'"N+'#9'c #146A00",'
+  +#10'"O+'#9'c #24AC00",'#10'"P+'#9'c #29B301",'#10'"Q+'#9'c #38BB07",'#10'"R+'
+  +#9'c #3CBB07",'#10'"S+'#9'c #3BBA04",'#10'"T+'#9'c #289D06",'#10'"U+'#9'c #1'
+  +'D590C",'#10'"V+'#9'c #0D1E08",'#10'"W+'#9'c #BE147D",'#10'"X+'#9'c #D73C9D"'
+  +','#10'"Y+'#9'c #F580CC",'#10'"Z+'#9'c #F46CC5",'#10'"`+'#9'c #360324",'#10
+  +'" @'#9'c #25AC00",'#10'".@'#9'c #30B704",'#10'"+@'#9'c #EF65BD",'#10'"@@'#9
+  +'c #F47FCC",'#10'"#@'#9'c #29AE02",'#10'"$@'#9'c #2FB603",'#10'"%@'#9'c #269'
+  +'C06",'#10'"&@'#9'c #F065BE",'#10'"*@'#9'c #F469C3",'#10'"=@'#9'c #26AD01",'
+  +#10'"-@'#9'c #2FB503",'#10'";@'#9'c #BA0F79",'#10'">@'#9'c #EF5EBB",'#10'",@'
+  +#9'c #F253BA",'#10'"''@'#9'c #E33AA8",'#10'")@'#9'c #B42181",'#10'"!@'#9'c #'
+  +'7C0A53",'#10'"~@'#9'c #13000C",'#10'"{@'#9'c #24AA00",'#10'"]@'#9'c #269B06'
+  +'",'#10'"^@'#9'c #DA3D9F",'#10'"/@'#9'c #EB56B6",'#10'"(@'#9'c #E33AA9",'#10
+  +'"_@'#9'c #C61A8B",'#10'":@'#9'c #310221",'#10'"<@'#9'c #146900",'#10'"[@'#9
+  +'c #1C8800",'#10'"}@'#9'c #25A801",'#10'"|@'#9'c #26850C",'#10'"1@'#9'c #DA2'
+  +'698",'#10'"2@'#9'c #EA36AB",'#10'"3@'#9'c #B71F81",'#10'"4@'#9'c #7B0A53",'
+  +#10'"5@'#9'c #470230",'#10'"6@'#9'c #1C7406",'#10'"7@'#9'c #25830C",'#10'"8@'
+  +#9'c #DA0C8E",'#10'"9@'#9'c #F109A1",'#10'"0@'#9'c #7C0654",'#10'"a@'#9'c #2'
+  +'9021B",'#10'"b@'#9'c #12000B",'#10'"c@'#9'c #0D4C00",'#10'"d@'#9'c #125F00"'
+  +','#10'"e@'#9'c #1D5F0C",'#10'"f@'#9'c #5D073C",'#10'"g@'#9'c #6D0647",'#10
+  +'"h@'#9'c #7C0452",'#10'"i@'#9'c #520336",'#10'"j@'#9'c #060004",'#10'"k@'#9
+  +'c #082E00",'#10'"l@'#9'c #0F3006",'#10'".                                  '
+  +'                             ",'#10'". . . . .                       + +   '
+  +'                          ",'#10'". . @ # $ .                     + + +    '
+  +'                       ",'#10'". . # % # & .                   + + + + +   '
+  +'                    ",'#10'". . * = - # ; .                 + + > , '' +   '
+  +'                  ",'#10'". ) ! = = ~ # { ]               + + , ^ , + +    '
+  +'               ",'#10'". / ( _ % : < # [ }             + + , ^ | , '' +    '
+  +'             ",'#10'". 1 2 3 4 3 5 6 # [ }           + + , ^ 7 ^ , + +     '
+  +'          ",'#10'". 8 9 0 a b c d < e [ f         + + , g h i | , '' +     '
+  +'        ",'#10'". j k l m n o p q r s t u       + + v w x y z ^ , + +      '
+  +'     ",'#10'") A B C D E F G H I J K L M     N O P Q R S T U V W X +       '
+  +'  ",'#10'"Y Z # `  ...+.@.#.$.%.&.*.=.-.  ;.>.,.''.).!.~.{.].^./.+ +       '
+  ,'",'#10'"Z Z e (._.:.<.[.}.|.1.2.3.4.5.6.7.8., 9.0.a.b.c.d.e.f., '' +     ",'
+  +#10'"Z g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.C.D.E.F.G., +     ",'#10
+  +'"Z / H.I.J.K...L.M.N.O.P.Q.R.S.T.U.V.x.W.X.Y.Z.`. +.+T ++, + +   ",'#10'"Z '
+  +'@+H.#+$+%+&+*+=+-+;+>+,+''+)+!+~+{+x.]+^+/+(+_+:+<+[+7 , + + + ",'#10'"Y }+'
+  +'H.#+|+1+2+3+4+#.5+,+6+7+8+9+0++ a+]+b+c+d+e+f+g+h+i+j+k+l++ ",'#10'") }+m+#'
+  +'+n+o+p+q+r+>+,+s+t+u+v+  w+x+a+y+z+A+B+/+C+7 i+D+E+F+F+  ",'#10'". }+m+#+G+'
+  +'H+I+J+5+,+6+t+K+L+    M+N+a+O+P+Q+R+S+T+i+U+E+V+F+    ",'#10'". W+X+6 Y+l.Z'
+  +'+>+,+s+t+`+L+      M+N+a+ @[email protected]+^ i+D+E+F+F+      ",'#10'". / h.+@@@H 5+,+'
+  +'6+t+K+L+        M+N+a+#@b+$@%@i+U+E+V+F+        ",'#10'". Z h.&@*@>+,+s+t+`'
+  +'+L+          M+N+a+=@-@7 i+D+E+F+F+          ",'#10'". ;@h.>@,@''@)@!@K+~@ '
+  +'           M+N+a+{@]@i+U+E+V+F+            ",'#10'". . ^@/@(@_@!@:@~@      '
+  +'        M+<@[@}@|@D+E+F+F+              ",'#10'". . 1@2@3@4@5@~@           '
+  +'     M+O 6@7@U+E+V+F+                ",'#10'". . 8@9@0@a@b@                '
+  +'  c@d@e@D+E+F+F+                  ",'#10'"f@f@g@h@i@j@                    k'
+  +'@k+l@E+V+                      ",'#10'"F+F+F+  F+                      F+  '
+  +'F+                          "};'#10#7'OnClick'#7#11'btnRunClick'#8'TabOrder'
+  +#2#0#4'Left'#2#16#6'Height'#2'/'#3'Top'#2#16#5'Width'#2'g'#0#0#7'TBitBtn'#7
+  +'BitBtn1'#7'Caption'#6#5'&Exit'#10'Glyph.Data'#10#184'%'#0#0#180'%'#0#0'/* X'
+  +'PM */'#10'static char * exit_xpm[] = {'#10'"32 32 464 2",'#10'"  '#9'c None'
+  +'",'#10'". '#9'c #9E0000",'#10'"+ '#9'c #9C0000",'#10'"@ '#9'c #9B0000",'#10
+  +'"# '#9'c #990000",'#10'"$ '#9'c #960000",'#10'"% '#9'c #940000",'#10'"& '#9
+  +'c #A40000",'#10'"* '#9'c #A30000",'#10'"= '#9'c #B31915",'#10'"- '#9'c #C94'
+  +'D47",'#10'"; '#9'c #D66F69",'#10'"> '#9'c #DD7C76",'#10'", '#9'c #DB7873",'
+  +#10'"'' '#9'c #D46660",'#10'") '#9'c #C34641",'#10'"! '#9'c #A91C19",'#10'"~'
+  +' '#9'c #910000",'#10'"{ '#9'c #8C0000",'#10'"] '#9'c #A50000",'#10'"^ '#9'c'
+  +' #C13731",'#10'"/ '#9'c #E59A94",'#10'"( '#9'c #FCDFDA",'#10'"_ '#9'c #FFF4'
+  +'F2",'#10'": '#9'c #FFFCFB",'#10'"< '#9'c #FFFAFA",'#10'"[ '#9'c #FFEEEF",'
+  +#10'"} '#9'c #FFDDDD",'#10'"| '#9'c #FFC3C2",'#10'"1 '#9'c #FCA9A5",'#10'"2 '
+  +#9'c #E27570",'#10'"3 '#9'c #B4312C",'#10'"4 '#9'c #8A0100",'#10'"5 '#9'c #A'
+  +'E0B08",'#10'"6 '#9'c #DF837B",'#10'"7 '#9'c #FFEEEA",'#10'"8 '#9'c #FFFFFF"'
+  +','#10'"9 '#9'c #FFF8F8",'#10'"0 '#9'c #E3C3C4",'#10'"a '#9'c #B07373",'#10
+  +'"b '#9'c #AD6C6C",'#10'"c '#9'c #D99E9E",'#10'"d '#9'c #FCC2C2",'#10'"e '#9
+  +'c #F8B2B2",'#10'"f '#9'c #FDABAC",'#10'"g '#9'c #FF9995",'#10'"h '#9'c #D95'
+  +'C55",'#10'"i '#9'c #94100D",'#10'"j '#9'c #810000",'#10'"k '#9'c #A60000",'
+  +#10'"l '#9'c #B20F0D",'#10'"m '#9'c #ECABA5",'#10'"n '#9'c #FFFCFC",'#10'"o '
+  +#9'c #FEF2F2",'#10'"p '#9'c #FBE8E8",'#10'"q '#9'c #AA6B6B",'#10'"r '#9'c #C'
+  +'09D9D",'#10'"s '#9'c #C9ADAD",'#10'"t '#9'c #A15858",'#10'"u '#9'c #EFA7A7"'
+  +','#10'"v '#9'c #F4A9A8",'#10'"w '#9'c #F29C9C",'#10'"x '#9'c #F59292",'#10
+  +'"y '#9'c #FF8C8B",'#10'"z '#9'c #E96460",'#10'"A '#9'c #961512",'#10'"B '#9
+  +'c #7C0000",'#10'"C '#9'c #AD0D0A",'#10'"D '#9'c #EDADA6",'#10'"E '#9'c #FFF'
+  +'5F5",'#10'"F '#9'c #FDE8E8",'#10'"G '#9'c #F6D5D5",'#10'"H '#9'c #B47474",'
+  +#10'"I '#9'c #F9F5F5",'#10'"J '#9'c #AF6C6C",'#10'"K '#9'c #E59090",'#10'"L '
+  +#9'c #F59F9F",'#10'"M '#9'c #F39393",'#10'"N '#9'c #EE8787",'#10'"O '#9'c #E'
+  +'F7B7C",'#10'"P '#9'c #FE7474",'#10'"Q '#9'c #EA5853",'#10'"R '#9'c #8D0E0C"'
+  +','#10'"S '#9'c #7B0000",'#10'"T '#9'c #DF827B",'#10'"U '#9'c #FFFDFD",'#10
+  +'"V '#9'c #F4DEDE",'#10'"W '#9'c #FCE0E0",'#10'"X '#9'c #F7CCCC",'#10'"Y '#9
+  +'c #B77070",'#10'"Z '#9'c #F5EEEE",'#10'"` '#9'c #B36868",'#10'" .'#9'c #E68'
+  +'888",'#10'"..'#9'c #F59797",'#10'"+.'#9'c #EA7B7B",'#10'"@.'#9'c #F27E7E",'
+  +#10'"#.'#9'c #EC7373",'#10'"$.'#9'c #EC6565",'#10'"%.'#9'c #FF605F",'#10'"&.'
+  +#9'c #D63E3B",'#10'"*.'#9'c #7A0302",'#10'"=.'#9'c #C23731",'#10'"-.'#9'c #F'
+  +'EF0EE",'#10'";.'#9'c #CD9292",'#10'">.'#9'c #AD5C5C",'#10'",.'#9'c #C77D7D"'
+  +','#10'"''.'#9'c #F8C6C6",'#10'").'#9'c #BC6E6E",'#10'"!.'#9'c #F6EFEF",'#10
+  +'"~.'#9'c #B76767",'#10'"{.'#9'c #EA8383",'#10'"].'#9'c #C95A5A",'#10'"^.'#9
+  +'c #AA4E4E",'#10'"/.'#9'c #BD4040",'#10'"(.'#9'c #EE6666",'#10'"_.'#9'c #EA5'
+  +'D5D",'#10'":.'#9'c #EE5050",'#10'"<.'#9'c #FF4B49",'#10'"[.'#9'c #A91F1C",'
+  +#10'"}.'#9'c #720000",'#10'"|.'#9'c #E69790",'#10'"1.'#9'c #FFFBFB",'#10'"2.'
+  +#9'c #CD8D8D",'#10'"3.'#9'c #BB7171",'#10'"4.'#9'c #F0E3E3",'#10'"5.'#9'c #B'
+  +'F7A7A",'#10'"6.'#9'c #D68282",'#10'"7.'#9'c #C37272",'#10'"8.'#9'c #F5F0F0"'
+  +','#10'"9.'#9'c #FDFFFF",'#10'"0.'#9'c #BE6969",'#10'"a.'#9'c #D35656",'#10
+  +'"b.'#9'c #BA6767",'#10'"c.'#9'c #F2ECEC",'#10'"d.'#9'c #C48E8E",'#10'"e.'#9
+  +'c #BA2A2A",'#10'"f.'#9'c #ED5454",'#10'"g.'#9'c #E54646",'#10'"h.'#9'c #F93'
+  +'B3C",'#10'"i.'#9'c #DD322F",'#10'"j.'#9'c #750202",'#10'"k.'#9'c #B31A16",'
+  +#10'"l.'#9'c #FCA998",'#10'"m.'#9'c #FEEFED",'#10'"n.'#9'c #E6B8B8",'#10'"o.'
+  +#9'c #B85F5F",'#10'"p.'#9'c #FAF7F7",'#10'"q.'#9'c #D5A6A6",'#10'"r.'#9'c #B'
+  ,'E4D4D",'#10'"s.'#9'c #C87171",'#10'"t.'#9'c #F4EFEF",'#10'"u.'#9'c #FCFFFF"'
+  +','#10'"v.'#9'c #C46969",'#10'"w.'#9'c #BB3030",'#10'"x.'#9'c #CC9797",'#10
+  +'"y.'#9'c #FEFFFF",'#10'"z.'#9'c #BE7171",'#10'"A.'#9'c #CC2424",'#10'"B.'#9
+  +'c #EA4040",'#10'"C.'#9'c #E93131",'#10'"D.'#9'c #E74039",'#10'"E.'#9'c #901'
+  +'412",'#10'"F.'#9'c #9F0000",'#10'"G.'#9'c #C94A42",'#10'"H.'#9'c #FF967E",'
+  +#10'"I.'#9'c #F6775D",'#10'"J.'#9'c #FDEBEA",'#10'"K.'#9'c #C36869",'#10'"L.'
+  +#9'c #E5C6C6",'#10'"M.'#9'c #E9CFCF",'#10'"N.'#9'c #BA4C4C",'#10'"O.'#9'c #E'
+  +'68A8A",'#10'"P.'#9'c #C96A6A",'#10'"Q.'#9'c #F3F1F1",'#10'"R.'#9'c #FBFFFF"'
+  +','#10'"S.'#9'c #C56565",'#10'"T.'#9'c #DF5555",'#10'"U.'#9'c #BA3636",'#10
+  +'"V.'#9'c #E2C1C1",'#10'"W.'#9'c #EFE7E7",'#10'"X.'#9'c #BB3132",'#10'"Y.'#9
+  +'c #E52929",'#10'"Z.'#9'c #CB1C14",'#10'"`.'#9'c #D7382E",'#10'" +'#9'c #AA2'
+  +'11E",'#10'".+'#9'c #6A0000",'#10'"++'#9'c #9D0000",'#10'"@+'#9'c #D76157",'
+  +#10'"#+'#9'c #FE886D",'#10'"$+'#9'c #EE1E00",'#10'"%+'#9'c #E35342",'#10'"&+'
+  +#9'c #CB7B7D",'#10'"*+'#9'c #F9FBFB",'#10'"=+'#9'c #F8F8F8",'#10'"-+'#9'c #C'
+  +'45F5F",'#10'";+'#9'c #E38282",'#10'">+'#9'c #F69E9E",'#10'",+'#9'c #C96161"'
+  +','#10'"''+'#9'c #FAFFFF",'#10'")+'#9'c #C76161",'#10'"!+'#9'c #E65858",'#10
+  +'"~+'#9'c #E34A4A",'#10'"{+'#9'c #BE4040",'#10'"]+'#9'c #F4F0F0",'#10'"^+'#9
+  +'c #CF8081",'#10'"/+'#9'c #BD0602",'#10'"(+'#9'c #B30B00",'#10'"_+'#9'c #D02'
+  +'A20",'#10'":+'#9'c #B82723",'#10'"<+'#9'c #690000",'#10'"[+'#9'c #DC6A5E",'
+  +#10'"}+'#9'c #FB7A5E",'#10'"|+'#9'c #EB2300",'#10'"1+'#9'c #CF0700",'#10'"2+'
+  +#9'c #D79698",'#10'"3+'#9'c #E3BCBC",'#10'"4+'#9'c #CC5252",'#10'"5+'#9'c #F'
+  +'8A6A6",'#10'"6+'#9'c #EE8686",'#10'"7+'#9'c #CD5F5F",'#10'"8+'#9'c #F8FFFF"'
+  +','#10'"9+'#9'c #CB6060",'#10'"0+'#9'c #E14848",'#10'"a+'#9'c #ED5555",'#10
+  +'"b+'#9'c #CA2121",'#10'"c+'#9'c #DCA8A8",'#10'"d+'#9'c #E0B2B2",'#10'"e+'#9
+  +'c #AB0403",'#10'"f+'#9'c #B00800",'#10'"g+'#9'c #CB231A",'#10'"h+'#9'c #BD2'
+  +'722",'#10'"i+'#9'c #9A0000",'#10'"j+'#9'c #DB665C",'#10'"k+'#9'c #F8765B",'
+  +#10'"l+'#9'c #E92000",'#10'"m+'#9'c #CD1003",'#10'"n+'#9'c #E0B1B3",'#10'"o+'
+  +#9'c #D99494",'#10'"p+'#9'c #DB6262",'#10'"q+'#9'c #F69FA1",'#10'"r+'#9'c #E'
+  +'F8182",'#10'"s+'#9'c #D16061",'#10'"t+'#9'c #F7FFFF",'#10'"u+'#9'c #D06363"'
+  +','#10'"v+'#9'c #E34041",'#10'"w+'#9'c #ED4C4D",'#10'"x+'#9'c #D6201F",'#10
+  +'"y+'#9'c #D48181",'#10'"z+'#9'c #EAC9C9",'#10'"A+'#9'c #B00E0D",'#10'"B+'#9
+  +'c #AC0500",'#10'"C+'#9'c #C82018",'#10'"D+'#9'c #BC231F",'#10'"E+'#9'c #680'
+  +'000",'#10'"F+'#9'c #970000",'#10'"G+'#9'c #D35A51",'#10'"H+'#9'c #F77961",'
+  +#10'"I+'#9'c #E62000",'#10'"J+'#9'c #CF1003",'#10'"K+'#9'c #E3B3B5",'#10'"L+'
+  +#9'c #DD9595",'#10'"M+'#9'c #CD2118",'#10'"N+'#9'c #E35547",'#10'"O+'#9'c #E'
+  +'7635D",'#10'"P+'#9'c #D04341",'#10'"Q+'#9'c #DC8C8E",'#10'"R+'#9'c #E09799"'
+  +','#10'"S+'#9'c #CC3B3A",'#10'"T+'#9'c #DD3530",'#10'"U+'#9'c #D42B22",'#10
+  +'"V+'#9'c #BF0706",'#10'"W+'#9'c #D87F7E",'#10'"X+'#9'c #F9FFFF",'#10'"Y+'#9
+  +'c #ECCACB",'#10'"Z+'#9'c #B30F0E",'#10'"`+'#9'c #A80400",'#10'" @'#9'c #CA1'
+  +'F18",'#10'".@'#9'c #B41D1B",'#10'"+@'#9'c #640000",'#10'"@@'#9'c #C3433C",'
+  +#10'"#@'#9'c #F88772",'#10'"$@'#9'c #E32A09",'#10'"%@'#9'c #D00900",'#10'"&@'
+  +#9'c #E19D9E",'#10'"*@'#9'c #F5FFFF",'#10'"=@'#9'c #E8BBBB",'#10'"-@'#9'c #C'
+  +'60600",'#10'";@'#9'c #CE1200",'#10'">@'#9'c #CC1902",'#10'",@'#9'c #C91703"'
+  +','#10'"''@'#9'c #BF0300",'#10'")@'#9'c #BD0200",'#10'"!@'#9'c #C10F00",'#10
+  +'"~@'#9'c #C01301",'#10'"{@'#9'c #B80D00",'#10'"]@'#9'c #B50000",'#10'"^@'#9
+  +'c #E4A0A1",'#10'"/@'#9'c #E9B6B7",'#10'"(@'#9'c #B20606",'#10'"_@'#9'c #A70'
+  +'500",'#10'":@'#9'c #D0211C",'#10'"<@'#9'c #A41513",'#10'"[@'#9'c #5F0000",'
+  +#10'"}@'#9'c #A91E1A",'#10'"|@'#9'c #F58878",'#10'"1@'#9'c #E43E21",'#10'"2@'
+  +#9'c #D40600",'#10'"3@'#9'c #DF706F",'#10'"4@'#9'c #F2FFFF",'#10'"5@'#9'c #F'
+  +'4F4F5",'#10'"6@'#9'c #D53F3E",'#10'"7@'#9'c #C80700",'#10'"8@'#9'c #CA1B00"'
+  +','#10'"9@'#9'c #C71700",'#10'"0@'#9'c #C51600",'#10'"a@'#9'c #C31500",'#10
+  +'"b@'#9'c #C01300",'#10'"c@'#9'c #BB1200",'#10'"d@'#9'c #B40300",'#10'"e@'#9
+  +'c #CA2826",'#10'"f@'#9'c #F3E7E7",'#10'"g@'#9'c #F3FFFF",'#10'"h@'#9'c #E38'
+  +'988",'#10'"i@'#9'c #AA0000",'#10'"j@'#9'c #AD0B05",'#10'"k@'#9'c #D6241F",'
+  +#10'"l@'#9'c #880B0A",'#10'"m@'#9'c #5E0000",'#10'"n@'#9'c #DD695E",'#10'"o@'
+  +#9'c #ED614A",'#10'"p@'#9'c #D51200",'#10'"q@'#9'c #D62320",'#10'"r@'#9'c #F'
+  +'2E2E3",'#10'"s@'#9'c #EEFEFD",'#10'"t@'#9'c #F0C2C3",'#10'"u@'#9'c #CE1110"'
+  +','#10'"v@'#9'c #C40800",'#10'"w@'#9'c #C21600",'#10'"x@'#9'c #BF1600",'#10
+  +'"y@'#9'c #BD1400",'#10'"z@'#9'c #BA1200",'#10'"A@'#9'c #B40500",'#10'"B@'#9
+  +'c #C30506",'#10'"C@'#9'c #EDACAC",'#10'"D@'#9'c #EFFFFE",'#10'"E@'#9'c #F5F'
+  +'1F1",'#10'"F@'#9'c #CF3636",'#10'"G@'#9'c #A00000",'#10'"H@'#9'c #BE1510",'
+  +#10'"I@'#9'c #C51C19",'#10'"J@'#9'c #660100",'#10'"K@'#9'c #B32E28",'#10'"L@'
+  +#9'c #F57F70",'#10'"M@'#9'c #DC351A",'#10'"N@'#9'c #CE0000",'#10'"O@'#9'c #E'
+  +'77071",'#10'"P@'#9'c #F1FFFF",'#10'"Q@'#9'c #EDFAFA",'#10'"R@'#9'c #F1BFC0"'
+  ,','#10'"S@'#9'c #DA3738",'#10'"T@'#9'c #C70000",'#10'"U@'#9'c #C00100",'#10
+  +'"V@'#9'c #BE0000",'#10'"W@'#9'c #C00000",'#10'"X@'#9'c #D32A2B",'#10'"Y@'#9
+  +'c #EFADAE",'#10'"Z@'#9'c #EEF9F9",'#10'"`@'#9'c #F0FFFF",'#10'" #'#9'c #EE8'
+  +'D8E",'#10'".#'#9'c #B00000",'#10'"+#'#9'c #A80904",'#10'"@#'#9'c #D51E1A",'
+  +#10'"##'#9'c #970E0C",'#10'"$#'#9'c #5A0000",'#10'"%#'#9'c #8B0101",'#10'"&#'
+  +#9'c #D3564D",'#10'"*#'#9'c #EF6A59",'#10'"=#'#9'c #CF1D06",'#10'"-#'#9'c #D'
+  +'10401",'#10'";#'#9'c #F2989A",'#10'">#'#9'c #EAFDFD",'#10'",#'#9'c #F1E9E9"'
+  +','#10'"''#'#9'c #EFA6A8",'#10'")#'#9'c #EA7F81",'#10'"!#'#9'c #EA7D7F",'#10
+  +'"~#'#9'c #EFA0A2",'#10'"{#'#9'c #F3E2E2",'#10'"]#'#9'c #EBFDFD",'#10'"^#'#9
+  +'c #EEFFFF",'#10'"/#'#9'c #F8B1B1",'#10'"(#'#9'c #C40A0A",'#10'"_#'#9'c #A00'
+  +'301",'#10'":#'#9'c #CA1915",'#10'"<#'#9'c #BE1714",'#10'"[#'#9'c #640101",'
+  +#10'"}#'#9'c #95100E",'#10'"|#'#9'c #E06258",'#10'"1#'#9'c #E75847",'#10'"2#'
+  +#9'c #C91605",'#10'"3#'#9'c #D10404",'#10'"4#'#9'c #F3787A",'#10'"5#'#9'c #F'
+  +'5E8E8",'#10'"6#'#9'c #EBFEFE",'#10'"7#'#9'c #E8FFFF",'#10'"8#'#9'c #ECFFFF"'
+  +','#10'"9#'#9'c #E9FFFF",'#10'"0#'#9'c #EAFFFF",'#10'"a#'#9'c #F68D8E",'#10
+  +'"b#'#9'c #C70E0E",'#10'"c#'#9'c #A00100",'#10'"d#'#9'c #C31612",'#10'"e#'#9
+  +'c #CC1A17",'#10'"f#'#9'c #770404",'#10'"g#'#9'c #971312",'#10'"h#'#9'c #DF5'
+  +'A51",'#10'"i#'#9'c #E75647",'#10'"j#'#9'c #C81F0F",'#10'"k#'#9'c #C60000",'
+  +#10'"l#'#9'c #E12827",'#10'"m#'#9'c #F58081",'#10'"n#'#9'c #F7B5B5",'#10'"o#'
+  +#9'c #F5CCCD",'#10'"p#'#9'c #F6CECE",'#10'"q#'#9'c #F7B8B9",'#10'"r#'#9'c #F'
+  +'68A8A",'#10'"s#'#9'c #E03433",'#10'"t#'#9'c #B70000",'#10'"u#'#9'c #A60601"'
+  +','#10'"v#'#9'c #CD1A17",'#10'"w#'#9'c #7D0605",'#10'"x#'#9'c #590000",'#10
+  +'"y#'#9'c #7D0000",'#10'"z#'#9'c #8E0E0D",'#10'"A#'#9'c #CD453E",'#10'"B#'#9
+  +'c #E8564B",'#10'"C#'#9'c #D33628",'#10'"D#'#9'c #C01408",'#10'"E#'#9'c #C30'
+  +'000",'#10'"F#'#9'c #CF0000",'#10'"G#'#9'c #D40502",'#10'"H#'#9'c #D30603",'
+  +#10'"I#'#9'c #CB0000",'#10'"J#'#9'c #BA0000",'#10'"K#'#9'c #AD0300",'#10'"L#'
+  +#9'c #BA140E",'#10'"M#'#9'c #760504",'#10'"N#'#9'c #580000",'#10'"O#'#9'c #7'
+  +'C0202",'#10'"P#'#9'c #A5221E",'#10'"Q#'#9'c #D04039",'#10'"R#'#9'c #E0463D"'
+  +','#10'"S#'#9'c #D83A2F",'#10'"T#'#9'c #CC2B21",'#10'"U#'#9'c #C62219",'#10
+  +'"V#'#9'c #C41E17",'#10'"W#'#9'c #C52019",'#10'"X#'#9'c #CB221D",'#10'"Y#'#9
+  +'c #D5241F",'#10'"Z#'#9'c #770101",'#10'"`#'#9'c #921412",'#10'" $'#9'c #880'
+  +'B09",'#10'".$'#9'c #660101",'#10'"+$'#9'c #6B0000",'#10'"@$'#9'c #600000",'
+  +#10'"                                                                ",'#10
+  +'"                                                                ",'#10'"  '
+  +'                                                              ",'#10'"     '
+  +'                     . + @ # $ %                           ",'#10'"        '
+  +'            & * = - ; > , '' ) ! ~ {                     ",'#10'"          '
+  +'        ] ^ / ( _ : < [ } | 1 2 3 4                   ",'#10'"             '
+  +' ] 5 6 7 8 8 9 0 a b c d e f g h i j               ",'#10'"            k l '
+  +'m 8 8 n o p q r s t u v w x y z A B             ",'#10'"            C D 8 8'
+  +' n E F G H I 8 J K L M N O P Q R S           ",'#10'"          ] T 8 8 U < '
+  +'V W X Y Z 8 `  ...+.@.#.$.%.&.*.          ",'#10'"        & =.-.8 U U ;.>.,'
+  +'.''.).!.8 ~.{.].^./.(._.:.<.[.}.        ",'#10'"        * |.8 1.8 2.3.4.5.6'
+  +'.7.8.9.0.a.b.c.d.e.f.g.h.i.j.        ",'#10'"        k.l.m.8 n.o.p.8 q.r.s.'
+  +'t.u.v.w.x.8 y.z.A.B.C.D.E.        ",'#10'"      F.G.H.I.J.K.L.u.M.N.O.P.Q.R'
+  +'.S.T.U.V.u.W.X.Y.Z.`. +.+      ",'#10'"      ++@+#+$+%+&+*+=+-+;+>+,+Q.''+)'
+  +'+!+~+{+]+u.^+/+(+_+:+<+      ",'#10'"      + [+}+|+1+2+u.3+4+5+6+7+Q.8+9+0+'
+  +'a+b+c+u.d+e+f+g+h+.+      ",'#10'"      i+j+k+l+m+n+''+o+p+q+r+s+t+R.u+v+w+'
+  +'x+y+''+z+A+B+C+D+E+      ",'#10'"      F+G+H+I+J+K+8+L+M+N+O+P+Q+R+S+T+U+V+'
+  +'W+X+Y+Z+`+ @.@+@      ",'#10'"      % @@#@$@%@&@*@=@-@;@>@,@''@)@!@~@{@]@^@'
+  +'*@/@(@_@:@<@[@      ",'#10'"        }@|@1@2@3@4@5@6@7@8@9@0@a@b@c@d@e@f@g@h'
+  +'@i@j@k@l@m@      ",'#10'"        ~ n@o@p@q@r@s@t@u@v@w@x@y@z@A@B@C@D@E@F@G@'
+  +'H@I@J@        ",'#10'"        { K@L@M@N@O@P@Q@R@S@T@U@V@W@X@Y@Z@`@ #.#+#@##'
+  +'#$#        ",'#10'"          %#&#*#=#-#;#`@>#,#''#)#!#~#{#]#^#/#(#_#:#<#[# '
+  +'         ",'#10'"            }#|#1#2#3#4#5#6#7#8#8#9#0#8.a#b#c#d#e#f#$#    '
+  +'      ",'#10'"            j g#h#i#j#k#l#m#n#o#p#q#r#s#t#u#:#v#w#x#         '
+  +'   ",'#10'"              y#z#A#B#C#D#E#F#G#H#I#J#K#L#@#<#M#N#              '
+  +'",'#10'"                S O#P#Q#R#S#T#U#V#W#X#Y#I@##[#$#                ",'
+  +#10'"                    }.Z#`# +:+h+D+.@<@ $.$$#                    ",'#10
+  +'"                          .+.++$<++@@$m@                        ",'#10'"  '
+  +'                                                              ",'#10'"     '
+  +'                                                           ",'#10'"        '
+  +'                                                        "};'#10#7'OnClick'#7
+  +#12'BitBtn1Click'#8'TabOrder'#2#1#4'Left'#3#24#2#6'Height'#2'0'#3'Top'#2#16#5
+  ,'Width'#2'`'#0#0#9'TComboBox'#9'ComboBox1'#13'Items.Strings'#1#6#3'All'#0#9
+  +'MaxLength'#2#0#8'TabOrder'#2#2#4'Text'#6#3'All'#4'Left'#3#160#0#6'Height'#2
+  +#24#3'Top'#2' '#5'Width'#3#20#1#0#0#6'TLabel'#6'Label1'#7'Caption'#6#20'Sele'
+  +'cted Test Suite:'#4'Left'#3#160#0#6'Height'#2#17#3'Top'#2#16#5'Width'#3#176
+  +#0#0#0#0#6'TPanel'#6'Panel2'#5'Align'#7#8'alClient'#7'Caption'#6#6'Panel2'#12
+  +'ClientHeight'#3#174#2#11'ClientWidth'#3#134#2#11'FullRepaint'#8#8'TabOrder'
+  +#2#1#7'TabStop'#9#6'Height'#3#174#2#3'Top'#2'R'#5'Width'#3#134#2#0#12'TPageC'
+  +'ontrol'#12'PageControl1'#10'ActivePage'#7#10'tsTestTree'#5'Align'#7#8'alCli'
+  +'ent'#8'TabIndex'#2#0#8'TabOrder'#2#0#4'Left'#2#1#6'Height'#3#172#2#3'Top'#2
+  +#1#5'Width'#3#132#2#0#9'TTabSheet'#10'tsTestTree'#7'Caption'#6#13'Testcase t'
+  +'ree'#12'ClientHeight'#3#150#2#11'ClientWidth'#3#132#2#6'Height'#3#150#2#3'T'
+  +'op'#2#22#5'Width'#3#132#2#0#9'TTreeView'#9'TreeView1'#5'Align'#7#5'alTop'#10
+  +'AutoExpand'#9#15'BackgroundColor'#7#9'clBtnFace'#17'DefaultItemHeight'#2#17
+  +#6'Images'#7#10'ImageList1'#11'ParentCtl3D'#8#10'ScrollBars'#7#10'ssAutoBoth'
+  +#8'TabOrder'#2#0#7'OnClick'#7#14'TreeView1Click'#7'Options'#11#13'tvoAutoExp'
+  +'and'#17'tvoAutoItemHeight'#16'tvoHideSelection'#21'tvoKeepCollapsedNodes'#14
+  +'tvoShowButtons'#12'tvoShowLines'#11'tvoShowRoot'#11'tvoToolTips'#0#6'Height'
+  +#3#224#1#3'Top'#2'?'#5'Width'#3#132#2#0#0#6'TPanel'#6'Panel4'#5'Align'#7#5'a'
+  +'lTop'#12'ClientHeight'#2'?'#11'ClientWidth'#3#132#2#11'FullRepaint'#8#8'Tab'
+  +'Order'#2#1#6'Height'#2'?'#5'Width'#3#132#2#0#9'TPaintBox'#9'PaintBox1'#11'P'
+  +'arentColor'#9#7'OnClick'#7#14'PaintBox1Click'#7'OnPaint'#7#14'PaintBox1Pain'
+  +'t'#4'Left'#2#22#6'Height'#2' '#3'Top'#2#15#5'Width'#3'Y'#2#0#0#0#9'TSplitte'
+  +'r'#9'Splitter1'#5'Align'#7#5'alTop'#6'Cursor'#7#8'crVSplit'#6'Height'#2#10#7
+  +'MinSize'#3#144#1#11'ParentColor'#9#5'Width'#3#132#2#6'Cursor'#7#8'crVSplit'
+  +#6'Height'#2#10#3'Top'#3#31#2#5'Width'#3#132#2#0#0#5'TMemo'#5'Memo1'#5'Align'
+  +#7#8'alClient'#9'PopupMenu'#7#10'PopupMenu2'#8'TabOrder'#2#3#6'Height'#2'm'#3
+  +'Top'#3')'#2#5'Width'#3#132#2#0#0#0#9'TTabSheet'#12'tsResultsXML'#7'Caption'
+  +#6#11'Results XML'#12'ClientHeight'#3#150#2#11'ClientWidth'#3#132#2#6'Height'
+  +#3#150#2#3'Top'#2#22#5'Width'#3#132#2#0#6'TPanel'#6'Panel3'#5'Align'#7#8'alC'
+  +'lient'#7'Caption'#6#6'Panel3'#12'ClientHeight'#3#150#2#11'ClientWidth'#3#132
+  +#2#11'FullRepaint'#8#8'TabOrder'#2#0#7'TabStop'#9#6'Height'#3#150#2#5'Width'
+  +#3#132#2#0#6'TPanel'#6'Panel5'#5'Align'#7#5'alTop'#11'BorderWidth'#2#1#12'Cl'
+  +'ientHeight'#2'*'#11'ClientWidth'#3#130#2#11'FullRepaint'#8#8'TabOrder'#2#0#4
+  +'Left'#2#1#6'Height'#2'*'#3'Top'#2#1#5'Width'#3#130#2#0#12'TSpeedButton'#12
+  +'SpeedButton1'#6'Action'#7#7'actCopy'#4'Flat'#9#10'Glyph.Data'#10#140#13#0#0
+  +#136#13#0#0'/* XPM */'#10'static char * editcopy_xpm[] = {'#10'"16 16 177 2"'
+  +','#10'"  '#9'c None",'#10'". '#9'c #406E9A",'#10'"+ '#9'c #7198BD",'#10'"@ '
+  +#9'c #6C94BA",'#10'"# '#9'c #6B94BA",'#10'"$ '#9'c #6B93BA",'#10'"% '#9'c #6'
+  +'E96BD",'#10'"& '#9'c #32608F",'#10'"* '#9'c #B6CDE3",'#10'"= '#9'c #FFFFFF"'
+  +','#10'"- '#9'c #92B5D1",'#10'"; '#9'c #B2C8E0",'#10'"> '#9'c #FDFEFF",'#10
+  +'", '#9'c #FBFCFF",'#10'"'' '#9'c #F7FBFF",'#10'") '#9'c #F5FAFF",'#10'"! '#9
+  +'c #F1F7FF",'#10'"~ '#9'c #FBFFFF",'#10'"{ '#9'c #8FB3D0",'#10'"] '#9'c #ADC'
+  +'5DD",'#10'"^ '#9'c #FDFDFE",'#10'"/ '#9'c #FDFEFE",'#10'"( '#9'c #FDFFFF",'
+  +#10'"_ '#9'c #F6FBFF",'#10'": '#9'c #F3FAFF",'#10'"< '#9'c #F0F8FF",'#10'"[ '
+  +#9'c #ECF5FF",'#10'"} '#9'c #F6FFFF",'#10'"| '#9'c #8DB1CF",'#10'"1 '#9'c #2'
+  +'0487A",'#10'"2 '#9'c #23497C",'#10'"3 '#9'c #6D91B5",'#10'"4 '#9'c #95ADC4"'
+  +','#10'"5 '#9'c #8FA8C1",'#10'"6 '#9'c #8DA7C1",'#10'"7 '#9'c #89A2BE",'#10
+  +'"8 '#9'c #C9D6E2",'#10'"9 '#9'c #FBFEFF",'#10'"0 '#9'c #EDF7FF",'#10'"a '#9
+  +'c #EAF4FF",'#10'"b '#9'c #F3FEFF",'#10'"c '#9'c #7DA7CE",'#10'"d '#9'c #6A8'
+  +'BAE",'#10'"e '#9'c #E3EDF5",'#10'"f '#9'c #DFEAF2",'#10'"g '#9'c #D0DCE7",'
+  +#10'"h '#9'c #C8D7E4",'#10'"i '#9'c #CBD9E5",'#10'"j '#9'c #CDDBE7",'#10'"k '
+  +#9'c #AABFD3",'#10'"l '#9'c #809EBA",'#10'"m '#9'c #F0F4F8",'#10'"n '#9'c #F'
+  +'0F9FF",'#10'"o '#9'c #E7F3FF",'#10'"p '#9'c #F0FCFF",'#10'"q '#9'c #699CCB"'
+  +','#10'"r '#9'c #839FBB",'#10'"s '#9'c #E1ECF3",'#10'"t '#9'c #89A6C0",'#10
+  +'"u '#9'c #E9EFF4",'#10'"v '#9'c #EDF8FF",'#10'"w '#9'c #E4F1FF",'#10'"x '#9
+  +'c #EDFAFF",'#10'"y '#9'c #6B9CCB",'#10'"z '#9'c #7D9AB8",'#10'"A '#9'c #FBF'
+  +'DFF",'#10'"B '#9'c #F0F7FF",'#10'"C '#9'c #F3FCFF",'#10'"D '#9'c #D0E3EE",'
+  +#10'"E '#9'c #83A2BE",'#10'"F '#9'c #E8F1F5",'#10'"G '#9'c #EAF6FF",'#10'"H '
+  +#9'c #E3F1FF",'#10'"I '#9'c #E0F0FF",'#10'"J '#9'c #E9F9FF",'#10'"K '#9'c #F'
+  +'5FBFF",'#10'"L '#9'c #F1F8FF",'#10'"M '#9'c #ECF6FF",'#10'"N '#9'c #F0FAFF"'
+  +','#10'"O '#9'c #C8DEED",'#10'"P '#9'c #779CBD",'#10'"Q '#9'c #E6F0F5",'#10
+  +'"R '#9'c #E8F5FF",'#10'"S '#9'c #E1F0FF",'#10'"T '#9'c #DEEFFF",'#10'"U '#9
+  +'c #E7F8FF",'#10'"V '#9'c #689CCB",'#10'"W '#9'c #F6FAFF",'#10'"X '#9'c #EDF'
+  +'6FF",'#10'"Y '#9'c #E7F4FF",'#10'"Z '#9'c #ECF7FF",'#10'"` '#9'c #C4DCED",'
+  ,#10'" .'#9'c #769BBD",'#10'"..'#9'c #E3F0F5",'#10'"+.'#9'c #E4F3FF",'#10'"@.'
+  +#9'c #DDEFFF",'#10'"#.'#9'c #DAEDFF",'#10'"$.'#9'c #E3F6FF",'#10'"%.'#9'c #6'
+  +'69BCB",'#10'"&.'#9'c #F8FBFF",'#10'"*.'#9'c #E8F4FF",'#10'"=.'#9'c #E2F1FF"'
+  +','#10'"-.'#9'c #E7F5FF",'#10'";.'#9'c #C0DAED",'#10'">.'#9'c #749ABD",'#10
+  +'",.'#9'c #DFEEF5",'#10'"''.'#9'c #E1F2FF",'#10'").'#9'c #D7EBFF",'#10'"!.'#9
+  +'c #E0F4FF",'#10'"~.'#9'c #659ACB",'#10'"{.'#9'c #7E9BB8",'#10'"].'#9'c #F2F'
+  +'9FF",'#10'"^.'#9'c #E2F3FF",'#10'"/.'#9'c #BCD8ED",'#10'"(.'#9'c #7299BD",'
+  +#10'"_.'#9'c #DCECF5",'#10'":.'#9'c #DDF0FF",'#10'"<.'#9'c #D4E9FF",'#10'"[.'
+  +#9'c #DCF2FF",'#10'"}.'#9'c #649ACB",'#10'"|.'#9'c #6E91B4",'#10'"1.'#9'c #E'
+  +'FF7FF",'#10'"2.'#9'c #E3F2FF",'#10'"3.'#9'c #E0EFFF",'#10'"4.'#9'c #D9EDFF"'
+  +','#10'"5.'#9'c #DDF1FF",'#10'"6.'#9'c #B8D6ED",'#10'"7.'#9'c #7098BD",'#10
+  +'"8.'#9'c #D9EBF5",'#10'"9.'#9'c #DAEEFF",'#10'"0.'#9'c #D3EAFF",'#10'"a.'#9
+  +'c #D1E8FF",'#10'"b.'#9'c #D9F1FF",'#10'"c.'#9'c #6399CB",'#10'"d.'#9'c #668'
+  +'CB2",'#10'"e.'#9'c #EDF5FF",'#10'"f.'#9'c #E6F2FF",'#10'"g.'#9'c #DDEEFF",'
+  +#10'"h.'#9'c #DAEFFF",'#10'"i.'#9'c #B5D5ED",'#10'"j.'#9'c #D8EAF5",'#10'"k.'
+  +#9'c #D9ECFF",'#10'"l.'#9'c #D2E8FF",'#10'"m.'#9'c #D0E5FF",'#10'"n.'#9'c #D'
+  +'7F0FF",'#10'"o.'#9'c #6299CC",'#10'"p.'#9'c #6B90B5",'#10'"q.'#9'c #F5FFFF"'
+  +','#10'"r.'#9'c #EEFEFF",'#10'"s.'#9'c #E9FCFF",'#10'"t.'#9'c #E5F8FF",'#10
+  +'"u.'#9'c #DFF5FF",'#10'"v.'#9'c #E2FAFF",'#10'"w.'#9'c #BADEF3",'#10'"x.'#9
+  +'c #739EC3",'#10'"y.'#9'c #E0F5FB",'#10'"z.'#9'c #E1F7FF",'#10'"A.'#9'c #DAF'
+  +'3FF",'#10'"B.'#9'c #D7F1FF",'#10'"C.'#9'c #DFFAFF",'#10'"D.'#9'c #639DCF",'
+  +#10'"E.'#9'c #235586",'#10'"F.'#9'c #618CB7",'#10'"G.'#9'c #5C88B4",'#10'"H.'
+  +#9'c #5986B3",'#10'"I.'#9'c #5685B3",'#10'"J.'#9'c #5585B3",'#10'"K.'#9'c #5'
+  +'484B3",'#10'"L.'#9'c #5686B5",'#10'"M.'#9'c #4477A8",'#10'"N.'#9'c #2B6299"'
+  +','#10'"O.'#9'c #558DBF",'#10'"P.'#9'c #538CC2",'#10'"Q.'#9'c #528BC2",'#10
+  +'"R.'#9'c #518CC2",'#10'"S.'#9'c #528FC3",'#10'"T.'#9'c #1E5891",'#10'"     '
+  +' . + @ @ @ @ @ @ # $ # % & ",'#10'"      * = = = = = = = = = = = - ",'#10'"'
+  +'      ; = = = = = > , '' ) ! ~ { ",'#10'"      ] ^ ^ ^ ^ / ( _ : < [ } | ",'
+  +#10'"  1 2 3 4 5 5 6 7 8 9 < 0 a b c ",'#10'"d e f g h i i j k l m n a o p q'
+  +' ",'#10'"r = = = = = = = s t u v o w x y ",'#10'"z = = = A ) B C D E F G H '
+  +'I J q ",'#10'"z = = 9 K L M N O P Q R S T U V ",'#10'"z = A W L X Y Z `  ..'
+  +'.+.@.#.$.%.",'#10'"z = &.L M *.=.-.;.>.,.''.#.).!.~.",'#10'"{.= ].X *.w T ^'
+  +'./.(._.:.).<.[.}.",'#10'"|.= 1.Y 2.3.4.5.6.7.8.9.0.a.b.c.",'#10'"d.= e.f.S '
+  +'g.).h.i.7.j.k.l.m.n.o.",'#10'"p.= q.r.s.t.u.v.w.x.y.z.A.B.C.D.",'#10'"E.F.G'
+  +'.H.I.J.K.L.M.N.O.P.Q.R.S.T."};'#10#9'NumGlyphs'#2#0#8'ShowHint'#9#14'Parent'
+  +'ShowHint'#8#4'Left'#2#16#6'Height'#2#30#4'Hint'#6#25'Copy results to clipbo'
+  +'ard'#3'Top'#2#7#5'Width'#2#31#0#0#12'TSpeedButton'#12'SpeedButton2'#6'Actio'
+  +'n'#7#6'actCut'#4'Flat'#9#10'Glyph.Data'#10#208#5#0#0#204#5#0#0'/* XPM */'#10
+  +'static char * editcut_Xpm[] = {'#10'"16 16 74 1",'#10'" '#9'c None",'#10'".'
+  +#9'c #818181",'#10'"+'#9'c #989898",'#10'"@'#9'c #888888",'#10'"#'#9'c #FEFE'
+  +'FE",'#10'"$'#9'c #686868",'#10'"%'#9'c #F7F7F7",'#10'"&'#9'c #C6C6C6",'#10
+  +'"*'#9'c #EDEDED",'#10'"='#9'c #7B7B7B",'#10'"-'#9'c #CDCDCD",'#10'";'#9'c #'
+  +'B4B3B3",'#10'">'#9'c #E7E7E7",'#10'",'#9'c #A1A1A1",'#10'"'''#9'c #464646",'
+  +#10'")'#9'c #7D7D7D",'#10'"!'#9'c #9F9F9F",'#10'"~'#9'c #C0C0C0",'#10'"{'#9
+  +'c #BABABA",'#10'"]'#9'c #833F3F",'#10'"^'#9'c #BC4949",'#10'"/'#9'c #E45353'
+  +'",'#10'"('#9'c #754E4E",'#10'"_'#9'c #D0D3D3",'#10'":'#9'c #CACACA",'#10'"<'
+  +#9'c #999999",'#10'"['#9'c #C8C8C8",'#10'"}'#9'c #BFBFBF",'#10'"|'#9'c #8D8D'
+  +'8D",'#10'"1'#9'c #8C4747",'#10'"2'#9'c #C25353",'#10'"3'#9'c #9E2E2E",'#10
+  +'"4'#9'c #D14040",'#10'"5'#9'c #AF2E2E",'#10'"6'#9'c #D59393",'#10'"7'#9'c #'
+  +'A4B3B3",'#10'"8'#9'c #979999",'#10'"9'#9'c #979797",'#10'"0'#9'c #969696",'
+  +#10'"a'#9'c #6A6A6A",'#10'"b'#9'c #D66666",'#10'"c'#9'c #C05B5B",'#10'"d'#9
+  +'c #A73D3D",'#10'"e'#9'c #FF4747",'#10'"f'#9'c #811212",'#10'"g'#9'c #8A7A7A'
+  +'",'#10'"h'#9'c #E7CCCC",'#10'"i'#9'c #7B7070",'#10'"j'#9'c #743636",'#10'"k'
+  +#9'c #F87777",'#10'"l'#9'c #E06767",'#10'"m'#9'c #D74545",'#10'"n'#9'c #450B'
+  +'0B",'#10'"o'#9'c #BC5555",'#10'"p'#9'c #BD4141",'#10'"q'#9'c #611F1F",'#10
+  +'"r'#9'c #C66666",'#10'"s'#9'c #FF8787",'#10'"t'#9'c #912929",'#10'"u'#9'c #'
+  +'BD6161",'#10'"v'#9'c #D76767",'#10'"w'#9'c #863030",'#10'"x'#9'c #ED5252",'
+  +#10'"y'#9'c #952525",'#10'"z'#9'c #FF8A8A",'#10'"A'#9'c #591A1A",'#10'"B'#9
+  +'c #A83D3D",'#10'"C'#9'c #B02424",'#10'"D'#9'c #E46C6C",'#10'"E'#9'c #EB5B5B'
+  +'",'#10'"F'#9'c #B63535",'#10'"G'#9'c #CF2F2F",'#10'"H'#9'c #9F3434",'#10'"I'
+  +#9'c #9F2727",'#10'"                ",'#10'"          .+    ",'#10'"        '
+  +' @#$    ",'#10'"         %&     ",'#10'"        &*=     ",'#10'"        *- '
+  +'     ",'#10'"       ;>,'')!~{ ",'#10'" ]^/  (_:<~[}|  ",'#10'"12 34567890a '
+  +'   ",'#10'"bc defghi       ",'#10'"jklmn op        ",'#10'"  q  rst        '
+  ,'",'#10'"    uvwxy       ",'#10'"    zA BC       ",'#10'"    DEFG        ",'
+  +#10'"     HI         "};'#10#9'NumGlyphs'#2#0#8'ShowHint'#9#14'ParentShowHin'
+  +'t'#8#4'Left'#2'6'#6'Height'#2#30#4'Hint'#6#24'Cut results to clipboard'#3'T'
+  +'op'#2#7#5'Width'#2#31#0#0#0#5'TMemo'#7'XMLMemo'#5'Align'#7#8'alClient'#8'On'
+  +'Change'#7#13'XMLMemoChange'#9'PopupMenu'#7#10'PopupMenu1'#8'TabOrder'#2#1#4
+  +'Left'#2#1#6'Height'#3'j'#2#3'Top'#2'+'#5'Width'#3#130#2#0#0#0#0#0#0#10'TIma'
+  +'geList'#10'ImageList1'#4'left'#2#20#3'top'#3#208#1#6'Bitmap'#10'8e'#0#0'li'
+  +#12#0#0#0#16#0#0#0#16#0#0#0#157#14#0#0'/* XPM */'#10'static char * ledlightg'
+  +'reen_xpm[] = {'#10'"16 16 194 2",'#10'"  '#9'c None",'#10'". '#9'c #02420F"'
+  +','#10'"+ '#9'c #194834",'#10'"@ '#9'c #2E534C",'#10'"# '#9'c #30534D",'#10
+  +'"$ '#9'c #1B423C",'#10'"% '#9'c #032B29",'#10'"& '#9'c #005C00",'#10'"* '#9
+  +'c #367F31",'#10'"= '#9'c #94B796",'#10'"- '#9'c #D4E2D8",'#10'"; '#9'c #EBF'
+  +'3ED",'#10'"> '#9'c #EDF3EE",'#10'", '#9'c #D7E3DC",'#10'"'' '#9'c #9AB1A4",'
+  +#10'") '#9'c #3B6154",'#10'"! '#9'c #002525",'#10'"~ '#9'c #015702",'#10'"{ '
+  +#9'c #6CB05F",'#10'"] '#9'c #EAF6DC",'#10'"^ '#9'c #FFFFFF",'#10'"/ '#9'c #E'
+  +'EF6E0",'#10'"( '#9'c #779E7D",'#10'"_ '#9'c #052F2E",'#10'": '#9'c #004709"'
+  +','#10'"< '#9'c #5EA84E",'#10'"[ '#9'c #E6FFCF",'#10'"} '#9'c #EFFFE2",'#10
+  +'"| '#9'c #F0FFE7",'#10'"1 '#9'c #F5FFF2",'#10'"2 '#9'c #FAFFF8",'#10'"3 '#9
+  +'c #F6FFF2",'#10'"4 '#9'c #F1FFE9",'#10'"5 '#9'c #EFFFE1",'#10'"6 '#9'c #EAF'
+  +'FD1",'#10'"7 '#9'c #6AA16A",'#10'"8 '#9'c #002529",'#10'"9 '#9'c #176B1A",'
+  +#10'"0 '#9'c #90E665",'#10'"a '#9'c #DAFFC2",'#10'"b '#9'c #DEFFCE",'#10'"c '
+  +#9'c #E8FFDC",'#10'"d '#9'c #EFFFE7",'#10'"e '#9'c #F2FFEC",'#10'"f '#9'c #E'
+  +'8FFDE",'#10'"g '#9'c #DFFFCF",'#10'"h '#9'c #DCFFC4",'#10'"i '#9'c #9AED6E"'
+  +','#10'"j '#9'c #1D5C31",'#10'"k '#9'c #03481B",'#10'"l '#9'c #4BA635",'#10
+  +'"m '#9'c #7CE542",'#10'"n '#9'c #B8F798",'#10'"o '#9'c #D9FFC5",'#10'"p '#9
+  +'c #DDFFCC",'#10'"q '#9'c #E3FFD6",'#10'"r '#9'c #E6FFDB",'#10'"s '#9'c #E7F'
+  +'FDA",'#10'"t '#9'c #E4FFD5",'#10'"u '#9'c #DDFFCE",'#10'"v '#9'c #D9FFC7",'
+  +#10'"w '#9'c #BCF89E",'#10'"x '#9'c #7EE843",'#10'"y '#9'c #51A53F",'#10'"z '
+  +#9'c #042F35",'#10'"A '#9'c #135C21",'#10'"B '#9'c #70D149",'#10'"C '#9'c #7'
+  +'9E441",'#10'"D '#9'c #85E754",'#10'"E '#9'c #B5F992",'#10'"F '#9'c #CFFFB7"'
+  +','#10'"G '#9'c #D6FFC3",'#10'"H '#9'c #DAFFC7",'#10'"I '#9'c #D7FFC3",'#10
+  +'"J '#9'c #CFFFB8",'#10'"K '#9'c #B8F996",'#10'"L '#9'c #88E858",'#10'"M '#9
+  +'c #79E43F",'#10'"N '#9'c #75D54B",'#10'"O '#9'c #18483D",'#10'"P '#9'c #1F6'
+  +'F24",'#10'"Q '#9'c #7DE14F",'#10'"R '#9'c #83EA4E",'#10'"S '#9'c #83EB4F",'
+  +#10'"T '#9'c #8BF257",'#10'"U '#9'c #9FFA70",'#10'"V '#9'c #B1FE8B",'#10'"W '
+  +#9'c #BAFF97",'#10'"X '#9'c #BAFF98",'#10'"Y '#9'c #B2FF8C",'#10'"Z '#9'c #A'
+  +'0FB73",'#10'"` '#9'c #8DF359",'#10'" .'#9'c #83EA4C",'#10'"..'#9'c #7FE54E"'
+  +','#10'"+.'#9'c #245A41",'#10'"@.'#9'c #217721",'#10'"#.'#9'c #84E756",'#10
+  +'"$.'#9'c #89F154",'#10'"%.'#9'c #8EF45B",'#10'"&.'#9'c #94FA5F",'#10'"*.'#9
+  +'c #96FE63",'#10'"=.'#9'c #9AFF69",'#10'"-.'#9'c #9CFF6D",'#10'";.'#9'c #9CF'
+  +'F6E",'#10'">.'#9'c #9AFF6A",'#10'",.'#9'c #94FB60",'#10'"''.'#9'c #8FF55D",'
+  +#10'").'#9'c #89F254",'#10'"!.'#9'c #86EB54",'#10'"~.'#9'c #265B42",'#10'"{.'
+  +#9'c #167213",'#10'"].'#9'c #82E45A",'#10'"^.'#9'c #93FB5C",'#10'"/.'#9'c #9'
+  +'4FB61",'#10'"(.'#9'c #9CFF6B",'#10'"_.'#9'c #A2FF77",'#10'":.'#9'c #A6FF80"'
+  +','#10'"<.'#9'c #A8FF85",'#10'"[.'#9'c #A8FF84",'#10'"}.'#9'c #A7FF80",'#10
+  +'"|.'#9'c #A3FF78",'#10'"1.'#9'c #9DFF6C",'#10'"2.'#9'c #95FC63",'#10'"3.'#9
+  +'c #92FB5A",'#10'"4.'#9'c #88E65D",'#10'"5.'#9'c #1B4A40",'#10'"6.'#9'c #045'
+  +'C07",'#10'"7.'#9'c #66C04C",'#10'"8.'#9'c #9FFF66",'#10'"9.'#9'c #9BFF69",'
+  +#10'"0.'#9'c #A4FF79",'#10'"a.'#9'c #A9FF85",'#10'"b.'#9'c #AFFF90",'#10'"c.'
+  +#9'c #B1FF97",'#10'"d.'#9'c #AFFF92",'#10'"e.'#9'c #AAFF86",'#10'"f.'#9'c #A'
+  +'4FF7A",'#10'"g.'#9'c #9BFF6A",'#10'"h.'#9'c #9EFF62",'#10'"i.'#9'c #6FBE5F"'
+  +','#10'"j.'#9'c #072F35",'#10'"k.'#9'c #2F7735",'#10'"l.'#9'c #A0F76E",'#10
+  +'"m.'#9'c #A3FF72",'#10'"n.'#9'c #A7FF82",'#10'"o.'#9'c #B6FFA0",'#10'"p.'#9
+  +'c #BAFFA9",'#10'"q.'#9'c #B6FFA1",'#10'"r.'#9'c #B1FF93",'#10'"s.'#9'c #A2F'
+  +'F72",'#10'"t.'#9'c #A3FC6E",'#10'"u.'#9'c #376D4E",'#10'"v.'#9'c #003520",'
+  +#10'"w.'#9'c #63A25F",'#10'"x.'#9'c #B2FF81",'#10'"y.'#9'c #AEFF8A",'#10'"z.'
+  +#9'c #B2FF9A",'#10'"A.'#9'c #BCFFAC",'#10'"B.'#9'c #C3FFB9",'#10'"C.'#9'c #C'
+  +'4FFBB",'#10'"D.'#9'c #BCFFAE",'#10'"E.'#9'c #B3FF9B",'#10'"F.'#9'c #AFFF8B"'
+  +','#10'"G.'#9'c #B2FF82",'#10'"H.'#9'c #6CAB65",'#10'"I.'#9'c #042932",'#10
+  +'"J.'#9'c #092E36",'#10'"K.'#9'c #6BA16C",'#10'"L.'#9'c #B6F995",'#10'"M.'#9
+  +'c #C3FFA6",'#10'"N.'#9'c #C5FFB4",'#10'"O.'#9'c #CBFFC6",'#10'"P.'#9'c #CDF'
+  +'FC6",'#10'"Q.'#9'c #C7FFB6",'#10'"R.'#9'c #C4FFA7",'#10'"S.'#9'c #B9FB97",'
+  +#10'"T.'#9'c #72AA6F",'#10'"U.'#9'c #0E3237",'#10'"V.'#9'c #02262F",'#10'"W.'
+  +#9'c #396754",'#10'"X.'#9'c #86B886",'#10'"Y.'#9'c #B7EAAB",'#10'"Z.'#9'c #C'
+  ,'7FABC",'#10'"`.'#9'c #C7FABD",'#10'" +'#9'c #B9ECAE",'#10'".+'#9'c #8CBD8A"'
+  +','#10'"++'#9'c #406C58",'#10'"@+'#9'c #042830",'#10'"#+'#9'c #082D32",'#10
+  +'"$+'#9'c #204945",'#10'"%+'#9'c #345D52",'#10'"&+'#9'c #345E53",'#10'"*+'#9
+  +'c #224B47",'#10'"=+'#9'c #092E33",'#10'"          . + @ # $ %           ",'
+  +#10'"      & * = - ; > , '' ) !       ",'#10'"    ~ { ] ^ ^ ^ ^ ^ ^ / ( _   '
+  +'  ",'#10'"  : < [ } | 1 2 2 3 4 5 6 7 8   ",'#10'"  9 0 a b c d e e | f g h'
+  +' i j   ",'#10'"k l m n o p q r s t u v w x y z ",'#10'"A B C D E F G v H I '
+  +'J K L M N O ",'#10'"P Q R S T U V W X Y Z ` S  ...+.",'#10'"@.#.$.%.&.*.=.-'
+  +'.;.>.*.,.''.).!.~.",'#10'"{.].^./.(._.:.<.[.}.|.1.2.3.4.5.",'#10'"6.7.8.9.0'
+  +'.a.b.c.c.d.e.f.g.h.i.j.",'#10'"  k.l.m.n.d.o.p.p.q.r.[.s.t.u.  ",'#10'"  v.'
+  +'w.x.y.z.A.B.C.D.E.F.G.H.I.  ",'#10'"    J.K.L.M.N.O.P.Q.R.S.T.U.    ",'#10
+  +'"      V.W.X.Y.Z.`. +.+++@+      ",'#10'"          #+$+%+&+*+=+          "}'
+  +';'#10'('#1#0#0'/* XPM */'#10'static char * menu_run_xpm[] = {'#10'"8 14 5 1'
+  +'",'#10'" '#9'c None",'#10'".'#9'c #146600",'#10'"+'#9'c #26B200",'#10'"@'#9
+  +'c #275919",'#10'"#'#9'c #000000",'#10'"..      ",'#10'".+.     ",'#10'".++.'
+  +'    ",'#10'".+++.   ",'#10'".++++.  ",'#10'".+++++. ",'#10'".++++++.",'#10
+  +'".+++++@#",'#10'".++++@# ",'#10'".+++@#  ",'#10'".++@#   ",'#10'".+@#    ",'
+  +#10'".@#     ",'#10'"##      "};'#10#198#13#0#0'/* XPM */'#10'static char * '
+  +'ledred_xpm[] = {'#10'"16 16 181 2",'#10'"  '#9'c None",'#10'". '#9'c #65000'
+  +'0",'#10'"+ '#9'c #6E1313",'#10'"@ '#9'c #792828",'#10'"# '#9'c #792929",'#10
+  +'"$ '#9'c #6B1414",'#10'"% '#9'c #590000",'#10'"& '#9'c #710000",'#10'"* '#9
+  +'c #922828",'#10'"= '#9'c #C58282",'#10'"- '#9'c #E8CBCB",'#10'"; '#9'c #F5E'
+  +'7E7",'#10'"> '#9'c #F6E8E8",'#10'", '#9'c #E9CECE",'#10'"'' '#9'c #C28A8A",'
+  +#10'") '#9'c #842D2D",'#10'"! '#9'c #550000",'#10'"~ '#9'c #700000",'#10'"{ '
+  +#9'c #B94A4A",'#10'"] '#9'c #F7C3C3",'#10'"^ '#9'c #FFF7F7",'#10'"/ '#9'c #F'
+  +'FFFFF",'#10'"( '#9'c #FFF9F9",'#10'"_ '#9'c #F8C8C8",'#10'": '#9'c #B35252"'
+  +','#10'"< '#9'c #5D0000",'#10'"[ '#9'c #660000",'#10'"} '#9'c #B52D2D",'#10
+  +'"| '#9'c #FFA5A5",'#10'"1 '#9'c #FFC8C8",'#10'"2 '#9'c #FFD7D7",'#10'"3 '#9
+  +'c #FFE9E9",'#10'"4 '#9'c #FFF3F3",'#10'"5 '#9'c #FFEAEA",'#10'"6 '#9'c #FFD'
+  +'ADA",'#10'"7 '#9'c #FFCACA",'#10'"8 '#9'c #FFAAAA",'#10'"9 '#9'c #B53838",'
+  +#10'"0 '#9'c #560000",'#10'"a '#9'c #840000",'#10'"b '#9'c #E72D2D",'#10'"c '
+  +#9'c #FF9292",'#10'"d '#9'c #FFACAC",'#10'"e '#9'c #FFC4C4",'#10'"f '#9'c #F'
+  +'FD6D6",'#10'"g '#9'c #FFDEDE",'#10'"h '#9'c #FFDFDF",'#10'"i '#9'c #FFC6C6"'
+  +','#10'"j '#9'c #FFAFAF",'#10'"k '#9'c #FF9696",'#10'"l '#9'c #ED3636",'#10
+  +'"m '#9'c #7F0000",'#10'"n '#9'c #690303",'#10'"o '#9'c #B20909",'#10'"p '#9
+  +'c #E40808",'#10'"q '#9'c #F75E5E",'#10'"r '#9'c #FF9999",'#10'"s '#9'c #FFA'
+  +'BAB",'#10'"t '#9'c #FFB9B9",'#10'"u '#9'c #FFC1C1",'#10'"v '#9'c #FFC2C2",'
+  +#10'"w '#9'c #FFBBBB",'#10'"x '#9'c #FF9B9B",'#10'"y '#9'c #F86666",'#10'"z '
+  +#9'c #E60A0A",'#10'"A '#9'c #B50808",'#10'"B '#9'c #5D0505",'#10'"C '#9'c #7'
+  +'80B0B",'#10'"D '#9'c #D61010",'#10'"E '#9'c #E60000",'#10'"F '#9'c #EA0E0E"'
+  +','#10'"G '#9'c #FA5353",'#10'"H '#9'c #FF8585",'#10'"I '#9'c #FFA1A1",'#10
+  +'"J '#9'c #FF9C9C",'#10'"K '#9'c #FF8888",'#10'"L '#9'c #FB5757",'#10'"M '#9
+  +'c #EB1111",'#10'"N '#9'c #E50000",'#10'"O '#9'c #D90D0D",'#10'"P '#9'c #700'
+  +'C0C",'#10'"Q '#9'c #860E0E",'#10'"R '#9'c #E30D0D",'#10'"S '#9'c #EC0000",'
+  +#10'"T '#9'c #EE0000",'#10'"U '#9'c #F60303",'#10'"V '#9'c #FC1E1E",'#10'"W '
+  +#9'c #FF3F3F",'#10'"X '#9'c #FF5353",'#10'"Y '#9'c #FF5454",'#10'"Z '#9'c #F'
+  +'F4343",'#10'"` '#9'c #FD2020",'#10'" .'#9'c #F60404",'#10'"..'#9'c #EF0000"'
+  +','#10'"+.'#9'c #7E0D0D",'#10'"@.'#9'c #8A0F0F",'#10'"#.'#9'c #EA0D0D",'#10
+  +'"$.'#9'c #F40000",'#10'"%.'#9'c #F80000",'#10'"&.'#9'c #FE0000",'#10'"*.'#9
+  +'c #FF0000",'#10'"=.'#9'c #FF0606",'#10'"-.'#9'c #FF0C0C",'#10'";.'#9'c #FF0'
+  +'707",'#10'">.'#9'c #FF0101",'#10'",.'#9'c #FD0000",'#10'"''.'#9'c #ED0A0A",'
+  +#10'").'#9'c #7E0F0F",'#10'"!.'#9'c #840F0F",'#10'"~.'#9'c #E71414",'#10'"{.'
+  +#9'c #FD0101",'#10'"].'#9'c #FF0B0B",'#10'"^.'#9'c #FF1717",'#10'"/.'#9'c #F'
+  +'F1F1F",'#10'"(.'#9'c #FF2222",'#10'"_.'#9'c #FF2020",'#10'":.'#9'c #FF1818"'
+  +','#10'"<.'#9'c #FE0202",'#10'"[.'#9'c #EC1212",'#10'"}.'#9'c #731010",'#10
+  +'"|.'#9'c #740707",'#10'"1.'#9'c #CA1919",'#10'"2.'#9'c #FF0909",'#10'"3.'#9
+  +'c #FF2525",'#10'"4.'#9'c #FF2E2E",'#10'"5.'#9'c #FF3535",'#10'"6.'#9'c #FF2'
+  +'F2F",'#10'"7.'#9'c #FF2626",'#10'"8.'#9'c #FF1A1A",'#10'"9.'#9'c #FF0A0A",'
+  +#10'"0.'#9'c #CC1919",'#10'"a.'#9'c #5C0909",'#10'"b.'#9'c #8F1515",'#10'"c.'
+  +#9'c #F91010",'#10'"d.'#9'c #FF0E0E",'#10'"e.'#9'c #FF2121",'#10'"f.'#9'c #F'
+  +'F3030",'#10'"g.'#9'c #FF3D3D",'#10'"h.'#9'c #FF4545",'#10'"i.'#9'c #FF4646"'
+  +','#10'"j.'#9'c #FF3E3E",'#10'"k.'#9'c #FF3131",'#10'"l.'#9'c #FF2323",'#10
+  +'"m.'#9'c #FF1010",'#10'"n.'#9'c #FC0F0F",'#10'"o.'#9'c #8D1616",'#10'"p.'#9
+  +'c #5D0606",'#10'"q.'#9'c #B62222",'#10'"r.'#9'c #FF1E1E",'#10'"s.'#9'c #FF3'
+  ,'737",'#10'"t.'#9'c #FF4848",'#10'"u.'#9'c #FF5555",'#10'"v.'#9'c #FF5757",'
+  +#10'"w.'#9'c #FF4A4A",'#10'"x.'#9'c #FF3939",'#10'"y.'#9'c #FF2727",'#10'"z.'
+  +#9'c #FF1D1D",'#10'"A.'#9'c #BD2222",'#10'"B.'#9'c #580808",'#10'"C.'#9'c #5'
+  +'C0B0B",'#10'"D.'#9'c #B52C2C",'#10'"E.'#9'c #FA3535",'#10'"F.'#9'c #FF4C4C"'
+  +','#10'"G.'#9'c #FF5E5E",'#10'"H.'#9'c #FF4D4D",'#10'"I.'#9'c #FC3636",'#10
+  +'"J.'#9'c #BC2C2C",'#10'"K.'#9'c #5F0D0D",'#10'"L.'#9'c #560707",'#10'"M.'#9
+  +'c #882222",'#10'"N.'#9'c #C83D3D",'#10'"O.'#9'c #EF5454",'#10'"P.'#9'c #FB5'
+  +'B5B",'#10'"Q.'#9'c #F05353",'#10'"R.'#9'c #CC4040",'#10'"S.'#9'c #8D2323",'
+  +#10'"T.'#9'c #570808",'#10'"U.'#9'c #5B0808",'#10'"V.'#9'c #721919",'#10'"W.'
+  +#9'c #811F1F",'#10'"X.'#9'c #821F1F",'#10'"          . + @ # $ %           "'
+  +','#10'"      & * = - ; > , '' ) !       ",'#10'"    ~ { ] ^ / / / / ( _ : <'
+  +'     ",'#10'"  [ } | 1 2 3 4 4 5 6 7 8 9 0   ",'#10'"  a b c d e f g h 2 i '
+  +'j k l m   ",'#10'"n o p q r s t u v w s x y z A B ",'#10'"C D E F G H x I I'
+  +' J K L M N O P ",'#10'"Q R S T U V W X Y Z `  ...S z +.",'#10'"@.#.$.%.&.*.'
+  +'=.-.-.;.>.,.%.$.''.).",'#10'"!.~.,.{.].^./.(.(._.:.-.<.&.[.}.",'#10'"|.1.>.'
+  +'2.:.3.4.5.5.6.7.8.9.>.0.a.",'#10'"  b.c.d.e.f.g.h.i.j.k.l.m.n.o.  ",'#10'" '
+  +' p.q.r.7.s.t.u.v.w.x.y.z.A.B.  ",'#10'"    C.D.E.g.F.G.G.H.W I.J.K.    ",'
+  +#10'"      L.M.N.O.P.P.Q.R.S.T.      ",'#10'"          U.V.W.X.V.a.         '
+  +' "};'#10#21#15#0#0'/* XPM */'#10'static char * ledpurple[] = {'#10'"16 16 2'
+  +'02 2",'#10'"  '#9'c None",'#10'". '#9'c #3F4177",'#10'"+ '#9'c #454577",'#10
+  +'"@ '#9'c #4F4F7E",'#10'"# '#9'c #51517F",'#10'"$ '#9'c #3F4071",'#10'"% '#9
+  +'c #2A2B60",'#10'"& '#9'c #575D8F",'#10'"* '#9'c #7871A5",'#10'"= '#9'c #B1A'
+  +'8CB",'#10'"- '#9'c #DEDDE9",'#10'"; '#9'c #F0F0F5",'#10'"> '#9'c #F1F1F6",'
+  +#10'", '#9'c #DFDFEA",'#10'"'' '#9'c #ACA6C5",'#10'") '#9'c #5D5688",'#10'"!'
+  +' '#9'c #24295B",'#10'"~ '#9'c #535A8A",'#10'"{ '#9'c #A48AC6",'#10'"] '#9'c'
+  +' #F3CAF9",'#10'"^ '#9'c #FFF0FF",'#10'"/ '#9'c #FFFEFF",'#10'"( '#9'c #FFFF'
+  +'FF",'#10'"_ '#9'c #FFF5FF",'#10'": '#9'c #F3CEF8",'#10'"< '#9'c #9679B6",'
+  +#10'"[ '#9'c #2E3463",'#10'"} '#9'c #464D7C",'#10'"| '#9'c #956BBB",'#10'"1 '
+  +#9'c #F8A2FA",'#10'"2 '#9'c #FAC3FA",'#10'"3 '#9'c #F9D7FA",'#10'"4 '#9'c #F'
+  +'BE9FC",'#10'"5 '#9'c #FDF3FD",'#10'"6 '#9'c #FBEAFC",'#10'"7 '#9'c #F8D9FA"'
+  +','#10'"8 '#9'c #F9C6FB",'#10'"9 '#9'c #FEAAFF",'#10'"0 '#9'c #8F61B2",'#10
+  +'"a '#9'c #262D5C",'#10'"b '#9'c #5C488E",'#10'"c '#9'c #BC37D0",'#10'"d '#9
+  +'c #F28CF4",'#10'"e '#9'c #F1ADF5",'#10'"f '#9'c #F5C4F8",'#10'"g '#9'c #F8D'
+  +'6FA",'#10'"h '#9'c #FADEFB",'#10'"i '#9'c #FADFFB",'#10'"j '#9'c #F8D7FA",'
+  +#10'"k '#9'c #F5C6F8",'#10'"l '#9'c #F1AFF5",'#10'"m '#9'c #F491F6",'#10'"n '
+  +#9'c #C63DD6",'#10'"o '#9'c #4D317D",'#10'"p '#9'c #48537C",'#10'"q '#9'c #8'
+  +'736AD",'#10'"r '#9'c #B204C9",'#10'"s '#9'c #DD5DE6",'#10'"t '#9'c #EF99F2"'
+  +','#10'"u '#9'c #F0ABF4",'#10'"v '#9'c #F3B9F7",'#10'"w '#9'c #F4C1F7",'#10
+  +'"x '#9'c #F4C2F7",'#10'"y '#9'c #F4BBF6",'#10'"z '#9'c #F0ACF4",'#10'"A '#9
+  +'c #F09BF2",'#10'"B '#9'c #E065E8",'#10'"C '#9'c #B808CD",'#10'"D '#9'c #842'
+  +'9A9",'#10'"E '#9'c #303A65",'#10'"F '#9'c #58588A",'#10'"G '#9'c #A926C7",'
+  +#10'"H '#9'c #B700D2",'#10'"I '#9'c #C10EDB",'#10'"J '#9'c #DE53EB",'#10'"K '
+  +#9'c #E985ED",'#10'"L '#9'c #EC9AEF",'#10'"M '#9'c #EDA1F1",'#10'"N '#9'c #E'
+  +'D9BEF",'#10'"O '#9'c #EA87EE",'#10'"P '#9'c #DF57EC",'#10'"Q '#9'c #C211DD"'
+  +','#10'"R '#9'c #B800D2",'#10'"S '#9'c #AC1CC8",'#10'"T '#9'c #433E75",'#10
+  +'"U '#9'c #665A96",'#10'"V '#9'c #B917D4",'#10'"W '#9'c #C200DF",'#10'"X '#9
+  +'c #C600E6",'#10'"Y '#9'c #D003F0",'#10'"Z '#9'c #DC1EF6",'#10'"` '#9'c #E24'
+  +'2F4",'#10'" .'#9'c #E456F2",'#10'"..'#9'c #E457F2",'#10'"+.'#9'c #E244F3",'
+  +#10'"@.'#9'c #DC20F6",'#10'"#.'#9'c #D004F1",'#10'"$.'#9'c #C700E7",'#10'"%.'
+  +#9'c #C300E0",'#10'"&.'#9'c #BB10D6",'#10'"*.'#9'c #523B7F",'#10'"=.'#9'c #6'
+  +'E5F9D",'#10'"-.'#9'c #C117DD",'#10'";.'#9'c #CB00E9",'#10'">.'#9'c #D302F4"'
+  +','#10'",.'#9'c #DA02FD",'#10'"''.'#9'c #DE0AFF",'#10'").'#9'c #E116FF",'#10
+  +'"!.'#9'c #E11FFF",'#10'"~.'#9'c #E120FF",'#10'"{.'#9'c #E016FF",'#10'"].'#9
+  +'c #DF0AFF",'#10'"^.'#9'c #DB02FD",'#10'"/.'#9'c #D401F5",'#10'"(.'#9'c #CC0'
+  +'0EB",'#10'"_.'#9'c #C310E0",'#10'":.'#9'c #533C81",'#10'"<.'#9'c #6C6C9C",'
+  +#10'"[.'#9'c #C227E2",'#10'"}.'#9'c #D700F7",'#10'"|.'#9'c #DB05FE",'#10'"1.'
+  +#9'c #E018FF",'#10'"2.'#9'c #E42FFF",'#10'"3.'#9'c #E73FFF",'#10'"4.'#9'c #E'
+  +'848FF",'#10'"5.'#9'c #E640FF",'#10'"6.'#9'c #E530FF",'#10'"7.'#9'c #E119FF"'
+  +','#10'"8.'#9'c #D900F9",'#10'"9.'#9'c #C51BE4",'#10'"0.'#9'c #463F76",'#10
+  +'"a.'#9'c #5B688F",'#10'"b.'#9'c #AA41D0",'#10'"c.'#9'c #E400FF",'#10'"d.'#9
+  +'c #E113FF",'#10'"e.'#9'c #E432FF",'#10'"f.'#9'c #E94AFF",'#10'"g.'#9'c #EC5'
+  +'EFF",'#10'"h.'#9'c #EE6AFF",'#10'"i.'#9'c #EC60FF",'#10'"j.'#9'c #E94DFF",'
+  +#10'"k.'#9'c #E534FF",'#10'"l.'#9'c #E017FF",'#10'"m.'#9'c #E600FF",'#10'"n.'
+  +#9'c #A82FCC",'#10'"o.'#9'c #2F3B62",'#10'"p.'#9'c #6E529E",'#10'"q.'#9'c #E'
+  ,'316FA",'#10'"r.'#9'c #E81FFF",'#10'"s.'#9'c #E745FF",'#10'"t.'#9'c #ED61FF"'
+  +','#10'"u.'#9'c #F07BFF",'#10'"v.'#9'c #F48BFF",'#10'"w.'#9'c #F48CFF",'#10
+  +'"x.'#9'c #F27CFF",'#10'"y.'#9'c #ED64FF",'#10'"z.'#9'c #E747FF",'#10'"A.'#9
+  +'c #E824FF",'#10'"B.'#9'c #E816FC",'#10'"C.'#9'c #653D92",'#10'"D.'#9'c #364'
+  +'66A",'#10'"E.'#9'c #9644BA",'#10'"F.'#9'c #F434FF",'#10'"G.'#9'c #EF4EFF",'
+  +#10'"H.'#9'c #EF71FF",'#10'"I.'#9'c #F491FF",'#10'"J.'#9'c #F9ABFF",'#10'"K.'
+  +#9'c #FAACFF",'#10'"L.'#9'c #F594FF",'#10'"M.'#9'c #EF73FF",'#10'"N.'#9'c #E'
+  +'F52FF",'#10'"O.'#9'c #F735FF",'#10'"P.'#9'c #A040C0",'#10'"Q.'#9'c #29395E"'
+  +','#10'"R.'#9'c #2F3A62",'#10'"S.'#9'c #9A50B7",'#10'"T.'#9'c #F45EFA",'#10
+  +'"U.'#9'c #FF7AFF",'#10'"V.'#9'c #FE9BFF",'#10'"W.'#9'c #FFBDFF",'#10'"X.'#9
+  +'c #FFBFFF",'#10'"Y.'#9'c #FF9EFF",'#10'"Z.'#9'c #FF7CFF",'#10'"`.'#9'c #F66'
+  +'0FC",'#10'" +'#9'c #A251BF",'#10'".+'#9'c #323C66",'#10'"++'#9'c #27355B",'
+  +#10'"@+'#9'c #644D8D",'#10'"#+'#9'c #B66FCA",'#10'"$+'#9'c #E994F0",'#10'"%+'
+  +#9'c #F9ABFB",'#10'"&+'#9'c #F9ACFB",'#10'"*+'#9'c #EC95F1",'#10'"=+'#9'c #B'
+  +'D71CE",'#10'"-+'#9'c #6A4F90",'#10'";+'#9'c #28365D",'#10'">+'#9'c #2D3462"'
+  +','#10'",+'#9'c #484477",'#10'"''+'#9'c #5C4F86",'#10'")+'#9'c #5D4F86",'#10
+  +'"!+'#9'c #4A4577",'#10'"~+'#9'c #2F3463",'#10'"          . + @ # $ %       '
+  +'    ",'#10'"      & * = - ; > , '' ) !       ",'#10'"    ~ { ] ^ / ( ( ( _ '
+  +': < [     ",'#10'"  } | 1 2 3 4 5 5 6 7 8 9 0 a   ",'#10'"  b c d e f g h i'
+  +' j k l m n o   ",'#10'"p q r s t u v w x y z A B C D E ",'#10'"F G H I J K '
+  +'L M M N O P Q R S T ",'#10'"U V W X Y Z `  ...+.@.#.$.%.&.*.",'#10'"=.-.;.>'
+  +'.,.''.).!.~.{.].^./.(._.:.",'#10'"<.[.}.|.1.2.3.4.4.5.6.7.|.8.9.0.",'#10'"a'
+  +'.b.c.d.e.f.g.h.h.i.j.k.l.m.n.o.",'#10'"  p.q.r.s.t.u.v.w.x.y.z.A.B.C.  ",'
+  +#10'"  D.E.F.G.H.I.J.K.L.M.N.O.P.Q.  ",'#10'"    R.S.T.U.V.W.X.Y.Z.`. +.+   '
+  +' ",'#10'"      ++@+#+$+%+&+*+=+-+;+      ",'#10'"          >+,+''+)+!+~+   '
+  +'       "};'#10#242#11#0#0'/* XPM */'#10'static char * messagebox_warning_xp'
+  +'m[] = {'#10'"16 16 151 2",'#10'"  '#9'c None",'#10'". '#9'c #B41715",'#10'"'
+  +'+ '#9'c #B31B19",'#10'"@ '#9'c #A70302",'#10'"# '#9'c #E89793",'#10'"$ '#9
+  +'c #E99F9A",'#10'"% '#9'c #A00505",'#10'"& '#9'c #C13A37",'#10'"* '#9'c #FFD'
+  +'8D6",'#10'"= '#9'c #FFCDCC",'#10'"- '#9'c #BE3B38",'#10'"; '#9'c #A70504",'
+  +#10'"> '#9'c #E5908C",'#10'", '#9'c #FFCCCC",'#10'"'' '#9'c #FFB4B5",'#10'")'
+  +' '#9'c #E47B78",'#10'"! '#9'c #960706",'#10'"~ '#9'c #C03935",'#10'"{ '#9'c'
+  +' #FEC0BE",'#10'"] '#9'c #FFD7D7",'#10'"^ '#9'c #FFC8C9",'#10'"/ '#9'c #FF8F'
+  +'8E",'#10'"( '#9'c #B62F2D",'#10'"_ '#9'c #A30403",'#10'": '#9'c #E58582",'
+  +#10'"< '#9'c #EFE6E6",'#10'"[ '#9'c #EDE6E6",'#10'"} '#9'c #FF9696",'#10'"| '
+  +#9'c #E35351",'#10'"1 '#9'c #8B0605",'#10'"2 '#9'c #FEB4B2",'#10'"3 '#9'c #F'
+  +'FDFDF",'#10'"4 '#9'c #6F7575",'#10'"5 '#9'c #647070",'#10'"6 '#9'c #FCC0C0"'
+  +','#10'"7 '#9'c #FE5D5C",'#10'"8 '#9'c #AF2321",'#10'"9 '#9'c #A30A09",'#10
+  +'"0 '#9'c #E7827F",'#10'"a '#9'c #FFBCBD",'#10'"b '#9'c #FFFBFB",'#10'"c '#9
+  +'c #505454",'#10'"d '#9'c #414646",'#10'"e '#9'c #FEF6F6",'#10'"f '#9'c #FF6'
+  +'D6D",'#10'"g '#9'c #E23130",'#10'"h '#9'c #830807",'#10'"i '#9'c #BE3732",'
+  +#10'"j '#9'c #FDA29E",'#10'"k '#9'c #FFCFCF",'#10'"l '#9'c #FFFFFF",'#10'"m '
+  +#9'c #757575",'#10'"n '#9'c #636363",'#10'"o '#9'c #FFA7A7",'#10'"p '#9'c #F'
+  +'E2625",'#10'"q '#9'c #A91917",'#10'"r '#9'c #A00C0C",'#10'"s '#9'c #DE4230"'
+  +','#10'"t '#9'c #F55F4B",'#10'"u '#9'c #FCEEED",'#10'"v '#9'c #8C8C8C",'#10
+  +'"w '#9'c #7E7E7E",'#10'"x '#9'c #FEEBEA",'#10'"y '#9'c #DF3730",'#10'"z '#9
+  +'c #C01910",'#10'"A '#9'c #790A0A",'#10'"B '#9'c #BC3027",'#10'"C '#9'c #ED2'
+  +'F13",'#10'"D '#9'c #E88375",'#10'"E '#9'c #F7FFFF",'#10'"F '#9'c #BCBCBC",'
+  +#10'"G '#9'c #B5B5B5",'#10'"H '#9'c #FCFFFF",'#10'"I '#9'c #D59490",'#10'"J '
+  +#9'c #C00D04",'#10'"K '#9'c #9C1612",'#10'"L '#9'c #9F0E0E",'#10'"M '#9'c #D'
+  +'E3C29",'#10'"N '#9'c #E83D26",'#10'"O '#9'c #E5D8D6",'#10'"P '#9'c #F2F9FA"'
+  +','#10'"Q '#9'c #FEFDFD",'#10'"R '#9'c #D7D5D5",'#10'"S '#9'c #D3D2D2",'#10
+  +'"T '#9'c #F5FAFA",'#10'"U '#9'c #E5E2E1",'#10'"V '#9'c #BC302D",'#10'"W '#9
+  +'c #B50D08",'#10'"X '#9'c #720807",'#10'"Y '#9'c #BB2D27",'#10'"Z '#9'c #EA3'
+  +'014",'#10'"` '#9'c #D7887C",'#10'" .'#9'c #D9F5F9",'#10'"..'#9'c #EAF6F8",'
+  +#10'"+.'#9'c #FBFFFF",'#10'"@.'#9'c #5E6A6A",'#10'"#.'#9'c #545F5F",'#10'"$.'
+  +#9'c #F9FFFF",'#10'"%.'#9'c #EFFAFA",'#10'"&.'#9'c #E2FBFB",'#10'"*.'#9'c #C'
+  +'58F8D",'#10'"=.'#9'c #B50704",'#10'"-.'#9'c #930D0B",'#10'";.'#9'c #A01211"'
+  +','#10'">.'#9'c #DB3D2A",'#10'",.'#9'c #E41C04",'#10'"''.'#9'c #D17263",'#10
+  +'").'#9'c #D0AFAB",'#10'"!.'#9'c #D9AEA9",'#10'"~.'#9'c #E0B7B3",'#10'"{.'#9
+  +'c #C79F9C",'#10'"].'#9'c #C49C9A",'#10'"^.'#9'c #DCB6B4",'#10'"/.'#9'c #D3A'
+  +'EAC",'#10'"(.'#9'c #CBB0AF",'#10'"_.'#9'c #BA7270",'#10'":.'#9'c #A40404",'
+  +#10'"<.'#9'c #AB0B09",'#10'"[.'#9'c #6E0505",'#10'"}.'#9'c #B52721",'#10'"|.'
+  +#9'c #EE492E",'#10'"1.'#9'c #E43116",'#10'"2.'#9'c #E02A11",'#10'"3.'#9'c #D'
+  ,'A2914",'#10'"4.'#9'c #D52512",'#10'"5.'#9'c #CF200F",'#10'"6.'#9'c #D6281A"'
+  +','#10'"7.'#9'c #D2241A",'#10'"8.'#9'c #C1140D",'#10'"9.'#9'c #BD110D",'#10
+  +'"0.'#9'c #B90F0B",'#10'"a.'#9'c #B50805",'#10'"b.'#9'c #AF0806",'#10'"c.'#9
+  +'c #B90A09",'#10'"d.'#9'c #880807",'#10'"e.'#9'c #9C0A08",'#10'"f.'#9'c #AF2'
+  +'31E",'#10'"g.'#9'c #AC2520",'#10'"h.'#9'c #A81F1A",'#10'"i.'#9'c #A51A15",'
+  +#10'"j.'#9'c #A11813",'#10'"k.'#9'c #9E1511",'#10'"l.'#9'c #9A120D",'#10'"m.'
+  +#9'c #950F0C",'#10'"n.'#9'c #920D0A",'#10'"o.'#9'c #8F0B09",'#10'"p.'#9'c #8'
+  +'C0906",'#10'"q.'#9'c #890A08",'#10'"r.'#9'c #880A09",'#10'"s.'#9'c #840706"'
+  +','#10'"t.'#9'c #6A0202",'#10'"              . +               ",'#10'"     '
+  +'       @ # $ %             ",'#10'"            & * = -             ",'#10'"'
+  +'          ; > , '' ) !           ",'#10'"          ~ { ] ^ / (           ",'
+  +#10'"        _ : ^ < [ } | 1         ",'#10'"        ~ 2 3 4 5 6 7 8        '
+  +' ",'#10'"      9 0 a b c d e f g h       ",'#10'"      i j k l m n l o p q '
+  +'      ",'#10'"    r s t u l v w l x y z A     ",'#10'"    B C D E l F G l H'
+  +' I J K     ",'#10'"  L M N O P Q R S Q T U V W X   ",'#10'"  Y Z `  ...+.@.'
+  +'#.$.%.&.*.=.-.  ",'#10'";.>.,.''.).!.~.{.].^./.(._.:.<.[.",'#10'"}.|.1.2.3.'
+  +'4.5.6.7.8.9.0.a.b.c.d.",'#10'"e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t."};'#10#7#13#0
+  +#0'/* XPM */'#10'static char * message_xpm[] = {'#10'"16 16 169 2",'#10'"  '
+  +#9'c None",'#10'". '#9'c #780404",'#10'"+ '#9'c #C31414",'#10'"@ '#9'c #D925'
+  +'25",'#10'"# '#9'c #6F0704",'#10'"$ '#9'c #B31010",'#10'"% '#9'c #EC1D1D",'
+  +#10'"& '#9'c #F42E30",'#10'"* '#9'c #CC1710",'#10'"= '#9'c #EFBE7F",'#10'"- '
+  +#9'c #FABB6D",'#10'"; '#9'c #F6A347",'#10'"> '#9'c #F08A29",'#10'", '#9'c #E'
+  +'A7310",'#10'"'' '#9'c #E35C00",'#10'") '#9'c #D94500",'#10'"! '#9'c #BF2126'
+  +'",'#10'"~ '#9'c #F43636",'#10'"{ '#9'c #E72424",'#10'"] '#9'c #C60607",'#10
+  +'"^ '#9'c #EEEEDD",'#10'"/ '#9'c #FFFFF2",'#10'"( '#9'c #FFFFDE",'#10'"_ '#9
+  +'c #FFFFCA",'#10'": '#9'c #FFFFAF",'#10'"< '#9'c #FFFF8E",'#10'"[ '#9'c #FEF'
+  +'46B",'#10'"} '#9'c #FCE353",'#10'"| '#9'c #F9CE3F",'#10'"1 '#9'c #D97C12",'
+  +#10'"2 '#9'c #BF320D",'#10'"3 '#9'c #DB1613",'#10'"4 '#9'c #C80000",'#10'"5 '
+  +#9'c #CA7268",'#10'"6 '#9'c #FDFFEA",'#10'"7 '#9'c #FFFFDD",'#10'"8 '#9'c #F'
+  +'FFFD4",'#10'"9 '#9'c #FFFFCD",'#10'"0 '#9'c #FFFFC6",'#10'"a '#9'c #FFFFBE"'
+  +','#10'"b '#9'c #FFFFB6",'#10'"c '#9'c #FFFFAB",'#10'"d '#9'c #FFFF96",'#10
+  +'"e '#9'c #C49123",'#10'"f '#9'c #F27E23",'#10'"g '#9'c #EED8BB",'#10'"h '#9
+  +'c #E5CBBE",'#10'"i '#9'c #FCFFE6",'#10'"j '#9'c #FFFFCB",'#10'"k '#9'c #FFF'
+  +'FC1",'#10'"l '#9'c #FFFFB7",'#10'"m '#9'c #FFFFAC",'#10'"n '#9'c #F7FAA2",'
+  +#10'"o '#9'c #F2F495",'#10'"p '#9'c #FFFF78",'#10'"q '#9'c #A76B16",'#10'"r '
+  +#9'c #F1802A",'#10'"s '#9'c #FFFFE3",'#10'"t '#9'c #FFFFF1",'#10'"u '#9'c #F'
+  +'EFFC2",'#10'"v '#9'c #FFFFA1",'#10'"w '#9'c #EBEF96",'#10'"x '#9'c #CBD28A"'
+  +','#10'"y '#9'c #FFFC63",'#10'"z '#9'c #894E10",'#10'"A '#9'c #F68B32",'#10
+  +'"B '#9'c #E5F0D6",'#10'"C '#9'c #FDFEE0",'#10'"D '#9'c #FFFFD6",'#10'"E '#9
+  +'c #FFFFCC",'#10'"F '#9'c #ECF2C2",'#10'"G '#9'c #B9CEB9",'#10'"H '#9'c #E9E'
+  +'FAF",'#10'"I '#9'c #B5C9A8",'#10'"J '#9'c #ADC0A0",'#10'"K '#9'c #C7CF8B",'
+  +#10'"L '#9'c #D7D977",'#10'"M '#9'c #FFEF51",'#10'"N '#9'c #69340A",'#10'"O '
+  +#9'c #FB9838",'#10'"P '#9'c #C9E0CF",'#10'"Q '#9'c #D0E0D3",'#10'"R '#9'c #B'
+  +'5CDC9",'#10'"S '#9'c #B6CDC1",'#10'"T '#9'c #A2BFBA",'#10'"U '#9'c #95B4B2"'
+  +','#10'"V '#9'c #A4BDAB",'#10'"W '#9'c #A3BAA0",'#10'"X '#9'c #C1CC8E",'#10
+  +'"Y '#9'c #CCCD7A",'#10'"Z '#9'c #EBE461",'#10'"` '#9'c #FFDF42",'#10'" .'#9
+  +'c #4C1F07",'#10'"..'#9'c #FDA33D",'#10'"+.'#9'c #D5EACD",'#10'"@.'#9'c #90B'
+  +'5C8",'#10'"#.'#9'c #B0CAC2",'#10'"$.'#9'c #AAC4BA",'#10'"%.'#9'c #BBD0B1",'
+  +#10'"&.'#9'c #D6E1A7",'#10'"*.'#9'c #D5E09B",'#10'"=.'#9'c #E9EA87",'#10'"-.'
+  +#9'c #FBF371",'#10'";.'#9'c #FFF25C",'#10'">.'#9'c #FFF147",'#10'",.'#9'c #F'
+  +'FCF36",'#10'"''.'#9'c #320F05",'#10'").'#9'c #F8A93F",'#10'"!.'#9'c #FAFECB'
+  +'",'#10'"~.'#9'c #E4EDC5",'#10'"{.'#9'c #F0F5BB",'#10'"].'#9'c #FEFEB0",'#10
+  +'"^.'#9'c #FFFFA5",'#10'"/.'#9'c #FFFF98",'#10'"(.'#9'c #FFFF86",'#10'"_.'#9
+  +'c #FFF871",'#10'":.'#9'c #FFF25E",'#10'"<.'#9'c #FFEF4A",'#10'"[.'#9'c #FFF'
+  +'036",'#10'"}.'#9'c #FABE2C",'#10'"|.'#9'c #1D0403",'#10'"1.'#9'c #F7B441",'
+  +#10'"2.'#9'c #FFFFC4",'#10'"3.'#9'c #FFFFBD",'#10'"4.'#9'c #FFFFB1",'#10'"5.'
+  +#9'c #FFFFA6",'#10'"6.'#9'c #FFFF9A",'#10'"7.'#9'c #FFFB88",'#10'"8.'#9'c #F'
+  +'FF673",'#10'"9.'#9'c #FFF25F",'#10'"0.'#9'c #FDE64B",'#10'"a.'#9'c #FECF31"'
+  +','#10'"b.'#9'c #FFDA1B",'#10'"c.'#9'c #F6A022",'#10'"d.'#9'c #0D0001",'#10
+  +'"e.'#9'c #FCC744",'#10'"f.'#9'c #FFFFC8",'#10'"g.'#9'c #FFFFBC",'#10'"h.'#9
+  +'c #FFFFA0",'#10'"i.'#9'c #FFFE8D",'#10'"j.'#9'c #FFF776",'#10'"k.'#9'c #FFF'
+  +'261",'#10'"l.'#9'c #FFF04D",'#10'"m.'#9'c #EACB37",'#10'"n.'#9'c #FFA520",'
+  +#10'"o.'#9'c #FF7E00",'#10'"p.'#9'c #701F02",'#10'"q.'#9'c #EEAD1B",'#10'"r.'
+  +#9'c #FAE055",'#10'"s.'#9'c #FFE860",'#10'"t.'#9'c #FFEF67",'#10'"u.'#9'c #F'
+  ,'FF369",'#10'"v.'#9'c #FFF363",'#10'"w.'#9'c #FFF35A",'#10'"x.'#9'c #FFF14E"'
+  +','#10'"y.'#9'c #FFF03C",'#10'"z.'#9'c #F2C831",'#10'"A.'#9'c #E77B1D",'#10
+  +'"B.'#9'c #400E00",'#10'"C.'#9'c #220B00",'#10'"D.'#9'c #2F1200",'#10'"E.'#9
+  +'c #411D00",'#10'"F.'#9'c #562900",'#10'"G.'#9'c #6C3706",'#10'"H.'#9'c #824'
+  +'50D",'#10'"I.'#9'c #995414",'#10'"J.'#9'c #B2661C",'#10'"K.'#9'c #A8521A",'
+  +#10'"L.'#9'c #1D0402",'#10'". + @ #                         ",'#10'"$ % & * '
+  +'= - ; > , '' )           ",'#10'"! ~ { ] ^ / ( _ : < [ } | 1     ",'#10'"2 '
+  +'3 4 5 6 7 8 9 0 a b c d e     ",'#10'"f g h i ( 8 j k l m n o p q     ",'#10
+  +'"r s t ( 8 j u l m v w x y z     ",'#10'"A B C D E F G H I J K L M N     ",'
+  +#10'"O P Q R S T U V W X Y Z `  .    ",'#10'"..+.@.#.$.%.&.*.=.-.;.>.,.''.  '
+  +'  ",'#10'").!.~.{.].^./.(._.:.<.[.}.|.    ",'#10'"1.2.3.4.5.6.7.8.9.0.a.b.c'
+  +'.d.    ",'#10'"e.f.g.: h.i.j.k.l.m.n.o.p.      ",'#10'"q.r.s.t.u.v.w.x.y.z.'
+  +'A.B.        ",'#10'"  C.D.E.F.G.H.I.J.K.L.          ",'#10'"               '
+  +'                 ",'#10'"                                "};'#10'/'#1#0#0'/'
+  +'* XPM */'#10'static char * InvalidBreakPoint_xpm[] = {'#10'"11 11 5 1",'#10
+  +'" '#9'c None",'#10'".'#9'c #000000",'#10'"+'#9'c #FF0000",'#10'"@'#9'c #FF0'
+  +'400",'#10'"#'#9'c #FFFF00",'#10'"   .....   ",'#10'"  .+++++.  ",'#10'" .++'
+  +'++++@. ",'#10'".++#+++#@+.",'#10'".+++###@++.",'#10'".++++#@@++.",'#10'".+@'
+  +'+###+++.",'#10'".++#+@@#++.",'#10'" .++@@+++. ",'#10'"  .+++++.  ",'#10'"  '
+  +' .....   "};'#10#18#1#0#0'/* XPM */'#10'static char * InactiveBreakPoint_xp'
+  +'m[] = {'#10'"11 11 3 1",'#10'" '#9'c None",'#10'".'#9'c #000000",'#10'"+'#9
+  +'c #0DA500",'#10'"   .....   ",'#10'"  .+++++.  ",'#10'" .+++++++. ",'#10'".'
+  +'+++++++++.",'#10'".+++++++++.",'#10'".+++++++++.",'#10'".+++++++++.",'#10'"'
+  +'.+++++++++.",'#10'" .+++++++. ",'#10'"  .+++++.  ",'#10'"   .....   "};'#10
+  +#18#2#0#0'/* XPM */'#10'static char * menu_debugger_xpm[] = {'#10'"16 16 10 '
+  +'1",'#10'" '#9'c None",'#10'".'#9'c #ED15E5",'#10'"+'#9'c #D022C9",'#10'"@'#9
+  +'c #6E3A6A",'#10'"#'#9'c #CD1EC6",'#10'"$'#9'c #AD28A7",'#10'"%'#9'c #CD1CC8'
+  +'",'#10'"&'#9'c #B223B2",'#10'"*'#9'c #CD1BC6",'#10'"='#9'c #8E2789",'#10'" '
+  +'               ",'#10'"                ",'#10'"                ",'#10'"   .'
+  +'  .         ",'#10'"   .  + ...     ",'#10'"   @..+ +       ",'#10'"  .....'
+  +'..   ..  ",'#10'" .............. ",'#10'" .#$......#%... ",'#10'" &...*.=.&'
+  +'&&... ",'#10'"  &.&&.&.&& &.  ",'#10'"   &&&...       ",'#10'"   &  . ...  '
+  +'   ",'#10'"   &  &         ",'#10'"                ",'#10'"                '
+  +'"};'#10'L'#2#0#0'/* XPM */'#10'static char * debugoutput_xpm[] = {'#10'"16 '
+  +'16 14 1",'#10'" '#9'c None",'#10'".'#9'c #424142",'#10'"+'#9'c #6666CC",'#10
+  +'"@'#9'c #9999B2",'#10'"#'#9'c #A5A5BE",'#10'"$'#9'c #B3B3CC",'#10'"%'#9'c #'
+  +'CCCCE6",'#10'"&'#9'c #D5D5EF",'#10'"*'#9'c #E7E7FF",'#10'"='#9'c #83C78C",'
+  +#10'"-'#9'c #1A821A",'#10'";'#9'c #5EAB5E",'#10'">'#9'c #FFFFFF",'#10'",'#9
+  +'c #000000",'#10'"                ",'#10'"   ,,,,,,,,,,,  ",'#10'"   ,++++++'
+  +'+++.> ",'#10'"   ,>*&>*>*&*.> ",'#10'"   ,>&>*>*&*%.> ",'#10'"  ,,>>,>*&*%*'
+  +'.> ",'#10'"  >,,,>*&*%*$.> ",'#10'"   ,=,*&*%*#&.> ",'#10'" ,>,,,&,%*#&@.> '
+  +'",'#10'"  ,===,%*@&@%.> ",'#10'" ,,=;-,,......> ",'#10'" >,=;-,>>>>>>>> ",'
+  +#10'"  ,=--,>        ",'#10'" ,>,,,>,>       ",'#10'" >  >>  >       ",'#10
+  +'"                "};'#10'S'#12#0#0'/* XPM */'#10'static char * messagebox_c'
+  +'ritical_xpm[] = {'#10'"16 16 157 2",'#10'"  '#9'c None",'#10'". '#9'c #B325'
+  +'26",'#10'"+ '#9'c #C56365",'#10'"@ '#9'c #A81414",'#10'"# '#9'c #980D0D",'
+  +#10'"$ '#9'c #B96363",'#10'"% '#9'c #9F2D2D",'#10'"& '#9'c #B53334",'#10'"* '
+  +#9'c #F1DCDB",'#10'"= '#9'c #FFE7DF",'#10'"- '#9'c #E8C8CA",'#10'"; '#9'c #A'
+  +'21819",'#10'"> '#9'c #961213",'#10'", '#9'c #DFBFC0",'#10'"'' '#9'c #FDE2DD'
+  +'",'#10'") '#9'c #F0E1DF",'#10'"! '#9'c #A04041",'#10'"~ '#9'c #B32728",'#10
+  +'"{ '#9'c #F2DBDB",'#10'"] '#9'c #FF9E86",'#10'"^ '#9'c #F92917",'#10'"/ '#9
+  +'c #FFBDAE",'#10'"( '#9'c #E7CDCF",'#10'"_ '#9'c #9A1415",'#10'": '#9'c #930'
+  +'B0C",'#10'"< '#9'c #E1C4C5",'#10'"[ '#9'c #F5C3BB",'#10'"} '#9'c #D11816",'
+  +#10'"| '#9'c #E38075",'#10'"1 '#9'c #ECE3E2",'#10'"2 '#9'c #973031",'#10'"3 '
+  +#9'c #C66466",'#10'"4 '#9'c #FFE9DF",'#10'"5 '#9'c #F9290F",'#10'"6 '#9'c #F'
+  +'21A00",'#10'"7 '#9'c #ED2106",'#10'"8 '#9'c #F9B9AD",'#10'"9 '#9'c #E2C5C7"'
+  +','#10'"0 '#9'c #DEBFBF",'#10'"a '#9'c #F3C0BA",'#10'"b '#9'c #D1170D",'#10
+  +'"c '#9'c #CA0900",'#10'"d '#9'c #C20603",'#10'"e '#9'c #F5D4D1",'#10'"f '#9
+  +'c #B47474",'#10'"g '#9'c #A91A1B",'#10'"h '#9'c #E7C4C5",'#10'"i '#9'c #ED2'
+  +'108",'#10'"j '#9'c #E81A00",'#10'"k '#9'c #E11B06",'#10'"l '#9'c #F1B6AE",'
+  +#10'"m '#9'c #EFC0B9",'#10'"n '#9'c #D1170C",'#10'"o '#9'c #CB0C00",'#10'"p '
+  +#9'c #C30A02",'#10'"q '#9'c #E6A19C",'#10'"r '#9'c #E3CFCF",'#10'"s '#9'c #8'
+  +'82122",'#10'"t '#9'c #A2191A",'#10'"u '#9'c #E7D1D3",'#10'"v '#9'c #FAB8AC"'
+  +','#10'"w '#9'c #E01B06",'#10'"x '#9'c #DC1400",'#10'"y '#9'c #D8200A",'#10
+  ,'"z '#9'c #D31F0D",'#10'"A '#9'c #CC0D00",'#10'"B '#9'c #C30900",'#10'"C '#9
+  +'c #E49D99",'#10'"D '#9'c #E6DBDB",'#10'"E '#9'c #882323",'#10'"F '#9'c #9A1'
+  +'111",'#10'"G '#9'c #E1C5C6",'#10'"H '#9'c #F1B4AC",'#10'"I '#9'c #D8200D",'
+  +#10'"J '#9'c #D01400",'#10'"K '#9'c #CC1200",'#10'"L '#9'c #C61407",'#10'"M '
+  +#9'c #E1A29F",'#10'"N '#9'c #DFCECF",'#10'"O '#9'c #851818",'#10'"P '#9'c #9'
+  +'40C0C",'#10'"Q '#9'c #DEC0C2",'#10'"R '#9'c #EFBCB6",'#10'"S '#9'c #D11F10"'
+  +','#10'"T '#9'c #CC1100",'#10'"U '#9'c #C60F00",'#10'"V '#9'c #C01309",'#10
+  +'"W '#9'c #E1ABA8",'#10'"X '#9'c #DDCACB",'#10'"Y '#9'c #7D1010",'#10'"Z '#9
+  +'c #961314",'#10'"` '#9'c #E2C4C6",'#10'" .'#9'c #D1190C",'#10'"..'#9'c #CB0'
+  +'D00",'#10'"+.'#9'c #C61305",'#10'"@.'#9'c #C11207",'#10'"#.'#9'c #BB0400",'
+  +#10'"$.'#9'c #B40705",'#10'"%.'#9'c #DEA6A5",'#10'"&.'#9'c #DED0D0",'#10'"*.'
+  +#9'c #7B1A1A",'#10'"=.'#9'c #981516",'#10'"-.'#9'c #DFBDBD",'#10'";.'#9'c #F'
+  +'4C1B9",'#10'">.'#9'c #D2180C",'#10'",.'#9'c #C30A00",'#10'"''.'#9'c #E1A19E'
+  +'",'#10'").'#9'c #E1ABA9",'#10'"!.'#9'c #B40605",'#10'"~.'#9'c #AF0100",'#10
+  +'"{.'#9'c #A80606",'#10'"].'#9'c #DBA7A7",'#10'"^.'#9'c #D8C4C4",'#10'"/.'#9
+  +'c #781B1B",'#10'"(.'#9'c #B96364",'#10'"_.'#9'c #FCE4DF",'#10'":.'#9'c #D01'
+  +'510",'#10'"<.'#9'c #C90800",'#10'"[.'#9'c #C30903",'#10'"}.'#9'c #E49E9B",'
+  +#10'"|.'#9'c #E0D0D0",'#10'"1.'#9'c #DCC9C9",'#10'"2.'#9'c #DDA8A7",'#10'"3.'
+  +#9'c #A90505",'#10'"4.'#9'c #A20000",'#10'"5.'#9'c #9B0404",'#10'"6.'#9'c #E'
+  +'5D0D0",'#10'"7.'#9'c #A77373",'#10'"8.'#9'c #A02D2E",'#10'"9.'#9'c #F0E0E1"'
+  +','#10'"0.'#9'c #E27F75",'#10'"a.'#9'c #C30E0D",'#10'"b.'#9'c #E6A19B",'#10
+  +'"c.'#9'c #E5D8D8",'#10'"d.'#9'c #861D1D",'#10'"e.'#9'c #7D1414",'#10'"f.'#9
+  +'c #DECDCD",'#10'"g.'#9'c #9A0C0C",'#10'"h.'#9'c #BD6363",'#10'"i.'#9'c #E5E'
+  +'1E1",'#10'"j.'#9'c #843838",'#10'"k.'#9'c #A04142",'#10'"l.'#9'c #EDE2E1",'
+  +#10'"m.'#9'c #F5D2D0",'#10'"n.'#9'c #E3D1D1",'#10'"o.'#9'c #892222",'#10'"p.'
+  +#9'c #7C1919",'#10'"q.'#9'c #D8C7C8",'#10'"r.'#9'c #E5CECF",'#10'"s.'#9'c #E'
+  +'5E0E0",'#10'"t.'#9'c #8D4E4E",'#10'"u.'#9'c #962F2F",'#10'"v.'#9'c #B47273"'
+  +','#10'"w.'#9'c #881C1C",'#10'"x.'#9'c #781514",'#10'"y.'#9'c #A77171",'#10
+  +'"z.'#9'c #843737",'#10'"                                ",'#10'"      . + @'
+  +'         # $ %       ",'#10'"    & * = - ;     > , '' ) !     ",'#10'"  ~ {'
+  +' ] ^ / ( _ : < [ } | 1 2   ",'#10'"  3 4 5 6 7 8 9 0 a b c d e f   ",'#10'"'
+  +'  g h / i j k l m n o p q r s   ",'#10'"    t u v w x y z A B C D E     ",'
+  +#10'"      F G H I J K L M N O       ",'#10'"      P Q R S T U V W X Y      '
+  +' ",'#10'"    Z ` a  ...+.@.#.$.%.&.*.    ",'#10'"  =.-.;.>.A ,.''.).!.~.{.]'
+  +'.^./.  ",'#10'"  (._.:.<.[.}.|.1.2.3.4.5.6.7.  ",'#10'"  8.9.0.a.b.c.d.e.f.'
+  +'].g.h.i.j.  ",'#10'"    k.l.m.n.o.    p.q.r.s.t.    ",'#10'"      u.v.w.   '
+  +'     x.y.z.      ",'#10'"                                "};'#10'o'#12#0#0
+  +'/* XPM */'#10'static char * messagebox_info_xpm[] = {'#10'"16 16 159 2",'#10
+  +'"  '#9'c None",'#10'". '#9'c #012B94",'#10'"+ '#9'c #1642A6",'#10'"@ '#9'c '
+  +'#2753B3",'#10'"# '#9'c #244EB3",'#10'"$ '#9'c #133AA4",'#10'"% '#9'c #021F8'
+  +'E",'#10'"& '#9'c #224FAF",'#10'"* '#9'c #6F9CDE",'#10'"= '#9'c #94C0FA",'#10
+  +'"- '#9'c #86B4F4",'#10'"; '#9'c #7AAAF2",'#10'"> '#9'c #73A6F7",'#10'", '#9
+  +'c #4C80DF",'#10'"'' '#9'c #173DAB",'#10'") '#9'c #3665BF",'#10'"! '#9'c #A3'
+  +'CDF9",'#10'"~ '#9'c #B1D6FF",'#10'"{ '#9'c #96BAF2",'#10'"] '#9'c #BECDE9",'
+  +#10'"^ '#9'c #B8C8E7",'#10'"/ '#9'c #729DE7",'#10'"( '#9'c #6A9EF2",'#10'"_ '
+  +#9'c #5591F5",'#10'": '#9'c #1F49BB",'#10'"< '#9'c #2450B0",'#10'"[ '#9'c #A'
+  +'3CCFA",'#10'"} '#9'c #AED2FF",'#10'"| '#9'c #90BAFA",'#10'"1 '#9'c #8FB1E7"'
+  +','#10'"2 '#9'c #F4F6F8",'#10'"3 '#9'c #F3F4F8",'#10'"4 '#9'c #7199DE",'#10
+  +'"5 '#9'c #4E82E0",'#10'"6 '#9'c #4D82E0",'#10'"7 '#9'c #3F7FF3",'#10'"8 '#9
+  +'c #1031A8",'#10'"9 '#9'c #012A95",'#10'"0 '#9'c #6F9BE0",'#10'"a '#9'c #B6D'
+  +'AFF",'#10'"b '#9'c #97BEFA",'#10'"c '#9'c #8CB5F7",'#10'"d '#9'c #6C9BEA",'
+  +#10'"e '#9'c #82A5E2",'#10'"f '#9'c #789DDF",'#10'"g '#9'c #4C7FDE",'#10'"h '
+  +#9'c #4C7EDF",'#10'"i '#9'c #3D71D6",'#10'"j '#9'c #3370E0",'#10'"k '#9'c #2'
+  +'05AD8",'#10'"l '#9'c #010F85",'#10'"m '#9'c #103FA5",'#10'"n '#9'c #589CF9"'
+  +','#10'"o '#9'c #92BEFC",'#10'"p '#9'c #91B8F7",'#10'"q '#9'c #73A0EB",'#10
+  +'"r '#9'c #88ABE7",'#10'"s '#9'c #80A4E4",'#10'"t '#9'c #779DE0",'#10'"u '#9
+  +'c #5283DC",'#10'"v '#9'c #3A70D9",'#10'"w '#9'c #3068D5",'#10'"x '#9'c #215'
+  +'CCF",'#10'"y '#9'c #1B5DD1",'#10'"z '#9'c #091E95",'#10'"A '#9'c #214FB3",'
+  +#10'"B '#9'c #277EF8",'#10'"C '#9'c #2472EC",'#10'"D '#9'c #79A6F0",'#10'"E '
+  +#9'c #6A98E7",'#10'"F '#9'c #84A7E2",'#10'"G '#9'c #F1F4F5",'#10'"H '#9'c #F'
+  +'3F6F5",'#10'"I '#9'c #618CDC",'#10'"J '#9'c #245FD3",'#10'"K '#9'c #235DCF"'
+  +','#10'"L '#9'c #0647BB",'#10'"M '#9'c #0D52C2",'#10'"N '#9'c #0B279E",'#10
+  +'"O '#9'c #204CB1",'#10'"P '#9'c #2B7FF4",'#10'"Q '#9'c #0055E2",'#10'"R '#9
+  +'c #1060DE",'#10'"S '#9'c #3D7AE1",'#10'"T '#9'c #407ADB",'#10'"U '#9'c #D4D'
+  ,'DEE",'#10'"V '#9'c #F7F8F2",'#10'"W '#9'c #5483D8",'#10'"X '#9'c #0D4BC6",'
+  +#10'"Y '#9'c #0546B9",'#10'"Z '#9'c #003FAE",'#10'"` '#9'c #0D4FBF",'#10'" .'
+  +#9'c #0B239C",'#10'"..'#9'c #153CA3",'#10'"+.'#9'c #327DED",'#10'"@.'#9'c #0'
+  +'159E0",'#10'"#.'#9'c #0054D8",'#10'"$.'#9'c #0047D0",'#10'"%.'#9'c #1556CF"'
+  +','#10'"&.'#9'c #D4DEED",'#10'"*.'#9'c #F6F7F1",'#10'"=.'#9'c #4372CD",'#10
+  +'"-.'#9'c #0035B2",'#10'";.'#9'c #0041B2",'#10'">.'#9'c #003EAC",'#10'",.'#9
+  +'c #0C4CBD",'#10'"''.'#9'c #061791",'#10'").'#9'c #062490",'#10'"!.'#9'c #33'
+  +'6FD6",'#10'"~.'#9'c #0F62E1",'#10'"{.'#9'c #0051D2",'#10'"].'#9'c #0048CB",'
+  +#10'"^.'#9'c #1051CA",'#10'"/.'#9'c #D2DCEB",'#10'"(.'#9'c #F5F5EF",'#10'"_.'
+  +#9'c #426FC9",'#10'":.'#9'c #0034AE",'#10'"<.'#9'c #003DAC",'#10'"[.'#9'c #0'
+  +'341AD",'#10'"}.'#9'c #0D40B7",'#10'"|.'#9'c #020681",'#10'"1.'#9'c #193FA9"'
+  +','#10'"2.'#9'c #2D77E5",'#10'"3.'#9'c #0452CE",'#10'"4.'#9'c #0043C3",'#10
+  +'"5.'#9'c #1952C8",'#10'"6.'#9'c #DBE2EB",'#10'"7.'#9'c #FBF9EF",'#10'"8.'#9
+  +'c #4E74C9",'#10'"9.'#9'c #002EA6",'#10'"0.'#9'c #003BA5",'#10'"a.'#9'c #0B4'
+  +'CBD",'#10'"b.'#9'c #061D99",'#10'"c.'#9'c #1F48B4",'#10'"d.'#9'c #236CDC",'
+  +#10'"e.'#9'c #0A50C9",'#10'"f.'#9'c #6F9CE1",'#10'"g.'#9'c #D3DFEE",'#10'"h.'
+  +#9'c #D6E0EA",'#10'"i.'#9'c #9EBEEB",'#10'"j.'#9'c #134FBB",'#10'"k.'#9'c #0'
+  +'647BA",'#10'"l.'#9'c #092AA5",'#10'"m.'#9'c #000078",'#10'"n.'#9'c #1232A3"'
+  +','#10'"o.'#9'c #2058C7",'#10'"p.'#9'c #2D6DD4",'#10'"q.'#9'c #1F61CE",'#10
+  +'"r.'#9'c #1B5CC9",'#10'"s.'#9'c #2461CC",'#10'"t.'#9'c #1246BB",'#10'"u.'#9
+  +'c #061C98",'#10'"v.'#9'c #000079",'#10'"w.'#9'c #040F85",'#10'"x.'#9'c #031'
+  +'994",'#10'"y.'#9'c #031F9B",'#10'"z.'#9'c #011C99",'#10'"A.'#9'c #000E8E",'
+  +#10'"B.'#9'c #000580",'#10'"                                ",'#10'"        '
+  +'  . + @ # $ %           ",'#10'"        & * = - ; > , ''         ",'#10'"  '
+  +'    ) ! ~ { ] ^ / ( _ :       ",'#10'"    < [ } | 1 2 3 4 5 6 7 8     ",'#10
+  +'"  9 0 a b c d e f g h i j k l   ",'#10'"  m n o p q r s t u v w x y z   ",'
+  +#10'"  A B C D E F G H I J K L M N   ",'#10'"  O P Q R S T U V W X Y Z `  . '
+  +' ",'#10'"  ..+.@.#.$.%.&.*.=.-.;.>.,.''.  ",'#10'"  ).!.~.{.].^./.(._.:.<.['
+  +'.}.|.  ",'#10'"    1.2.3.4.5.6.7.8.9.0.a.b.    ",'#10'"      c.d.e.f.g.h.i.'
+  +'j.k.l.m.    ",'#10'"        n.o.p.q.r.s.t.u.v.      ",'#10'"          w.x.y'
+  +'.z.A.B.          ",'#10'"                                "};'#10#0#0#11'TAc'
+  +'tionList'#11'ActionList1'#6'Images'#7#10'ImageList2'#4'left'#2'p'#3'top'#3
+  +' '#1#0#7'TAction'#7'actCopy'#4'Hint'#6#25'Copy results to clipboard'#9'OnEx'
+  +'ecute'#7#14'actCopyExecute'#8'Category'#6#4'edit'#0#0#7'TAction'#6'actCut'
+  +#10'ImageIndex'#2#1#9'OnExecute'#7#13'actCutExecute'#8'Category'#6#4'edit'#0
+  +#0#0#10'TImageList'#10'ImageList2'#4'left'#2't'#3'top'#3'j'#1#6'Bitmap'#10'g'
+  +'"'#0#0'li'#3#0#0#0#16#0#0#0#16#0#0#0#136#13#0#0'/* XPM */'#10'static char *'
+  +' editcopy_xpm[] = {'#10'"16 16 177 2",'#10'"  '#9'c None",'#10'". '#9'c #40'
+  +'6E9A",'#10'"+ '#9'c #7198BD",'#10'"@ '#9'c #6C94BA",'#10'"# '#9'c #6B94BA",'
+  +#10'"$ '#9'c #6B93BA",'#10'"% '#9'c #6E96BD",'#10'"& '#9'c #32608F",'#10'"* '
+  +#9'c #B6CDE3",'#10'"= '#9'c #FFFFFF",'#10'"- '#9'c #92B5D1",'#10'"; '#9'c #B'
+  +'2C8E0",'#10'"> '#9'c #FDFEFF",'#10'", '#9'c #FBFCFF",'#10'"'' '#9'c #F7FBFF'
+  +'",'#10'") '#9'c #F5FAFF",'#10'"! '#9'c #F1F7FF",'#10'"~ '#9'c #FBFFFF",'#10
+  +'"{ '#9'c #8FB3D0",'#10'"] '#9'c #ADC5DD",'#10'"^ '#9'c #FDFDFE",'#10'"/ '#9
+  +'c #FDFEFE",'#10'"( '#9'c #FDFFFF",'#10'"_ '#9'c #F6FBFF",'#10'": '#9'c #F3F'
+  +'AFF",'#10'"< '#9'c #F0F8FF",'#10'"[ '#9'c #ECF5FF",'#10'"} '#9'c #F6FFFF",'
+  +#10'"| '#9'c #8DB1CF",'#10'"1 '#9'c #20487A",'#10'"2 '#9'c #23497C",'#10'"3 '
+  +#9'c #6D91B5",'#10'"4 '#9'c #95ADC4",'#10'"5 '#9'c #8FA8C1",'#10'"6 '#9'c #8'
+  +'DA7C1",'#10'"7 '#9'c #89A2BE",'#10'"8 '#9'c #C9D6E2",'#10'"9 '#9'c #FBFEFF"'
+  +','#10'"0 '#9'c #EDF7FF",'#10'"a '#9'c #EAF4FF",'#10'"b '#9'c #F3FEFF",'#10
+  +'"c '#9'c #7DA7CE",'#10'"d '#9'c #6A8BAE",'#10'"e '#9'c #E3EDF5",'#10'"f '#9
+  +'c #DFEAF2",'#10'"g '#9'c #D0DCE7",'#10'"h '#9'c #C8D7E4",'#10'"i '#9'c #CBD'
+  +'9E5",'#10'"j '#9'c #CDDBE7",'#10'"k '#9'c #AABFD3",'#10'"l '#9'c #809EBA",'
+  +#10'"m '#9'c #F0F4F8",'#10'"n '#9'c #F0F9FF",'#10'"o '#9'c #E7F3FF",'#10'"p '
+  +#9'c #F0FCFF",'#10'"q '#9'c #699CCB",'#10'"r '#9'c #839FBB",'#10'"s '#9'c #E'
+  +'1ECF3",'#10'"t '#9'c #89A6C0",'#10'"u '#9'c #E9EFF4",'#10'"v '#9'c #EDF8FF"'
+  +','#10'"w '#9'c #E4F1FF",'#10'"x '#9'c #EDFAFF",'#10'"y '#9'c #6B9CCB",'#10
+  +'"z '#9'c #7D9AB8",'#10'"A '#9'c #FBFDFF",'#10'"B '#9'c #F0F7FF",'#10'"C '#9
+  +'c #F3FCFF",'#10'"D '#9'c #D0E3EE",'#10'"E '#9'c #83A2BE",'#10'"F '#9'c #E8F'
+  +'1F5",'#10'"G '#9'c #EAF6FF",'#10'"H '#9'c #E3F1FF",'#10'"I '#9'c #E0F0FF",'
+  +#10'"J '#9'c #E9F9FF",'#10'"K '#9'c #F5FBFF",'#10'"L '#9'c #F1F8FF",'#10'"M '
+  +#9'c #ECF6FF",'#10'"N '#9'c #F0FAFF",'#10'"O '#9'c #C8DEED",'#10'"P '#9'c #7'
+  +'79CBD",'#10'"Q '#9'c #E6F0F5",'#10'"R '#9'c #E8F5FF",'#10'"S '#9'c #E1F0FF"'
+  +','#10'"T '#9'c #DEEFFF",'#10'"U '#9'c #E7F8FF",'#10'"V '#9'c #689CCB",'#10
+  ,'"W '#9'c #F6FAFF",'#10'"X '#9'c #EDF6FF",'#10'"Y '#9'c #E7F4FF",'#10'"Z '#9
+  +'c #ECF7FF",'#10'"` '#9'c #C4DCED",'#10'" .'#9'c #769BBD",'#10'"..'#9'c #E3F'
+  +'0F5",'#10'"+.'#9'c #E4F3FF",'#10'"@.'#9'c #DDEFFF",'#10'"#.'#9'c #DAEDFF",'
+  +#10'"$.'#9'c #E3F6FF",'#10'"%.'#9'c #669BCB",'#10'"&.'#9'c #F8FBFF",'#10'"*.'
+  +#9'c #E8F4FF",'#10'"=.'#9'c #E2F1FF",'#10'"-.'#9'c #E7F5FF",'#10'";.'#9'c #C'
+  +'0DAED",'#10'">.'#9'c #749ABD",'#10'",.'#9'c #DFEEF5",'#10'"''.'#9'c #E1F2FF'
+  +'",'#10'").'#9'c #D7EBFF",'#10'"!.'#9'c #E0F4FF",'#10'"~.'#9'c #659ACB",'#10
+  +'"{.'#9'c #7E9BB8",'#10'"].'#9'c #F2F9FF",'#10'"^.'#9'c #E2F3FF",'#10'"/.'#9
+  +'c #BCD8ED",'#10'"(.'#9'c #7299BD",'#10'"_.'#9'c #DCECF5",'#10'":.'#9'c #DDF'
+  +'0FF",'#10'"<.'#9'c #D4E9FF",'#10'"[.'#9'c #DCF2FF",'#10'"}.'#9'c #649ACB",'
+  +#10'"|.'#9'c #6E91B4",'#10'"1.'#9'c #EFF7FF",'#10'"2.'#9'c #E3F2FF",'#10'"3.'
+  +#9'c #E0EFFF",'#10'"4.'#9'c #D9EDFF",'#10'"5.'#9'c #DDF1FF",'#10'"6.'#9'c #B'
+  +'8D6ED",'#10'"7.'#9'c #7098BD",'#10'"8.'#9'c #D9EBF5",'#10'"9.'#9'c #DAEEFF"'
+  +','#10'"0.'#9'c #D3EAFF",'#10'"a.'#9'c #D1E8FF",'#10'"b.'#9'c #D9F1FF",'#10
+  +'"c.'#9'c #6399CB",'#10'"d.'#9'c #668CB2",'#10'"e.'#9'c #EDF5FF",'#10'"f.'#9
+  +'c #E6F2FF",'#10'"g.'#9'c #DDEEFF",'#10'"h.'#9'c #DAEFFF",'#10'"i.'#9'c #B5D'
+  +'5ED",'#10'"j.'#9'c #D8EAF5",'#10'"k.'#9'c #D9ECFF",'#10'"l.'#9'c #D2E8FF",'
+  +#10'"m.'#9'c #D0E5FF",'#10'"n.'#9'c #D7F0FF",'#10'"o.'#9'c #6299CC",'#10'"p.'
+  +#9'c #6B90B5",'#10'"q.'#9'c #F5FFFF",'#10'"r.'#9'c #EEFEFF",'#10'"s.'#9'c #E'
+  +'9FCFF",'#10'"t.'#9'c #E5F8FF",'#10'"u.'#9'c #DFF5FF",'#10'"v.'#9'c #E2FAFF"'
+  +','#10'"w.'#9'c #BADEF3",'#10'"x.'#9'c #739EC3",'#10'"y.'#9'c #E0F5FB",'#10
+  +'"z.'#9'c #E1F7FF",'#10'"A.'#9'c #DAF3FF",'#10'"B.'#9'c #D7F1FF",'#10'"C.'#9
+  +'c #DFFAFF",'#10'"D.'#9'c #639DCF",'#10'"E.'#9'c #235586",'#10'"F.'#9'c #618'
+  +'CB7",'#10'"G.'#9'c #5C88B4",'#10'"H.'#9'c #5986B3",'#10'"I.'#9'c #5685B3",'
+  +#10'"J.'#9'c #5585B3",'#10'"K.'#9'c #5484B3",'#10'"L.'#9'c #5686B5",'#10'"M.'
+  +#9'c #4477A8",'#10'"N.'#9'c #2B6299",'#10'"O.'#9'c #558DBF",'#10'"P.'#9'c #5'
+  +'38CC2",'#10'"Q.'#9'c #528BC2",'#10'"R.'#9'c #518CC2",'#10'"S.'#9'c #528FC3"'
+  +','#10'"T.'#9'c #1E5891",'#10'"      . + @ @ @ @ @ @ # $ # % & ",'#10'"     '
+  +' * = = = = = = = = = = = - ",'#10'"      ; = = = = = > , '' ) ! ~ { ",'#10
+  +'"      ] ^ ^ ^ ^ / ( _ : < [ } | ",'#10'"  1 2 3 4 5 5 6 7 8 9 < 0 a b c ",'
+  +#10'"d e f g h i i j k l m n a o p q ",'#10'"r = = = = = = = s t u v o w x y'
+  +' ",'#10'"z = = = A ) B C D E F G H I J q ",'#10'"z = = 9 K L M N O P Q R S '
+  +'T U V ",'#10'"z = A W L X Y Z `  ...+.@.#.$.%.",'#10'"z = &.L M *.=.-.;.>.,'
+  +'.''.#.).!.~.",'#10'"{.= ].X *.w T ^./.(._.:.).<.[.}.",'#10'"|.= 1.Y 2.3.4.5'
+  +'.6.7.8.9.0.a.b.c.",'#10'"d.= e.f.S g.).h.i.7.j.k.l.m.n.o.",'#10'"p.= q.r.s.'
+  +'t.u.v.w.x.y.z.A.B.C.D.",'#10'"E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T."};'#10#204#5
+  +#0#0'/* XPM */'#10'static char * editcut_Xpm[] = {'#10'"16 16 74 1",'#10'" '
+  +#9'c None",'#10'".'#9'c #818181",'#10'"+'#9'c #989898",'#10'"@'#9'c #888888"'
+  +','#10'"#'#9'c #FEFEFE",'#10'"$'#9'c #686868",'#10'"%'#9'c #F7F7F7",'#10'"&'
+  +#9'c #C6C6C6",'#10'"*'#9'c #EDEDED",'#10'"='#9'c #7B7B7B",'#10'"-'#9'c #CDCD'
+  +'CD",'#10'";'#9'c #B4B3B3",'#10'">'#9'c #E7E7E7",'#10'",'#9'c #A1A1A1",'#10
+  +'"'''#9'c #464646",'#10'")'#9'c #7D7D7D",'#10'"!'#9'c #9F9F9F",'#10'"~'#9'c '
+  +'#C0C0C0",'#10'"{'#9'c #BABABA",'#10'"]'#9'c #833F3F",'#10'"^'#9'c #BC4949",'
+  +#10'"/'#9'c #E45353",'#10'"('#9'c #754E4E",'#10'"_'#9'c #D0D3D3",'#10'":'#9
+  +'c #CACACA",'#10'"<'#9'c #999999",'#10'"['#9'c #C8C8C8",'#10'"}'#9'c #BFBFBF'
+  +'",'#10'"|'#9'c #8D8D8D",'#10'"1'#9'c #8C4747",'#10'"2'#9'c #C25353",'#10'"3'
+  +#9'c #9E2E2E",'#10'"4'#9'c #D14040",'#10'"5'#9'c #AF2E2E",'#10'"6'#9'c #D593'
+  +'93",'#10'"7'#9'c #A4B3B3",'#10'"8'#9'c #979999",'#10'"9'#9'c #979797",'#10
+  +'"0'#9'c #969696",'#10'"a'#9'c #6A6A6A",'#10'"b'#9'c #D66666",'#10'"c'#9'c #'
+  +'C05B5B",'#10'"d'#9'c #A73D3D",'#10'"e'#9'c #FF4747",'#10'"f'#9'c #811212",'
+  +#10'"g'#9'c #8A7A7A",'#10'"h'#9'c #E7CCCC",'#10'"i'#9'c #7B7070",'#10'"j'#9
+  +'c #743636",'#10'"k'#9'c #F87777",'#10'"l'#9'c #E06767",'#10'"m'#9'c #D74545'
+  +'",'#10'"n'#9'c #450B0B",'#10'"o'#9'c #BC5555",'#10'"p'#9'c #BD4141",'#10'"q'
+  +#9'c #611F1F",'#10'"r'#9'c #C66666",'#10'"s'#9'c #FF8787",'#10'"t'#9'c #9129'
+  +'29",'#10'"u'#9'c #BD6161",'#10'"v'#9'c #D76767",'#10'"w'#9'c #863030",'#10
+  +'"x'#9'c #ED5252",'#10'"y'#9'c #952525",'#10'"z'#9'c #FF8A8A",'#10'"A'#9'c #'
+  +'591A1A",'#10'"B'#9'c #A83D3D",'#10'"C'#9'c #B02424",'#10'"D'#9'c #E46C6C",'
+  +#10'"E'#9'c #EB5B5B",'#10'"F'#9'c #B63535",'#10'"G'#9'c #CF2F2F",'#10'"H'#9
+  +'c #9F3434",'#10'"I'#9'c #9F2727",'#10'"                ",'#10'"          .+'
+  +'    ",'#10'"         @#$    ",'#10'"         %&     ",'#10'"        &*=    '
+  +' ",'#10'"        *-      ",'#10'"       ;>,'')!~{ ",'#10'" ]^/  (_:<~[}|  "'
+  +','#10'"12 34567890a    ",'#10'"bc defghi       ",'#10'"jklmn op        ",'
+  +#10'"  q  rst        ",'#10'"    uvwxy       ",'#10'"    zA BC       ",'#10
+  +'"    DEFG        ",'#10'"     HI         "};'#10#249#14#0#0'/* XPM */'#10's'
+  ,'tatic char * editpaste_xpm[] = {'#10'"16 16 200 2",'#10'"  '#9'c None",'#10
+  +'". '#9'c #66A298",'#10'"+ '#9'c #83B38F",'#10'"@ '#9'c #6FAF77",'#10'"# '#9
+  +'c #38964D",'#10'"$ '#9'c #FF3806",'#10'"% '#9'c #FC4814",'#10'"& '#9'c #F94'
+  +'813",'#10'"* '#9'c #F43C0E",'#10'"= '#9'c #757650",'#10'"- '#9'c #A0F6B2",'
+  +#10'"; '#9'c #BEFFB7",'#10'"> '#9'c #BFFFBC",'#10'", '#9'c #96F1A3",'#10'"'''
+  +' '#9'c #485F28",'#10'") '#9'c #D8320D",'#10'"! '#9'c #D63A13",'#10'"~ '#9'c'
+  +' #CE3716",'#10'"{ '#9'c #C62306",'#10'"] '#9'c #FD5B1E",'#10'"^ '#9'c #FFAB'
+  +'37",'#10'"/ '#9'c #FF9109",'#10'"( '#9'c #B77F19",'#10'"_ '#9'c #39AC47",'
+  +#10'": '#9'c #33D13D",'#10'"< '#9'c #32C838",'#10'"[ '#9'c #35C939",'#10'"} '
+  +#9'c #37D43E",'#10'"| '#9'c #159429",'#10'"1 '#9'c #9F6B10",'#10'"2 '#9'c #F'
+  +'D9408",'#10'"3 '#9'c #FEAF39",'#10'"4 '#9'c #D75323",'#10'"5 '#9'c #FD6220"'
+  +','#10'"6 '#9'c #F6B22E",'#10'"7 '#9'c #AF8D5E",'#10'"8 '#9'c #639368",'#10
+  +'"9 '#9'c #22952E",'#10'"0 '#9'c #1E8925",'#10'"a '#9'c #1E822B",'#10'"b '#9
+  +'c #1E7F2E",'#10'"c '#9'c #1F7F31",'#10'"d '#9'c #1B7832",'#10'"e '#9'c #4F6'
+  +'E5D",'#10'"f '#9'c #AA815C",'#10'"g '#9'c #F8B62F",'#10'"h '#9'c #DA5C25",'
+  +#10'"i '#9'c #FF621A",'#10'"j '#9'c #D5A731",'#10'"k '#9'c #92AFCD",'#10'"l '
+  +#9'c #DEF2FB",'#10'"m '#9'c #D7E2D4",'#10'"n '#9'c #D9E1DA",'#10'"o '#9'c #D'
+  +'9DDDD",'#10'"p '#9'c #D9DCDF",'#10'"q '#9'c #D9D9E1",'#10'"r '#9'c #D8DADF"'
+  +','#10'"s '#9'c #DBEBFC",'#10'"t '#9'c #889DCD",'#10'"u '#9'c #D0A033",'#10
+  +'"v '#9'c #DB5A1E",'#10'"w '#9'c #FB641B",'#10'"x '#9'c #D4AD37",'#10'"y '#9
+  +'c #A2B5C6",'#10'"z '#9'c #FAFEFF",'#10'"A '#9'c #FFFFFF",'#10'"B '#9'c #FAF'
+  +'DFF",'#10'"C '#9'c #9BAAD0",'#10'"D '#9'c #D0AF54",'#10'"E '#9'c #DA581E",'
+  +#10'"F '#9'c #F8671B",'#10'"G '#9'c #D5B750",'#10'"H '#9'c #A1B5CD",'#10'"I '
+  +#9'c #F9FDFF",'#10'"J '#9'c #FCFDFF",'#10'"K '#9'c #F9FCFF",'#10'"L '#9'c #F'
+  +'5FBFF",'#10'"M '#9'c #F0F8FF",'#10'"N '#9'c #EFFAFF",'#10'"O '#9'c #8CA4D6"'
+  +','#10'"P '#9'c #D0BA6F",'#10'"Q '#9'c #D7571E",'#10'"R '#9'c #F5691C",'#10
+  +'"S '#9'c #D6BB60",'#10'"T '#9'c #A2B5D2",'#10'"U '#9'c #FEFFFF",'#10'"V '#9
+  +'c #FBFEFF",'#10'"W '#9'c #F8FBFF",'#10'"X '#9'c #F6FBFF",'#10'"Y '#9'c #F0F'
+  +'7FF",'#10'"Z '#9'c #E5F2FF",'#10'"` '#9'c #E2F4FF",'#10'" .'#9'c #839DD4",'
+  +#10'"..'#9'c #D0B96B",'#10'"+.'#9'c #D35A1E",'#10'"@.'#9'c #F36B1D",'#10'"#.'
+  +#9'c #D7BB5E",'#10'"$.'#9'c #A4B3D0",'#10'"%.'#9'c #EFF7FF",'#10'"&.'#9'c #E'
+  +'6F1FF",'#10'"*.'#9'c #DFEFFF",'#10'"=.'#9'c #DEF2FF",'#10'"-.'#9'c #849BD3"'
+  +','#10'";.'#9'c #D2B96A",'#10'">.'#9'c #D25A1F",'#10'",.'#9'c #F06E1E",'#10
+  +'"''.'#9'c #D7BD60",'#10'").'#9'c #A5B3D0",'#10'"!.'#9'c #F9FBFF",'#10'"~.'#9
+  +'c #F5FAFF",'#10'"{.'#9'c #ECF6FF",'#10'"].'#9'c #E0EFFF",'#10'"^.'#9'c #DAE'
+  +'CFF",'#10'"/.'#9'c #D9F0FF",'#10'"(.'#9'c #839AD3",'#10'"_.'#9'c #D2BA6B",'
+  +#10'":.'#9'c #CE5D20",'#10'"<.'#9'c #ED6F1F",'#10'"[.'#9'c #D7C56A",'#10'"}.'
+  +#9'c #A3B3D4",'#10'"|.'#9'c #F8FCFF",'#10'"1.'#9'c #EAF5FF",'#10'"2.'#9'c #E'
+  +'4F1FF",'#10'"3.'#9'c #DFF0FF",'#10'"4.'#9'c #DAEEFF",'#10'"5.'#9'c #D5EBFF"'
+  +','#10'"6.'#9'c #D3EEFF",'#10'"7.'#9'c #8298D1",'#10'"8.'#9'c #D3BC6C",'#10
+  +'"9.'#9'c #CB5E20",'#10'"0.'#9'c #EA721F",'#10'"a.'#9'c #D7C76D",'#10'"b.'#9
+  +'c #A0B3D3",'#10'"c.'#9'c #F3FBFF",'#10'"d.'#9'c #E9F5FF",'#10'"e.'#9'c #E6F'
+  +'4FF",'#10'"f.'#9'c #E2F0FF",'#10'"g.'#9'c #DCEFFF",'#10'"h.'#9'c #D7EDFF",'
+  +#10'"i.'#9'c #D2EAFF",'#10'"j.'#9'c #D0ECFF",'#10'"k.'#9'c #8398D2",'#10'"l.'
+  +#9'c #D4BC6B",'#10'"m.'#9'c #C96121",'#10'"n.'#9'c #E77520",'#10'"o.'#9'c #D'
+  +'5C66A",'#10'"p.'#9'c #98ACD6",'#10'"q.'#9'c #EFF8FF",'#10'"r.'#9'c #E7F6FF"'
+  +','#10'"s.'#9'c #E2F5FF",'#10'"t.'#9'c #DCF1FF",'#10'"u.'#9'c #D7EFFF",'#10
+  +'"v.'#9'c #D2ECFF",'#10'"w.'#9'c #CBE9FF",'#10'"x.'#9'c #C9ECFF",'#10'"y.'#9
+  +'c #7A91D4",'#10'"z.'#9'c #D2B969",'#10'"A.'#9'c #C66421",'#10'"B.'#9'c #E27'
+  +'424",'#10'"C.'#9'c #EFD66F",'#10'"D.'#9'c #9695AA",'#10'"E.'#9'c #A0ACD4",'
+  +#10'"F.'#9'c #A1ADD0",'#10'"G.'#9'c #9DAACF",'#10'"H.'#9'c #99A7CE",'#10'"I.'
+  +#9'c #96A5CE",'#10'"J.'#9'c #92A1CC",'#10'"K.'#9'c #8E9DCC",'#10'"L.'#9'c #8'
+  +'89BCF",'#10'"M.'#9'c #8481A7",'#10'"N.'#9'c #EFD06F",'#10'"O.'#9'c #C16526"'
+  +','#10'"P.'#9'c #DD7928",'#10'"Q.'#9'c #FFFF89",'#10'"R.'#9'c #EDE483",'#10
+  +'"S.'#9'c #D3D282",'#10'"T.'#9'c #D5D381",'#10'"U.'#9'c #D5D382",'#10'"V.'#9
+  +'c #D5D181",'#10'"W.'#9'c #D6D181",'#10'"X.'#9'c #D6CF80",'#10'"Y.'#9'c #D7C'
+  +'F80",'#10'"Z.'#9'c #D5CC7F",'#10'"`.'#9'c #EDDE81",'#10'" +'#9'c #FFFE89",'
+  +#10'".+'#9'c #BA6829",'#10'"++'#9'c #CB4C0E",'#10'"@+'#9'c #E09E2C",'#10'"#+'
+  +#9'c #E0962A",'#10'"$+'#9'c #E29627",'#10'"%+'#9'c #DF9527",'#10'"&+'#9'c #D'
+  +'C9427",'#10'"*+'#9'c #DB9126",'#10'"=+'#9'c #D98F26",'#10'"-+'#9'c #D78D26"'
+  +','#10'";+'#9'c #D58B25",'#10'">+'#9'c #D38924",'#10'",+'#9'c #CD8426",'#10
+  +'"''+'#9'c #CC8528",'#10'")+'#9'c #9C350C",'#10'"            . + @ #        '
+  +'     ",'#10'"  $ % & * = - ; > , '' ) ! ~ {   ",'#10'"  ] ^ / ( _ : < [ } |'
+  +' 1 2 3 4   ",'#10'"  5 6 7 8 9 0 a b c d e f g h   ",'#10'"  i j k l m n o '
+  ,'p q r s t u v   ",'#10'"  w x y z A A A A A A B C D E   ",'#10'"  F G H I A'
+  +' A J K L M N O P Q   ",'#10'"  R S T I U V W X Y Z `  ...+.  ",'#10'"  @.#.'
+  +'$.I J K X %.&.*.=.-.;.>.  ",'#10'"  ,.''.).K !.~.{.Z ].^./.(._.:.  ",'#10'"'
+  +'  <.[.}.|.Y 1.2.3.4.5.6.7.8.9.  ",'#10'"  0.a.b.c.d.e.f.g.h.i.j.k.l.m.  ",'
+  +#10'"  n.o.p.q.r.s.t.u.v.w.x.y.z.A.  ",'#10'"  B.C.D.E.F.G.H.I.J.K.L.M.N.O. '
+  +' ",'#10'"  P.Q.R.S.T.U.V.W.X.Y.Z.`. +.+  ",'#10'"  ++@+#+$+%+&+*+=+-+;+>+,+'
+  +'''+)+  "};'#10#0#0#10'TPopupMenu'#10'PopupMenu1'#6'Images'#7#10'ImageList2'
+  +#4'left'#2'p'#3'top'#3#16#2#0#9'TMenuItem'#9'MenuItem1'#6'Action'#7#7'actCop'
+  +'y'#7'Caption'#6#6'&Copy '#10'ImageIndex'#2#0#7'OnClick'#7#14'actCopyExecute'
+  +#0#0#9'TMenuItem'#9'MenuItem2'#6'Action'#7#6'actCut'#7'Caption'#6#4'C&ut'#7
+  +'OnClick'#7#13'actCutExecute'#0#0#0#10'TPopupMenu'#10'PopupMenu2'#4'left'#3
+  +#176#2#3'top'#2'H'#0#9'TMenuItem'#9'MenuItem3'#7'Caption'#6#17'Copy to clipb'
+  +'oard'#11'Bitmap.Data'#10#140#13#0#0#136#13#0#0'/* XPM */'#10'static char * '
+  +'editcopy_xpm[] = {'#10'"16 16 177 2",'#10'"  '#9'c None",'#10'". '#9'c #406'
+  +'E9A",'#10'"+ '#9'c #7198BD",'#10'"@ '#9'c #6C94BA",'#10'"# '#9'c #6B94BA",'
+  +#10'"$ '#9'c #6B93BA",'#10'"% '#9'c #6E96BD",'#10'"& '#9'c #32608F",'#10'"* '
+  +#9'c #B6CDE3",'#10'"= '#9'c #FFFFFF",'#10'"- '#9'c #92B5D1",'#10'"; '#9'c #B'
+  +'2C8E0",'#10'"> '#9'c #FDFEFF",'#10'", '#9'c #FBFCFF",'#10'"'' '#9'c #F7FBFF'
+  +'",'#10'") '#9'c #F5FAFF",'#10'"! '#9'c #F1F7FF",'#10'"~ '#9'c #FBFFFF",'#10
+  +'"{ '#9'c #8FB3D0",'#10'"] '#9'c #ADC5DD",'#10'"^ '#9'c #FDFDFE",'#10'"/ '#9
+  +'c #FDFEFE",'#10'"( '#9'c #FDFFFF",'#10'"_ '#9'c #F6FBFF",'#10'": '#9'c #F3F'
+  +'AFF",'#10'"< '#9'c #F0F8FF",'#10'"[ '#9'c #ECF5FF",'#10'"} '#9'c #F6FFFF",'
+  +#10'"| '#9'c #8DB1CF",'#10'"1 '#9'c #20487A",'#10'"2 '#9'c #23497C",'#10'"3 '
+  +#9'c #6D91B5",'#10'"4 '#9'c #95ADC4",'#10'"5 '#9'c #8FA8C1",'#10'"6 '#9'c #8'
+  +'DA7C1",'#10'"7 '#9'c #89A2BE",'#10'"8 '#9'c #C9D6E2",'#10'"9 '#9'c #FBFEFF"'
+  +','#10'"0 '#9'c #EDF7FF",'#10'"a '#9'c #EAF4FF",'#10'"b '#9'c #F3FEFF",'#10
+  +'"c '#9'c #7DA7CE",'#10'"d '#9'c #6A8BAE",'#10'"e '#9'c #E3EDF5",'#10'"f '#9
+  +'c #DFEAF2",'#10'"g '#9'c #D0DCE7",'#10'"h '#9'c #C8D7E4",'#10'"i '#9'c #CBD'
+  +'9E5",'#10'"j '#9'c #CDDBE7",'#10'"k '#9'c #AABFD3",'#10'"l '#9'c #809EBA",'
+  +#10'"m '#9'c #F0F4F8",'#10'"n '#9'c #F0F9FF",'#10'"o '#9'c #E7F3FF",'#10'"p '
+  +#9'c #F0FCFF",'#10'"q '#9'c #699CCB",'#10'"r '#9'c #839FBB",'#10'"s '#9'c #E'
+  +'1ECF3",'#10'"t '#9'c #89A6C0",'#10'"u '#9'c #E9EFF4",'#10'"v '#9'c #EDF8FF"'
+  +','#10'"w '#9'c #E4F1FF",'#10'"x '#9'c #EDFAFF",'#10'"y '#9'c #6B9CCB",'#10
+  +'"z '#9'c #7D9AB8",'#10'"A '#9'c #FBFDFF",'#10'"B '#9'c #F0F7FF",'#10'"C '#9
+  +'c #F3FCFF",'#10'"D '#9'c #D0E3EE",'#10'"E '#9'c #83A2BE",'#10'"F '#9'c #E8F'
+  +'1F5",'#10'"G '#9'c #EAF6FF",'#10'"H '#9'c #E3F1FF",'#10'"I '#9'c #E0F0FF",'
+  +#10'"J '#9'c #E9F9FF",'#10'"K '#9'c #F5FBFF",'#10'"L '#9'c #F1F8FF",'#10'"M '
+  +#9'c #ECF6FF",'#10'"N '#9'c #F0FAFF",'#10'"O '#9'c #C8DEED",'#10'"P '#9'c #7'
+  +'79CBD",'#10'"Q '#9'c #E6F0F5",'#10'"R '#9'c #E8F5FF",'#10'"S '#9'c #E1F0FF"'
+  +','#10'"T '#9'c #DEEFFF",'#10'"U '#9'c #E7F8FF",'#10'"V '#9'c #689CCB",'#10
+  +'"W '#9'c #F6FAFF",'#10'"X '#9'c #EDF6FF",'#10'"Y '#9'c #E7F4FF",'#10'"Z '#9
+  +'c #ECF7FF",'#10'"` '#9'c #C4DCED",'#10'" .'#9'c #769BBD",'#10'"..'#9'c #E3F'
+  +'0F5",'#10'"+.'#9'c #E4F3FF",'#10'"@.'#9'c #DDEFFF",'#10'"#.'#9'c #DAEDFF",'
+  +#10'"$.'#9'c #E3F6FF",'#10'"%.'#9'c #669BCB",'#10'"&.'#9'c #F8FBFF",'#10'"*.'
+  +#9'c #E8F4FF",'#10'"=.'#9'c #E2F1FF",'#10'"-.'#9'c #E7F5FF",'#10'";.'#9'c #C'
+  +'0DAED",'#10'">.'#9'c #749ABD",'#10'",.'#9'c #DFEEF5",'#10'"''.'#9'c #E1F2FF'
+  +'",'#10'").'#9'c #D7EBFF",'#10'"!.'#9'c #E0F4FF",'#10'"~.'#9'c #659ACB",'#10
+  +'"{.'#9'c #7E9BB8",'#10'"].'#9'c #F2F9FF",'#10'"^.'#9'c #E2F3FF",'#10'"/.'#9
+  +'c #BCD8ED",'#10'"(.'#9'c #7299BD",'#10'"_.'#9'c #DCECF5",'#10'":.'#9'c #DDF'
+  +'0FF",'#10'"<.'#9'c #D4E9FF",'#10'"[.'#9'c #DCF2FF",'#10'"}.'#9'c #649ACB",'
+  +#10'"|.'#9'c #6E91B4",'#10'"1.'#9'c #EFF7FF",'#10'"2.'#9'c #E3F2FF",'#10'"3.'
+  +#9'c #E0EFFF",'#10'"4.'#9'c #D9EDFF",'#10'"5.'#9'c #DDF1FF",'#10'"6.'#9'c #B'
+  +'8D6ED",'#10'"7.'#9'c #7098BD",'#10'"8.'#9'c #D9EBF5",'#10'"9.'#9'c #DAEEFF"'
+  +','#10'"0.'#9'c #D3EAFF",'#10'"a.'#9'c #D1E8FF",'#10'"b.'#9'c #D9F1FF",'#10
+  +'"c.'#9'c #6399CB",'#10'"d.'#9'c #668CB2",'#10'"e.'#9'c #EDF5FF",'#10'"f.'#9
+  +'c #E6F2FF",'#10'"g.'#9'c #DDEEFF",'#10'"h.'#9'c #DAEFFF",'#10'"i.'#9'c #B5D'
+  +'5ED",'#10'"j.'#9'c #D8EAF5",'#10'"k.'#9'c #D9ECFF",'#10'"l.'#9'c #D2E8FF",'
+  +#10'"m.'#9'c #D0E5FF",'#10'"n.'#9'c #D7F0FF",'#10'"o.'#9'c #6299CC",'#10'"p.'
+  +#9'c #6B90B5",'#10'"q.'#9'c #F5FFFF",'#10'"r.'#9'c #EEFEFF",'#10'"s.'#9'c #E'
+  +'9FCFF",'#10'"t.'#9'c #E5F8FF",'#10'"u.'#9'c #DFF5FF",'#10'"v.'#9'c #E2FAFF"'
+  +','#10'"w.'#9'c #BADEF3",'#10'"x.'#9'c #739EC3",'#10'"y.'#9'c #E0F5FB",'#10
+  +'"z.'#9'c #E1F7FF",'#10'"A.'#9'c #DAF3FF",'#10'"B.'#9'c #D7F1FF",'#10'"C.'#9
+  +'c #DFFAFF",'#10'"D.'#9'c #639DCF",'#10'"E.'#9'c #235586",'#10'"F.'#9'c #618'
+  +'CB7",'#10'"G.'#9'c #5C88B4",'#10'"H.'#9'c #5986B3",'#10'"I.'#9'c #5685B3",'
+  ,#10'"J.'#9'c #5585B3",'#10'"K.'#9'c #5484B3",'#10'"L.'#9'c #5686B5",'#10'"M.'
+  +#9'c #4477A8",'#10'"N.'#9'c #2B6299",'#10'"O.'#9'c #558DBF",'#10'"P.'#9'c #5'
+  +'38CC2",'#10'"Q.'#9'c #528BC2",'#10'"R.'#9'c #518CC2",'#10'"S.'#9'c #528FC3"'
+  +','#10'"T.'#9'c #1E5891",'#10'"      . + @ @ @ @ @ @ # $ # % & ",'#10'"     '
+  +' * = = = = = = = = = = = - ",'#10'"      ; = = = = = > , '' ) ! ~ { ",'#10
+  +'"      ] ^ ^ ^ ^ / ( _ : < [ } | ",'#10'"  1 2 3 4 5 5 6 7 8 9 < 0 a b c ",'
+  +#10'"d e f g h i i j k l m n a o p q ",'#10'"r = = = = = = = s t u v o w x y'
+  +' ",'#10'"z = = = A ) B C D E F G H I J q ",'#10'"z = = 9 K L M N O P Q R S '
+  +'T U V ",'#10'"z = A W L X Y Z `  ...+.@.#.$.%.",'#10'"z = &.L M *.=.-.;.>.,'
+  +'.''.#.).!.~.",'#10'"{.= ].X *.w T ^./.(._.:.).<.[.}.",'#10'"|.= 1.Y 2.3.4.5'
+  +'.6.7.8.9.0.a.b.c.",'#10'"d.= e.f.S g.).h.i.7.j.k.l.m.n.o.",'#10'"p.= q.r.s.'
+  +'t.u.v.w.x.y.z.A.B.C.D.",'#10'"E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T."};'#10#7'OnC'
+  +'lick'#7#14'MenuItem3Click'#0#0#0#0
+]);

+ 335 - 0
fcl/fpcunit/demo/lazarusguiunner/main.pas

@@ -0,0 +1,335 @@
+unit main;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+  Buttons, ComCtrls, ActnList, Menus, Clipbrd, StdCtrls,
+  testreport, fpcunit, testregistry;
+
+const
+  S_OK = 0;                             {$EXTERNALSYM S_OK}
+  S_FALSE = $00000001;                  {$EXTERNALSYM S_FALSE}
+  E_NOINTERFACE = HRESULT($80004002);   {$EXTERNALSYM E_NOINTERFACE}
+
+type
+
+  TGUITestRunner = class(TForm, ITestListener)
+    actCopy: TAction;
+    actCut: TAction;
+    ActionList1: TActionList;
+    BitBtn1: TBitBtn;
+    btnRun: TBitBtn;
+    ComboBox1: TComboBox;
+    ImageList1: TImageList;
+    ImageList2: TImageList;
+    Label1: TLabel;
+    Memo1: TMemo;
+    MenuItem1: TMenuItem;
+    MenuItem2: TMenuItem;
+    MenuItem3: TMenuItem;
+    PopupMenu1: TPopupMenu;
+    PopupMenu2: TPopupMenu;
+    SpeedButton1: TSpeedButton;
+    SpeedButton2: TSpeedButton;
+    XMLMemo: TMemo;
+    PaintBox1: TPaintBox;
+    Panel4: TPanel;
+    Panel5: TPanel;
+    Splitter1: TSplitter;
+    PageControl1: TPageControl;
+    Panel1: TPanel;
+    Panel2: TPanel;
+    Panel3: TPanel;
+    tsTestTree: TTabSheet;
+    tsResultsXML: TTabSheet;
+    TreeView1: TTreeView;
+    procedure BitBtn1Click(Sender: TObject);
+    procedure GUITestRunnerCreate(Sender: TObject);
+    procedure GUITestRunnerDestroy(Sender: TObject);
+    procedure MenuItem3Click(Sender: TObject);
+    procedure PaintBox1Click(Sender: TObject);
+    procedure PaintBox1Paint(Sender: TObject);
+    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
+    procedure TreeView1Click(Sender: TObject);
+    procedure XMLMemoChange(Sender: TObject);
+    procedure actCopyExecute(Sender: TObject);
+    procedure actCutExecute(Sender: TObject);
+    procedure btnRunClick(Sender: TObject);
+  private
+    { private declarations }
+    suiteList: TStringList;
+    currentTestNode: TTreeNode;
+    failureCounter: Longint;
+    errorCounter: Longint;
+    testsCounter: Longint;
+    barColor: TColor;
+  protected
+    { IInterface }
+    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
+    function _AddRef: Integer; stdcall;
+    function _Release: Integer; stdcall;
+  public
+    class procedure RunUnitTests;
+    procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
+    procedure AddError(ATest: TTest; AError: TTestFailure);
+    procedure StartTest(ATest: TTest);
+    procedure EndTest(ATest: TTest);
+    procedure DrawBar;
+  end; 
+
+var
+  GUITestRunner: TGUITestRunner;
+
+implementation
+uses
+  suiteconfig;
+
+{ TGUITestRunner }
+
+class procedure TGUITestRunner.RunUnitTests;
+begin
+  with TGUITestRunner.Create(nil) do
+  begin
+    try
+      ShowModal;
+    finally
+      Free;
+    end;
+  end;
+end;
+
+procedure TGUITestRunner.TreeView1Change(Sender: TObject; Node: TTreeNode);
+begin
+
+end;
+
+procedure TGUITestRunner.TreeView1Click(Sender: TObject);
+var
+  Node: TTreeNode;
+begin
+  if TreeView1.Selected <> nil then
+  begin
+     Memo1.Lines.Clear;
+     Node := TreeView1.Selected;
+     if (Node.Level = 2) then
+       if (TObject(Node.Data) is TTestFailure)  then
+       begin
+         Memo1.Lines.Add('Exception Message: ' + TTestFailure(Node.Data).ExceptionMessage);
+         Memo1.Lines.Add('Exception Class Name: ' + TTestFailure(Node.Data).ExceptionClassName);
+         if TTestFailure(Node.Data).SourceUnitName <> '' then
+         begin
+           Memo1.Lines.Add('Unit Name: ' + TTestFailure(Node.Data).SourceUnitName);
+           Memo1.Lines.Add('Method Name: ' + TTestFailure(Node.Data).MethodName);
+           Memo1.Lines.Add('Line Number: ' + IntToStr(TTestFailure(Node.Data).LineNumber));
+         end;
+       end;
+  end;
+end;
+
+procedure TGUITestRunner.XMLMemoChange(Sender: TObject);
+begin
+
+end;
+
+procedure TGUITestRunner.actCopyExecute(Sender: TObject);
+begin
+  Clipboard.AsText := XMLMemo.Lines.Text;
+end;
+
+procedure TGUITestRunner.actCutExecute(Sender: TObject);
+begin
+  Clipboard.AsText := XMLMemo.Lines.Text;
+  XMLMemo.Lines.Clear;
+end;
+
+procedure TGUITestRunner.GUITestRunnerCreate(Sender: TObject);
+var
+  i: integer;
+begin
+  suiteList := TStringList.Create;
+  RegisterUnitTests;
+  barColor := clGray;
+  for i := 0 to GetTestRegistry.Tests.Count - 1 do
+    ComboBox1.Items.Add(GetTestRegistry.Test[i].TestName);
+end;
+
+procedure TGUITestRunner.BitBtn1Click(Sender: TObject);
+begin
+  Close;
+end;
+
+
+procedure TGUITestRunner.GUITestRunnerDestroy(Sender: TObject);
+begin
+  suiteList.Free;
+end;
+
+procedure TGUITestRunner.MenuItem3Click(Sender: TObject);
+begin
+  Clipboard.AsText := Memo1.Lines.Text;
+end;
+
+procedure TGUITestRunner.PaintBox1Click(Sender: TObject);
+begin
+
+end;
+
+procedure TGUITestRunner.PaintBox1Paint(Sender: TObject);
+var
+  msg: string;
+begin
+  with PaintBox1 do
+  begin
+    Canvas.Brush.Color := clGray;
+    Canvas.Rectangle(0, 0, Width, Height);
+    if (FailureCounter = 0) and (ErrorCounter = 0) then
+       barColor := clGreen;
+    Canvas.Brush.Color := barColor;
+    if TestsCounter <> 0 then
+    begin
+      Canvas.Rectangle(0, 0, round((TestsCounter- FailureCounter- ErrorCounter)/TestsCounter*
+        Width), Height);
+      Canvas.Font.Color := clWhite;
+      msg := 'Runs: ' + IntToStr(TestsCounter);
+      if ErrorCounter <> 0 then
+          msg := msg + '    Number of test errors: ' + IntToStr(ErrorCounter);
+      if (FailureCounter <> 0) then
+        msg := msg + '     Number of test failures: ' + IntToStr(FailureCounter);
+      Canvas.Textout(10, 10,  msg)
+    end;
+  end;
+end;
+
+procedure TGUITestRunner.btnRunClick(Sender: TObject);
+var
+  testResult: TTestResult;
+begin
+  TreeView1.items.Clear;
+  suiteList.Clear;
+  currentTestNode := nil;
+  failureCounter := 0;
+  errorCounter := 0;
+  testsCounter := 0;
+  testResult := TTestResult.Create;
+  try
+    testResult.AddListener(self);
+    if ComboBox1.ItemIndex = 0 then
+      GetTestRegistry.Run(testResult)
+    else
+      (GetTestRegistry[ComboBox1.itemindex - 1]).Run(testResult);
+    XMLMemo.lines.text:= TestResultAsXML(testResult);
+  finally
+    testResult.Free;
+  end;
+  PaintBox1.invalidate;
+end;
+
+procedure TGUITestRunner.AddFailure(ATest: TTest; AFailure: TTestFailure);
+var
+  node: TTreeNode;
+begin
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Message: ' + AFailure.ExceptionMessage, AFailure);
+  node.ImageIndex := 4;
+  node.SelectedIndex := 4;
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Exception: ' + AFailure.ExceptionClassName, AFailure);
+  node.ImageIndex := 4;
+  node.SelectedIndex := 4;
+  currentTestNode.ImageIndex := 3;
+  currentTestNode.SelectedIndex := 3;
+  node := TTreeNode(suiteList.Objects[suiteList.IndexOf(ATest.TestSuiteName)]);
+  node.ImageIndex := 3;
+  node.SelectedIndex := 3;
+  Inc(failureCounter);
+  Application.ProcessMessages;
+  if BarColor <> clRed then
+    barColor := clFuchsia;
+end;
+
+procedure TGUITestRunner.AddError(ATest: TTest; AError: TTestFailure);
+var
+  node: TTreeNode;
+begin
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Exception message: ' + AError.ExceptionMessage, AError);
+  node.ImageIndex := 4;
+  node.SelectedIndex := 4;
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Exception class: ' + AError.ExceptionClassName, AError);
+  node.ImageIndex := 4;
+  node.SelectedIndex := 4;
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Unit name: ' + AError.SourceUnitName, AError);
+  node.ImageIndex := 11;
+  node.SelectedIndex := 11;
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Method name: ' + AError.MethodName, AError);
+  node.ImageIndex := 11;
+  node.SelectedIndex := 11;
+  node := TreeView1.Items.AddChildObject(currentTestNode, 'Line number: ' + IntToStr(AError.LineNumber), AError);
+  node.ImageIndex := 11;
+  node.SelectedIndex := 11;
+  currentTestNode.ImageIndex := 2;
+  currentTestNode.SelectedIndex := 2;
+  node := TTreeNode(suiteList.Objects[suiteList.IndexOf(ATest.TestSuiteName)]);
+  node.ImageIndex := 2;
+  node.SelectedIndex := 2;
+  Inc(errorCounter);
+  Application.ProcessMessages;
+  barColor := clRed;
+end;
+
+procedure TGUITestRunner.StartTest(ATest: TTest);
+var
+  parentNode: TTreeNode;
+begin
+  if suiteList.IndexOf(ATest.TestSuiteName) <> -1 then
+  begin
+    parentNode := TTreeNode(suiteList.Objects[suiteList.IndexOf(ATest.TestSuiteName)]);
+  end
+  else
+    begin
+      if TreeView1.Items.Count = 0 then
+      begin
+        parentNode := TreeView1.Items.AddFirst(nil, ATest.TestSuiteName);
+      end
+      else
+        parentNode := TreeView1.Items.Add(TTreeNode(suiteList.Objects[SuiteList.Count - 1]), ATest.TestSuiteName);
+      suiteList.AddObject(ATest.TestSuiteName, parentNode);
+    end;
+  currentTestNode := TreeView1.Items.AddChildObject(parentNode, ATest.TestName, ATest);
+  Application.ProcessMessages;
+end;
+
+procedure TGUITestRunner.EndTest(ATest: TTest);
+begin
+  Inc(testsCounter);
+  PaintBox1.invalidate;
+end;
+
+procedure TGUITestRunner.DrawBar;
+begin
+
+end;
+
+{ TGUITestRunner.IInterface }
+
+function TGUITestRunner.QueryInterface(const IID: TGUID; out Obj): HResult; StdCall;
+begin
+  if GetInterface(IID, Obj) then Result := S_OK
+    else Result := E_NOINTERFACE
+end;
+
+function TGUITestRunner._AddRef: Integer; StdCall;
+begin
+  Result := -1;
+end;
+
+function TGUITestRunner._Release: Integer; StdCall;
+begin
+  Result := -1;
+end;
+
+initialization
+  {$I main.lrs}
+
+end.
+

+ 36 - 0
fcl/fpcunit/demo/lazarusguiunner/suiteconfig.pp

@@ -0,0 +1,36 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    a unit to register the tests to be runned. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit suiteconfig;
+
+interface
+
+uses
+  fpcunittests;
+
+procedure RegisterUnitTests;
+
+implementation
+uses
+  testregistry;
+
+procedure RegisterUnitTests;
+begin
+  RegisterTests([TTestCaseTest, TTestSuiteTest, TAssertTest, TListenerTest]);
+end;
+
+end.

+ 570 - 0
fcl/fpcunit/exampletests/fpcunittests.pp

@@ -0,0 +1,570 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    unit tests of the FPCUnit framework. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit fpcunittests;
+
+interface
+
+uses
+  SysUtils, Classes, fpcunit, testutils;
+
+type
+
+  EMyException = class(Exception);
+
+  TTestCaseTest = class(TTestCase)
+  private
+    FFlag: integer;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestSetUp;
+    procedure TestAsString;
+  end;
+
+  TTestSuiteTest = class(TTestCase)
+  private
+    FSuite: TTestSuite;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestCountTestCases;
+    procedure TestExtractMethods;
+  end;
+
+  TAssertTest = class(TTestCase)
+  private
+    Fa,
+    Fb: TObject;
+    procedure FailEqualsInt;
+    procedure FailEqualsInt64;
+    procedure FailEqualsCurrency;
+    procedure FailEqualsDouble;
+    procedure FailEqualsBoolean;
+    procedure FailEqualsChar;
+    procedure FailEqualsTClass;
+    procedure FailEqualsTObject;
+    procedure FailAssertNull;
+    procedure FailAssertNotNull;
+    procedure RaiseMyException;
+    procedure InterceptFailure(AMethod: TRunMethod; const ExpectedMessage: string);
+  published
+    procedure TestEqualsInt;
+    procedure TestEqualsInt64;
+    procedure TestEqualsCurrency;
+    procedure TestEqualsDouble;
+    procedure TestEqualsBoolean;
+    procedure TestEqualsChar;
+    procedure TestEqualsTClass;
+    procedure TestEqualsTObject;
+    procedure TestNull;
+    procedure TestNotNull;
+    procedure TestFailEqualsInt;
+    procedure TestFailEqualsInt64;
+    procedure TestFailEqualsCurrency;
+    procedure TestFailEqualsDouble;
+    procedure TestFailEqualsBoolean;
+    procedure TestFailEqualsChar;
+    procedure TestFailEqualsTClass;
+    procedure TestFailEqualsTObject;
+    procedure TestFailNull;
+    procedure TestFailNotNull;
+    procedure TestAssertException;
+  end;
+
+  TMockListener = class(TNoRefCountObject, ITestListener)
+  private
+    FList: TStringList;
+    FFailureList: TStringList;
+    FErrorList: TStringList;
+    FExpectedList: TStringList;
+  public
+    constructor Create; virtual;
+    destructor Destroy; override;
+    procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
+    procedure AddError(ATest: TTest; AError: TTestFailure);
+    procedure StartTest(ATest: TTest);
+    procedure EndTest(ATest: TTest);
+    procedure AddExpectedLine(ALine: string);
+    procedure Verify(ActualList: TStrings);
+  end;
+
+  TExampleTest = class(TTestCase)
+  published
+    procedure TestOne;
+    procedure TestWithError;
+    procedure TestWithFailure;
+  end;
+
+  TListenerTest = class(TTestCase)
+  private
+    FMockListener: TMockListener;
+    FResult: TTestResult;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure TestStartAndEndTest;
+    procedure TestAddError;
+    procedure TestAddFailure;
+  end;
+
+implementation
+
+procedure TTestCaseTest.SetUp;
+begin
+  FFlag := 1
+end;
+
+procedure TTestCaseTest.TearDown;
+begin
+  FFlag := 0;
+end;
+
+procedure TTestCaseTest.TestSetUp;
+begin
+  AssertTrue( 'TTestCaseTest: wrong SetUp', FFlag = 1);
+end;
+
+procedure TTestCaseTest.TestAsString;
+begin
+  AssertEquals( 'TTestCaseTest: wrong AsString output', 'TESTASSTRING(TTestCaseTest)', AsString);
+end;
+
+procedure TTestSuiteTest.SetUp;
+begin
+  FSuite := TTestSuite.Create(TTestSuiteTest);
+end;
+
+procedure TTestSuiteTest.TearDown;
+begin
+  FSuite.Free;
+end;
+
+
+
+procedure TTestSuiteTest.TestCountTestCases;
+begin
+  AssertTrue(FSuite.CountTestCases = 2);
+end;
+
+procedure TTestSuiteTest.TestExtractMethods;
+var
+  i: integer;
+  s: string;
+begin
+  s := '';
+  for i := 0 to FSuite.CountTestCases - 1 do
+    s := s + UpperCase(FSuite[i].TestName) + ' ';
+  AssertEquals('Failure in extracting methods:', 'TESTCOUNTTESTCASES TESTEXTRACTMETHODS ', s );
+end;
+
+procedure TAssertTest.TestEqualsInt;
+var
+  i, j: integer;
+begin
+  AssertEquals(33,33);
+  i := 33;
+  j := 33;
+  AssertEquals(i, j);
+end;
+
+procedure TAssertTest.TestEqualsInt64;
+var
+  i, j: int64;
+begin
+  AssertEquals(1234567891234,1234567891234);
+  i := 1234567891234;
+  j := 1234567891234;
+  AssertEquals(i, j);
+end;
+
+procedure TAssertTest.TestEqualsCurrency;
+var
+  i, j: currency;
+begin
+  AssertEquals(12345678912345.6789, 12345678912345.6789);
+  i := 12345678912345.6789;
+  j := 12345678912345.6789;
+  AssertEquals(i, j);
+end;
+
+
+procedure TAssertTest.TestEqualsDouble;
+var
+  i, j, delta: double;
+begin
+  i := 0.123456;
+  j := 0.123456;
+  delta := 0.0000001;
+  AssertEquals(i,j, delta);
+end;
+
+procedure TAssertTest.TestEqualsBoolean;
+var
+  a, b: boolean;
+begin
+  a := true;
+  b := true;
+  AssertEquals(a, b);
+end;
+
+procedure TAssertTest.TestEqualsChar;
+var
+  a, b: char;
+begin
+  a := 'a';
+  b := 'a';
+  AssertEquals(a, b);
+end;
+
+procedure TAssertTest.TestEqualsTClass;
+var
+  a, b: TClass;
+begin
+  a := TAssertTest;
+  b := TAssertTest;
+  AssertEquals(a, b);
+end;
+
+procedure TAssertTest.TestEqualsTObject;
+var
+  a, b: TObject;
+begin
+  a := TMockListener.Create;
+  b := a;
+  AssertSame(a, b);
+  a.Free;
+end;
+
+procedure TAssertTest.TestNull;
+begin
+  AssertNull(nil);
+end;
+
+procedure TAssertTest.TestNotNull;
+var
+  obj: TTestCase;
+begin
+  obj := TTestCase.Create;
+  AssertNotNull(obj);
+  obj.Free;
+end;
+
+procedure TAssertTest.InterceptFailure(AMethod: TRunMethod; const ExpectedMessage: string);
+var
+  failureIntercepted: boolean;
+begin
+  failureIntercepted := False;
+  try
+    AMethod;
+  except
+    on E: EAssertionFailedError do
+       begin
+         failureIntercepted := True;
+         if (E.Message <> ExpectedMessage) then
+	   raise EAssertionFailedError.Create('Wrong failure message: expected <'+ ExpectedMessage + '>'
+	     + 'but was <' + E.Message +'>');
+       end
+    else
+      raise;
+  end;
+  if not failureIntercepted then
+    raise EAssertionFailedError.Create('Expected an EAssertionFailedError');
+end;
+
+procedure TAssertTest.FailEqualsInt;
+var
+  i, j: integer;
+begin
+  i := 33;
+  j := 34;
+  AssertEquals(i, j);
+end;
+
+procedure TAssertTest.FailEqualsInt64;
+var
+  i, j: int64;
+begin
+  i := 33;
+  j := 34;
+  AssertEquals(i,j);
+end;
+
+procedure TAssertTest.FailEqualsCurrency;
+var
+  i, j: Currency;
+begin
+  i := 12345678912.6789;
+  j := 12345678912.6788;
+  AssertEquals(i,j);
+end;
+
+procedure TAssertTest.FailEqualsDouble;
+var
+  i, j, delta: double;
+begin
+  i := 33.00;
+  j := 34.00;
+  delta := 0.0000001;
+  AssertEquals(i, j, delta);
+end;
+
+procedure TAssertTest.FailEqualsBoolean;
+var
+  a, b: boolean;
+begin
+  a := true;
+  b := false;
+  AssertEquals(a, b);
+end;
+
+procedure TAssertTest.FailEqualsChar;
+var
+  a, b: char;
+begin
+  a := 'a';
+  b := 'b';
+  AssertEquals(a, b);
+end;
+
+procedure TAssertTest.FailEqualsTClass;
+var
+  a, b: TClass;
+begin
+  a := TAssertTest;
+  b := TTestSuiteTest;
+  AssertEquals(a, b);
+end;
+
+procedure TAssertTest.FailEqualsTObject;
+begin
+  AssertSame(Fa,Fb);
+  FA.Free;
+  FB.Free;
+end;
+
+procedure TAssertTest.FailAssertNull;
+var
+  obj: TTestCase;
+begin
+  obj := TTestCase.Create;
+  try
+    AssertNull(obj);
+  finally
+    obj.Free;
+  end;  
+end;
+
+procedure TAssertTest.FailAssertNotNull;
+var
+  obj: TObject;
+begin
+  obj := nil;
+  AssertNotNull(obj);
+end;
+
+procedure TAssertTest.TestFailEqualsInt;
+begin
+  InterceptFailure(@FailEqualsInt, ' expected: <33> but was: <34>');  
+end;
+
+procedure TAssertTest.TestFailEqualsInt64;
+begin
+  InterceptFailure(@FailEqualsInt64, ' expected: <33> but was: <34>');
+end;
+
+procedure TAssertTest.TestFailEqualsCurrency;
+begin
+  InterceptFailure(@FailEqualsCurrency, ' expected: <'+FloatToStr(12345678912.6789)+'> but was: <'+FloatToStr(12345678912.6788)+'>');
+end;
+
+procedure TAssertTest.TestFailEqualsDouble;
+begin
+  InterceptFailure(@FailEqualsDouble, ' expected: <33> but was: <34>')
+end;
+
+procedure TAssertTest.TestFailEqualsBoolean;
+begin
+  InterceptFailure(@FailEqualsBoolean, ' expected: <TRUE> but was: <FALSE>');
+end;
+
+procedure TAssertTest.TestFailEqualsChar;
+begin
+  InterceptFailure(@FailEqualsChar, ' expected: <a> but was: <b>');
+end;
+
+procedure TAssertTest.TestFailEqualsTClass;
+begin
+  InterceptFailure(@FailEqualsTClass, ' expected: <TAssertTest> but was: <TTestSuiteTest>');
+end;
+
+procedure TAssertTest.TestFailEqualsTObject;
+begin
+  FA := TAssertTest.Create;
+  FB := TAssertTest.Create;
+  InterceptFailure(@FailEqualsTObject, ' expected: <'+ IntToStr(PtrInt(FA)) +
+    '> but was: <' + IntToStr(PtrInt(FB))+ '>');
+  FA.Free;
+  FB.Free;  
+end;
+
+procedure TAssertTest.TestFailNull;
+begin
+  InterceptFailure(@FailAssertNull, '');
+end;
+
+procedure TAssertTest.TestFailNotNull;
+begin
+  InterceptFailure(@FailAssertNotNull, '');
+end;
+
+procedure TAssertTest.RaiseMyException;
+begin
+  raise EMyException.Create('EMyException raised');
+end;
+
+procedure TAssertTest.TestAssertException;
+begin
+  AssertException(EMyException, @RaiseMyException);
+end;
+
+constructor TMockListener.Create;
+begin
+  FList := TStringList.Create;
+  FFailureList := TStringList.Create;
+  FErrorList := TStringList.Create;
+  FExpectedList := TStringList.Create;
+end;
+
+destructor TMockListener.Destroy;
+begin
+  FList.Free;
+  FFailureList.Free;
+  FErrorList.Free;
+  FExpectedList.Free;
+end;
+
+procedure TMockListener.AddFailure(ATest: TTest; AFailure: TTestFailure);
+begin
+  FFailureList.Add(ATest.TestName + ': ' + AFailure.ExceptionMessage);
+end;
+
+procedure TMockListener.AddError(ATest: TTest; AError: TTestFailure);
+begin
+  FErrorList.Add(ATest.TestName + ': ' + AError.ExceptionMessage);
+end;
+
+procedure TMockListener.StartTest(ATest: TTest);
+begin
+  FList.Add('Started: ' + ATest.TestName)
+end;
+
+procedure TMockListener.EndTest(ATest: TTest);
+begin
+  FList.Add('Ended: ' + ATest.TestName)
+end;
+
+
+procedure TMockListener.AddExpectedLine(ALine: string);
+begin
+  FExpectedList.Add(ALine)
+end;
+
+procedure TMockListener.Verify(ActualList: TStrings);
+begin
+  TAssert.AssertEquals('Error in comparing text', FExpectedList.Text, ActualList.Text);
+end;
+
+procedure TExampleTest.TestOne;
+var 
+  i: integer;
+begin
+  i := 1;
+  AssertEquals(1, i);
+end;
+
+procedure TExampleTest.TestWithError;
+begin
+  raise Exception.Create('Error Raised');
+end;
+
+procedure TExampleTest.TestWithFailure;
+begin
+  Fail('Failure Raised');
+end;
+
+procedure TListenerTest.SetUp;
+begin
+  FMockListener := TMockListener.Create;
+  FResult := TTestResult.Create;
+  FResult.AddListener(FMockListener);
+end;
+    
+procedure TListenerTest.TearDown;
+begin
+  FMockListener.Free;
+  FResult.Free;
+end;
+
+procedure TListenerTest.TestStartAndEndTest;
+var 
+  t: TTestCase;
+begin
+  t := TExampleTest.CreateWith('TestOne','TExampleTest');
+  try
+    t.Run(FResult);
+    FMockListener.AddExpectedLine('Started: TestOne');
+    FMockListener.AddExpectedLine('Ended: TestOne');
+    FMockListener.Verify(FMockListener.FList);
+  finally
+    t.Free;
+  end;
+end;
+
+procedure TListenerTest.TestAddError;
+var
+  t: TTestCase;
+begin
+  t := TExampleTest.CreateWith('TestWithError', 'TExampleTest');
+  try
+    t.Run(FResult);
+    FMockListener.AddExpectedLine('TestWithError: Error Raised');
+    FMockListener.Verify(FMockListener.FErrorList);
+  finally
+    t.Free;
+  end;  
+end;
+
+
+procedure TListenerTest.TestAddFailure;
+var 
+  t: TTestCase;
+begin
+  t := TExampleTest.CreateWith('TestWithFailure', 'TExampleTest');
+  try
+    t.Run(FResult);
+    FMockListener.AddExpectedLine('TestWithFailure: Failure Raised');
+    FMockListener.Verify(FMockListener.FFailureList);
+  finally
+    t.Free;
+  end;    
+end;
+
+end.

+ 415 - 0
fcl/fpcunit/exampletests/money.pp

@@ -0,0 +1,415 @@
+unit money;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+  
+  TMoney = class;
+  TMoneyBag = class;
+  
+  IMoney = interface
+  ['{2E0160F6-312C-D911-8DE5-DD8AC3E7C6F4}']
+  function add(m: IMoney): IMoney;
+  function addMoney(m: TMoney): IMoney;
+  function addMoneyBag(mb: TMoneyBag): IMoney;
+  function isZero: boolean;
+  function multiply(factor: integer): IMoney;
+  function negate: IMoney;
+  function subtract(m: IMoney): IMoney;
+  procedure appendTo(m: TMoneyBag);
+  function toString: String;
+  function equals(m: IMoney): boolean;
+  function Count: integer;
+  function _Self: TObject;
+  end; 
+  
+  ISingleCurrencyMoney = interface(IMoney)
+  ['{D6D97717-E52D-D911-83C4-8233402A6B6C}']
+  function GetCurrencyUnit: string;
+  function GetAmount: int64;
+  property Amount: int64 read GetAmount;
+  property CurrencyUnit: string read GetCurrencyUnit;
+  end;
+  
+  TMoney = class(TInterfacedObject, IMoney, ISingleCurrencyMoney)
+  private
+    FAmount: int64;
+    FCurrencyUnit: String;
+    function GetAmount: int64;
+    function GetCurrencyUnit: string;
+  public
+    constructor Create(aAmount: int64; aCurrencyUnit: String);
+    function add(m: IMoney): IMoney;
+    function addMoney(m: TMoney): IMoney;
+    function addMoneyBag(mb: TMoneyBag): IMoney;
+    function isZero: Boolean;
+    function multiply(factor: Integer): IMoney;
+    function negate: IMoney;
+    function subtract(m: IMoney): IMoney;
+    procedure appendTo(m: TMoneyBag);
+    function toString: String;
+    function equals(m: IMoney): boolean;
+    property Amount: int64 read GetAmount;
+    property CurrencyUnit: string read GetCurrencyUnit;
+    function Count: integer;
+    function _Self: TObject;
+  end;
+  
+  TMoneyBag = class(TInterfacedObject, IMoney)
+  private
+    FMonies: TList;
+    function AddToMoniesList(const Item: IInterface): Integer;
+    function RemoveFromMoniesList(const Item: IInterface): Integer;
+    function FindMoney(aCurrencyUnit: string): ISingleCurrencyMoney;
+    function Contains(m: ISingleCurrencyMoney): boolean;
+  public
+    constructor Create;
+    class function CreateWith(m1: IMoney; m2: IMoney): IMoney;
+    destructor Destroy; override;
+    function Simplify: IMoney;
+    function add(m: IMoney): IMoney;
+    function addMoney(m: TMoney): IMoney;
+    function addMoneyBag(mb: TMoneyBag): IMoney;
+    procedure appendBag(aBag: TMoneyBag);
+    procedure appendMoney(aMoney: ISingleCurrencyMoney);
+    function isZero: boolean;
+    function multiply(factor: integer): IMoney;
+    function negate: IMoney;
+    function subtract(m: IMoney): IMoney;
+    procedure appendTo(m: TMoneyBag);
+    function toString: String;
+    function equals(m: IMoney): boolean;
+    function Count: integer;
+    function _Self: TObject;
+  end;
+  
+  Operator + (c: IMoney; c1: IMoney) c2: IMoney;
+  Operator - (c: IMoney; c1: IMoney) c2: IMoney;
+  Operator * (c: IMoney; i: integer) c2: IMoney;
+  
+ implementation
+
+Operator + (c: IMoney; c1: IMoney) c2: IMoney;
+begin
+  c2 := c.add(c1);
+end;
+
+Operator - (c: IMoney; c1: IMoney) c2: IMoney;
+begin
+  c2 := c.subtract(c1);
+end;
+
+Operator * (c: IMoney; i: integer) c2: IMoney;
+begin
+  c2 := c.multiply(i);
+end;
+
+function TMoneyBag.AddToMoniesList(const Item: IInterface): Integer;
+begin
+  Result := FMonies.Add(nil);
+  IInterface(FMonies.List^[Result]) := Item;
+end;
+
+function TMoneyBag.RemoveFromMoniesList(const Item: IInterface): Integer;
+begin
+  Result := FMonies.IndexOf(Pointer(Item));
+  if Result > -1 then
+  begin
+    IInterface(FMonies.List^[Result]) := nil;
+    FMonies.Delete(Result);
+  end;
+end;
+
+function TMoneyBag.FindMoney(aCurrencyUnit: string): ISingleCurrencyMoney;
+var
+  i: Integer;
+begin
+  for i := 0 to FMonies.Count - 1 do
+    if ISingleCurrencyMoney(FMonies.items[i]).CurrencyUnit = aCurrencyUnit then
+    begin
+      Result := ISingleCurrencyMoney(FMonies.items[i]);
+      Exit;
+    end;
+end;
+
+function TMoneyBag.Contains(m: ISingleCurrencyMoney): boolean;
+var
+  found: ISingleCurrencyMoney;
+begin
+  found := FindMoney(m.CurrencyUnit);
+  if found = nil then
+  begin
+    Result := false;
+    Exit;
+  end;
+  Result := (found.Amount = m.amount);
+end;
+
+class function TMoneyBag.CreateWith(m1: IMoney; m2: IMoney): IMoney;
+var
+  mb: TMoneyBag;
+begin
+  mb := TMoneyBag.Create;
+  m1.AppendTo(mb);
+  m2.AppendTo(mb);
+  Result := mb.Simplify;
+end;
+
+constructor TMoneyBag.Create;
+begin
+  FMonies := TList.Create;
+end;
+
+destructor TMoneyBag.Destroy;
+begin
+  FMonies.Free;
+  inherited Destroy;
+end;
+
+function TMoneyBag.Simplify: IMoney;
+begin
+  if FMonies.Count = 1 then
+    Result := IInterface(FMonies.items[0]) as IMoney
+  else
+    Result := Self;
+end;
+
+function TMoneyBag.add(m: IMoney): IMoney;
+begin
+  Result := m.AddMoneyBag(Self);
+end;
+
+function TMoneyBag.addMoney(m: TMoney): IMoney;
+begin
+  Result := TMoneyBag.CreateWith(m, Self);
+end;
+
+function TMoneyBag.addMoneyBag(mb: TMoneyBag): IMoney;
+begin
+  Result := TMoneyBag.CreateWith(mb, Self);
+end;
+
+procedure TMoneyBag.appendBag(aBag: TMoneyBag);
+var
+  i: integer;
+begin
+  for i := 0 to aBag.FMonies.Count - 1 do
+    appendMoney(IUnknown(aBag.FMonies.Items[i]) as ISingleCurrencyMoney);
+end;
+
+procedure TMoneyBag.appendMoney(aMoney: ISingleCurrencyMoney);
+var
+  old: IMoney;
+  sum: IMoney;
+begin
+  if aMoney.isZero then Exit;
+  old := findMoney(aMoney.CurrencyUnit);
+  if old = nil then
+  begin
+    AddToMoniesList(aMoney);
+    Exit;
+  end;
+  sum := old.Add(aMoney);
+  RemoveFromMoniesList(old);
+  if sum.isZero then Exit;
+  AddToMoniesList(sum);
+end;
+
+function TMoneyBag.isZero: boolean;
+begin
+  Result := FMonies.Count = 0;
+end;
+
+function TMoneyBag.multiply(factor: integer): IMoney;
+var
+  i: Integer;
+begin
+  Result := TMoneyBag.Create;
+  if factor <> 0 then
+    for i := 0 to FMonies.Count - 1 do
+    begin
+      TMoneyBag(Result._Self).appendMoney((IInterface(FMonies.items[i])
+        as ISingleCurrencyMoney).Multiply(factor) as ISingleCurrencyMoney);
+    end;
+end;
+
+function TMoneyBag.negate: IMoney;
+var
+  i: integer;
+begin
+  Result := TMoneyBag.Create;
+  for i := 0 to FMonies.Count - 1 do
+  begin
+    TMoneyBag(Result._Self).appendMoney((IInterface(FMonies.items[i])
+      as ISingleCurrencyMoney).negate as ISingleCurrencyMoney);
+  end;
+end;
+
+function TMoneyBag.subtract(m: IMoney): IMoney;
+begin
+  Result := Add(m.negate);
+end;
+
+procedure TMoneyBag.appendTo(m: TMoneyBag);
+begin
+  m.AppendBag(Self);
+end;
+
+function TMoneyBag.toString: String;
+var
+  i: integer;
+begin
+  Result := '{';
+  for i := 0 to FMonies.Count - 1 do
+    Result := Result + (IInterface(FMonies.items[i]) as ISingleCurrencyMoney).ToString;
+  Result := Result + '}';
+end;
+
+function TMoneyBag.equals(m: IMoney): boolean;
+var
+  aMoneyBag: TMoneyBag;
+  i: integer;
+begin
+  if m = nil then
+  begin
+    Result := false;
+    Exit;
+  end;
+  if isZero then
+  begin
+    Result := m.isZero;
+    Exit;
+  end;
+  if m._Self.ClassType = TMoneyBag then
+  begin
+    aMoneyBag := TMoneyBag(m._Self);
+    if aMoneyBag.FMonies.count <> FMonies.Count then
+    begin
+      Result := false;
+      Exit;
+    end;
+    for i := 0 to FMonies.Count - 1 do
+    begin
+      if not aMoneyBag.Contains(IInterface(FMonies.items[i]) as ISingleCurrencyMoney) then
+      begin
+        Result := false;
+        Exit;
+      end;
+    end;
+    Result := true;
+    Exit;
+  end;
+  Result := false;
+end;
+
+function TMoneyBag.Count: integer;
+begin
+  Result := FMonies.Count;
+end;
+
+function TMoneyBag._Self: TObject;
+begin
+  Result := Self;
+end;
+
+
+{ TMoney }
+
+function TMoney.GetCurrencyUnit: string;
+begin
+  Result := FCurrencyUnit;
+end;
+
+function TMoney.GetAmount: int64;
+begin
+  Result := FAmount;
+end;
+
+constructor TMoney.Create(aAmount: int64; aCurrencyUnit: string);
+begin
+  FAmount := aAmount;
+  FCurrencyUnit := aCurrencyUnit;
+end;
+
+function TMoney.add(m: IMoney): IMoney;
+begin
+  Result := m.AddMoney(Self);
+end;
+
+function TMoney.addMoney(m: TMoney): IMoney;
+begin
+  if (m.CurrencyUnit = Self.CurrencyUnit) then
+    Result := TMoney.Create(Self.Amount + m.Amount, Self.CurrencyUnit)
+  else
+    Result := TMoneyBag.CreateWith(Self, M);
+end;
+
+function TMoney.addMoneyBag(mb: TMoneyBag): IMoney;
+begin
+  Result := mb.AddMoney(Self);
+end;
+
+function TMoney.isZero: Boolean;
+begin
+  Result := Amount = 0;
+end;
+
+function TMoney.multiply(factor: Integer): IMoney;
+begin
+  Result := TMoney.Create(Amount * factor, CurrencyUnit);
+end;
+
+function TMoney.negate: IMoney;
+begin
+  Result := TMoney.Create(- Amount, CurrencyUnit);
+end;
+
+function TMoney.subtract(m: IMoney): IMoney;
+begin
+  Result := Add(m.negate);
+end;
+
+procedure TMoney.appendTo(m: TMoneyBag);
+begin
+  m.AppendMoney(Self);
+end;
+
+function TMoney.toString: String;
+begin
+  Result := '[' + IntToStr(FAmount) + ' '+ FCurrencyUnit + ']';
+end;
+
+function TMoney.equals(m: IMoney): boolean;
+begin
+  if Assigned(m) then
+  begin
+    if isZero then
+      if Assigned(m as IMoney) then
+        Result := (m as IMoney).isZero;
+    if m._Self.ClassType = TMoney  then
+       Result := ((m as ISingleCurrencyMoney).Amount = Amount) and
+          ((m as ISingleCurrencyMoney).CurrencyUnit = CurrencyUnit)
+    else
+      Result := false;
+  end
+  else
+    Result := false;
+end;
+
+function TMoney.Count: integer;
+begin
+  Result := 1;
+end;
+
+function TMoney._Self: TObject;
+begin
+  Result := Self;
+end;
+
+end.
+

+ 284 - 0
fcl/fpcunit/exampletests/moneytest.pp

@@ -0,0 +1,284 @@
+unit moneytest;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, fpcunit, money;
+  
+type
+
+  TMoneyTest = class(TTestCase)
+  private
+    F12CHF: IMoney;
+    F14CHF: IMoney;
+    F7USD: IMoney;
+    F21USD: IMoney;
+    FMB1: IMoney;
+    FMB2: IMoney;
+  protected
+    procedure SetUp; override;
+    procedure TearDown; override;
+  published
+    procedure testBagCreate;
+    procedure testBagMultiply;
+    procedure testBagNegate;
+    procedure testBagSimpleAdd;
+    procedure testBagSubtract;
+    procedure testBagSumAdd;
+    procedure testIsZero;
+    procedure testMixedSimpleAdd;
+    procedure testBagNotEquals;
+    procedure testMoneyBagEquals;
+    procedure testMoneyEquals;
+    procedure testSimplify;
+    procedure testNormalize2;
+    procedure testNormalize3;
+    procedure testNormalize4;
+    procedure testPrint;
+    procedure testMoneyBagPrint;
+    procedure testSimpleAdd;
+    procedure testSimpleBagAdd;
+    procedure testSimpleMultiply;
+    procedure testSimpleNegate;
+    procedure testSimpleSubtract;
+    procedure testOperators;
+  end;
+    
+    
+
+implementation
+
+{ TMoneyTest }
+
+procedure TMoneyTest.SetUp;
+begin
+  F12CHF := TMoney.Create(12, 'CHF');
+  F14CHF := TMoney.Create(14, 'CHF');
+  F7USD := TMoney.Create(7, 'USD');
+  F21USD := TMoney.Create(21, 'USD');
+  FMB1 := TMoneyBag.CreateWith(F12CHF, F7USD);
+  FMB2 := TMoneyBag.CreateWith(F14CHF, F21USD);
+end;
+
+procedure TMoneyTest.TearDown;
+begin
+  F12CHF := nil;
+  F14CHF := nil;
+  F7USD := nil;
+  F21USD := nil;
+  FMB1 := nil;
+  FMB2 := nil;
+end;
+
+procedure TMoneyTest.testBagCreate;
+begin
+  AssertEquals('Wrong number of moneys in bag', 2, FMB1.Count);
+end;
+
+procedure TMoneyTest.testBagMultiply;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(TMoney.Create(24, 'CHF'), TMoney.Create(14, 'USD'));
+  AssertTrue(expected.equals(FMB1.multiply(2)));
+  AssertTrue(FMB1.equals(FMB1.multiply(1)));
+  AssertTrue('multiplication by zero failed', FMB1.multiply(0).isZero);
+end;
+
+procedure TMoneyTest.testBagNegate;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(TMoney.Create(-12, 'CHF'), TMoney.Create(-7, 'USD'));
+  AssertTrue('expected '+ expected.toString + ' but was ' + FMB1.negate.toString, expected.equals(FMB1.negate));
+end;
+
+procedure TMoneyTest.testBagSimpleAdd;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(7, 'USD'));
+  AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.add(F14CHF).toString, expected.equals(FMB1.add(F14CHF)));
+end;
+
+procedure TMoneyTest.testBagSubtract;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(TMoney.Create(-2, 'CHF'), TMoney.Create(-14, 'USD'));
+  AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.subtract(FMB2).toString, expected.equals(FMB1.Subtract(FMB2)));
+end;
+
+procedure TMoneyTest.testBagSumAdd;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(28, 'USD'));
+  AssertTrue('expected ' + expected.toString + ' but was ' + FMB1.add(FMB2).toString, expected.equals(FMB1.add(FMB2)));
+
+end;
+
+procedure TMoneyTest.testIsZero;
+begin
+  AssertTrue('error: [0 CHF] is to be considered zero!', TMoney.Create(0, 'CHF').IsZero);
+  AssertFalse('error: [12 USD] is not to be considered zero!', TMoney.Create(12, 'USD').IsZero);
+  AssertTrue(FMB1.subtract(FMB1).isZero);
+  AssertTrue(TMoneyBag.CreateWith(TMoney.Create(0, 'CHF'), TMoney.Create(0, 'USD')).isZero);
+end;
+
+procedure TMoneyTest.testMixedSimpleAdd;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(F12CHF, F7USD);
+  AssertTrue('expected ' + expected.toString + ' but was ' + F12CHF.add(F7USD).toString, expected.equals(F12CHF.add(F7USD)));
+end;
+
+procedure TMoneyTest.testBagNotEquals;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(F12CHF, F7USD);
+  AssertFalse(expected.equals(TMoney.Create(12, 'CAD').add(F7USD)));
+end;
+
+procedure TMoneyTest.testMoneyBagEquals;
+var
+  equal: IMoney;
+begin
+  AssertTrue(not FMB1.equals(nil));
+  AssertTrue(FMB1.equals(FMB1));
+  equal := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(7, 'USD'));
+  AssertTrue(FMB1.equals(equal));
+  AssertTrue(not FMB1.equals(F12CHF));
+  AssertTrue(not F12CHF.equals(FMB1));
+  AssertTrue(not FMB1.equals(FMB2));
+end;
+
+procedure TMoneyTest.testMoneyEquals;
+var
+  equalMoney: IMoney;
+begin
+  AssertTrue('error: [12 CHF] does not equal nil', not F12CHF.equals(nil));
+  equalMoney := TMoney.Create(12, 'CHF');
+  AssertTrue(F12CHF.equals(F12CHF));
+  AssertTrue(F12CHF.equals(equalMoney));
+  AssertFalse(F12CHF.equals(F14CHF));
+end;
+
+procedure TMoneyTest.testSimplify;
+var
+  money: IMoney;
+begin
+  money := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(28, 'CHF'));
+  AssertTrue('Expected ' + TMoney.Create(54, 'CHF').toString + ' but was '
+    + money.toString, TMoney.Create(54, 'CHF').equals(money));
+end;
+
+procedure TMoneyTest.testNormalize2;
+var
+  expected: IMoney;
+begin
+  // {[12 CHF][7 USD]} - [12 CHF] = [7 USD]
+  expected := TMoney.Create(7, 'USD');
+  AssertTrue('Expected ' + expected.toString + ' but was '
+    + FMB1.subtract(F12CHF).toString, expected.equals(FMB1.subtract(F12CHF)));
+end;
+
+procedure TMoneyTest.testNormalize3;
+var
+  ms1: IMoney;
+  expected: IMoney;
+begin
+  // {[12 CHF][7 USD]} - {[12 CHF][3 USD]} = [4 USD]
+  ms1 := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(3, 'USD'));
+  expected := TMoney.Create(4, 'USD');
+  AssertTrue('Expected ' + expected.toString + ' but was ' + FMB1.subtract(ms1).toString,
+    expected.equals(FMB1.subtract(ms1)));
+end;
+
+procedure TMoneyTest.testNormalize4;
+var
+  ms1: IMoney;
+  expected: IMoney;
+begin
+  // [12 CHF] - {[12 CHF][3 USD]} = [-3 USD]
+  ms1 := TMoneyBag.CreateWith(TMoney.Create(12, 'CHF'), TMoney.Create(3, 'USD'));
+  expected := TMoney.Create(-3, 'USD');
+  AssertTrue('Expected ' + expected.toString + ' but was ' + F12CHF.subtract(ms1).toString,
+    expected.equals(F12CHF.subtract(ms1)));
+end;
+
+procedure TMoneyTest.testPrint;
+begin
+  AssertEquals('[12 CHF]', F12CHF.ToString);
+end;
+
+procedure TMoneyTest.testMoneyBagPrint;
+begin
+  AssertEquals('{[12 CHF][7 USD]}', FMB1.toString);
+end;
+
+procedure TMoneyTest.testSimpleAdd;
+var
+  expected: IMoney;
+  res: IMoney;
+begin
+  expected := TMoney.Create(26, 'CHF');
+  res := F12CHF.add(F14CHF);
+  AssertTrue('addition error: [12 CHF] + [14 CHF] was not [26 CHF]', res.equals(expected));
+end;
+
+procedure TMoneyTest.testSimpleBagAdd;
+var
+  expected: IMoney;
+begin
+  expected := TMoneyBag.CreateWith(TMoney.Create(26, 'CHF'), TMoney.Create(7, 'USD'));
+  AssertTrue('expected ' + expected.toString + ' but was ' + F14CHF.add(FMB1).toString, expected.equals(F14CHF.add(FMB1)));
+end;
+
+procedure TMoneyTest.testSimpleMultiply;
+var
+  expected: IMoney;
+begin
+  expected := TMoney.Create(28, 'CHF');
+  AssertTrue('Multiply Error: [14 CHF] * 2 was not equal to [28 CHF]',
+    expected.equals(F14CHF.Multiply(2)));
+end;
+
+procedure TMoneyTest.testSimpleNegate;
+var
+  expected: IMoney;
+begin
+  expected := TMoney.Create(-14, 'CHF');
+  AssertTrue('Negate Error: [14 CHF] negate was not equal to [-14 CHF]',
+    expected.equals(F14CHF.negate));
+end;
+
+procedure TMoneyTest.testSimpleSubtract;
+var
+  expected: IMoney;
+begin
+  expected := TMoney.Create(2, 'CHF');
+  AssertTrue('Negate Error: [14 CHF] - [12 CHF] was not equal to [2 CHF]',
+    expected.equals(F14CHF.subtract(F12CHF)));
+end;
+
+procedure TMoneyTest.testOperators;
+var
+  mb: IMoney;
+  ma: IMoney;
+begin
+  ma := TMoney.Create(2, 'CHF');
+  AssertTrue(F14CHF.equals(F12CHF + ma ));
+  AssertTrue('expected ' + FMB1.toString +' but was ' +
+    (FMB2 - TMoneyBag.CreateWith(TMoney.Create(2, 'CHF'), TMoney.Create(14, 'USD'))).toString,
+    FMB1.equals(FMB2 - TMoneyBag.CreateWith(TMoney.Create(2, 'CHF'), TMoney.Create(14, 'USD'))));
+  mb := TMoneyBag.CreateWith(TMoney.Create(28, 'CHF'), TMoney.Create(42, 'USD'));
+  AssertTrue('expected ' + mb.toString + ' but was ' + (FMB2 *2).toString, (FMB2 * 2).equals(mb));
+end;
+
+end.
+

+ 888 - 0
fcl/fpcunit/fpcunit.pp

@@ -0,0 +1,888 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    Port to Free Pascal of the JUnit framework. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit fpcunit;
+
+interface
+
+{$define SHOWLINEINFO}
+
+uses
+  {$ifdef SHOWLINEINFO}
+  LineInfo, 
+  {$endif}
+  SysUtils, Classes;
+
+type
+  
+  EAssertionFailedError = class(Exception)
+    constructor Create; overload;
+    constructor Create(const msg :string); overload;
+  end;
+  
+  TRunMethod = procedure of object;
+  
+  TTestResult = class;
+  
+  {$M+}
+  TTest = class(TObject)
+  protected
+    function GetTestName: string; virtual;
+    function GetTestSuiteName: string; virtual;
+  public
+    function CountTestCases: integer; virtual; 
+    procedure Run(AResult: TTestResult); virtual;
+  published
+    property TestName: string read GetTestName;
+    property TestSuiteName: string read GetTestSuiteName;
+  end; 
+  {$M-}   
+
+  TAssert = class(TTest)
+  public
+    class procedure Fail(const AMessage: string);
+    class procedure AssertTrue(const AMessage: string; ACondition: boolean); overload;
+    class procedure AssertTrue(ACondition: boolean); overload;
+    class procedure AssertFalse(const AMessage: string; ACondition: boolean); overload;
+    class procedure AssertFalse(ACondition: boolean); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: string); overload;
+    class procedure AssertEquals(Expected, Actual: string); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: integer); overload;
+    class procedure AssertEquals(Expected, Actual: integer); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: int64); overload;
+    class procedure AssertEquals(Expected, Actual: int64); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: currency); overload;
+    class procedure AssertEquals(Expected, Actual: currency); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual, Delta: double); overload;
+    class procedure AssertEquals(Expected, Actual, Delta: double); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: boolean); overload;
+    class procedure AssertEquals(Expected, Actual: boolean); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: char); overload;
+    class procedure AssertEquals(Expected, Actual: char); overload;
+    class procedure AssertEquals(const AMessage: string; Expected, Actual: TClass); overload;
+    class procedure AssertEquals(Expected, Actual: TClass); overload;
+    class procedure AssertSame(const AMessage: string; Expected, Actual: TObject); overload;
+    class procedure AssertSame(Expected, Actual: TObject); overload;
+    class procedure AssertNotSame(const AMessage: string; Expected, Actual: TObject); overload;
+    class procedure AssertNotSame(Expected, Actual: TObject); overload;
+    class procedure AssertNotNull(const AMessage: string; AObject: TObject); overload;
+    class procedure AssertNotNull(AObject: TObject); overload;
+    class procedure AssertNull(const AMessage: string; AObject: TObject); overload;
+    class procedure AssertNull(AObject: TObject); overload;
+    class procedure AssertNotNull(const AMessage, AString: string); overload;
+    class procedure AssertNotNull(const AString: string); overload;
+    class procedure AssertException(const AMessage: string; AExceptionClass: ExceptClass; AMethod: TRunMethod); overload;
+    class procedure AssertException(AExceptionClass: ExceptClass; AMethod: TRunMethod); overload;
+  end;
+  
+  TTestFailure = class(TObject)
+  private
+    FTestName: string;
+    FTestSuiteName: string;
+    FLineNumber: longint;
+    FMethodName: string;
+    FRaisedExceptionClass: TClass;
+    FRaisedExceptionMessage: string;
+    FSourceUnitName: string;
+    function GetAsString: string;
+    function GetExceptionMessage: string;
+    function GetIsFailure: boolean;
+    function GetExceptionClassName: string;
+  public
+    constructor CreateFailure(ATest: TTest; E: Exception);
+    property ExceptionClass: TClass read FRaisedExceptionClass;
+  published
+    property AsString: string read GetAsString;
+    property IsFailure: boolean read GetIsFailure;
+    property ExceptionMessage: string read GetExceptionMessage;
+    property ExceptionClassName: string read GetExceptionClassName;
+    property SourceUnitName: string read FSourceUnitName write FSourceUnitName;
+    property LineNumber: longint read FLineNumber write FLineNumber;
+    property MethodName: string read FMethodName write FMethodName;
+  end;
+  
+  ITestListener = interface
+  ['{0CE9D3AE-882A-D811-9401-ADEB5E4C7FC1}']
+    procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
+    procedure AddError(ATest: TTest; AError: TTestFailure);
+    procedure StartTest(ATest: TTest);
+    procedure EndTest(ATest: TTest);
+  end;
+  
+  TTestCase = class(TAssert)
+  private
+    FName: string;
+    FTestSuiteName: string;
+  protected
+    function CreateResult: TTestResult; virtual;
+    procedure SetUp; virtual;
+    procedure TearDown; virtual;
+    procedure RunTest; virtual;
+    function GetTestName: string; override;
+    function GetTestSuiteName: string; override;
+    procedure SetTestSuiteName(const aName: string); virtual;
+    procedure SetTestName(const Value: string); virtual;
+  public
+    constructor Create; virtual;
+    constructor CreateWith(const AName: string; const ATestSuiteName: string); virtual;
+    constructor CreateWithName(const AName: string); virtual;
+    function CountTestCases: integer; override;
+    function CreateResultAndRun: TTestResult; virtual;
+    procedure Run(AResult: TTestResult); override;
+    procedure RunBare; virtual;
+    function AsString: string;
+    property TestSuiteName: string read GetTestSuiteName write SetTestSuiteName;
+  published
+    property TestName: string read GetTestName write SetTestName;
+  end;
+  
+  TTestClass = Class of TTestCase;
+  
+  TTestSuite = class(TTest)
+  private
+    FTests: TList;
+    FName: string;
+    FTestSuiteName: string;
+    function GetTest(Index: integer): TTest;
+  protected
+    function IsTestMethod(AMethodName: string): boolean; virtual;
+    function GetTestName: string; override;
+    function GetTestSuiteName: string; override;
+    procedure SetTestSuiteName(const aName: string); virtual;
+    procedure SetTestName(const Value: string); virtual;
+  public
+    constructor Create(AClass: TClass; AName: string); reintroduce; overload; virtual;
+    constructor Create(AClass: TClass); reintroduce; overload; virtual;
+    constructor Create(AClassArray: Array of TClass); reintroduce; overload; virtual;
+    constructor Create(AName: string); reintroduce; overload; virtual;
+    constructor Create; reintroduce; overload; virtual;
+    destructor Destroy; override;
+    function CountTestCases: integer; override;
+    procedure Run(AResult: TTestResult); override;
+    procedure RunTest(ATest: TTest; AResult: TTestResult); virtual;
+    procedure AddTest(ATest: TTestCase); overload; virtual;
+    procedure AddTest(ATestSuite: TTestSuite); overload; virtual;
+    procedure AddTestSuiteFromClass(ATestClass: TClass); virtual;
+    class function Warning(const aMessage: string): TTestCase;
+    property Test[Index: integer]: TTest read GetTest; default;    
+    property TestSuiteName: string read GetTestSuiteName write SetTestSuiteName;
+    property TestName: string read GetTestName write SetTestName;
+    property Tests: TList read FTests;
+  end;
+  
+  TTestResult = class(TObject)
+  private
+  protected
+    FRunTests: integer;
+    FFailures: TList;
+    FErrors: TList;
+    FListeners: TList;
+    function GetNumErrors: integer;
+    function GetNumFailures: integer;
+  public
+    constructor Create; virtual;
+    destructor Destroy; override;
+    property Listeners: TList read FListeners;
+    procedure ClearErrorLists;
+    procedure StartTest(ATest: TTest);
+    procedure AddFailure(ATest: TTest; E: EAssertionFailedError);
+    procedure AddError(ATest: TTest; E: Exception; AUnitName: string;
+      AMethodName: string; ALineNumber: longint);
+    procedure EndTest(ATest: TTest);
+    procedure AddListener(AListener: ITestListener);
+    procedure RemoveListener(AListener: ITestListener);
+    procedure Run(ATestCase: TTestCase);
+    procedure RunProtected(ATestCase: TTestCase);
+    function WasSuccessful: boolean;
+  published
+    property Failures: TList read FFailures;
+    property Errors: TList read FErrors;
+    property RunTests: integer read FRunTests;
+    property NumberOfErrors: integer read GetNumErrors;
+    property NumberOfFailures: integer read GetNumFailures;
+  end;
+  
+  
+implementation
+
+uses
+  testutils;
+
+type
+
+  TTestWarning = class(TTestCase)
+  private
+    FMessage: String;
+  protected
+    procedure RunTest; override;
+  end;
+  
+procedure TTestWarning.RunTest;
+begin
+  Fail(FMessage);
+end;  
+  
+constructor EAssertionFailedError.Create;
+begin
+  inherited Create('');
+end;
+
+constructor EAssertionFailedError.Create(const msg: string);
+begin
+  inherited Create(msg);
+end;
+
+constructor TTestFailure.CreateFailure(ATest: TTest; E: Exception);
+begin
+  inherited Create;
+  FTestName := ATest.GetTestName;
+  FTestSuiteName := ATest.GetTestSuiteName;
+  FRaisedExceptionClass := E.ClassType;
+  FRaisedExceptionMessage := E.Message;
+end;
+
+function TTestFailure.GetAsString: string;
+var
+  s: string;
+begin
+  if FTestSuiteName <> '' then
+    s := FTestSuiteName + '.'
+  else
+    s := '';
+  Result := s + FTestName + ': ' + FRaisedExceptionMessage;
+end;
+
+function TTestFailure.GetExceptionClassName: string;
+begin
+  Result := FRaisedExceptionClass.ClassName;
+end;
+    
+function TTestFailure.GetExceptionMessage: string;
+begin
+  Result := FRaisedExceptionMessage;
+end;
+
+function TTestFailure.GetIsFailure: boolean;
+begin
+  Result := FRaisedExceptionClass.InheritsFrom(EAssertionFailedError);
+end;
+
+{ TTest}
+
+function TTest.GetTestName: string;
+begin
+  Result := 'TTest';
+end;
+
+function TTest.GetTestSuiteName: string;
+begin
+  Result := 'TTest';
+end;
+
+function TTest.CountTestCases: integer;
+begin
+  Result := 0;
+end; 
+
+procedure TTest.Run(AResult: TTestResult);
+begin
+end;
+
+{ TAssert }
+  
+class procedure TAssert.Fail(const AMessage: String);
+begin
+  raise EAssertionFailedError.Create(AMessage);
+end;
+
+class procedure TAssert.AssertTrue(const AMessage: String; ACondition: Boolean);
+begin
+  if (not ACondition) then
+    Fail(AMessage);
+end;
+
+class procedure TAssert.AssertTrue(ACondition: Boolean);
+begin
+  AssertTrue('', ACondition);
+end;
+
+class procedure TAssert.AssertFalse(const AMessage: String; ACondition: Boolean);
+begin
+  AssertTrue(AMessage, not ACondition);
+end;
+
+class procedure TAssert.AssertFalse(ACondition: Boolean);
+begin
+  AssertFalse('', ACondition);
+end;
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: string);
+begin
+  AssertTrue(AMessage + ': ' + 'expected <' + Expected+ '> but was <' + Actual + '>' ,
+    AnsiCompareStr(Expected, Actual) = 0);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: string);
+begin
+  AssertEquals('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertNotNull(const AString: string);
+begin
+  AssertNotNull('', AString);
+end;
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: integer); 
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + IntToStr(Expected) + '> but was: <'
+    + IntToStr(Actual) + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: integer);
+begin
+  AssertEquals('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: int64);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + IntToStr(Expected) + '> but was: <'
+    + IntToStr(Actual) + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: int64);
+begin
+  AssertEquals('', Expected, Actual);
+end;
+
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: currency);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + FloatToStr(Expected) + '> but was: <'
+    + FloatToStr(Actual) + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: currency);
+begin
+   AssertEquals('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual, Delta: double);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + FloatToStr(Expected) + '> but was: <'
+      + FloatToStr(Actual) + '>', (Abs(Expected - Actual) <= Delta));
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual, Delta: double);
+begin
+  AssertEquals('', Expected, Actual, Delta);
+end;
+
+class procedure TAssert.AssertNotNull(const AMessage, AString: string);
+begin
+  AssertTrue(AMessage, AString <> ''); 
+end;
+ 
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: boolean);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + BoolToStr(Expected) + '> but was: <'
+    + BoolToStr(Actual) + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: boolean);
+begin
+  AssertEquals('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: char);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + Expected + '> but was: <'
+    + Actual + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: char);
+begin
+  AssertEquals('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertEquals(const AMessage: string; Expected, Actual: TClass);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + Expected.ClassName + '> but was: <'
+    + Actual.ClassName + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertEquals(Expected, Actual: TClass);
+begin
+  AssertEquals('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertSame(const AMessage: string; Expected, Actual: TObject);
+begin
+  AssertTrue(AMessage + ' ' + 'expected: <' + IntToStr(PtrInt(Expected)) + '> but was: <'
+    + IntToStr(PtrInt(Actual)) + '>', Expected = Actual);
+end;
+
+class procedure TAssert.AssertSame(Expected, Actual: TObject);
+begin
+  AssertSame('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertNotSame(const AMessage: string; Expected, Actual: TObject);
+begin
+  AssertFalse('expected not same', Expected = Actual);
+end;
+
+class procedure TAssert.AssertNotSame(Expected, Actual: TObject);
+begin
+  AssertNotSame('', Expected, Actual);
+end;
+
+class procedure TAssert.AssertNotNull(const AMessage: string; AObject: TObject);
+begin
+  AssertTrue(AMessage, (AObject <> nil));
+end;
+
+class procedure TAssert.AssertNotNull(AObject: TObject);
+begin
+  AssertNotNull('', AObject);
+end;
+
+class procedure TAssert.AssertNull(const AMessage: string; AObject: TObject);
+begin
+  AssertTrue(AMessage, (AObject = nil));
+end;
+
+class procedure TAssert.AssertNull(AObject: TObject);
+begin
+  AssertNull('', AObject);
+end;
+
+class procedure TAssert.AssertException(const AMessage: string; AExceptionClass: ExceptClass;
+  AMethod: TRunMethod);
+var
+  Passed : Boolean;
+  ExceptionName: string;
+begin
+  Passed := False;
+  try
+    AMethod;
+  except
+    on E: Exception do
+    begin
+      ExceptionName := E.ClassName;
+      if E.ClassType.InheritsFrom(AExceptionClass) then
+      begin
+        Passed := AExceptionClass.ClassName = E.ClassName;
+      end;
+    end;
+  end;
+  AssertTrue(Format('Exception %s expected but %s was raised',
+    [AExceptionClass.ClassName, ExceptionName])+ ': ' + AMessage, Passed);
+end;
+
+class procedure TAssert.AssertException(AExceptionClass: ExceptClass;
+  AMethod: TRunMethod);
+begin
+  AssertException('', AExceptionClass, AMethod);
+end;
+
+constructor TTestCase.Create;
+begin
+  inherited Create;
+end;   
+
+constructor TTestCase.CreateWithName(const AName: string);
+begin
+  Create;
+  FName := AName;
+end;
+
+constructor TTestCase.CreateWith(const AName: string; const ATestSuiteName: string);
+begin
+  Create;
+  FName := AName;
+  FTestSuiteName := ATestSuiteName;
+end;
+
+function TTestCase.AsString: string;
+begin
+  Result := TestName + '(' + ClassName + ')';
+end;
+
+function TTestCase.CountTestCases: integer;
+begin
+  Result := 1;
+end;
+
+function TTestCase.CreateResult: TTestResult;
+begin
+  Result := TTestResult.Create;
+end;
+
+
+function TTestCase.GetTestName: string;
+begin
+  Result := FName;
+end;
+
+function TTestCase.GetTestSuiteName: string;
+begin
+  Result := FTestSuiteName;
+end;
+
+procedure TTestCase.SetTestSuiteName(const aName: string);
+begin
+  if FTestSuiteName <> aName then
+    FTestSuiteName := aName;
+end;
+
+procedure TTestCase.SetTestName(const Value: string);
+begin
+  FName := Value;
+end;
+
+function TTestCase.CreateResultAndRun: TTestResult;
+begin
+  Result := CreateResult;
+  Run(Result);
+end;
+
+procedure TTestCase.Run(AResult: TTestResult);
+begin
+  (AResult).Run(Self);
+end;
+
+procedure TTestCase.RunBare;
+begin
+  SetUp;
+  try
+    RunTest;
+  finally
+    TearDown;
+  end;
+end;
+
+procedure TTestCase.RunTest;
+var
+  m: TMethod;
+  RunMethod: TRunMethod;
+  pMethod : Pointer;
+begin
+  AssertNotNull(FName);
+  pMethod := Self.MethodAddress(FName);
+  if (Assigned(pMethod)) then 
+  begin
+    m.Code := pMethod;
+    m.Data := self;
+    RunMethod := TRunMethod(m);
+    RunMethod;
+  end
+  else 
+    begin
+      Fail('Method "' + FName + '" not found'); 
+    end;
+end;
+
+procedure TTestCase.SetUp;
+begin
+
+end;
+
+procedure TTestCase.TearDown;
+begin
+
+end;
+
+constructor TTestSuite.Create(AClass: TClass; AName: string);
+begin
+  Create(AClass);
+  FName := AName;
+end;
+
+constructor TTestSuite.Create(AClass: TClass);
+var
+  ml: TStringList;
+  i: integer;
+  tc: TTestClass;
+begin
+  Create(AClass.ClassName);
+  if AClass.InheritsFrom(TTestCase) then
+  begin
+    tc := TTestClass(AClass);
+    ml := TStringList.Create;
+    try
+      GetMethodList(AClass, ml);
+      for i := 0 to ml.Count -1 do
+      begin
+        if IsTestMethod(ml.Strings[i]) then
+          AddTest(tc.CreateWith(ml.Strings[i], tc.ClassName));
+      end;
+    finally
+      ml.Free;
+    end;
+  end
+  else
+    AddTest(Warning(AClass.ClassName + ' does not inherit from TTestCase'));
+  if FTests.Count = 0 then
+    AddTest(Warning('No valid tests found in ' + AClass.ClassName));
+end;
+
+constructor TTestSuite.Create(AClassArray: Array of TClass); 
+var
+  i: integer;
+begin
+  Create;
+  for i := Low(AClassArray) to High(AClassArray) do
+    if Assigned(AClassArray[i]) then
+      AddTest(TTestSuite.Create(AClassArray[i]));
+end;
+
+constructor TTestSuite.Create(AName: string);
+begin
+  Create();
+  FName := AName;
+end;
+
+constructor TTestSuite.Create;
+begin
+  inherited Create;
+  FTests := TList.Create;
+end;
+
+destructor TTestSuite.Destroy;
+begin
+  FreeObjects(FTests);
+  FTests.Free;
+  inherited Destroy;
+end;
+
+function TTestSuite.GetTest(Index: integer): TTest;
+begin
+  Result := TTest(FTests[Index]);
+end;
+
+function TTestSuite.GetTestName: string;
+begin
+  Result := FName;
+end;
+
+function TTestSuite.GetTestSuiteName: string;
+begin
+  Result := FTestSuiteName;
+end;
+
+procedure TTestSuite.SetTestName(const Value: string);
+begin
+  FName := Value;
+end;
+
+procedure TTestSuite.SetTestSuiteName(const aName: string);
+begin
+  if FTestSuiteName <> aName then
+    FTestSuiteName := aName;
+end;
+
+function TTestSuite.IsTestMethod(AMethodName: string): Boolean;
+begin
+  Result := Pos('TEST', UpperCase(AMethodName))= 1;
+end;
+
+function TTestSuite.CountTestCases: integer;
+var
+  i: integer;
+begin
+  Result := 0;
+  for i := 0 to FTests.Count - 1 do
+  begin
+    Result := Result + TTest(FTests[i]).CountTestCases;
+  end;
+end;
+
+procedure TTestSuite.Run(AResult: TTestResult); 
+var
+  i: integer;
+begin
+  for i := 0 to FTests.Count - 1 do
+    RunTest(TTest(FTests[i]), AResult);
+end;
+
+procedure TTestSuite.RunTest(ATest: TTest; AResult: TTestResult);
+begin
+  ATest.Run(AResult);
+end;
+
+procedure TTestSuite.AddTest(ATest: TTestCase);
+begin
+  FTests.Add(ATest);
+  if ATest.TestSuiteName = '' then
+    ATest.TestSuiteName := Self.TestName;
+end;
+
+procedure TTestSuite.AddTest(ATestSuite: TTestSuite);
+begin
+  FTests.Add(ATestSuite);
+  if ATestSuite.TestSuiteName = '' then
+    ATestSuite.TestSuiteName := Self.TestName;
+end;
+
+procedure TTestSuite.AddTestSuiteFromClass(ATestClass: TClass); 
+begin
+  AddTest(TTestSuite.Create(ATestClass));
+end;
+
+class function TTestSuite.Warning(const aMessage: string): TTestCase;
+var
+  w: TTestWarning;
+begin
+  w := TTestWarning.Create;
+  w.FMessage := aMessage;
+  Result := w;
+end;
+
+constructor TTestResult.Create;
+begin
+  inherited Create;
+  FFailures := TList.Create;
+  FErrors := TList.Create;
+  FListeners := TList.Create;
+end;
+
+destructor TTestResult.Destroy;
+begin
+  FreeObjects(FFailures);
+  FFailures.Free;
+  FreeObjects(FErrors);
+  FErrors.Free;
+  FListeners.Free;
+end;
+
+procedure TTestResult.ClearErrorLists;
+begin
+  FreeObjects(FFailures);
+  FFailures.Clear;
+  FreeObjects(FErrors);
+  FErrors.Clear;
+end;
+
+function TTestResult.GetNumErrors: integer;
+begin
+  Result := FErrors.Count;
+end;
+
+function TTestResult.GetNumFailures: integer;
+begin
+  Result := FFailures.Count;
+end;
+
+procedure TTestResult.AddListener(AListener: ITestListener);
+begin
+  FListeners.Add(pointer(AListener));
+end;
+
+procedure TTestResult.RemoveListener(AListener: ITestListener);
+begin
+  FListeners.Remove(pointer(AListener));
+end;
+
+procedure TTestResult.AddFailure(ATest: TTest; E: EAssertionFailedError);
+var
+  i: integer;
+  f: TTestFailure;
+begin
+  //lock mutex
+  f := TTestFailure.CreateFailure(ATest, E);
+  FFailures.Add(f);
+  for i := 0 to FListeners.Count - 1 do
+    ITestListener(FListeners[i]).AddFailure(ATest, f);
+  //unlock mutex
+end;
+
+procedure TTestResult.AddError(ATest: TTest; E: Exception;
+  AUnitName: string; AMethodName: string; ALineNumber: longint);
+var
+  i: integer;
+  f: TTestFailure;
+begin
+  //lock mutex
+  f := TTestFailure.CreateFailure(ATest, E);
+  f.SourceUnitName := AUnitName;
+  f.MethodName := AMethodName;
+  f.LineNumber := ALineNumber;
+  FErrors.Add(f);
+  for i := 0 to FListeners.Count - 1 do
+    ITestListener(FListeners[i]).AddError(ATest, f);
+  //unlock mutex
+end;
+
+procedure TTestResult.EndTest(ATest: TTest);
+var
+  i: integer;
+begin
+  for i := 0 to FListeners.Count - 1 do
+    ITestListener(FListeners[i]).EndTest(ATest);
+end;
+
+
+procedure TTestResult.Run(ATestCase: TTestCase);
+begin
+  StartTest(ATestCase);
+  RunProtected(ATestCase);
+  EndTest(ATestCase);
+end;
+
+procedure TTestResult.RunProtected(ATestCase: TTestCase);
+var
+  func, source: shortstring;
+  line: longint;
+begin
+  func := '';
+  source := '';
+  line := 0;
+  try
+    ATestCase.RunBare;
+  except
+    on E: EAssertionFailedError do AddFailure(ATestCase, E);
+    on E: Exception do
+      begin
+      {$ifdef SHOWLINEINFO}
+        GetLineInfo(LongWord(ExceptAddr), func, source, line);
+      {$endif}
+        AddError(ATestCase, E, source, func, line);
+      end;
+  end;
+end;
+
+procedure TTestResult.StartTest(ATest: TTest);
+var
+  count: integer;
+  i: integer;
+begin
+  count := ATest.CountTestCases;
+  //lock mutex
+  FRunTests := FRunTests + count;
+  for i := 0 to FListeners.Count - 1 do
+    ITestListener(FListeners[i]).StartTest(ATest);
+  //unlock mutex  
+end;
+
+function TTestResult.WasSuccessful: boolean;
+begin
+//lock mutex
+  Result := (FErrors.Count = 0) and (FFailures.Count = 0);
+//unlock mutex
+end;
+
+end.

+ 73 - 0
fcl/fpcunit/testregistry.pp

@@ -0,0 +1,73 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    Port to Free Pascal of the JUnit framework. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit testregistry;
+
+interface
+
+uses
+  fpcunit;
+
+
+procedure RegisterTest(ATestClass: TTestClass); overload;
+
+procedure RegisterTests(ATests: Array of TTestClass);
+
+function NumberOfRegisteredTests: longint;
+
+function GetTestRegistry: TTestSuite;
+
+implementation
+
+var
+  FTestRegistry: TTestSuite;
+
+function GetTestRegistry: TTestSuite;
+begin
+  if not Assigned(FTestRegistry) then
+    FTestRegistry := TTestSuite.Create;
+  Result := FTestRegistry;
+end;
+
+procedure RegisterTest(ATestClass: TTestClass);
+begin
+  GetTestRegistry.AddTestSuiteFromClass(ATestClass);
+end;
+
+procedure RegisterTests(ATests: Array of TTestClass);
+var
+  i: integer;
+begin
+  for i := Low(ATests) to High(ATests) do
+    if Assigned(ATests[i]) then
+    begin
+      RegisterTest(ATests[i]);
+    end;
+end;
+
+
+function NumberOfRegisteredTests: longint;
+begin
+  Result := GetTestRegistry.CountTestCases;
+end;
+
+initialization
+  FTestRegistry := nil;
+finalization
+  FTestRegistry.Free;
+end.
+

+ 207 - 0
fcl/fpcunit/testreport.pp

@@ -0,0 +1,207 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    an example of a console test runner of FPCUnit tests. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit testreport;
+
+interface
+
+uses 
+  classes, SysUtils, fpcunit, testutils;
+
+type
+  TXMLResultsWriter = class(TNoRefCountObject, ITestListener)
+  public
+    procedure WriteHeader;
+    procedure WriteResult(aResult: TTestResult);
+  {ITestListener}
+    procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
+    procedure AddError(ATest: TTest; AError: TTestFailure);
+    procedure StartTest(ATest: TTest);
+    procedure EndTest(ATest: TTest);
+  end;
+  
+ { 
+  TLatexResultsWriter = class(TNoRefCountObject, ITestListener)
+  public
+    procedure AddFailure(ATest: TTest; AFailure: TTestFailure);
+    procedure AddError(ATest: TTest; AError: TTestFailure);
+    procedure StartTest(ATest: TTest);
+    procedure EndTest(ATest: TTest);
+  end;}
+
+
+function TestSuiteAsXML(aSuite: TTestSuite): string;
+function TestSuiteAsLatex(aSuite:TTestSuite): string;
+function GetSuiteAsXML(aSuite: TTestSuite): string;
+function GetSuiteAsLatex(aSuite: TTestSuite): string;
+function TestResultAsXML(aTestResult: TTestResult): string;
+
+implementation
+
+
+procedure TXMLResultsWriter.WriteHeader;
+begin
+  writeln('<testresults>');
+  writeln('<testlisting>');
+end;
+
+procedure TXMLResultsWriter.WriteResult(aResult: TTestResult);
+begin
+  writeln('</testlisting>'); 
+  writeln(TestResultAsXML(aResult));
+  writeln('</testresults>');
+end;
+
+{TXMLResultsWriter}
+procedure TXMLResultsWriter.AddFailure(ATest: TTest; AFailure: TTestFailure);
+begin
+  writeln('<failure ExceptionClassName="', AFailure.ExceptionClassName, '">');
+  writeln('<message>', AFailure.ExceptionMessage, '</message>');
+  writeln('</failure>');
+end;
+    
+procedure TXMLResultsWriter.AddError(ATest: TTest; AError: TTestFailure);
+begin
+writeln('<error ExceptionClassName="', AError.ExceptionClassName, '">');
+  writeln('<message>', AError.ExceptionMessage, '</message>');
+  writeln('<sourceunit>', AError.SourceUnitName, '</sourceunit>');
+  writeln('<methodname>', AError.MethodName, '</methodname>');
+  writeln('<linenumber>', AError.LineNumber, '</linenumber>');
+  writeln('</error>');
+end;
+    
+procedure TXMLResultsWriter.StartTest(ATest: TTest);
+begin
+  writeln('<test name="' , ATest.TestSuiteName + '.' + ATest.TestName, '">');
+end;
+    
+procedure TXMLResultsWriter.EndTest(ATest: TTest);  
+begin
+  writeln('</test>');
+end;
+
+
+
+function TestSuiteAsXML(aSuite:TTestSuite): string;
+var
+  i: integer;
+begin
+  Result := '<TestSuite name="' + ASuite.TestName + '">' + System.sLineBreak;
+  for i := 0 to aSuite.Tests.Count - 1 do
+    if TTest(aSuite.Tests.Items[i]) is TTestSuite then
+      Result := Result + TestSuiteAsXML(TTestSuite(aSuite.Tests.Items[i])) 
+    else
+      if TTest(aSuite.Tests.Items[i]) is TTestCase then
+        Result := Result +'<test>' + TTestcase(aSuite.Tests.Items[i]).TestName + '</test>' + System.sLineBreak;
+  Result := Result + '</TestSuite>' + System.sLineBreak;    
+end;
+
+function TestSuiteAsLatex(aSuite:TTestSuite): string;
+var
+  i,j: integer;
+  s: TTestSuite;
+begin
+  Result := '\flushleft' + System.sLineBreak;
+  for i := 0 to aSuite.Tests.Count - 1 do
+  begin
+    s := TTestSuite(ASuite.Tests.Items[i]); 
+    Result := Result + s.TestSuiteName + System.sLineBreak;
+    Result := Result + '\begin{itemize}'+ System.sLineBreak;
+    for j := 0 to s.Tests.Count - 1 do
+      if TTest(s.Tests.Items[j]) is TTestCase then   
+        Result := Result + '\item[-] ' + TTestcase(s.Tests.Items[j]).TestName  + System.sLineBreak;
+    Result := Result +'\end{itemize}' + System.sLineBreak; 
+  end;    
+end;  
+
+function GetSuiteAsXML(aSuite: TTestSuite): string;
+begin
+  if aSuite <> nil then
+    begin
+      if aSuite.TestName = '' then
+        aSuite.TestName := 'Test Suite';
+      Result := TestSuiteAsXML(aSuite)
+    end
+  else
+    Result := '';
+end;
+
+function GetSuiteAsLatex(aSuite: TTestSuite): string;
+begin
+  if aSuite <> nil then
+    begin
+      Result := '\documentclass[a4paper,12pt]{article}' + System.sLineBreak;
+      Result := Result + '\usepackage{array}' + System.sLineBreak;
+      Result := Result + '\usepackage{mdwlist}' + System.sLineBreak + System.sLineBreak;
+      Result := Result + '\begin{document}' + System.sLineBreak + System.sLineBreak;
+      if aSuite.TestName = '' then
+        aSuite.TestName := 'Test Suite';
+      Result := Result + TestSuiteAsLatex(aSuite);
+      Result := Result + '\end{document}';
+    end
+  else
+    Result := '';
+end;
+
+function TestResultAsXML(aTestResult: TTestResult): string;
+var
+  i: longint;
+  f: TTestFailure;
+begin
+  with aTestResult do
+  begin
+    Result := '<NumberOfRunnedTests>' + intToStr(RunTests) + '</NumberOfRunnedTests>' + System.sLineBreak;
+    Result := Result + '<NumberOfErrors>' + intToStr(NumberOfErrors) + '</NumberOfErrors>' + System.sLineBreak;
+    Result := Result + '<NumberOfFailures>' + intToStr(NumberOfFailures) + '</NumberOfFailures>';
+    if NumberOfErrors <> 0 then
+    begin
+      Result := Result + System.sLineBreak;
+      Result := Result + '<ListOfErrors>';
+      for i := 0 to Errors.Count - 1 do
+      begin
+        Result := Result + System.sLineBreak;
+        Result := Result + '<Error>' + System.sLineBreak;
+        f := TTestFailure(Errors.Items[i]);
+        Result := Result + '  <Message>' + f.AsString + '</Message>' + System.sLineBreak;
+        Result := Result + '  <ExceptionClass>' + f.ExceptionClassName + '</ExceptionClass>' + System.sLineBreak;
+        Result := Result + '  <ExceptionMessage>' + f.ExceptionMessage + '</ExceptionMessage>' + System.sLineBreak;
+        Result := Result + '  <SourceUnitName>' + f.SourceUnitName + '</SourceUnitName>' + System.sLineBreak;
+        Result := Result + '  <LineNumber>' + IntToStr(f.LineNumber) + '</LineNumber>' + System.sLineBreak;
+        Result := Result + '  <MethodName>' + f.MethodName + '</MethodName>' + System.sLineBreak;
+        Result := Result + '</Error>' + System.sLineBreak;
+      end;  
+      Result := Result + '</ListOfErrors>';
+    end;
+    if NumberOfFailures <> 0 then
+    begin
+      Result := Result + System.sLineBreak;
+      Result := Result + '<ListOfFailures>' + System.sLineBreak;
+      for i := 0 to Failures.Count - 1 do
+      begin
+        Result := Result + '<Failure>' + System.sLineBreak;
+        f := TTestFailure(Failures.Items[i]);
+        Result := Result + '  <Message>' + f.AsString + '</Message>' + System.sLineBreak;
+        Result := Result + '  <ExceptionClass>' + f.ExceptionClassName + '</ExceptionClass>' + System.sLineBreak;
+        Result := Result + '  <ExceptionMessage>' + f.ExceptionMessage + '</ExceptionMessage>' + System.sLineBreak;
+        Result := Result + '</Failure>' + System.sLineBreak;
+      end;  
+      Result := Result + '</ListOfFailures>';
+    end;
+  end;
+end;
+
+end.

+ 214 - 0
fcl/fpcunit/tests/asserttest.pp

@@ -0,0 +1,214 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec
+    
+    Port to Free Pascal of the JUnit framework. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit asserttest;
+
+interface
+
+uses 
+  fpcunit;
+
+type
+  
+  TAssertTest = class(TTestCase)
+  published
+    procedure TestFail;
+    procedure TestAssertSame;
+    procedure TestAssertSameNull;
+    procedure TestAssertNotSameFailsNull;
+    procedure TestAssertStringEquals;
+    procedure TestNullNotSameObject;
+    procedure TestAssertNull;
+    procedure TestAssertNotNull;
+    procedure TestAssertTrue;
+    procedure TestAssertFalse;
+    procedure TestAssertNotSame;
+  end;
+
+implementation
+
+procedure TAssertTest.TestFail;
+begin
+  try
+    fail('Wrong or no exception raised with fail');
+  except
+    on E: EAssertionfailedError do
+      Exit;  
+  end;     
+  raise EAssertionFailedError.Create; 
+end;
+
+procedure TAssertTest.TestAssertSame;
+var
+  o: TObject;
+  o1: TObject;
+begin
+  o := TObject.Create;
+  AssertSame(o, o);
+  o1 := TObject.Create;
+  try
+    AssertSame(o, o1);
+  except
+    on E: EAssertionFailedError do  
+    begin
+      o.Free;
+      o1.Free;
+      Exit;
+    end;  
+  end;    
+  o.Free;
+  o1.Free;
+  Fail('Wrong or no exception raised');
+end;
+
+procedure TAssertTest.TestAssertSameNull;
+var
+  a, b: TObject;
+begin
+  a := nil;
+  b := nil;
+  AssertSame(a, b);
+  AssertSame(nil, a);
+  AssertSame(a, nil);
+end;
+
+procedure TAssertTest.TestAssertNotSameFailsNull;
+var
+  a, b: TObject;
+begin
+  a := nil;
+  b := nil;
+  try
+    assertNotSame(a, b);
+  except
+    on E: EAssertionFailedError do
+    Exit;
+  end;  
+  fail('error: nil should equal nil');
+end;
+
+procedure TAssertTest.TestAssertStringEquals;
+begin
+  AssertEquals('a', 'a')
+end;
+
+procedure TAssertTest.TestNullNotSameObject;
+var
+  obj: TObject;
+begin
+  obj := TObject.Create;
+  try
+    AssertSame(nil, obj);
+  except
+    on E: EAssertionFailedError do  
+    begin
+      obj.Free;
+      Exit;
+    end;  
+  end; 
+  Fail('error comparing a valid obj instance with nil');   
+end;
+
+procedure TAssertTest.TestAssertNull;
+var
+  obj: TObject;
+begin
+  AssertNull(nil);
+  obj := TObject.Create;
+  try
+    AssertNull(obj);
+  except
+    on E: EAssertionFailedError do  
+    begin
+      obj.Free;
+      Exit;
+    end;  
+  end; 
+  obj.Free;
+  Fail('failure: obj is not null!');   
+end;
+
+procedure TAssertTest.TestAssertNotNull;
+var
+  obj: TObject;
+begin
+  obj := TObject.Create;
+  AssertNotNull(obj);
+  try
+    AssertNotNull(nil);
+  except
+    on E: EAssertionFailedError do  
+    begin
+      obj.Free;
+      Exit;
+    end;  
+  end; 
+  obj.Free;
+  Fail('error: nil is not a valid object');
+end;
+
+procedure TAssertTest.TestAssertTrue;
+begin
+  assertTrue(true);
+  try
+    assertTrue(false);
+  except
+    on E: EAssertionFailedError do
+    Exit;
+  end;  
+  fail('error asserting true');
+end;
+
+procedure TAssertTest.TestAssertFalse;
+begin
+  assertFalse(false);
+  try
+    assertFalse(true);
+  except
+    on E: EAssertionFailedError do
+    Exit;
+  end;  
+  fail('error asserting false');
+end;
+
+procedure TAssertTest.TestAssertNotSame;
+var
+  obj: TObject;
+  obj1: TObject;
+begin
+  obj := TObject.Create;
+  obj1 := TObject.Create;
+  AssertNotSame(obj, nil);
+  AssertNotSame(nil, obj);
+  AssertNotSame(obj, obj1);
+  try
+    AssertNotSame(obj, obj)
+  except
+    on E: EAssertionFailedError do
+    begin
+      obj.Free;
+      obj1.Free;
+      Exit;
+    end;
+  end;  
+  obj.Free;
+  obj1.Free;
+  Fail('Error: Objects are the same!');
+end;
+
+end.
+ 

+ 138 - 0
fcl/fpcunit/tests/frameworktest.pp

@@ -0,0 +1,138 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec, Michael Van Canneyt
+    
+    an example of a console test runner of FPCUnit tests. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+program frameworktest;
+
+uses 
+  custapp, classes, SysUtils, fpcunit, testreport, asserttest, suitetest;
+  
+Const 
+  ShortOpts = 'alh';
+  Longopts : Array[1..5] of String = (
+    'all','list','format:','suite:','help');
+  Version = 'Version 0.1'; 
+
+Type
+  TTestRunner = Class(TCustomApplication)
+  private
+    FSuite: TTestSuite;
+    FXMLResultsWriter: TXMLResultsWriter;
+  protected  
+    procedure DoRun ; Override;
+    procedure doTestRun(aTest: TTest); virtual;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+  end;
+  
+  
+constructor TTestRunner.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  FXMLResultsWriter := TXMLResultsWriter.Create;
+  FSuite := TTestSuite.Create;
+  FSuite.TestName := 'Framework test';
+  FSuite.AddTestSuiteFromClass(TAssertTest);
+  FSuite.AddTest(TSuiteTest.Suite());
+end;
+
+destructor TTestRunner.Destroy;
+begin
+  FXMLResultsWriter.Free;
+  FSuite.Free;
+end;
+
+procedure TTestRunner.doTestRun(aTest: TTest);
+var
+  testResult: TTestResult;
+begin
+  testResult := TTestResult.Create;
+  try
+    testResult.AddListener(FXMLResultsWriter); 
+    FXMLResultsWriter.WriteHeader;   
+    aTest.Run(testResult);
+    FXMLResultsWriter.WriteResult(testResult);
+  finally  
+    testResult.Free;
+  end;    
+end;
+  
+procedure TTestRunner.DoRun;
+var
+  I : Integer;
+  S : String;
+begin
+  S:=CheckOptions(ShortOpts,LongOpts);
+  If (S<>'') then
+    Writeln(S);
+  if HasOption('h', 'help') or (ParamCount = 0) then
+  begin
+    writeln(Title);
+    writeln(Version);
+    writeln('Usage: ');
+    writeln('-l or --list to show a list of registered tests');
+    writeln('default format is xml, add --format=latex to output the list as latex source');
+    writeln('-a or --all to run all the tests and show the results in xml format');
+    writeln('The results can be redirected to an xml file,');
+    writeln('for example: ./testrunner --all > results.xml');
+    writeln('use --suite=MyTestSuiteName to run only the tests in a single test suite class');
+  end 
+  else;
+    if HasOption('l', 'list') then
+    begin
+      if HasOption('format') then
+      begin
+        if GetOptionValue('format') = 'latex' then
+          writeln(GetSuiteAsLatex(FSuite))
+        else
+          writeln(GetSuiteAsXML(FSuite));
+      end
+      else
+        writeln(GetSuiteAsXML(FSuite));   
+    end;
+  if HasOption('a', 'all') then
+  begin
+    doTestRun(FSuite)
+  end
+  else
+    if HasOption('suite') then
+    begin
+      S := '';
+      S:=GetOptionValue('suite');
+      if S = '' then
+        for I := 0 to FSuite.Tests.count - 1 do
+          writeln(FSuite[i].TestName)
+      else
+      for I := 0 to FSuite.Tests.count - 1 do
+        if FSuite[i].TestName = S then
+        begin    
+          doTestRun(FSuite.Test[i]);   
+        end;      
+    end;  
+  Terminate;
+end;
+
+Var
+  App : TTestRunner;
+ 
+begin
+  App:=TTestRunner.Create(Nil);
+  App.Initialize;
+  App.Title := 'FPCUnit Console Test Case runner.';
+  App.Run;
+  App.Free;
+end.

+ 221 - 0
fcl/fpcunit/tests/suitetest.pp

@@ -0,0 +1,221 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec
+    
+    Port to Free Pascal of the JUnit framework. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit suitetest;
+
+interface
+
+uses 
+  fpcunit, testreport;
+
+type
+
+  TNoTestCases = class(TTestCase)
+  published
+    procedure NoTestCase;  
+  end;
+  
+  {$M+}
+  TNoTestCaseClass = class(TObject)
+  published
+    procedure TestSuccess;
+  end;
+  {$M-}
+  
+  TOneTestCase = class(TTestCase)
+  published
+    procedure NoTestCase;
+    procedure TestCase; virtual;
+  end;
+
+  TOverrideTestCase = class(TOneTestCase)
+  published
+    procedure TestCase; override;
+  end;
+
+  
+  TInheritedTestCase = class(TOneTestCase)
+  published
+    procedure Test2;
+  end;
+
+  TSuiteTest = class(TTestCase)
+  private
+    FResult: TTestResult;
+  protected
+    procedure Setup; override;
+    procedure Teardown; override;
+  public
+    class function Suite: TTestSuite;  
+  published
+    procedure testNoTestCaseClass;
+    procedure testNoTestCases;
+    procedure testOneTestCase;
+    procedure testInheritedTests;
+    procedure testNotExistingTestCase;
+    procedure testShadowedTests;
+    procedure testAddTestSuiteFromClass;
+    procedure testCreateTestSuiteFromArray;
+  end;
+  
+  
+implementation
+
+procedure TNoTestCases.NoTestCase;
+begin
+end;
+
+procedure TNoTestCaseClass.TestSuccess;
+begin
+end;
+
+procedure TOneTestCase.NoTestCase;
+begin
+end;
+
+procedure TOneTestCase.TestCase;
+begin
+end;
+
+procedure TOverrideTestCase.TestCase;
+begin
+end;
+
+procedure TInheritedTestCase.Test2;
+begin
+end;
+
+procedure TSuiteTest.Setup;
+begin
+  FResult := TTestResult.Create;
+end;
+
+procedure TSuiteTest.Teardown;
+begin
+  FResult.Free;
+end;
+
+class function TSuiteTest.Suite: TTestSuite;
+begin
+  Result := TTestSuite.Create('TSuiteTest');
+  Result.AddTest(TSuiteTest.CreateWithName('testNoTestCaseClass'));
+  Result.AddTest(TSuiteTest.CreateWithName('testNoTestCases'));
+  Result.AddTest(TSuiteTest.CreateWithName('testOneTestCase'));
+  Result.AddTest(TSuiteTest.CreateWithName('testInheritedTests'));
+  Result.AddTest(TSuiteTest.CreateWithName('testNotExistingTestCase'));
+  Result.AddTest(TSuiteTest.CreateWithName('testShadowedTests'));
+  Result.AddTest(TSuiteTest.CreateWithName('testAddTestSuiteFromClass'));
+  Result.AddTest(TSuiteTest.CreateWithName('testCreateTestSuiteFromArray'));
+end;
+
+procedure TSuiteTest.testNoTestCaseClass;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create(TNoTestCaseClass);
+  ts.Run(FResult);
+  ts.Free;
+  AssertEquals(1, FResult.RunTests);
+  AssertTrue(not FResult.WasSuccessful);
+end;
+
+procedure TSuiteTest.testNoTestCases;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create(TNoTestCases);
+  ts.Run(FResult);
+  ts.Free;
+  AssertTrue(FResult.RunTests = 1);
+  AssertTrue(FResult.NumberOfFailures = 1);
+  AssertTrue(not FResult.WasSuccessful);
+end;
+
+procedure TSuiteTest.testOneTestCase;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create(TOneTestCase);
+  ts.Run(FResult);
+  ts.Free;
+  AssertTrue(FResult.RunTests = 1);
+  AssertTrue(FResult.NumberOfFailures = 0);
+  AssertTrue(FResult.NumberOfErrors = 0);
+  AssertTrue(FResult.WasSuccessful);
+end;
+
+procedure TSuiteTest.testInheritedTests;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create(TInheritedTestCase);
+  ts.Run(FResult);
+  ts.Free;
+  AssertEquals(2, FResult.RunTests);
+  AssertTrue(FResult.WasSuccessful);
+end;
+
+procedure TSuiteTest.testNotExistingTestCase;
+var
+  t: TTestCase;
+begin
+  t := TSuiteTest.CreateWithName('notExistingMethod');
+  t.Run(FResult);
+  t.Free;
+  AssertTrue(FResult.RunTests = 1);
+  AssertTrue(FResult.NumberOfFailures = 1);
+  AssertTrue(FResult.NumberOfErrors = 0);
+end;
+
+procedure TSuiteTest.testShadowedTests;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create(TOverrideTestCase);
+  ts.Run(FResult);
+  ts.Free;
+  AssertEquals(1, FResult.RunTests);
+end;
+
+procedure TSuiteTest.testAddTestSuiteFromClass;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create;
+  ts.AddTestSuiteFromClass(TOneTestCase);
+  ts.Run(FResult);
+  ts.Free;
+  AssertEquals(1, FResult.RunTests);
+end;
+
+procedure TSuiteTest.testCreateTestSuiteFromArray;
+var
+  ts: TTestSuite;
+begin
+  ts := TTestSuite.Create([TOneTestCase, TInheritedTestCase]);
+  try
+    AssertEquals(3, ts.CountTestCases);
+    AssertEquals(2, ts.Tests.Count); 
+    AssertEquals('TOneTestCase', ts[0].TestName); 
+    AssertEquals('TInheritedTestCase', ts[1].TestName);   
+  finally
+    ts.Free;
+  end;
+end;
+
+end.
+ 

+ 115 - 0
fcl/fpcunit/testutils.pp

@@ -0,0 +1,115 @@
+{$mode objfpc}
+{$h+}
+{
+    $Id$
+    This file is part of the Free Component Library (FCL)
+    Copyright (c) 2004 by Dean Zobec
+    
+    Port to Free Pascal of the JUnit framework. 
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+unit testutils;
+
+interface
+
+uses
+  Classes, SysUtils;
+
+type
+  {$M+}
+  TNoRefCountObject = class(TObject, IInterface)
+  protected
+    { IInterface }
+    function QueryInterface(const IID: TGUID; out Obj): HResult; virtual; stdcall;
+    function _AddRef: Integer; stdcall;
+    function _Release: Integer; stdcall;
+  end; 
+  {$M-}   
+  
+procedure FreeObjects(List: TList);  
+procedure GetMethodList( AObject: TObject; AList: TStrings ); overload;
+procedure GetMethodList( AClass: TClass; AList: TStrings ); overload;
+
+implementation
+
+function TNoRefCountObject.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
+begin
+  if GetInterface(IID, Obj) then Result := 0
+    else Result := HRESULT($80004002);
+end;
+
+function TNoRefCountObject._AddRef: Integer;stdcall;
+begin
+  Result := -1;
+end;
+
+function TNoRefCountObject._Release: Integer;stdcall;
+begin
+  Result := -1;
+end;  
+
+// been to the dentist and suffered a lot
+// Hack Alert! see objpas.inc
+//  Get a list of published methods for a given class or object
+procedure GetMethodList( AObject: TObject; AList: TStrings );
+begin
+  GetMethodList( AObject.ClassType, AList );
+end;
+
+procedure GetMethodList(AClass: TClass; AList: TStrings);
+type
+  TMethodNameRec = packed record
+    name : pshortstring;
+    addr : pointer;
+  end;
+
+  TMethodNameTable = packed record
+    count : dword;
+    entries : packed array[0..0] of TMethodNameRec;
+  end;
+
+  pMethodNameTable =  ^TMethodNameTable;
+
+var
+  methodTable : pMethodNameTable;
+  i : dword;
+  vmt: TClass;
+  idx: integer;
+begin
+  AList.Clear;
+  vmt := aClass;
+  while assigned(vmt) do
+  begin
+    methodTable := pMethodNameTable((Pointer(vmt) + vmtMethodTable)^);
+    if assigned(MethodTable) then
+    begin
+      for i := 0 to MethodTable^.count - 1 do
+      begin
+        idx := aList.IndexOf(MethodTable^.entries[i].name^);
+        if (idx <> - 1) then 
+	//found overridden method so delete it
+	  aList.Delete(idx);
+        aList.AddObject(MethodTable^.entries[i].name^, TObject(MethodTable^.entries[i].addr));
+      end;
+    end;
+    vmt := pClass(pointer(vmt) + vmtParent)^;
+  end;
+end;
+
+procedure FreeObjects(List: TList);
+var
+  i: integer;
+begin
+  for i:= 0 to List.Count - 1 do
+    TObject(List.Items[i]).Free;
+end;  
+
+end.
+