diff --git a/Extensions/test.pas b/Extensions/test.pas deleted file mode 100644 index 4b6a49b..0000000 --- a/Extensions/test.pas +++ /dev/null @@ -1,16 +0,0 @@ -program new; - -{ Creating TForm crashed for me, but probably because I'm on Linux x86_64 } -procedure init; - -//var -// a: TForm; -begin - createf; -// a := TForm.Create(nil); -// a.ShowModal; -// a.Free; -end; - -begin -end. diff --git a/Extensions/test.sex b/Extensions/test.sex new file mode 100644 index 0000000..d4d1000 --- /dev/null +++ b/Extensions/test.sex @@ -0,0 +1,35 @@ +program new; + +procedure init; +begin; + Writeln('init your extension here'); +end; + +procedure free; +begin + Writeln('Free your extension here'); +end; + +procedure Attach; +begin; + Writeln('Your extension has been enabled, do stuff here'); +end; + +Procedure Detach; +begin + Writeln('Your extension has ben disabled, do stuff here'); +end; + +//Called to retrieve the name of your extension +function GetName : string; +begin; + result := 'Test Extension'; +end; + +//Called to retrieve the version of your extension +function GetVersion : string; +begin; + result := '1.1b'; +end; +begin +end. diff --git a/Extensions/test2.sex b/Extensions/test2.sex new file mode 100644 index 0000000..6af8172 --- /dev/null +++ b/Extensions/test2.sex @@ -0,0 +1,53 @@ +program new; +var + MenuItem,MenuItem2 : TMenuItem; + Started : Boolean; + +procedure OnClick(sender : TObject); +begin; + Writeln('Hey you clicked the test menu item!'); +end; +procedure init; +begin; + MenuItem := TMenuItem.Create(Simba_MainMenu); + MenuItem.Caption := 'Test'; + Simba_MainMenu.Items.Add(menuItem); + MenuItem2 := TMenuItem.Create(MenuItem); + MenuItem2.Caption := 'Test!'; + MenuItem2.OnClick := @OnClick; + MenuItem.Add(MenuItem2); + Started := True; +end; + +procedure Free; +begin + if Started then + begin; + //MenuItem.Free; {Doesn't work in PS somehow} + //MenuItem2.Free; + end; +end; + +procedure Attach; +begin; + //Menuitem.Visible := True; +end; + +Procedure Detach; +begin + //Menuitem.Visible := False; +end; + +//Called to retrieve the name of your extension +function GetName : string; +begin; + result := 'Add submenu'; +end; + +//Called to retrieve the version of your extension +function GetVersion : string; +begin; + result := '1.0'; +end; +begin +end. diff --git a/Extensions/test3.sex b/Extensions/test3.sex new file mode 100644 index 0000000..5ebaa9a --- /dev/null +++ b/Extensions/test3.sex @@ -0,0 +1,35 @@ +program new; + +procedure init; +begin; + Writeln('init your extension here'); +end; + +procedure free; +begin + Writeln('Free your extension here'); +end; + +procedure Attach; +begin; + Writeln('Your extension has been enabled, do stuff here'); +end; + +Procedure Detach; +begin + Writeln('Your extension has ben disabled, do stuff here'); +end; + +//Called to retrieve the name of your extension +function GetName : string; +begin; + result := 'Leet Extension'; +end; + +//Called to retrieve the version of your extension +function GetVersion : string; +begin; + result := '0.001'; +end; +begin +end. diff --git a/Projects/SAMufasaGUI/extensionmanager.pas b/Projects/SAMufasaGUI/extensionmanager.pas index 213b615..631ba5e 100644 --- a/Projects/SAMufasaGUI/extensionmanager.pas +++ b/Projects/SAMufasaGUI/extensionmanager.pas @@ -5,46 +5,132 @@ unit extensionmanager; interface uses - Classes, SysUtils; + Classes, SysUtils,virtualextension,psextension,mufasabase,mufasatypes; type - + TExtension = TVirtualSimbaExtension; (** - TExtensionManager holds a list of VirtualExtensions, and + TExtensionManager holds a list of TExtension, and has functions to easily handle hooks. *) + { TExtensionManager } + TExtensionManager = class(TObject) - public - constructor Create; - destructor Destroy; override; private - Extensions: TList; + FOnChange: TNotifyEvent; + procedure SetOnchange(const AValue: TNotifyEvent); public - function HandleHook(HookName: String; Args: Array of Variant): Variant; + constructor Create; + destructor Destroy; override; + public + Extensions: TList; + StartDisabled : boolean; + property OnChange : TNotifyEvent read FOnChange write SetOnchange; + function GetExtensionIndex(Filename : string) : integer; + function LoadPSExtension(Filename : string) : boolean; + function LoadPSExtensionsDir(Directory,ext : string) : boolean; + function HandleHook(HookName: String; Args: Array of Variant): Variant; end; - +var + ExtManager : TExtensionManager; implementation uses - pseventextension, virtualextension; + TestUnit; +procedure TExtensionManager.SetOnchange(const AValue: TNotifyEvent); +var + i : integer; +begin + for i := 0 to Extensions.Count - 1 do + TExtension(Extensions[i]).OnChange := AValue;; + FOnChange:=AValue; +end; constructor TExtensionManager.Create; begin + inherited Create; Extensions := TList.Create; + StartDisabled := True; end; destructor TExtensionManager.Destroy; var i: Integer; begin - { for i := 0 to Extensions.Count - 1 do - TVirtualSimbaExtension(Extensions.Items[i]).Free; - } + TExtension(Extensions.Items[i]).Free; Extensions.Free; + inherited Destroy; +end; + +function TExtensionManager.GetExtensionIndex(Filename: string): integer; +var + i : integer; +begin + for i := 0 to Extensions.Count - 1 do + if CompareText(TExtension(Extensions[i]).Filename,filename) = 0 then + exit(i); + result := -1; +end; + +function TExtensionManager.LoadPSExtension(Filename: string): boolean; +var + Ext : TExtension; +begin + if GetExtensionIndex(filename) <> -1 then + exit(true); + Result := False; + try + Ext := TSimbaPSExtension.Create(filename,startdisabled); + result := TSimbaPSExtension(ext).Working; + Extensions.Add(ext); + ext.OnChange:= FOnChange; + if assigned(FOnChange) then + FOnChange(Self); + except + on e : exception do + formWritelnex(format('Error in LoadPSExtension(%s): %s',[FileName, e.message])); + end; +end; + +function GetFiles(Path, Ext: string): TstringArray; +var + SearchRec : TSearchRec; + c : integer; +begin + c := 0; + if FindFirst(Path + '*.' + ext, faAnyFile, SearchRec) = 0 then + begin + repeat + inc(c); + SetLength(Result,c); + Result[c-1] := SearchRec.Name; + until FindNext(SearchRec) <> 0; + SysUtils.FindClose(SearchRec); + end; +end; + +function TExtensionManager.LoadPSExtensionsDir(Directory,ext: string): boolean; +var + Files : TstringArray; + i : integer; + tempevent : TNotifyEvent; +begin + result := false; + if not DirectoryExists(directory) then + exit; + tempevent := FOnChange; + FOnChange := nil; + Directory := IncludeTrailingPathDelimiter(directory); + Files := GetFiles(Directory,ext); + for i := 0 to high(Files) do + result := result or LoadPSExtension(Directory + files[i]); + FOnChange := Tempevent; + if Assigned(FOnChange) then + FOnChange(self); end; // How do we return more than one result? @@ -53,11 +139,13 @@ var i: Integer; begin for i := 0 to Extensions.Count -1 do - if TVirtualSimbaExtension(Extensions.Items[i]).HookExists(HookName) then - if TVirtualSimbaExtension(Extensions.Items[i]).ExecuteHook(HookName, Args, Result) <> 0 then - begin - // Not succesfull. - end; + with TExtension(Extensions[i]) do + if Enabled then + if HookExists(HookName) then + if ExecuteHook(HookName, Args, Result) <> 0 then + begin + // Not succesfull. + end; end; end. diff --git a/Projects/SAMufasaGUI/extensionmanagergui.lfm b/Projects/SAMufasaGUI/extensionmanagergui.lfm new file mode 100644 index 0000000..e3c0084 --- /dev/null +++ b/Projects/SAMufasaGUI/extensionmanagergui.lfm @@ -0,0 +1,74 @@ +object ExtensionsForm: TExtensionsForm + Left = 200 + Height = 256 + Top = 139 + Width = 389 + Caption = 'ExtensionsForm' + ClientHeight = 256 + ClientWidth = 389 + OnCreate = FormCreate + LCLVersion = '0.9.29' + object ExtensionsBox: TGroupBox + Left = 0 + Height = 256 + Top = 0 + Width = 389 + Align = alClient + Caption = 'Extensions' + ClientHeight = 238 + ClientWidth = 385 + TabOrder = 0 + object ExtensionsList: TListView + Left = 6 + Height = 192 + Top = 8 + Width = 371 + Align = alCustom + Anchors = [akTop, akLeft, akRight, akBottom] + Columns = < + item + Caption = 'Extensions' + MinWidth = 90 + Width = 90 + end + item + Caption = 'Name' + MinWidth = 75 + Width = 150 + end + item + AutoSize = True + Caption = 'Version' + MinWidth = 60 + Width = 60 + end> + HideSelection = False + ItemIndex = -1 + ReadOnly = True + RowSelect = True + TabOrder = 0 + ViewStyle = vsReport + OnAdvancedCustomDrawItem = ExtensionsListAdvancedCustomDrawItem + OnSelectItem = ExtensionsListSelectItem + end + object Button: TButton + Left = 302 + Height = 25 + Top = 208 + Width = 75 + Caption = 'Refresh' + OnClick = ButtonClick + TabOrder = 1 + end + object ExtEnabled: TCheckBox + Left = 6 + Height = 17 + Top = 208 + Width = 72 + Caption = 'ExtEnabled' + OnChange = ExtEnabledChange + TabOrder = 2 + Visible = False + end + end +end diff --git a/Projects/SAMufasaGUI/extensionmanagergui.lrs b/Projects/SAMufasaGUI/extensionmanagergui.lrs new file mode 100644 index 0000000..33e7bcb --- /dev/null +++ b/Projects/SAMufasaGUI/extensionmanagergui.lrs @@ -0,0 +1,23 @@ +{ This is an automatically generated lazarus resource file } + +LazarusResources.Add('TExtensionsForm','FORMDATA',[ + 'TPF0'#15'TExtensionsForm'#14'ExtensionsForm'#4'Left'#3#200#0#6'Height'#3#0#1 + +#3'Top'#3#139#0#5'Width'#3#133#1#7'Caption'#6#14'ExtensionsForm'#12'ClientHe' + +'ight'#3#0#1#11'ClientWidth'#3#133#1#8'OnCreate'#7#10'FormCreate'#10'LCLVers' + +'ion'#6#6'0.9.29'#0#9'TGroupBox'#13'ExtensionsBox'#4'Left'#2#0#6'Height'#3#0 + +#1#3'Top'#2#0#5'Width'#3#133#1#5'Align'#7#8'alClient'#7'Caption'#6#10'Extens' + +'ions'#12'ClientHeight'#3#238#0#11'ClientWidth'#3#129#1#8'TabOrder'#2#0#0#9 + +'TListView'#14'ExtensionsList'#4'Left'#2#6#6'Height'#3#192#0#3'Top'#2#8#5'Wi' + +'dth'#3's'#1#5'Align'#7#8'alCustom'#7'Anchors'#11#5'akTop'#6'akLeft'#7'akRig' + +'ht'#8'akBottom'#0#7'Columns'#14#1#7'Caption'#6#10'Extensions'#8'MinWidth'#2 + +'Z'#5'Width'#2'Z'#0#1#7'Caption'#6#4'Name'#8'MinWidth'#2'K'#5'Width'#3#150#0 + +#0#1#8'AutoSize'#9#7'Caption'#6#7'Version'#8'MinWidth'#2'<'#5'Width'#2'<'#0#0 + +#13'HideSelection'#8#9'ItemIndex'#2#255#8'ReadOnly'#9#9'RowSelect'#9#8'TabOr' + +'der'#2#0#9'ViewStyle'#7#8'vsReport'#24'OnAdvancedCustomDrawItem'#7'$Extensi' + +'onsListAdvancedCustomDrawItem'#12'OnSelectItem'#7#24'ExtensionsListSelectIt' + +'em'#0#0#7'TButton'#6'Button'#4'Left'#3'.'#1#6'Height'#2#25#3'Top'#3#208#0#5 + +'Width'#2'K'#7'Caption'#6#7'Refresh'#7'OnClick'#7#11'ButtonClick'#8'TabOrder' + +#2#1#0#0#9'TCheckBox'#10'ExtEnabled'#4'Left'#2#6#6'Height'#2#17#3'Top'#3#208 + +#0#5'Width'#2'H'#7'Caption'#6#10'ExtEnabled'#8'OnChange'#7#16'ExtEnabledChan' + +'ge'#8'TabOrder'#2#2#7'Visible'#8#0#0#0#0 +]); diff --git a/Projects/SAMufasaGUI/extensionmanagergui.pas b/Projects/SAMufasaGUI/extensionmanagergui.pas new file mode 100644 index 0000000..d3417ea --- /dev/null +++ b/Projects/SAMufasaGUI/extensionmanagergui.pas @@ -0,0 +1,137 @@ +unit extensionmanagergui; + +{$mode objfpc} + +interface + +uses + Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, + StdCtrls, ComCtrls, Grids,extensionmanager; + +type + + { TExtensionsForm } + + TExtensionsForm = class(TForm) + Button: TButton; + ExtEnabled: TCheckBox; + ExtensionsBox: TGroupBox; + ExtensionsList: TListView; + procedure ButtonClick(Sender: TObject); + procedure ExtEnabledChange(Sender: TObject); + procedure ExtensionsListAdvancedCustomDrawItem(Sender: TCustomListView; + Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage; + var DefaultDraw: Boolean); + procedure ExtensionsListSelectItem(Sender: TObject; Item: TListItem; + Selected: Boolean); + procedure FormCreate(Sender: TObject); + private + { private declarations } + procedure Refresh; + public + procedure OnChangeExtensions(Sender: TObject); + end; + +var + ExtensionsForm: TExtensionsForm; + +implementation +uses + virtualextension; + +{ TExtensionsForm } + +procedure TExtensionsForm.ButtonClick(Sender: TObject); +begin + Refresh; +end; + +procedure TExtensionsForm.ExtEnabledChange(Sender: TObject); +begin + if ExtensionsList.Selected <> nil then + with TVirtualSimbaExtension(ExtManager.Extensions[ExtensionsList.Selected.Index]) do + begin; + Enabled:= ExtEnabled.Checked; + ExtEnabled.Checked := Enabled; + end; +end; + +procedure TExtensionsForm.ExtensionsListAdvancedCustomDrawItem( + Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; + Stage: TCustomDrawStage; var DefaultDraw: Boolean); +begin + if TVirtualSimbaExtension(ExtManager.Extensions[Item.Index]).Enabled then + Sender.Canvas.Brush.Color := $CCFFCC//$7AFF95 + else + sender.canvas.brush.color := $CCCCFF//$FF3D64; +end; + +procedure TExtensionsForm.ExtensionsListSelectItem(Sender: TObject; + Item: TListItem; Selected: Boolean); +var + str : string; +begin + if Selected = true then + begin + extEnabled.Visible := true; + with TVirtualSimbaExtension(ExtManager.Extensions[Item.Index]) do + begin + OnChange:= nil; + ExtEnabled.Checked := Enabled; + Onchange := @OnChangeExtensions; + str := GetName; + if str = '' then + str := ExtractFileName(Filename); + ExtEnabled.Caption:= 'Enable: ' + str; + end; + end else + ExtEnabled.Visible := false; +end; + +procedure TExtensionsForm.FormCreate(Sender: TObject); +begin + ExtManager.OnChange:= @OnChangeExtensions; + Refresh; +end; + +procedure TExtensionsForm.Refresh; +var + i , sel: integer; + Extensions : TList; + str : string; +begin + sel := -1; + if ExtensionsList.Selected <> nil then + sel := ExtensionsList.Selected.Index; + ExtensionsList.Clear; + Extensions := ExtManager.Extensions; + for i := 0 to Extensions.Count - 1 do + begin + with TVirtualSimbaExtension(Extensions[i]),ExtensionsList.Items.Add do + begin + Caption:= ExtractFileName(FileName); + str := GetName; + if str = '' then + str := caption; //Could not retrieve the name + SubItems.Add(str); + str := GetVersion; + if str = '' then + str := 'NA'; //Could not retrieve the version + SubItems.Add(str); + end; + end; + if sel <> -1 then + if sel < extensions.count then + ExtensionsList.Selected := ExtensionsList.Items[sel]; +end; + +procedure TExtensionsForm.OnChangeExtensions(Sender: TObject); +begin + Refresh; +end; + +initialization + {$I extensionmanagergui.lrs} + +end. + diff --git a/Projects/SAMufasaGUI/project1.lpi b/Projects/SAMufasaGUI/project1.lpi index 4d2258d..25e7330 100644 --- a/Projects/SAMufasaGUI/project1.lpi +++ b/Projects/SAMufasaGUI/project1.lpi @@ -39,7 +39,7 @@ - + @@ -164,10 +164,9 @@ - + - - + @@ -208,31 +207,22 @@ - + - - - - + - + + + + - - - - - - - - - diff --git a/Projects/SAMufasaGUI/project1.lpr b/Projects/SAMufasaGUI/project1.lpr index 5ce9fc7..35bface 100644 --- a/Projects/SAMufasaGUI/project1.lpr +++ b/Projects/SAMufasaGUI/project1.lpr @@ -33,7 +33,7 @@ uses {$ENDIF}{$ENDIF} Interfaces, Forms, testunit, colourhistory, About, internets, debugimage, framefunctionlist, simpleanalyzer, updater, updateform, simbasettings, -libloader, mufasabase; +libloader, mufasabase, extensionmanagergui; {$R project1.res} @@ -46,6 +46,7 @@ begin Application.CreateForm(TAboutForm, AboutForm); Application.CreateForm(TDebugImgForm, DebugImgForm); Application.CreateForm(TSimbaUpdateForm, SimbaUpdateForm); + Application.CreateForm(TExtensionsForm, ExtensionsForm); // Application.CreateForm(TSettingsForm, SettingsForm); Done in FormCreate of MainForm Application.Run; end. diff --git a/Projects/SAMufasaGUI/pseventextension.pas b/Projects/SAMufasaGUI/pseventextension.pas deleted file mode 100644 index 3687bb6..0000000 --- a/Projects/SAMufasaGUI/pseventextension.pas +++ /dev/null @@ -1,219 +0,0 @@ -unit pseventextension; - -{$mode objfpc} - -interface - -uses - Classes, SysUtils, virtualextension, - uPSComponent,uPSCompiler, uPSRuntime, uPSPreProcessor,forms; - - - -type - - { TSimbaPSEventExtension } - - TSimbaPSEventExtension = class(TVirtualSimbaExtension) - public - constructor Create(FileName: String); - destructor Destroy; override; - private - PSInstance: TPSScript; - FEnabled: Boolean; - Script: TStringList; - - private - function InitScript: Boolean; - procedure OutputMessages; - - public - function HookExists(HookName: String): Boolean; override; - function ExecuteHook(HookName: String; fArgs: Array of Variant; out OutVariant): Integer; - protected - procedure RegisterPSCComponents(Sender: TObject; x: TPSPascalCompiler); - procedure RegisterPSRComponents(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter); - procedure RegisterMyMethods(Sender: TPSScript); - procedure OnPSExecute(Sender: TPSScript); - - end; - - -implementation -uses - uPSC_std, uPSC_controls,uPSC_classes,uPSC_graphics,uPSC_stdctrls,uPSC_forms, - uPSC_extctrls,uPSC_menus, //Compile libs - uPSR_std, uPSR_controls,uPSR_classes,uPSR_graphics,uPSR_stdctrls,uPSR_forms, - uPSR_extctrls,uPSR_menus, //Runtime-libs - testunit//Writeln - ; - -procedure createf; -var - a: TForm; -begin - a:=TForm.Create(nil); - a.ShowModal; - a.Free; -end; - - -function TSimbaPSEventExtension.HookExists(HookName: String): Boolean; -begin - { FIXME: Free the .data ? } - Exit(PSInstance.GetProcMethod('init').Data <> nil); -end; - -function TSimbaPSEventExtension.ExecuteHook(HookName: String; fArgs: Array of Variant; out OutVariant): Integer; - -begin - - result := 0; - try - PSInstance.ExecuteFunction([], HookName); - except - result := 1; - end; -end; - -constructor TSimbaPSEventExtension.Create(FileName: String); -var - fStr:TFileStream; - -begin - inherited create; - - try - Script := TStringList.Create; - fStr := TFileStream.Create(FileName, fmOpenRead); - Script.LoadFromStream(fStr); - fStr.Free; - except - raise Exception.CreateFmt('File %s could not be read', [FileName]); - end; - - FEnabled := False; - - { Create script, and see if the extension is valid. (If it compiles) } - - PSInstance := TPSScript.Create(nil); - - PSInstance.Script := Self.Script; - PSInstance.OnCompImport:=@RegisterPSCComponents; - PSInstance.OnExecImport:=@RegisterPSRComponents; - PSInstance.OnCompile:=@RegisterMyMethods; - PSInstance.OnExecute:=@OnPSExecute; - - formWritelnEx(Format('%s: Script: %s', [FileName, Self.Script.Text])); - - try - FEnabled := PSInstance.Compile; - finally - if FEnabled then - formWritelnEx('Extension Enabled') - else - begin - formWritelnEx('Extension Disabled - Did not compile'); - OutputMessages; - end; - end; - - FEnabled := InitScript(); - if FEnabled then - formWritelnEx('It exists') - else - formWritelnEx('It does not exist - or something went wrong while executing it.'); -end; - -function TSimbaPSEventExtension.InitScript: Boolean; -begin - if not HookExists('init') then - exit(false); - - result := true; - try - PSInstance.ExecuteFunction([], 'init'); - except - result := false; - end; -end; - - -procedure TSimbaPSEventExtension.RegisterMyMethods(Sender: TPSScript); -begin - Sender.AddFunction(@createf, 'procedure createf;'); - Sender.AddFunction(@formWritelnEx,'procedure Writeln(s : string)'); - Sender.AddRegisteredVariable('Simba','TForm'); - Sender.AddRegisteredVariable('Simba_MainMenu','TMainMenu'); -end; - -procedure TSimbaPSEventExtension.OnPSExecute(Sender: TPSScript); -begin - Sender.SetVarToInstance('simba',Form1); - Sender.SetVarToInstance('Simba_MainMenu',Form1.MainMenu); -end; - -procedure TSimbaPSEventExtension.RegisterPSCComponents(Sender: TObject; x: TPSPascalCompiler); -begin - SIRegister_Std(x); - SIRegister_Classes(x, True); - SIRegister_Controls(x); - SIRegister_Graphics(x, True); - SIRegister_stdctrls(x); - SIRegister_Forms(x); - SIRegister_ExtCtrls(x); - SIRegister_Menus(x); -end; - -procedure TSimbaPSEventExtension.RegisterPSRComponents(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter); -begin - RIRegister_Std(x); - RIRegister_Classes(x, True); - RIRegister_Controls(x); - RIRegister_Graphics(x, True); - RIRegister_stdctrls(x); - RIRegister_Forms(x); - RIRegister_ExtCtrls(x); - RIRegister_Menus(x); -end; - -destructor TSimbaPSEventExtension.Destroy; -begin - if Assigned(PSInstance) then - FreeAndNil(PSInstance); - - - formWritelnEx('Closing extension'); - - inherited; -end; - - -procedure TSimbaPSEventExtension.OutputMessages; -var - l: Longint; - b: Boolean; -begin - b := False; - for l := 0 to PSInstance.CompilerMessageCount - 1 do - begin - if (not b) and (PSInstance.CompilerMessages[l] is TIFPSPascalCompilerError) then - begin - b := True; - with PSInstance.CompilerMessages[l] do - formWritelnEx(MessageToString); - {if OnError <> nil then - with PSInstance.CompilerMessages[l] do - HandleError(Row, Col, Pos, MessageToString,errCompile, ModuleName) - else } - formWritelnEx(PSInstance.CompilerErrorToStr(l) + ' at line ' + inttostr(PSInstance.CompilerMessages[l].Row)); - end else - formWritelnEx(PSInstance.CompilerErrorToStr(l) + ' at line ' + inttostr(PSInstance.CompilerMessages[l].Row)); - - end; -end; - - - -end. - diff --git a/Projects/SAMufasaGUI/psextension.pas b/Projects/SAMufasaGUI/psextension.pas new file mode 100644 index 0000000..0624949 --- /dev/null +++ b/Projects/SAMufasaGUI/psextension.pas @@ -0,0 +1,229 @@ +unit psextension; + +{$mode objfpc} + +interface + +uses + Classes, SysUtils,mufasabase, virtualextension, + uPSComponent,uPSCompiler, uPSRuntime, uPSPreProcessor,forms; + + + +type + + { TSimbaPSExtension } + + TSimbaPSExtension = class(TVirtualSimbaExtension) + public + constructor Create(FileStr: String; StartDisabled : boolean = false); + destructor Destroy; override; + private + PSInstance: TPSScript; + FWorking: Boolean; + Script: TStringList; + procedure StartExtension; + private + function FreeScript: boolean; + function InitScript: Boolean; + procedure OutputMessages; + + public + function HookExists(HookName: String): Boolean;override; + function ExecuteHook(HookName: String; fArgs: Array of Variant; out OutVariant : Variant): Integer;override; + property Working : boolean read FWorking; + protected + procedure RegisterPSCComponents(Sender: TObject; x: TPSPascalCompiler); + procedure RegisterPSRComponents(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter); + procedure RegisterMyMethods(Sender: TPSScript); + procedure OnPSExecute(Sender: TPSScript); + procedure SetEnabled(bool : boolean);override; + end; + + +implementation +uses + uPSC_std, uPSC_controls,uPSC_classes,uPSC_graphics,uPSC_stdctrls,uPSC_forms, + uPSC_extctrls,uPSC_menus, //Compile libs + uPSR_std, uPSR_controls,uPSR_classes,uPSR_graphics,uPSR_stdctrls,uPSR_forms, + uPSR_extctrls,uPSR_menus, //Runtime-libs + testunit//Writeln + ; + +function TSimbaPSExtension.HookExists(HookName: String): Boolean; +begin + Result := False; + if FWorking then + if PSInstance.Exec.GetProc(HookName) <> InvalidVal then + result := True; +end; + +function TSimbaPSExtension.ExecuteHook(HookName: String; fArgs: Array of Variant; out OutVariant : Variant): Integer; +begin + result := SExt_error; + if not FWorking then + exit; + try + outvariant := PSInstance.ExecuteFunction(fArgs, HookName); + result := SExt_ok; + except + on e : exception do + formWritelnEx(format('Error in Simba extension (%s): %s',[Self.GetName,e.message])); + end; +end; + +constructor TSimbaPSExtension.Create(FileStr: String; StartDisabled: boolean = false); +begin + inherited create; + FWorking := False; + FileName := FileStr; + try + Script := TStringList.Create; + Script.LoadFromFile(FileName); + except + raise Exception.CreateFmt('File %s could not be read', [FileName]); + end; + FEnabled := false; + PSInstance := nil; + if not StartDisabled then + StartExtension; +end; + +function TSimbaPSExtension.InitScript: Boolean; +begin + if not HookExists('init') then + exit(false); + result := true; + try + PSInstance.ExecuteFunction([], 'init'); + except + result := false; + end; +end; + +function TSimbaPSExtension.FreeScript: boolean; +var + bla : variant; +begin + if not HookExists('Free') then + exit(false); + result := ExecuteHook('Free',[],bla) = SExt_ok; +end; + + +procedure TSimbaPSExtension.RegisterMyMethods(Sender: TPSScript); +begin + Sender.AddFunction(@formWritelnEx,'procedure Writeln(s : string)'); + Sender.AddRegisteredVariable('Simba','TForm'); + Sender.AddRegisteredVariable('Simba_MainMenu','TMainMenu'); +end; + +procedure TSimbaPSExtension.OnPSExecute(Sender: TPSScript); +begin + Sender.SetVarToInstance('simba',Form1); + Sender.SetVarToInstance('Simba_MainMenu',Form1.MainMenu); +end; + +procedure TSimbaPSExtension.SetEnabled(bool: boolean); +var + temp : variant; +begin + if bool <> FEnabled then + begin + if bool then + begin; + if not assigned(PSInstance) then //We enable it for the first time, calls SetEnabled. + StartExtension + else + begin + if not FWorking then + Exit; + if hookexists('attach') then + ExecuteHook('attach',[],temp); + end; + end else + if HookExists('detach') then + ExecuteHook('detach',[],temp); + end; + inherited SetEnabled(bool); +end; + +procedure TSimbaPSExtension.RegisterPSCComponents(Sender: TObject; x: TPSPascalCompiler); +begin + SIRegister_Std(x); + SIRegister_Classes(x, True); + SIRegister_Controls(x); + SIRegister_Graphics(x, True); + SIRegister_stdctrls(x); + SIRegister_Forms(x); + SIRegister_ExtCtrls(x); + SIRegister_Menus(x); +end; + +procedure TSimbaPSExtension.RegisterPSRComponents(Sender: TObject; se: TPSExec; x: TPSRuntimeClassImporter); +begin + RIRegister_Std(x); + RIRegister_Classes(x, True); + RIRegister_Controls(x); + RIRegister_Graphics(x, True); + RIRegister_stdctrls(x); + RIRegister_Forms(x); + RIRegister_ExtCtrls(x); + RIRegister_Menus(x); +end; + +destructor TSimbaPSExtension.Destroy; +begin + FreeScript; + if Assigned(PSInstance) then + FreeAndNil(PSInstance); + inherited; +end; + +procedure TSimbaPSExtension.StartExtension; +begin + if assigned(PSInstance) then + exit;//Already started.. + { Create script, and see if the extension is valid. (If it compiles) } + PSInstance := TPSScript.Create(nil); + + PSInstance.Script := Self.Script; + PSInstance.OnCompImport:=@RegisterPSCComponents; + PSInstance.OnExecImport:=@RegisterPSRComponents; + PSInstance.OnCompile:=@RegisterMyMethods; + PSInstance.OnExecute:=@OnPSExecute; + + formWritelnEx(Format('Loading extension %s', [FileName])); + try + FWorking := PSInstance.Compile; + except + on e : exception do + FormWritelnEx(format('Error in Simba extension (%s) : %s',[FileName,e.message])); + end; + if FWorking then + formWritelnEx('Extension Enabled') + else + begin + formWritelnEx('Extension Disabled - Did not compile'); + OutputMessages; + end; + + if InitScript then + mDebugLn('Init procedure succesfully called') + else + mDebugLn('Init procedure didn''t execute right, or couldn''t be found'); + Enabled:= FWorking; +end; + +procedure TSimbaPSExtension.OutputMessages; +var + l: Longint; +begin + for l := 0 to PSInstance.CompilerMessageCount - 1 do + formWritelnEx(PSInstance.CompilerErrorToStr(l) + ' at line ' + inttostr(PSInstance.CompilerMessages[l].Row)); +end; + + + +end. + diff --git a/Projects/SAMufasaGUI/testunit.lfm b/Projects/SAMufasaGUI/testunit.lfm index 23d7da5..69af4a6 100644 --- a/Projects/SAMufasaGUI/testunit.lfm +++ b/Projects/SAMufasaGUI/testunit.lfm @@ -1239,17 +1239,21 @@ object Form1: TForm1 object MenuView: TMenuItem Caption = '&View' object MenuItemColourHistory: TMenuItem - Caption = 'View &Colour History' + Caption = '&Colour History' OnClick = MenuItemColourHistoryClick end object MenuItemDebugImage: TMenuItem - Caption = 'View &Debug Image' + Caption = '&Debug Image' OnClick = MenuItemDebugImageClick end object MenuItemFunctionList: TMenuItem - Caption = 'View &Function List' + Caption = '&Function List' OnClick = MenuItemFunctionListClick end + object MenuItemExtensions: TMenuItem + Caption = '&Extensions' + OnClick = MenuItemExtensionsClick + end end object MenuTools: TMenuItem Caption = '&Tools' diff --git a/Projects/SAMufasaGUI/testunit.lrs b/Projects/SAMufasaGUI/testunit.lrs index d57c778..39c8eb8 100644 --- a/Projects/SAMufasaGUI/testunit.lrs +++ b/Projects/SAMufasaGUI/testunit.lrs @@ -1059,346 +1059,347 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#10'ImageIndex'#2#7#7'OnClick'#7#17'Ac' +'tionStopExecute'#0#0#0#9'TMenuItem'#8'MenuView'#7'Caption'#6#5'&View'#0#9'T' - +'MenuItem'#21'MenuItemColourHistory'#7'Caption'#6#20'View &Colour History'#7 - +'OnClick'#7#26'MenuItemColourHistoryClick'#0#0#9'TMenuItem'#18'MenuItemDebug' - +'Image'#7'Caption'#6#17'View &Debug Image'#7'OnClick'#7#23'MenuItemDebugImag' - +'eClick'#0#0#9'TMenuItem'#20'MenuItemFunctionList'#7'Caption'#6#19'View &Fun' - +'ction List'#7'OnClick'#7#25'MenuItemFunctionListClick'#0#0#0#9'TMenuItem'#9 - +'MenuTools'#7'Caption'#6#6'&Tools'#0#9'TMenuItem'#24'MenuitemFillFunctionLis' - +'t'#7'Caption'#6#19'&Fill Function List'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0 - +'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4 - +#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0'9'#134'@'#3'4~:x'#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0'A'#145'I'#156';'#136'B'#210#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0'N'#163'W'#144'f'#176'n'#255'a'#170'h'#255'='#139'D'#255'7'#131'>' - +#255'2{7'#255',t2'#234'''m,'#183'#f''p'#31'a#'#29#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0'['#180'e'#132's'#189'|'#255#150 - +#209#159#255#148#207#156#255#143#205#150#255#138#202#145#255#133#199#139#255 - +'z'#190#129#255'e'#173'l'#255'K'#146'Q'#255'$h)'#176' c$9'#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0'`'#188'l'#138'y'#196#131#255#158#215 - +#167#255#155#212#164#255#151#210#159#255#146#207#154#255#141#204#149#255#136 - +#202#144#255'z'#194#130#255'~'#196#133#255']'#164'c'#255'&k*'#176'"e%'#29#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'b'#190'm'#147'{'#199#133 - +#255'w'#194#129#255'T'#171'^'#255'N'#163'W'#255'I'#155'Q'#255'c'#172'k'#255 - +#131#195#139#255#135#201#143#255#130#198#137#255'P'#151'V'#255'''m,p'#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'c'#192'n'#159 - +'_'#187'j'#210#255#255#255#0#255#255#255#0#255#255#255#0'K'#158'S'#141'E'#150 - +'M'#225#134#198#142#255#136#201#143#255'o'#179'v'#255'.v3'#183'E'#150'Ma?' - +#142'Fa9'#134'@a4~:a.v3ag'#198's'#3'd'#194'p{'#255#255#255#0#255#255#255#0 - ,#255#255#255#0#255#255#255#0'M'#161'U'#131'G'#153'O'#237'A'#145'I'#246';'#136 - +'B'#248'5'#128'<'#232'M'#161'U'#232'G'#153'O'#248'A'#145'I'#246';'#136'B'#237 - +'5'#128'<'#131#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#30'_!' - +'{'#27'['#30#3'T'#171'^aN'#163'WaI'#155'QaC'#147'Ka='#139'DaT'#171'^'#183#128 - +#195#137#255#141#204#149#255#131#196#138#255'='#139'D'#225'7'#131'>'#141#255 - +#255#255#0#255#255#255#0#255#255#255#0'#f'''#210#31'a#'#159#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'['#180'epu'#191'~'#255 - +#152#210#161#255#148#207#156#255#134#199#141#255'^'#167'e'#255'9'#134'@'#255 - +'4~:'#255'.v3'#255'I'#144'O'#255'E'#139'J'#255' c$'#147#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0'`'#188'l'#29'\'#182'g'#176#133#201#142#255 - +#155#212#164#255#143#206#152#255#146#207#154#255#141#204#149#255#136#202#144 - +#255#131#198#139#255'~'#196#133#255'y'#193#127#255'G'#141'L'#255'"e%'#138#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'b'#190'm9^'#185'h'#176 - +'y'#195#131#255#137#202#146#255#148#208#156#255#149#209#158#255#144#207#153 - +#255#140#203#148#255#135#201#143#255#128#196#135#255'N'#149'T'#255'''m,'#132 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'c'#192 - +'n'#29'_'#187'jp['#180'e'#183'V'#173'_'#234'P'#166'Z'#255'K'#158'S'#255'E' - +#150'M'#255'`'#168'h'#255'['#162'b'#255'4~:'#144#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0'G'#153'O'#210'A'#145'I'#156#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0'N'#163'WxI'#155'Q'#3#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#8'ShortCut'#3'Q@'#7'OnClick'#7#29'MenuitemFillFunctionL' - +'istClick'#0#0#9'TMenuItem'#16'UpdateMenuButton'#7'Caption'#6#7'&Update'#11 - +'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0 - +#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255 + +'MenuItem'#21'MenuItemColourHistory'#7'Caption'#6#15'&Colour History'#7'OnCl' + +'ick'#7#26'MenuItemColourHistoryClick'#0#0#9'TMenuItem'#18'MenuItemDebugImag' + +'e'#7'Caption'#6#12'&Debug Image'#7'OnClick'#7#23'MenuItemDebugImageClick'#0 + +#0#9'TMenuItem'#20'MenuItemFunctionList'#7'Caption'#6#14'&Function List'#7'O' + +'nClick'#7#25'MenuItemFunctionListClick'#0#0#9'TMenuItem'#18'MenuItemExtensi' + +'ons'#7'Caption'#6#11'&Extensions'#7'OnClick'#7#23'MenuItemExtensionsClick'#0 + +#0#0#9'TMenuItem'#9'MenuTools'#7'Caption'#6#6'&Tools'#0#9'TMenuItem'#24'Menu' + +'itemFillFunctionList'#7'Caption'#6#19'&Fill Function List'#11'Bitmap.Data' + +#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0 + +#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'9'#134'@'#3'4~:x'#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#255#0#255#255#255#0#255#255#255#0'A'#145'I'#156';'#136'B'#210#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#0#138 - +#255#139#0#138#255#244#0#138#255#139#0#138#255#150#0#138#255#255#0#138#255 - +#150#0#138#255#249#0#138#255#218#0#138#255#199#0#138#255#141#0#138#255#246#0 - +#138#255#152#0#138#255#150#0#138#255#255#0#138#255#150#255#255#255#0#0#138 - +#255#244#244#250#255#255#0#138#255#244'w'#193#255#255#255#255#255#255'w'#193 - +#255#255#249#252#255#255#218#238#255#255#199#229#255#255#0#138#255#246#246 - +#251#255#255#152#208#255#255'o'#189#255#255#255#255#255#255#0#138#255#255#255 - +#255#255#0#0#138#255#244#244#250#255#255#0#138#255#244#238#247#255#255#244 - +#250#255#255'w'#193#255#255#232#244#255#255#0#138#255#232#0#138#255#199#3#139 - +#255#255#249#252#255#255#183#222#255#255#170#216#255#255#251#253#255#255'''' - +#156#255#255#0#138#255'Q'#0#138#255#244#244#250#255#255#153#208#255#255'w' - +#193#255#255#244#250#255#255'w'#193#255#255#249#252#255#255#218#238#255#255 - +#199#229#255#255#159#211#255#255#228#243#255#255#220#239#255#255#227#242#255 - +#255#205#232#255#255#186#223#255#255#0#138#255#186#0#138#255#246#246#251#255 - +#255#238#247#255#255#0#138#255#244#244#250#255#255'w'#193#255#255#232#244#255 - +#255#0#138#255#232#12#144#255#255#237#247#255#255'x'#193#255#255#187#224#255 - +#255#187#224#255#255'V'#177#255#255#227#242#255#255#0#138#255#227#0#138#255 - +#238#238#247#255#255'D'#169#255#255#0#138#255#232#232#244#255#255'D'#169#255 - +#255#244#250#255#255#218#238#255#255#203#231#255#255#171#216#255#255#12#144 - +#255#255'f'#185#255#255'f'#185#255#255#0#138#255#215#215#237#255#255#24#149 - +#255#255#0#138#255#133#0#138#255#238#0#138#255#133#0#138#255#127#0#138#255 - +#232#0#138#255#139#0#138#255#244#0#138#255#218#0#138#255#203#0#138#255#171#0 - ,#138#255'B'#0#138#255'f'#0#138#255'f'#0#138#255'n'#0#138#255#215#0#138#255'n' - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#7'OnClick'#7#21'UpdateMenuButtonClick'#0#0#9'TMenuItem'#16'MenuItemDivider9' - +#7'Caption'#6#1'-'#0#0#9'TMenuItem'#22'MenuItemSettingsButton'#7'Caption'#6#8 - +'Settings'#7'OnClick'#7#27'MenuItemSettingsButtonClick'#0#0#9'TMenuItem'#17 - +'MenuItemDivider10'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#18'MenuItemExportHTML' - +#7'Caption'#6#22'&Export script as HTML'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0 - +'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4 - +#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#205'n#'#255#201'e'#27#255#200'`'#26 - +#255#198'Y'#24#255#194'S'#23#255#192'N'#22#255#189'G'#21#255#187'A'#21#255 - +#185'>'#20#255#183'9'#19#255#182'5'#18#255#180'3'#18#255#180'3'#18#255#180'3' - +#18#255#180'3'#18#255#180'3'#18#255#210'w5'#255#228#175#135#255#227#171#129 - +#255#225#168'{'#255#223#163'v'#255#222#161'q'#255#220#157'm'#255#219#153'h' - +#255#218#151'c'#255#217#148'^'#255#215#145'['#255#215#143'W'#255#213#141'T' - +#255#213#140'S'#255#213#140'S'#255#180'3'#18#255#214#132'C'#255#231#181#144 - +#255#224#163't'#255#222#158'n'#255#220#154'g'#255#219#149'`'#255#217#145'Z' - +#255#215#141'S'#255#213#137'M'#255#211#133'H'#255#210#129'C'#255#208'~>'#255 - +#207'{9'#255#206'y5'#255#213#141'T'#255#180'3'#18#255#219#142'S'#255#234#187 - +#153#255#252#246#242#255#225#166'y'#255#252#245#241#255#221#157'k'#255#252 - +#246#242#255#218#148'^'#255#247#233#222#255#214#140'Q'#255#239#209#186#255 - +#222#164'w'#255#253#250#247#255#247#232#221#255#215#143'Y'#255#182'5'#18#255 - +#225#151'b'#255#236#193#161#255#252#247#243#255#229#173#132#255#252#246#242 - +#255#225#164'w'#255#252#247#243#255#221#155'i'#255#248#235#224#255#240#211 - +#190#255#243#222#206#255#224#169#127#255#250#240#233#255#210#131'D'#255#217 - +#148'^'#255#183'<'#19#255#226#160'n'#255#238#199#168#255#254#253#252#255#253 - +#247#243#255#254#250#248#255#227#172#129#255#252#247#244#255#224#163't'#255 - +#249#236#227#255#250#242#235#255#253#248#244#255#227#174#134#255#250#241#234 - +#255#213#137'M'#255#218#153'f'#255#189'C'#21#255#230#167'y'#255#240#203#176 - +#255#253#248#245#255#234#186#152#255#253#248#244#255#231#179#140#255#253#248 - +#245#255#227#170#128#255#249#238#229#255#238#205#180#255#253#248#245#255#229 - +#179#142#255#253#249#246#255#216#143'W'#255#221#158'm'#255#192'N'#22#255#234 - +#171#128#255#242#207#181#255#252#244#238#255#236#191#159#255#251#243#237#255 - +#253#248#244#255#253#247#244#255#252#247#243#255#244#219#201#255#231#180#142 - +#255#247#230#218#255#227#173#131#255#246#228#214#255#219#151'b'#255#223#163 - +'v'#255#196'Y'#24#255#234#171#128#255#243#208#183#255#239#198#169#255#239#196 - +#166#255#238#194#162#255#236#191#158#255#235#188#152#255#233#184#147#255#232 - +#180#142#255#230#176#136#255#227#172#129#255#226#167'{'#255#224#163't'#255 - +#222#158'n'#255#226#170#128#255#201'b'#26#255#234#171#128#255#243#208#183#255 - +#243#208#183#255#243#208#183#255#242#208#183#255#241#206#179#255#240#203#176 - +#255#239#201#172#255#238#198#168#255#237#194#163#255#235#192#158#255#234#187 - +#153#255#232#183#148#255#230#180#143#255#228#176#137#255#205'n#'#255#234#171 - +#128#255#234#171#128#255#234#171#128#255#234#171#128#255#234#171#128#255#234 - +#171#128#255#232#169'|'#255#230#164'w'#255#226#160'p'#255#226#155'k'#255#225 - +#151'b'#255#221#144'Y'#255#217#139'R'#255#216#133'I'#255#214#128'>'#255#210 - +'w5'#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#255#255#255#0#255#255#255#0'N'#163'W'#144'f'#176'n'#255'a'#170'h'#255'='#139 + +'D'#255'7'#131'>'#255'2{7'#255',t2'#234'''m,'#183'#f''p'#31'a#'#29#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'['#180'e'#132 + +'s'#189'|'#255#150#209#159#255#148#207#156#255#143#205#150#255#138#202#145 + +#255#133#199#139#255'z'#190#129#255'e'#173'l'#255'K'#146'Q'#255'$h)'#176' c$' + +'9'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'`'#188'l'#138'y' + +#196#131#255#158#215#167#255#155#212#164#255#151#210#159#255#146#207#154#255 + +#141#204#149#255#136#202#144#255'z'#194#130#255'~'#196#133#255']'#164'c'#255 + +'&k*'#176'"e%'#29#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'b' + +#190'm'#147'{'#199#133#255'w'#194#129#255'T'#171'^'#255'N'#163'W'#255'I'#155 + +'Q'#255'c'#172'k'#255#131#195#139#255#135#201#143#255#130#198#137#255'P'#151 + +'V'#255'''m,p'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0'c'#192'n'#159'_'#187'j'#210#255#255#255#0#255#255#255#0#255#255 + +#255#0'K'#158'S'#141'E'#150'M'#225#134#198#142#255#136#201#143#255'o'#179'v' + ,#255'.v3'#183'E'#150'Ma?'#142'Fa9'#134'@a4~:a.v3ag'#198's'#3'd'#194'p{'#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'M'#161'U'#131'G'#153'O' + +#237'A'#145'I'#246';'#136'B'#248'5'#128'<'#232'M'#161'U'#232'G'#153'O'#248'A' + +#145'I'#246';'#136'B'#237'5'#128'<'#131#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#30'_!{'#27'['#30#3'T'#171'^aN'#163'WaI'#155'QaC'#147'Ka' + +'='#139'DaT'#171'^'#183#128#195#137#255#141#204#149#255#131#196#138#255'=' + +#139'D'#225'7'#131'>'#141#255#255#255#0#255#255#255#0#255#255#255#0'#f'''#210 + +#31'a#'#159#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0'['#180'epu'#191'~'#255#152#210#161#255#148#207#156#255#134#199#141#255 + +'^'#167'e'#255'9'#134'@'#255'4~:'#255'.v3'#255'I'#144'O'#255'E'#139'J'#255' ' + +'c$'#147#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'`'#188'l'#29 + +'\'#182'g'#176#133#201#142#255#155#212#164#255#143#206#152#255#146#207#154 + +#255#141#204#149#255#136#202#144#255#131#198#139#255'~'#196#133#255'y'#193 + +#127#255'G'#141'L'#255'"e%'#138#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0'b'#190'm9^'#185'h'#176'y'#195#131#255#137#202#146#255#148#208#156 + +#255#149#209#158#255#144#207#153#255#140#203#148#255#135#201#143#255#128#196 + +#135#255'N'#149'T'#255'''m,'#132#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0'c'#192'n'#29'_'#187'jp['#180'e'#183'V'#173'_' + +#234'P'#166'Z'#255'K'#158'S'#255'E'#150'M'#255'`'#168'h'#255'['#162'b'#255'4' + +'~:'#144#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - ,#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#0#255#255#255#0#255#255#255#0'G'#153'O'#210'A'#145'I'#156#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0'N'#163'WxI'#155'Q'#3#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#8'ShortCut'#3'Q@'#7'OnC' + +'lick'#7#29'MenuitemFillFunctionListClick'#0#0#9'TMenuItem'#16'UpdateMenuBut' + +'ton'#7'Caption'#6#7'&Update'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0 + +#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0 + +#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#7'OnClick'#7#23'MenuItemExportHTMLClick'#0#0#0#9'TMenuItem'#8'MenuHel' - +'p'#7'Caption'#6#5'&Help'#0#9'TMenuItem'#13'MenuItemAbout'#7'Caption'#6#6'&A' - +'bout'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0 - +#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0 - +#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#173'tD#'#172 - +'rA}'#170'p?'#219#168'm<'#243#167'k:'#243#165'i7'#219#164'h5}'#163'f3#'#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#181'~QS'#179'|N'#230#215#187#163#255#233#218#202#255#236 - +#224#209#255#236#224#209#255#232#216#200#255#211#181#156#255#167'l:'#230#166 - +'j8S'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#189#137'_S'#187#135'['#244#231#213#196#255#229#210#191#255#201#166#133#255 - +#184#142'g'#255#182#138'e'#255#197#161#128#255#224#204#186#255#227#208#190 - +#255#171'p@'#244#169'n=S'#255#255#255#0#255#255#255#0#255#255#255#0#198#149 - +'m"'#195#146'j'#229#234#216#201#255#227#205#186#255#192#148'k'#255#186#140'b' - +#255#207#176#148#255#207#176#148#255#183#137'_'#255#178#135'a'#255#218#192 - +#170#255#228#209#192#255#174'uF'#229#173'sC"'#255#255#255#0#255#255#255#0#204 - +#158'x~'#228#204#185#255#234#214#197#255#199#153'q'#255#191#144'f'#255#191 - +#144'f'#255#247#241#236#255#246#240#234#255#183#137'_'#255#183#137'_'#255#181 - +#137'c'#255#226#206#187#255#217#189#166#255#178'{M~'#255#255#255#0#255#255 - +#255#0#211#167#132#219#239#225#211#255#217#181#149#255#199#152'l'#255#195#149 - +'i'#255#193#147'g'#255#191#144'f'#255#191#144'f'#255#187#139'c'#255#185#138 - +'c'#255#184#138'b'#255#203#167#134#255#234#220#204#255#184#131'W'#219#255#255 - +#255#0#255#255#255#0#217#176#143#246#242#228#217#255#209#165'z'#255#197#153 - +'k'#255#196#151'j'#255#196#150'i'#255#250#246#242#255#243#234#225#255#194#149 - +'m'#255#190#143'e'#255#190#143'd'#255#192#149'm'#255#239#227#213#255#191#140 - +'a'#246#255#255#255#0#255#255#255#0#224#185#153#246#242#229#218#255#209#166 - +'~'#255#204#157'q'#255#199#154'l'#255#197#152'k'#255#226#204#182#255#248#243 - +#238#255#246#238#232#255#217#189#161#255#194#148'h'#255#197#155'q'#255#240 - +#226#214#255#197#149'l'#246#255#255#255#0#255#255#255#0#230#193#163#219#243 - +#229#217#255#223#187#158#255#207#160'u'#255#205#158'r'#255#245#235#227#255 - +#228#203#180#255#231#211#191#255#251#248#246#255#229#211#191#255#196#152'k' - +#255#214#180#145#255#238#224#210#255#204#158'x'#219#255#255#255#0#255#255#255 - +#0#235#201#173'~'#244#227#212#255#239#220#205#255#213#168'~'#255#208#160'w' - +#255#251#248#245#255#252#248#245#255#252#248#245#255#251#248#245#255#209#168 - +#129#255#207#164'{'#255#234#213#195#255#234#212#194#255#210#167#131'~'#255 - +#255#255#0#255#255#255#0#241#208#181'"'#239#206#179#229#246#233#221#255#236 - +#216#198#255#215#172#129#255#220#187#154#255#246#236#227#255#245#236#226#255 - +#228#200#174#255#210#167'{'#255#230#206#186#255#241#226#213#255#219#179#145 - +#229#217#176#142'"'#255#255#255#0#255#255#255#0#255#255#255#0#244#212#187'S' - +#242#210#184#244#247#234#223#255#238#222#208#255#227#193#167#255#216#174#137 - +#255#215#172#134#255#221#187#156#255#235#214#199#255#243#230#217#255#227#190 - +#159#244#225#187#156'S'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 - +#0#255#255#255#0#246#216#191'S'#245#214#189#230#249#233#220#255#246#232#221 - +#255#243#229#218#255#243#229#218#255#245#231#220#255#245#228#214#255#235#200 - +#172#230#233#198#169'S'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 - +#0#255#255#255#0#255#255#255#0#255#255#255#0#249#219#196'#'#248#218#194'}' - +#247#216#192#219#246#215#190#243#244#213#188#243#243#211#185#219#241#209#183 - +'}'#240#207#180'#'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 - +#7'OnClick'#7#18'MenuItemAboutClick'#0#0#9'TMenuItem'#16'MenuItemHandbook'#7 - +'Caption'#6#9'&Handbook'#7'OnClick'#7#21'MenuItemHandbookClick'#0#0#9'TMenuI' - +'tem'#17'MenuItemReportBug'#7'Caption'#6#13'&Report a Bug'#11'Bitmap.Data'#10 - +':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0 - ,' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'2'#138#197#236'0'#135#196 - +#246'/'#133#195#246'-'#131#194#246'*'#128#187#255')~'#186#255'(}'#191#246'&{' - +#190#246'%y'#189#246'#w'#189#246'"v'#188#195#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0'8'#145#201#228#221#236#246#255#189#238 - +#249#255#172#234#248#255#171#234#248#255#171#234#248#255#171#234#248#255#173 - +#234#248#255#212#243#251#255#164#200#228#255'&{'#190#171#255#255#255#0#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'3'#135#129#200#142#194 - +#225#255#151#232#249#255'a'#220#246#255'['#219#245#255'2'#136#194#255'['#219 - +#245#255'j'#222#246#255#177#231#246#255'-'#131#194#233'+'#129#193'*'#255#255 - +#255#0#255#255#255#0#255#255#255#0#255#255#255#0'*{.'#193'+z2'#255'J'#159#188 - +#255#171#219#239#255't'#224#247#255'X'#218#245#255'X'#218#245#255']'#219#245 - +#255#144#230#248#255#146#193#225#255'/'#132#176#144#255#255#255#0#255#255#255 - +#0#255#255#255#0#255#255#255#0'/'#135'3'#193' t#'#255#148#192#157#255'b'#172 - +#153#255'{'#189#223#255#162#234#249#255'a'#220#246#255'1'#135#194#255'w'#225 - +#247#255#182#222#240#255'8'#144#188#233'8'#145#201#13#255#255#255#0#255#255 - +#255#0#255#255#255#0'5'#146':'#135'-'#140'2'#255'w'#181#130#255'M'#158'T'#255 - +'y'#179#141#255'M'#167#174#255#172#217#236#255#130#227#248#255'3'#136#194#255 - +#172#237#250#255'C'#158#207#254'A'#155#206'S'#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0'2'#149'7'#245'b'#173'h'#255'w'#190#145#255'D'#160']' - +#255'K'#159'S'#255'r'#180#153#255'Q'#174#207#255#180#235#248#255#142#230#248 - +#255#181#221#238#255'>'#150#159#255'+xM'#23#255#255#255#0' f#|'#255#255#255#0 - +#255#255#255#0'3'#156'8'#248'R'#169'Y'#255'm'#188#140#255'M'#170'p'#255'B' - +#159'\'#255'L'#162'T'#255'm'#187#184#255#164#215#235#255#220#244#251#255'U' - +#176#211#255'/'#130'N'#255'$s('#254'#p'''#255'"l&'#255#255#255#255#0'4'#164 - +'9'#199'3'#161'8'#255'3'#158'8'#255#148#207#172#255'\'#180'~'#255'N'#172'r' - +#255'A'#161']'#255'O'#167'^'#255'`'#187#210#255#171#219#237#255'l'#186#189 - +#255'*~-'#255'&y*'#244'%v)m'#255#255#255#0'7'#173'<'#250'6'#170';'#255'5'#167 - +':'#162'8'#165'>'#234'P'#173'V'#255#141#204#165#255'^'#181#128#255'O'#173's' - +#255'B'#163']'#255'U'#177#134#255'i'#192#211#255#138#191#155#255')'#131'.' - +#255'%Y;'#175#255#255#255#0#255#255#255#0'8'#177'>'#241'7'#175'=#'#255#255 - +#255#0#255#255#255#0'4'#166':'#254'9'#165'?'#255#144#206#168#255'b'#185#132 - +#255'X'#178'{'#255'`'#178'v'#255'8'#151'>'#255')'#137'-'#255'W'#164'b'#255'&' - +'PD'#219#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 - +#0'7'#174'=A6'#171'<'#255'8'#169'>'#240'E'#172'K'#255#158#212#173#255#164#215 - +#184#255#133#195#142#255'('#143'-'#255'O'#183'_'#255#151#200#170#255','#141 - +'1'#255'+'#137'0'#255'*'#133'.'#255#255#255#255#0#255#255#255#0#255#255#255#0 - +'8'#179'>'#240'8'#177'='#248#255#255#255#0'8'#172'='#241'5'#168':'#255'4'#165 - +'9'#255'4'#161'9'#255'r'#194'~'#255#175#227#194#255'_'#140'x'#255'2eMu'#255 - +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0':'#183'@' - +#255'9'#181'?t'#255#255#255#0#255#255#255#0'7'#173'<'#248'6'#170';'#237'F' - +#127'f'#165':'#134'P'#247'3'#157':'#254';qX'#137#255#255#255#0#255#255#255#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0';'#187'A#'#255#255 - +#255#0#255#255#255#0#255#255#255#0'8'#178'>'#255'7'#175'='#178'N'#142'j"5' - +#169';e4'#166':'#242#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 - +#255#255#0#255#255#255#0':'#183'?'#255'9'#180'?A'#255#255#255#0'7'#174'=R6' - +#172'<'#247#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#7'OnClic' - +'k'#7#22'MenuItemReportBugClick'#0#0#0#0#10'TImageList'#17'Mufasa_Image_List' - +#4'left'#3#192#1#3'top'#3#144#0#6'Bitmap'#10#14'p'#0#0'Li'#28#0#0#0#16#0#0#0 - +#16#0#0#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB' - +#0'BBB'#0'BBB'#0#161'UB'#255#161'UB'#255#161'UB'#255'BBB'#14'BBB'#0'BBB'#0'B' - +'BB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255 - +#255#218#208#255#208'^B'#255#161'UB'#255#161'UB'#255'BBB'#0'BBB'#0'BBB'#0'BB' - +'B'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#255#218#208#255 - +#208'^B'#255#208'^B'#255#161'UB'#255#161'UB'#255'BBB'#0'BBB'#0'BBB'#0'BBB'#0 - +'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#161'UB'#255#255#218#208#255#208'^B' - +#255#208'^B'#255#161'UB'#255#161'UB'#255#161'UB'#255'BBB'#0'BBB'#0'BBB'#0'BB' - +'B'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#255#218#208#255#161'UB'#255#208'^B' - +#255#208'^B'#255#161'UB'#255#161'UB'#255#161'UB'#255'BBBcBBB'#0'BBB'#0'BBB'#0 - +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'BBB'#11#161'UB'#255 - +#255#218#208#255#161'UB'#255#208'^B'#255#161'UB'#255#161'UB'#255'BBBcBBBLBBB' - +#0'BBB'#0'BBB'#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#131 - +#131#131#255#255#255#255#255#161'UB'#255#255#218#208#255#161'UB'#255#161'UB' - ,#255'BBBcBBBLBBB'#25'BBB'#0'BBB'#0'BBB'#0#255#255#255#0#255#255#255#0#255#255 - +#255#0#131#131#131#255#255#255#255#255#229#229#229#255#161#161#161#255#161'U' - +'B'#255#255#218#208#255#161'UB'#255'BBBXBBB'#28'BBB'#3'BBB'#0'BBB'#0'BBB'#0 - +#255#255#255#0#255#255#255#0#131#131#131#255#255#255#255#255#229#229#229#255 - +#161#161#161#255#131#131#131#255'BBBc'#161'UB'#255'BBB`BBBJBBB'#14'BBB'#0'BB' - +'B'#0'BBB'#0'BBB'#0#255#255#255#0#131#131#131#255#255#255#255#255#229#229#229 - +#255#161#161#161#255#131#131#131#255'BBBcBBBLBBB''BBB>BBB'#25'BBB'#3'BBB'#0 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#0#138#255#139#0#138#255#244#0#138#255#139#0#138#255 + +#150#0#138#255#255#0#138#255#150#0#138#255#249#0#138#255#218#0#138#255#199#0 + +#138#255#141#0#138#255#246#0#138#255#152#0#138#255#150#0#138#255#255#0#138 + +#255#150#255#255#255#0#0#138#255#244#244#250#255#255#0#138#255#244'w'#193#255 + +#255#255#255#255#255'w'#193#255#255#249#252#255#255#218#238#255#255#199#229 + +#255#255#0#138#255#246#246#251#255#255#152#208#255#255'o'#189#255#255#255#255 + +#255#255#0#138#255#255#255#255#255#0#0#138#255#244#244#250#255#255#0#138#255 + +#244#238#247#255#255#244#250#255#255'w'#193#255#255#232#244#255#255#0#138#255 + +#232#0#138#255#199#3#139#255#255#249#252#255#255#183#222#255#255#170#216#255 + +#255#251#253#255#255''''#156#255#255#0#138#255'Q'#0#138#255#244#244#250#255 + +#255#153#208#255#255'w'#193#255#255#244#250#255#255'w'#193#255#255#249#252 + +#255#255#218#238#255#255#199#229#255#255#159#211#255#255#228#243#255#255#220 + +#239#255#255#227#242#255#255#205#232#255#255#186#223#255#255#0#138#255#186#0 + +#138#255#246#246#251#255#255#238#247#255#255#0#138#255#244#244#250#255#255'w' + +#193#255#255#232#244#255#255#0#138#255#232#12#144#255#255#237#247#255#255'x' + +#193#255#255#187#224#255#255#187#224#255#255'V'#177#255#255#227#242#255#255#0 + +#138#255#227#0#138#255#238#238#247#255#255'D'#169#255#255#0#138#255#232#232 + +#244#255#255'D'#169#255#255#244#250#255#255#218#238#255#255#203#231#255#255 + +#171#216#255#255#12#144#255#255'f'#185#255#255'f'#185#255#255#0#138#255#215 + +#215#237#255#255#24#149#255#255#0#138#255#133#0#138#255#238#0#138#255#133#0 + ,#138#255#127#0#138#255#232#0#138#255#139#0#138#255#244#0#138#255#218#0#138 + +#255#203#0#138#255#171#0#138#255'B'#0#138#255'f'#0#138#255'f'#0#138#255'n'#0 + +#138#255#215#0#138#255'n'#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#7'OnClick'#7#21'UpdateMenuButtonClick'#0#0#9'TMenuI' + +'tem'#16'MenuItemDivider9'#7'Caption'#6#1'-'#0#0#9'TMenuItem'#22'MenuItemSet' + +'tingsButton'#7'Caption'#6#8'Settings'#7'OnClick'#7#27'MenuItemSettingsButto' + +'nClick'#0#0#9'TMenuItem'#17'MenuItemDivider10'#7'Caption'#6#1'-'#0#0#9'TMen' + +'uItem'#18'MenuItemExportHTML'#7'Caption'#6#22'&Export script as HTML'#11'Bi' + +'tmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0 + +#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#205'n' + +'#'#255#201'e'#27#255#200'`'#26#255#198'Y'#24#255#194'S'#23#255#192'N'#22#255 + +#189'G'#21#255#187'A'#21#255#185'>'#20#255#183'9'#19#255#182'5'#18#255#180'3' + +#18#255#180'3'#18#255#180'3'#18#255#180'3'#18#255#180'3'#18#255#210'w5'#255 + +#228#175#135#255#227#171#129#255#225#168'{'#255#223#163'v'#255#222#161'q'#255 + +#220#157'm'#255#219#153'h'#255#218#151'c'#255#217#148'^'#255#215#145'['#255 + +#215#143'W'#255#213#141'T'#255#213#140'S'#255#213#140'S'#255#180'3'#18#255 + +#214#132'C'#255#231#181#144#255#224#163't'#255#222#158'n'#255#220#154'g'#255 + +#219#149'`'#255#217#145'Z'#255#215#141'S'#255#213#137'M'#255#211#133'H'#255 + +#210#129'C'#255#208'~>'#255#207'{9'#255#206'y5'#255#213#141'T'#255#180'3'#18 + +#255#219#142'S'#255#234#187#153#255#252#246#242#255#225#166'y'#255#252#245 + +#241#255#221#157'k'#255#252#246#242#255#218#148'^'#255#247#233#222#255#214 + +#140'Q'#255#239#209#186#255#222#164'w'#255#253#250#247#255#247#232#221#255 + +#215#143'Y'#255#182'5'#18#255#225#151'b'#255#236#193#161#255#252#247#243#255 + +#229#173#132#255#252#246#242#255#225#164'w'#255#252#247#243#255#221#155'i' + +#255#248#235#224#255#240#211#190#255#243#222#206#255#224#169#127#255#250#240 + +#233#255#210#131'D'#255#217#148'^'#255#183'<'#19#255#226#160'n'#255#238#199 + +#168#255#254#253#252#255#253#247#243#255#254#250#248#255#227#172#129#255#252 + +#247#244#255#224#163't'#255#249#236#227#255#250#242#235#255#253#248#244#255 + +#227#174#134#255#250#241#234#255#213#137'M'#255#218#153'f'#255#189'C'#21#255 + +#230#167'y'#255#240#203#176#255#253#248#245#255#234#186#152#255#253#248#244 + +#255#231#179#140#255#253#248#245#255#227#170#128#255#249#238#229#255#238#205 + +#180#255#253#248#245#255#229#179#142#255#253#249#246#255#216#143'W'#255#221 + +#158'm'#255#192'N'#22#255#234#171#128#255#242#207#181#255#252#244#238#255#236 + +#191#159#255#251#243#237#255#253#248#244#255#253#247#244#255#252#247#243#255 + +#244#219#201#255#231#180#142#255#247#230#218#255#227#173#131#255#246#228#214 + +#255#219#151'b'#255#223#163'v'#255#196'Y'#24#255#234#171#128#255#243#208#183 + +#255#239#198#169#255#239#196#166#255#238#194#162#255#236#191#158#255#235#188 + +#152#255#233#184#147#255#232#180#142#255#230#176#136#255#227#172#129#255#226 + +#167'{'#255#224#163't'#255#222#158'n'#255#226#170#128#255#201'b'#26#255#234 + +#171#128#255#243#208#183#255#243#208#183#255#243#208#183#255#242#208#183#255 + +#241#206#179#255#240#203#176#255#239#201#172#255#238#198#168#255#237#194#163 + +#255#235#192#158#255#234#187#153#255#232#183#148#255#230#180#143#255#228#176 + +#137#255#205'n#'#255#234#171#128#255#234#171#128#255#234#171#128#255#234#171 + +#128#255#234#171#128#255#234#171#128#255#232#169'|'#255#230#164'w'#255#226 + +#160'p'#255#226#155'k'#255#225#151'b'#255#221#144'Y'#255#217#139'R'#255#216 + +#133'I'#255#214#128'>'#255#210'w5'#255#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + ,#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#7'OnClick'#7#23'MenuItemExportHTMLCli' + +'ck'#0#0#0#9'TMenuItem'#8'MenuHelp'#7'Caption'#6#5'&Help'#0#9'TMenuItem'#13 + +'MenuItemAbout'#7'Caption'#6#6'&About'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0 + +'BM6'#4#0#0#0#0#0#0'6'#0#0#0'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4 + +#0#0'd'#0#0#0'd'#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#173'tD#'#172'rA}'#170'p?'#219#168'm<'#243#167'k:'#243 + +#165'i7'#219#164'h5}'#163'f3#'#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#181'~QS'#179'|N'#230#215 + +#187#163#255#233#218#202#255#236#224#209#255#236#224#209#255#232#216#200#255 + +#211#181#156#255#167'l:'#230#166'j8S'#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#189#137'_S'#187#135'['#244#231#213#196#255#229 + +#210#191#255#201#166#133#255#184#142'g'#255#182#138'e'#255#197#161#128#255 + +#224#204#186#255#227#208#190#255#171'p@'#244#169'n=S'#255#255#255#0#255#255 + +#255#0#255#255#255#0#198#149'm"'#195#146'j'#229#234#216#201#255#227#205#186 + +#255#192#148'k'#255#186#140'b'#255#207#176#148#255#207#176#148#255#183#137'_' + +#255#178#135'a'#255#218#192#170#255#228#209#192#255#174'uF'#229#173'sC"'#255 + +#255#255#0#255#255#255#0#204#158'x~'#228#204#185#255#234#214#197#255#199#153 + +'q'#255#191#144'f'#255#191#144'f'#255#247#241#236#255#246#240#234#255#183#137 + +'_'#255#183#137'_'#255#181#137'c'#255#226#206#187#255#217#189#166#255#178'{M' + +'~'#255#255#255#0#255#255#255#0#211#167#132#219#239#225#211#255#217#181#149 + +#255#199#152'l'#255#195#149'i'#255#193#147'g'#255#191#144'f'#255#191#144'f' + +#255#187#139'c'#255#185#138'c'#255#184#138'b'#255#203#167#134#255#234#220#204 + +#255#184#131'W'#219#255#255#255#0#255#255#255#0#217#176#143#246#242#228#217 + +#255#209#165'z'#255#197#153'k'#255#196#151'j'#255#196#150'i'#255#250#246#242 + +#255#243#234#225#255#194#149'm'#255#190#143'e'#255#190#143'd'#255#192#149'm' + +#255#239#227#213#255#191#140'a'#246#255#255#255#0#255#255#255#0#224#185#153 + +#246#242#229#218#255#209#166'~'#255#204#157'q'#255#199#154'l'#255#197#152'k' + +#255#226#204#182#255#248#243#238#255#246#238#232#255#217#189#161#255#194#148 + +'h'#255#197#155'q'#255#240#226#214#255#197#149'l'#246#255#255#255#0#255#255 + +#255#0#230#193#163#219#243#229#217#255#223#187#158#255#207#160'u'#255#205#158 + +'r'#255#245#235#227#255#228#203#180#255#231#211#191#255#251#248#246#255#229 + +#211#191#255#196#152'k'#255#214#180#145#255#238#224#210#255#204#158'x'#219 + +#255#255#255#0#255#255#255#0#235#201#173'~'#244#227#212#255#239#220#205#255 + +#213#168'~'#255#208#160'w'#255#251#248#245#255#252#248#245#255#252#248#245 + +#255#251#248#245#255#209#168#129#255#207#164'{'#255#234#213#195#255#234#212 + +#194#255#210#167#131'~'#255#255#255#0#255#255#255#0#241#208#181'"'#239#206 + +#179#229#246#233#221#255#236#216#198#255#215#172#129#255#220#187#154#255#246 + +#236#227#255#245#236#226#255#228#200#174#255#210#167'{'#255#230#206#186#255 + +#241#226#213#255#219#179#145#229#217#176#142'"'#255#255#255#0#255#255#255#0 + +#255#255#255#0#244#212#187'S'#242#210#184#244#247#234#223#255#238#222#208#255 + +#227#193#167#255#216#174#137#255#215#172#134#255#221#187#156#255#235#214#199 + +#255#243#230#217#255#227#190#159#244#225#187#156'S'#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#246#216#191'S'#245#214#189#230 + +#249#233#220#255#246#232#221#255#243#229#218#255#243#229#218#255#245#231#220 + +#255#245#228#214#255#235#200#172#230#233#198#169'S'#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#249 + +#219#196'#'#248#218#194'}'#247#216#192#219#246#215#190#243#244#213#188#243 + +#243#211#185#219#241#209#183'}'#240#207#180'#'#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0#255#255#255#0#7'OnClick'#7#18'MenuItemAboutClick'#0#0#9'TMenu' + +'Item'#16'MenuItemHandbook'#7'Caption'#6#9'&Handbook'#7'OnClick'#7#21'MenuIt' + +'emHandbookClick'#0#0#9'TMenuItem'#17'MenuItemReportBug'#7'Caption'#6#13'&Re' + ,'port a Bug'#11'Bitmap.Data'#10':'#4#0#0'6'#4#0#0'BM6'#4#0#0#0#0#0#0'6'#0#0#0 + +'('#0#0#0#16#0#0#0#16#0#0#0#1#0' '#0#0#0#0#0#0#4#0#0'd'#0#0#0'd'#0#0#0#0#0#0 + +#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0'2'#138#197#236'0'#135#196#246'/'#133#195#246'-'#131#194#246'*'#128#187 + +#255')~'#186#255'(}'#191#246'&{'#190#246'%y'#189#246'#w'#189#246'"v'#188#195 + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'8'#145 + +#201#228#221#236#246#255#189#238#249#255#172#234#248#255#171#234#248#255#171 + +#234#248#255#171#234#248#255#173#234#248#255#212#243#251#255#164#200#228#255 + +'&{'#190#171#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + +#255#0'3'#135#129#200#142#194#225#255#151#232#249#255'a'#220#246#255'['#219 + +#245#255'2'#136#194#255'['#219#245#255'j'#222#246#255#177#231#246#255'-'#131 + +#194#233'+'#129#193'*'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0'*{.'#193'+z2'#255'J'#159#188#255#171#219#239#255't'#224#247#255'X'#218#245 + +#255'X'#218#245#255']'#219#245#255#144#230#248#255#146#193#225#255'/'#132#176 + +#144#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'/'#135'3'#193' ' + +'t#'#255#148#192#157#255'b'#172#153#255'{'#189#223#255#162#234#249#255'a'#220 + +#246#255'1'#135#194#255'w'#225#247#255#182#222#240#255'8'#144#188#233'8'#145 + +#201#13#255#255#255#0#255#255#255#0#255#255#255#0'5'#146':'#135'-'#140'2'#255 + +'w'#181#130#255'M'#158'T'#255'y'#179#141#255'M'#167#174#255#172#217#236#255 + +#130#227#248#255'3'#136#194#255#172#237#250#255'C'#158#207#254'A'#155#206'S' + +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'2'#149'7'#245'b'#173 + +'h'#255'w'#190#145#255'D'#160']'#255'K'#159'S'#255'r'#180#153#255'Q'#174#207 + +#255#180#235#248#255#142#230#248#255#181#221#238#255'>'#150#159#255'+xM'#23 + +#255#255#255#0' f#|'#255#255#255#0#255#255#255#0'3'#156'8'#248'R'#169'Y'#255 + +'m'#188#140#255'M'#170'p'#255'B'#159'\'#255'L'#162'T'#255'm'#187#184#255#164 + +#215#235#255#220#244#251#255'U'#176#211#255'/'#130'N'#255'$s('#254'#p'''#255 + +'"l&'#255#255#255#255#0'4'#164'9'#199'3'#161'8'#255'3'#158'8'#255#148#207#172 + +#255'\'#180'~'#255'N'#172'r'#255'A'#161']'#255'O'#167'^'#255'`'#187#210#255 + +#171#219#237#255'l'#186#189#255'*~-'#255'&y*'#244'%v)m'#255#255#255#0'7'#173 + +'<'#250'6'#170';'#255'5'#167':'#162'8'#165'>'#234'P'#173'V'#255#141#204#165 + +#255'^'#181#128#255'O'#173's'#255'B'#163']'#255'U'#177#134#255'i'#192#211#255 + +#138#191#155#255')'#131'.'#255'%Y;'#175#255#255#255#0#255#255#255#0'8'#177'>' + +#241'7'#175'=#'#255#255#255#0#255#255#255#0'4'#166':'#254'9'#165'?'#255#144 + +#206#168#255'b'#185#132#255'X'#178'{'#255'`'#178'v'#255'8'#151'>'#255')'#137 + +'-'#255'W'#164'b'#255'&PD'#219#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0'7'#174'=A6'#171'<'#255'8'#169'>'#240'E'#172'K'#255 + +#158#212#173#255#164#215#184#255#133#195#142#255'('#143'-'#255'O'#183'_'#255 + +#151#200#170#255','#141'1'#255'+'#137'0'#255'*'#133'.'#255#255#255#255#0#255 + +#255#255#0#255#255#255#0'8'#179'>'#240'8'#177'='#248#255#255#255#0'8'#172'=' + +#241'5'#168':'#255'4'#165'9'#255'4'#161'9'#255'r'#194'~'#255#175#227#194#255 + +'_'#140'x'#255'2eMu'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +#255#255#255#0':'#183'@'#255'9'#181'?t'#255#255#255#0#255#255#255#0'7'#173'<' + +#248'6'#170';'#237'F'#127'f'#165':'#134'P'#247'3'#157':'#254';qX'#137#255#255 + +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 + +';'#187'A#'#255#255#255#0#255#255#255#0#255#255#255#0'8'#178'>'#255'7'#175'=' + +#178'N'#142'j"5'#169';e4'#166':'#242#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#255#255#0#255#255#255#0#255#255#255#0':'#183'?'#255'9'#180'?A'#255#255#255#0 + +'7'#174'=R6'#172'<'#247#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#7'OnClick'#7#22'MenuItemReportBugClick'#0#0#0#0#10'TImageList'#17'Mufasa_' + +'Image_List'#4'left'#3#192#1#3'top'#3#144#0#6'Bitmap'#10#14'p'#0#0'Li'#28#0#0 + +#0#16#0#0#0#16#0#0#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0 + +'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#161'UB'#255#161'UB'#255'BBB'#14'BBB' + +#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161 + +'UB'#255#255#218#208#255#208'^B'#255#161'UB'#255#161'UB'#255'BBB'#0'BBB'#0'B' + +'BB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#255#218 + +#208#255#208'^B'#255#208'^B'#255#161'UB'#255#161'UB'#255'BBB'#0'BBB'#0'BBB'#0 + +'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#161'UB'#255#255#218#208#255 + +#208'^B'#255#208'^B'#255#161'UB'#255#161'UB'#255#161'UB'#255'BBB'#0'BBB'#0'B' + +'BB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#161'UB'#255#255#218#208#255#161'UB'#255 + +#208'^B'#255#208'^B'#255#161'UB'#255#161'UB'#255#161'UB'#255'BBBcBBB'#0'BBB' + +#0'BBB'#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'BBB'#11#161 + +'UB'#255#255#218#208#255#161'UB'#255#208'^B'#255#161'UB'#255#161'UB'#255'BBB' + +'cBBBLBBB'#0'BBB'#0'BBB'#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 + ,#255#0#131#131#131#255#255#255#255#255#161'UB'#255#255#218#208#255#161'UB' + +#255#161'UB'#255'BBBcBBBLBBB'#25'BBB'#0'BBB'#0'BBB'#0#255#255#255#0#255#255 + +#255#0#255#255#255#0#131#131#131#255#255#255#255#255#229#229#229#255#161#161 + +#161#255#161'UB'#255#255#218#208#255#161'UB'#255'BBBXBBB'#28'BBB'#3'BBB'#0'B' + +'BB'#0'BBB'#0#255#255#255#0#255#255#255#0#131#131#131#255#255#255#255#255#229 + +#229#229#255#161#161#161#255#131#131#131#255'BBBc'#161'UB'#255'BBB`BBBJBBB' + +#14'BBB'#0'BBB'#0'BBB'#0'BBB'#0#255#255#255#0#131#131#131#255#255#255#255#255 + +#229#229#229#255#161#161#161#255#131#131#131#255'BBBcBBBLBBB''BBB>BBB'#25'BB' + +'B'#3'BBB'#0'BBB'#0'BBB'#0'BBB'#0#131#131#131#255#255#255#255#255#229#229#229 + +#255#161#161#161#255#131#131#131#255'BBBcBBBLBBB'#25'BBB'#6'BBB'#11'BBB'#2'B' + +'BB'#0'BBB'#0'BBB'#0'BBB'#0#131#131#131#255#255#255#255#255#229#229#229#255 + +#161#161#161#255#131#131#131#255'BBBcBBBLBBB'#25'BBB'#3'BBB'#0'BBB'#0'BBB'#0 +'BBB'#0'BBB'#0'BBB'#0#131#131#131#255#255#255#255#255#229#229#229#255#161#161 - +#161#255#131#131#131#255'BBBcBBBLBBB'#25'BBB'#6'BBB'#11'BBB'#2'BBB'#0'BBB'#0 - +'BBB'#0'BBB'#0#131#131#131#255#255#255#255#255#229#229#229#255#161#161#161 - +#255#131#131#131#255'BBBcBBBLBBB'#25'BBB'#3'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB' - +#0'BBB'#0#131#131#131#255#255#255#255#255#229#229#229#255#161#161#161#255#131 - +#131#131#255'BBBcBBBLBBB'#25'BBB'#3'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0 - +'BBB'#0#131#131#131#255#229#229#229#255#161#161#161#255#131#131#131#255'BBBc' - +'BBBLBBB'#25'BBB'#3#255#255#255#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0 - +#131#131#131#255#229#229#229#255#131#131#131#255#131#131#131#255'BBBcBBBLBBB' - +#25'BBB'#3#255#255#255#0#255#255#255#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BB' - +'B'#0#131#131#131#255#131#131#131#255'BBB`BBBXBBBJBBB'#25'BBB'#3'BBB'#0'BBB' - +#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#0#0#0#0#0#0#0#0#225#238 - +#225#255#197#220#197#255#219#233#219#255#244#249#244#255#0#0#0#0#0#0#0#0#0#0 + +#161#255#131#131#131#255'BBBcBBBLBBB'#25'BBB'#3'BBB'#0'BBB'#0'BBB'#0'BBB'#0 + +'BBB'#0'BBB'#0'BBB'#0#131#131#131#255#229#229#229#255#161#161#161#255#131#131 + +#131#255'BBBcBBBLBBB'#25'BBB'#3#255#255#255#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BB' + +'B'#0'BBB'#0#131#131#131#255#229#229#229#255#131#131#131#255#131#131#131#255 + +'BBBcBBBLBBB'#25'BBB'#3#255#255#255#0#255#255#255#0'BBB'#0'BBB'#0'BBB'#0'BBB' + +#0'BBB'#0'BBB'#0#131#131#131#255#131#131#131#255'BBB`BBBXBBBJBBB'#25'BBB'#3 + +'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0'BBB'#0#0#0#0#0#0#0#0 + +#0#225#238#225#255#197#220#197#255#219#233#219#255#244#249#244#255#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#174#213#176#255#214#248#225#255#207#250#221#255#181#248#204#255'x'#216#145 - +#255'@'#139'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#202#225#202#255#197#247#213#255#156#244#185 - +#255'}'#228#159#255#10'Y'#12#255#0#0#0#191#0#0#0#0#195#196#237#255#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#149#196#149#255#187#243#206 - +#255#157#240#186#255'k'#212#142#255'N'#154'h'#255#10'D'#10#255#0#0#0#191#0#0 - +#0#0#221#221#246#255'RW'#199#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#132 - +#195#132#255#134#227#165#255'l'#224#146#255'K'#170'k'#255#1'/'#1#255'*Y:'#255 - +'6U6'#255#0#0#0#191#0#0#0#0#0#0#0#0#177#180#234#255'=F'#197#255#0#0#0#0#0#0#0 - +#0#0#0#0#0#232#243#232#255#136#221#159#255'D'#207'r'#255'&'#142'I'#255'4;4' - +#255'1:1'#255'!>+'#255'[r['#255#0#0#0#191#0#0#0#0#0#0#0#0#224#225#247#255'!6' - +#211#255#130#132#185#255#0#0#0#0#0#0#0#0'a'#177'a'#255'7'#198'^'#255'$'#153 - +'J'#255'0I0'#255#0#0#0#191#0#0#0#191#9'@'#9#255#0#0#0#191#0#0#0#191#0#0#0#0#0 - +#0#0#0#151#157#232#255#0#25#192#255#21#25'g'#255#0#0#0#0#0#0#0#0#27#142#27 - +#255#22#139'.'#255';^;'#255#0#0#0#191#0#0#0#191#0#0#0#0#0#0#0#0'x'#135#241 - +#255#0#0#0#0#0#0#0#0#185#191#246#255#0','#241#255#0#20'}'#255#17#20'4'#255#0 - +#0#0#0#0#0#0#0'd'#140'd'#255#21'W"'#255'?D?'#255#0#0#0#191#0#0#0#0#0#0#0#0 - +#194#201#249#255#161#189#254#255#235#237#253#255#233#235#253#255'3d'#254#255 - +#2' '#147#255#0#11'<'#255'99?'#255#0#0#0#0#0#0#0#0#0#0#0#0#2'.'#3#255'$5$' - +#255#0#0#0#191#0#0#0#0#0#0#0#0#133#151#250#255#142#182#255#255'hz'#238#255'p' - +#155#251#255#17'5'#156#255#3#18'A'#255#6#10'3'#255#0#0#0#191#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#2''''#2#255'DLD'#255#0#0#0#0#0#0#0#0#16'2'#251#255'r'#178 - +#255#255'c'#161#245#255'6\'#154#255#19'"A'#255#5#11'7'#255#0#0#0#191#0#0#0 - +#191#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'=Q='#255#0#0#0#191#0#0#0#0#9'2' - +#181#255'S~'#161#255'5Rq'#255#26'+A'#255#23#28';'#255#0#0#0#191#0#0#0#191#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#191#0#0#0#0#23'$e' - +#255#30'/A'#255'(6A'#255#30'/A'#255#20'$A'#255#1#9'7'#255#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#191'::@'#255'%(='#255#6#13'8'#255'%(='#255#0#0#0#191#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#174#213#176#255#214#248#225#255#207#250#221#255#181#248#204#255'x' + +#216#145#255'@'#139'@'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#202#225#202#255#197#247#213#255#156 + +#244#185#255'}'#228#159#255#10'Y'#12#255#0#0#0#191#0#0#0#0#195#196#237#255#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#149#196#149#255#187 + +#243#206#255#157#240#186#255'k'#212#142#255'N'#154'h'#255#10'D'#10#255#0#0#0 + +#191#0#0#0#0#221#221#246#255'RW'#199#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#132#195#132#255#134#227#165#255'l'#224#146#255'K'#170'k'#255#1'/'#1#255 + +'*Y:'#255'6U6'#255#0#0#0#191#0#0#0#0#0#0#0#0#177#180#234#255'=F'#197#255#0#0 + +#0#0#0#0#0#0#0#0#0#0#232#243#232#255#136#221#159#255'D'#207'r'#255'&'#142'I' + +#255'4;4'#255'1:1'#255'!>+'#255'[r['#255#0#0#0#191#0#0#0#0#0#0#0#0#224#225 + +#247#255'!6'#211#255#130#132#185#255#0#0#0#0#0#0#0#0'a'#177'a'#255'7'#198'^' + +#255'$'#153'J'#255'0I0'#255#0#0#0#191#0#0#0#191#9'@'#9#255#0#0#0#191#0#0#0 + +#191#0#0#0#0#0#0#0#0#151#157#232#255#0#25#192#255#21#25'g'#255#0#0#0#0#0#0#0 + +#0#27#142#27#255#22#139'.'#255';^;'#255#0#0#0#191#0#0#0#191#0#0#0#0#0#0#0#0 + +'x'#135#241#255#0#0#0#0#0#0#0#0#185#191#246#255#0','#241#255#0#20'}'#255#17 + +#20'4'#255#0#0#0#0#0#0#0#0'd'#140'd'#255#21'W"'#255'?D?'#255#0#0#0#191#0#0#0 + +#0#0#0#0#0#194#201#249#255#161#189#254#255#235#237#253#255#233#235#253#255'3' + +'d'#254#255#2' '#147#255#0#11'<'#255'99?'#255#0#0#0#0#0#0#0#0#0#0#0#0#2'.'#3 + +#255'$5$'#255#0#0#0#191#0#0#0#0#0#0#0#0#133#151#250#255#142#182#255#255'hz' + +#238#255'p'#155#251#255#17'5'#156#255#3#18'A'#255#6#10'3'#255#0#0#0#191#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#2''''#2#255'DLD'#255#0#0#0#0#0#0#0#0#16'2'#251#255 + +'r'#178#255#255'c'#161#245#255'6\'#154#255#19'"A'#255#5#11'7'#255#0#0#0#191#0 + +#0#0#191#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0'=Q='#255#0#0#0#191#0#0#0#0#9 + +'2'#181#255'S~'#161#255'5Rq'#255#26'+A'#255#23#28';'#255#0#0#0#191#0#0#0#191 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#191#0#0#0#0#23 + +'$e'#255#30'/A'#255'(6A'#255#30'/A'#255#20'$A'#255#1#9'7'#255#0#0#0#0#0#0#0#0 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#191'::@'#255'%(='#255#6#13'8'#255'%(='#255#0#0#0#191#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 @@ -1408,8 +1409,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#167#128#195'l'#179#146#255#168#213#195#255#197#230#219#255'q'#183#151#255 +#198#230#220#255#169#214#196#255'o'#181#148#255'V'#167#128#198'V'#167#128#30 +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'R'#162'}'#27'S'#163 - +'~'#228#143#198#174#255#200#232#223#255#223#242#236#255#249#253#251#255'w' - ,#184#153#255#248#252#251#255#220#241#235#255#199#231#222#255#147#200#178#255 + ,'~'#228#143#198#174#255#200#232#223#255#223#242#236#255#249#253#251#255'w' + +#184#153#255#248#252#251#255#220#241#235#255#199#231#222#255#147#200#178#255 +'U'#164#128#232'R'#162'}'#30#255#255#255#0#255#255#255#0#255#255#255#0'M'#157 +'x'#192#140#195#171#255#195#230#220#255#245#251#249#255#197#230#220#255#157 +#213#197#255'\'#170#135#255#159#214#197#255#201#232#223#255#244#250#249#255 @@ -1472,8 +1473,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#221#255#225#205#180#255#177#141']'#191#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#3#13#140#31#27'&'#167#153'*4'#186#204#17#28#157#137#187#152'i'#204#240#224 - +#208#255#183#145'_'#197#143']'#20#11#255#255#255#0#255#255#255#0#255#255#255 - ,#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#3#13#140#31',5' + ,#208#255#183#145'_'#197#143']'#20#11#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#3#13#140#31',5' +#185#215''#202#242'?L'#215#255#216#188#154#255#246#234#225#255 +#187#146'Z'#191#148'b'#24';'#145'a'#26#1#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8 @@ -1536,8 +1537,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#238#238#0#238#238#238#0#238#238#238#0#153'nL'#255#171'qC'#255#172'rD'#255 +#153'nL'#255#251#227#188#0#251#227#188#0#153'nL'#255#171'qC'#255#172'rD'#255 +#153'nL'#255#0#0#0#0#0#0#0#0#0#0#0#0#153'nL'#0#153'nL'#0#153'nL'#0#162'f7' - +#255#220#191#164#255#223#198#175#255#162'f7'#255#153'nL'#0#153'nL'#0#162'f7' - ,#255#220#191#164#255#223#198#175#255#162'f7'#255#0#0#0#0#0#0#0#0#0#0#0#0#164 + ,#255#220#191#164#255#223#198#175#255#162'f7'#255#153'nL'#0#153'nL'#0#162'f7' + +#255#220#191#164#255#223#198#175#255#162'f7'#255#0#0#0#0#0#0#0#0#0#0#0#0#164 +'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255#221#188#157#255#231#209#188#255#164'e' +'4'#255#164'e4'#0#164'e4'#0#164'e4'#255#221#188#157#255#231#209#188#255#164 +'e4'#255#0#0#0#0#0#0#0#0#0#0#0#0#164'e4'#0#164'e4'#0#164'e4'#0#164'e4'#255 @@ -1600,8 +1601,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#22'|G'#255#136#156#146#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#4's:'#255#131#220#175#255#17#195'i'#255#26#204's'#255'i'#223#163#255 +'Z'#194#141#255#19'vC'#255#158#167#163#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'w?'#255#131#219#174#255#31#198'q'#255'r'#222 - ,#167#255'K'#178#127#255#23'tE'#255#168#173#170#255#0#0#0#0#0#0#0#0#0#0#0#0#0 + ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#9'w?'#255#131#219#174#255#31#198'q'#255'r'#222 + +#167#255'K'#178#127#255#23'tE'#255#168#173#170#255#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255#130#216#172#255'v' +#214#166#255'<'#157'j'#255'''tL'#255#172#174#173#255#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#4's:'#255'z'#207#164 @@ -1664,8 +1665,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#135#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#15'6' +#157#188#1')'#154#255#3'0'#166#255#4'%'#145#254#5'('#137#255#1#23'u'#255#1'1' +#171#254#1''''#145#255#7#30'j'#171#0#0#0#0#3#27'm'#0#0#0#0#0#0#0#0#0#127'rf' - +#0#0#0#0#0#0#9#154#1#3'2'#172#226#15':'#133#241#11'v'#234#255#11'~'#240#255 - ,#18'\'#171#255#9'q'#229#255#3'('#148#255#0','#162#254#0#25'm'#255#5#27'k'#221 + ,#0#0#0#0#0#0#9#154#1#3'2'#172#226#15':'#133#241#11'v'#234#255#11'~'#240#255 + +#18'\'#171#255#9'q'#229#255#3'('#148#255#0','#162#254#0#25'm'#255#5#27'k'#221 +#19'&f"'#0#0#0#0#0#0#0#0'sf['#6'uli'#29'gkz!'#8'A'#183#239#19'~'#236#255#12 +#137#255#254#23'p'#207#255'*x'#200#255#10'{'#243#255#5'K'#186#255#0'+'#160 +#255#4'*'#131#255#0#25'm'#254#2#23'f'#255#17#29'_$tz'#137#6'pjd*xdW(Td'#130 @@ -1728,8 +1729,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#255#255#255#0#197#128'B'#247#248#241#232#255#254#229#213#255#253#229#211 +#255#253#229#211#255#252#229#211#255#252#229#211#255#252#228#209#255#252#226 +#206#255#252#226#204#255#251#224#201#255#251#225#200#255#253#250#247#255#193 - +'v;'#247#255#255#255#0#255#255#255#0#196'|@'#247#247#240#230#255#248#180'U' - ,#255#247#180'V'#255#247#181'T'#255#248#180'S'#255#248#178'S'#255#247#179'R' + ,'v;'#247#255#255#255#0#255#255#255#0#196'|@'#247#247#240#230#255#248#180'U' + +#255#247#180'V'#255#247#181'T'#255#248#180'S'#255#248#178'S'#255#247#179'R' +#255#247#179'R'#255#247#178'Q'#255#247#178'O'#255#247#178'O'#255#252#249#245 +#255#191'o6'#247#255#255#255#0#255#255#255#0#193'x<'#247#247#237#227#255#253 +#194'n'#255#255#216#160#255#255#215#158#255#255#214#155#255#255#215#152#255 @@ -1792,8 +1793,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0'3'#142#217#251#220#240#250#255#152#225#246#255#149#224#246#255#146#223#246 +#255#142#222#245#255#137#220#245#255#133#218#244#255#128#217#244#255'z'#215 +#243#255't'#213#243#255'p'#211#242#255#194#234#248#255'5'#148#218#255#255#255 - +#255#0#255#255#255#0','#134#216#209'-'#136#216#247'-'#135#216#247'-'#136#216 - ,#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216 + ,#255#0#255#255#255#0','#134#216#209'-'#136#216#247'-'#135#216#247'-'#136#216 + +#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216#247'-'#136#216 +#247'-'#136#216#247'-'#136#216#247'-'#135#216#247'-'#136#216#247','#134#216 +#209#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152'* c'#152 +#255' c'#152#255' c'#152#255' c'#152#255' c'#152#255' c'#152#240#255#255#255 @@ -1856,8 +1857,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#250#255' '#227#250#255'1'#225#246#255#173#243#251#255#0#160#196#255#5'y}'#17 +#0#0#0#0#255#255#255#0#0#0#0#0#5'y}2'#19#163#193#228'A'#206#227#254'i'#231 +#246#255'6'#217#236#255#22#205#227#255')'#219#241#255'/'#224#245#255')'#219 - +#241#255'2'#226#247#255'/'#224#246#255#173#243#251#255#0#160#196#255#5'y}'#10 - ,#255#255#255#0#5'y}'#10#22#161#189#202'@'#205#225#255'6'#217#236#255#29#210 + ,#241#255'2'#226#247#255'/'#224#246#255#173#243#251#255#0#160#196#255#5'y}'#10 + +#255#255#255#0#5'y}'#10#22#161#189#202'@'#205#225#255'6'#217#236#255#29#210 +#232#255#29#210#232#255#29#210#232#255')'#219#241#255'/'#224#245#255'2'#226 +#247#255'2'#226#247#255'2'#226#248#255'/'#224#246#255#173#243#251#255#0#160 +#196#255#255#255#255#0#21#160#188#203#27#171#197#248'j'#229#243#255#11#200 @@ -1920,8 +1921,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#255#255#255#0#0#0#0#11#0#0#0'#'#0#0#0'#'#0#0#0#11#0#0#0#0#0 +#0#0#11#0#0#0';'#0#0#159#255#0#0#0#167#0#0#0#131#0#0#0';'#0#0#0#11#0#0#0#0#0 +#0#0#0#0#0#0#0#188'k6q'#188'k6'#144#188'k6'#204#188'k6'#238#188'k6'#250#187 - +'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255#188'l9'#255#189'n;'#255#187'm:' - ,#255#187'k8'#239#187'p>'#203#182'i5T'#255#255#255#0#188'k6'#155#246#224#209 + ,'k6'#254#187'k6'#255#187'j6'#255#187'j6'#255#188'l9'#255#189'n;'#255#187'm:' + +#255#187'k8'#239#187'p>'#203#182'i5T'#255#255#255#0#188'k6'#155#246#224#209 +#255#247#224#209#255#254#251#248#255#254#251#247#255#253#249#246#255#252#245 +#240#255#250#240#234#255#251#242#237#255#253#249#246#255#253#250#247#255#251 +#241#235#255#248#233#223#254#236#208#189#251#201#137'^'#236#181'i5c'#188'k6' @@ -1984,8 +1985,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255#255 +#255#255#255'UUUgQQQh'#253#253#253#255#252#252#252#255#252#252#252#255#252 +#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255 - +#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252 - ,#255#253#253#253#255'QQQhMMMj'#250#250#250#255#248#248#248#255#248#248#248 + ,#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252#255#252#252#252 + +#255#253#253#253#255'QQQhMMMj'#250#250#250#255#248#248#248#255#248#248#248 +#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248 +#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248#248#248#255#248 +#248#248#255#250#250#250#255'MMMjIIIl'#247#247#247#255#244#244#244#255#244 @@ -2048,8 +2049,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255'888s222v'#234#234#234#255#226#226#226#255#226#226#226#255#226#226#226 +#255#226#226#226#255#226#226#226#255#226#226#226#255#226#226#226#255'[['#190 +#255'--'#179#255'--'#179#255'--'#179#255'--'#179#255'//'#181#255#17#17#129 - +#200'''''''{'#235#235#235#255#231#231#231#255#231#231#231#255#231#231#231#255 - ,#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255'//'#167#255 + ,#200'''''''{'#235#235#235#255#231#231#231#255#231#231#231#255#231#231#231#255 + +#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255'//'#167#255 +'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255'^^'#247#255#5#5#139#229#13 +#13#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16 +#16#16#133#16#16#16#133#16#16#16#133#4#4'['#207#2#2's'#231#2#2's'#231#2#2's' @@ -2112,8 +2113,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#210#232#255'6'#217#236#255'@'#205#225#255#22#161#189#202#5'y}'#10#0#0#0#0#5 +'y~'#17#0#160#196#255'y'#237#251#255'2'#226#248#255','#223#244#255#4#192#214 +#255#4#192#214#255#4#192#214#255#29#210#232#255#29#210#232#255#29#210#232#255 - +#11#200#223#255'j'#229#243#255#27#171#197#248#21#160#188#203#0#0#0#0#0#0#0#0 - ,#5'y}'#17#0#160#196#255'v'#237#251#255#4#195#218#255'v'#237#251#255'i'#234 + ,#11#200#223#255'j'#229#243#255#27#171#197#248#21#160#188#203#0#0#0#0#0#0#0#0 + +#5'y}'#17#0#160#196#255'v'#237#251#255#4#195#218#255'v'#237#251#255'i'#234 +#249#255'i'#234#249#255'i'#234#249#255'i'#234#249#255#5#221#247#255#10#200 +#223#255#7#194#216#255'o'#220#235#255#27#163#191#244#0#0#0#0#0#0#0#0#0#0#0#0 +#5'y}'#17#0#160#196#255'v'#237#251#255'v'#237#251#255#0#160#196#255#0#160#196 @@ -2176,8 +2177,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#23#0#0#0#12#0#0#0#2#255#255#255#0'TTT'#0'T' +'TT'#0'TTT'#0'UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUYUUU"TTT'#0'RRR' +#0'RRR'#0'RRR['#198#198#198#212#219#219#219#255#214#214#214#255#209#209#209 - +#255#203#204#204#255#199#199#199#255#198#196#196#255#200#197#197#255#206#198 - ,#198#255#212#201#201#255#196#183#183#212'RRR[UUU'#0'TTT'#0'PPP'#0'PPPi'#187 + ,#255#203#204#204#255#199#199#199#255#198#196#196#255#200#197#197#255#206#198 + +#198#255#212#201#201#255#196#183#183#212'RRR[UUU'#0'TTT'#0'PPP'#0'PPPi'#187 +#187#187#255#185#185#185#255#182#182#182#255#180#180#180#255#176#176#176#255 +#173#173#173#255#169#169#169#255#166#166#166#255#162#162#162#255#160#160#160 +#255#157#157#157#255#3#3#3'fUUU'#0'UUU'#0'UUU'#0'TTTg'#255#255#255#255#255 @@ -2240,8 +2241,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#141'e'#255#243#205#176#255#255#255#255#255#227#199#179#255#255#255#255#255 +#255#255#255#255#255#255#255#255#255#255#255#255#234#191#161#255#201#137'`' +#255#255#255#255#0#255#255#255#0#196#129'T'#201#234#182#151#201#206#152's' - +#248#234#190#161#248#199#134'['#255#239#192#158#255#255#255#255#255#204#147 - ,'n'#255#255#255#255#255#255#255#255#255#255#251#247#255#255#248#241#255#228 + ,#248#234#190#161#248#199#134'['#255#239#192#158#255#255#255#255#255#204#147 + +'n'#255#255#255#255#255#255#255#255#255#255#251#247#255#255#248#241#255#228 +#175#140#255#199#138'a'#255#255#255#255#0#255#255#255#0#195#127'Q'#201#239 +#182#154#201#204#150'o'#248#214#182#145#248#200#136']'#255#239#191#161#255 +#253#252#250#255#254#252#251#255#254#253#253#255#254#253#252#255#253#251#250 @@ -2304,8 +2305,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#145#255#255#247#240#255#255#231#213#255#253#231#214#255#253#230#212#255#252 +#228#208#255#251#227#203#255#250#220#194#255#254#243#232#255#204#134'V'#254 +#199'yJ'#185#200'yK'#206#200'uE'#221#199'uE'#212#200'uE'#212#199'uE'#212#202 - +#132'R'#255#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217#255 - ,#255#231#215#255#255#229#210#255#255#226#203#255#255#247#241#255#203#133'U' + ,#132'R'#255#255#247#241#255#255#233#217#255#255#234#219#255#255#233#217#255 + +#255#231#215#255#255#229#210#255#255#226#203#255#255#247#241#255#203#133'U' +#254#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0 +#255#255#255#0#204#131'R'#251#251#245#238#255#255#233#217#255#255#234#219#255 +#255#233#217#255#255#231#215#255#255#229#210#255#255#226#203#255#251#246#239 @@ -2368,8 +2369,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'ttk'#255'ttk'#255'ttk'#255'ttk'#255'ff]'#255'ZZP'#199'ZZP'#139'F'#255#143#206#153#255'}'#198#135 - +#255'x'#195#129#255's'#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255 - ,'T'#127'W'#255'T'#137#191#255#148#191#221#255'u'#173#212#255'c'#184#225#255 + ,#255'x'#195#129#255's'#192'|'#255't'#192'|'#255'y'#194#129#255'I'#144'O'#255 + +'T'#127'W'#255'T'#137#191#255#148#191#221#255'u'#173#212#255'c'#184#225#255 +'K'#212#255#255'B'#139#184#255',n'#166#234';'#135'B'#255#137#203#146#255#132 +#200#141#255#128#198#136#255'{'#195#131#255'w'#193#127#255'G'#143'M'#255';t?' +#255#161#161#161#255'L'#132#186#255#141#187#219#255'n'#168#209#255'f'#166#209 @@ -2496,8 +2497,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1'0'#2 +#2#2#239#21#21#21#255':::'#255'```'#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#1#1#1' '#2#2#2#207 - +#20#20#20#255'999'#207#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 - ,#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 + ,#20#20#20#255'999'#207#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255 + +#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0'UUU"UUUYUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUUfUUU' +'fUUUYUUU"RRR['#198#198#198#212#220#220#220#255#216#217#217#255#213#213#213 @@ -2560,8 +2561,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#212#151#0#0#0#0#0#0#0#0#0#5#20#147#255#6#21#146#255#7#22#147#255#6#19#151 +#255#6#18#154#255#6#18#151#255#3#18#144#255#2#22#141#255#1#23#135#255#0#17'|' +#255#8#24'y'#255#3#15'f'#255#9#17'a'#255#15#21']'#255#27#28'T'#255'^Qh'#170#0 - +#0#0#0#0#0#0#0#188#173#160#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#252#212#151#2 - ,#251#211#150#0#6#21#148#255#5#21#145#255#5#21#146#255#6#18#151#255#5#17#152 + ,#0#0#0#0#0#0#0#188#173#160#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#252#212#151#2 + +#251#211#150#0#6#21#148#255#5#21#145#255#5#21#146#255#6#18#151#255#5#17#152 +#255#4#17#150#255#5#20#145#255#4#26#138#255#14'+'#142#255#2#25'w'#255#1#20'k' +#255#2#17'a'#255#8#18'\'#255#14#23']'#255#21'!_'#255'33Q'#230#255#255#255#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#8#23#150#255#4 @@ -2624,8 +2625,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#14#27#148#255#13#22#140#255#15#23#142#254#12#24#146#255#27#30#140#255'4' +'(s'#227'bF]'#28#0#0#0#0#0#0#0#0#0#0#0#0't}~'#0#0#0#0#0#0#0#0#0#239#171'P'#1 +#233#168'L'#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#158'ma'#0#0#0#255#0#0#0 - +#0#0'?!S#-!o}''&s'#190'/''{'#221'2'#31'z'#231'/$t'#210'<6c'#141'{jW'#25#0#0#0 - ,#0'jM_'#0#0#0#0#0#243#174'Q'#0#0#0#0#0#0#0#0#0#241#173'Q'#0#0#0#0#0#0#0#0#0#0 + ,#0#0'?!S#-!o}''&s'#190'/''{'#221'2'#31'z'#231'/$t'#210'<6c'#141'{jW'#25#0#0#0 + +#0'jM_'#0#0#0#0#0#243#174'Q'#0#0#0#0#0#0#0#0#0#241#173'Q'#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#132'Za'#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#187'tV'#14#145'\Z'#29#255#243'L'#6#0#0#0#0#0#0#0#0#146'xp'#0#243 +#174'R'#0#243#174'R'#0#0#0#0#0#0#0#0#0#0#0#0#0#242#174'R'#0#0#0#0#0#241#173 @@ -2688,8 +2689,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#154#154#255#155#155#155#255#155#155#155#255'o'#157#211#255#170#209#231#255 +#171#209#231#255#152#199#225#255#145#194#222#255'V'#143#183#255'R'#137#193 +#234#255#255#255#0#255#255#255#0#128#128#128#255'~~~'#255'|||'#255'zzz'#255 - +'www'#255'uuu'#255'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171 - ,#211#232#255#169#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255 + ,'www'#255'uuu'#255'rrr'#255'q'#158#212#255'o'#158#214#255#135#178#220#255#171 + +#211#232#255#169#208#230#255'X'#144#184#255'Y'#142#198#234#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'p'#158#214#219 +'m'#156#212#255#133#177#218#255'Z'#145#185#255'`'#147#203#234#255#255#255#0 @@ -2752,8 +2753,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255 +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#0#0#0#9#0#0#0#22#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26 - +#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#22#0#0#0#9#13#13 - ,#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16 + ,#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#26#0#0#0#22#0#0#0#9#13#13 + +#13'g'#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16#16#133#16#16 +#16#133#16#16#16#133#16#16#16#133#4#4'['#207#2#2's'#231#2#2's'#231#2#2's'#231 +#2#2's'#231#2#2's'#231#2#2'X'#176'''''''{'#235#235#235#255#231#231#231#255 +#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231#255#231#231#231 @@ -2816,8 +2817,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#9'OnExecute'#7#18'ActionPauseExecute'#0#0#7'TAction'#16'ActionStopScript'#7 +'Caption'#6#5'&Stop'#9'OnExecute'#7#17'ActionStopExecute'#8'ShortCut'#2'q'#0 +#0#7'TAction'#13'ActionSaveAll'#7'Caption'#6#8'Save All'#10'ImageIndex'#2#21 - +#9'OnExecute'#7#20'ActionSaveAllExecute'#8'ShortCut'#3'S`'#0#0#7'TAction'#16 - ,'ActionClearDebug'#7'Caption'#6#5'Clear'#10'ImageIndex'#2#4#9'OnExecute'#7#23 + ,#9'OnExecute'#7#20'ActionSaveAllExecute'#8'ShortCut'#3'S`'#0#0#7'TAction'#16 + +'ActionClearDebug'#7'Caption'#6#5'Clear'#10'ImageIndex'#2#4#9'OnExecute'#7#23 +'ActionClearDebugExecute'#0#0#7'TAction'#15'ActionFindStart'#7'Caption'#6#9 +'&Find ...'#10'ImageIndex'#2#26#9'OnExecute'#7#22'ActionFindstartExecute'#8 +'ShortCut'#3'F@'#0#0#7'TAction'#9'ActionCut'#7'Caption'#6#4'Cu&t'#10'ImageIn' @@ -2880,8 +2881,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'%'#228#251#255#0#160#196#255#0#160#196#255#19#161#190#231#21#159#187#207#27 +#161#187#164#6'z|'#11#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#5'y}'#17#0#160#196#255#173#243#251#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0 - +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 - ,#0#0#0#157#191#20#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + ,#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 + +#0#0#0#157#191#20#0#160#196#255#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#160#196#255#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0 +#0#0#0#0#0#0#0#0#0#0#0#7'OnClick'#7#17'ActionUndoExecute'#0#0#9'TMenuItem'#13 @@ -2944,8 +2945,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0'2<'#195#236'#.'#173#175 +#255#255#255#0#26'%'#168#153'BP'#210#255#203#163'u'#254'AO'#214#255#22'!'#163 +#157'/9'#192#212'.8'#190#223#2#13#139#10#255#255#255#0#255#255#255#0#255#255 - +#255#0#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8#18#144':'#7#17 - ,#144'S;H'#212#255#219#189#156#255#238#204#166#255'@L'#222#255':C'#209#255#15 + ,#255#0#255#255#255#0#255#255#255#0#29'('#169#156';F'#204#255#8#18#144':'#7#17 + +#144'S;H'#212#255#219#189#156#255#238#204#166#255'@L'#222#255':C'#209#255#15 +#25#152'i'#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0#255#255 +#255#0#255#255#255#0#3#13#140#31',5'#185#215''#202#242'?L'#215 +#255#216#188#154#255#246#234#225#255#187#146'Z'#191#148'b'#24';'#145'a'#26#1 @@ -3008,8 +3009,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#135'X'#254#202#132'R'#219#255#247#241#222#255#233#217#222#255#234#219#222 +#255#233#217#222#255#231#215#222#228#187#146#255#254#246#240#255#252#226#205 +#255#252#227#205#255#250#223#200#255#247#217#188#255#245#233#221#255#250#243 - +#235#255#251#248#243#255#202#131'S'#254#203#133'S'#219#255#247#240#222#255 - ,#231#213#222#253#231#214#222#253#230#212#222#252#228#208#222#228#187#147#255 + ,#235#255#251#248#243#255#202#131'S'#254#203#133'S'#219#255#247#240#222#255 + +#231#213#222#253#231#214#222#253#230#212#222#252#228#208#222#228#187#147#255 +#254#245#237#255#252#222#197#255#251#224#199#255#249#220#194#255#245#211#180 +#255#254#249#243#255#250#226#196#255#236#193#147#255#195'}H'#147#203#134'T' +#219#255#247#242#222#254#231#213#222#254#231#213#222#253#229#209#222#250#224 @@ -3072,8 +3073,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152#255 +#127#191#228#255'i'#178#222#255'J'#155#218#255'D'#151#220#255'C'#150#220#255 +'B'#150#220#255'B'#149#220#255'A'#149#219#255'Q'#158#214#255'l'#178#222#255 - +' c'#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152 - ,#224'q'#179#219#254'~'#191#228#255'N'#157#223#255#181#238#253#255'u'#212#240 + ,' c'#152#255#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c'#152 + +#224'q'#179#219#254'~'#191#228#255'N'#157#223#255#181#238#253#255'u'#212#240 +#255'u'#212#240#255#181#238#253#255'K'#155#222#255'n'#180#224#255'm'#179#223 +#249' c'#152#243#255#255#255#0#255#255#255#0#255#255#255#0#255#255#255#0' c' +#152'2 c'#152#178' c'#152#255'7u'#164#255#182#239#254#255#128#219#243#255#128 @@ -3136,8 +3137,8 @@ LazarusResources.Add('TForm1','FORMDATA',[ +'Action'#7#13'ActionReplace'#7'Caption'#6#7'Replace'#7'OnClick'#7#20'ActionR' +'eplaceExecute'#0#0#0#14'TReplaceDialog'#10'dlgReplace'#7'Options'#11#6'frDo' +'wn'#10'frFindNext'#12'frHideUpDown'#0#6'OnFind'#7#14'dlgReplaceFind'#9'OnRe' - +'place'#7#17'dlgReplaceReplace'#4'left'#3'`'#2#3'top'#2'h'#0#0#6'TTimer'#11 - ,'UpdateTimer'#8'Interval'#3#16''''#4'left'#3'`'#2#3'top'#3#144#0#0#0#6'TTime' + ,'place'#7#17'dlgReplaceReplace'#4'left'#3'`'#2#3'top'#2'h'#0#0#6'TTimer'#11 + +'UpdateTimer'#8'Interval'#3#16''''#4'left'#3'`'#2#3'top'#3#144#0#0#0#6'TTime' +'r'#10'MouseTimer'#8'Interval'#2'd'#7'OnTimer'#7#17'ChangeMouseStatus'#4'lef' +'t'#3#192#1#3'top'#3#200#0#0#0#6'TTimer'#9'NewsTimer'#8'Interval'#3#244#1#7 +'OnTimer'#7#14'NewsTimerTimer'#4'left'#3#232#1#3'top'#3#200#0#0#0#0 diff --git a/Projects/SAMufasaGUI/testunit.pas b/Projects/SAMufasaGUI/testunit.pas index ab8e0d4..1a4fc72 100644 --- a/Projects/SAMufasaGUI/testunit.pas +++ b/Projects/SAMufasaGUI/testunit.pas @@ -41,7 +41,7 @@ uses SynExportHTML, SynEditKeyCmds, SynEditHighlighter, SynEditMarkupHighAll, LMessages, Buttons, stringutil,mufasatypesutil,mufasabase, - about, framefunctionlist, ocr, updateform, simbasettings, pseventextension, + about, framefunctionlist, ocr, updateform, simbasettings, psextension, virtualextension, extensionmanager; const @@ -102,6 +102,7 @@ type MenuFile: TMenuItem; MenuEdit: TMenuItem; MenuHelp: TMenuItem; + MenuItemExtensions: TMenuItem; MenuItemSettingsButton: TMenuItem; MenuItemDivider10: TMenuItem; MenuTools: TMenuItem; @@ -251,6 +252,7 @@ type procedure FunctionListChange(Sender: TObject; Node: TTreeNode); procedure FunctionListEnter(Sender: TObject); procedure FunctionListExit(Sender: TObject); + procedure MenuItemExtensionsClick(Sender: TObject); procedure MenuItemHandbookClick(Sender: TObject); procedure MenuItemColourHistoryClick(Sender: TObject); procedure dlgReplaceFind(Sender: TObject); @@ -397,6 +399,7 @@ uses lclintf, syncobjs, // for the critical sections debugimage, + extensionmanagergui, colourhistory, math; @@ -902,7 +905,7 @@ end; procedure TForm1.CreateDefaultEnvironment; var - IncludePath,FontPath,PluginsPath : string; + IncludePath,FontPath,PluginsPath,extensionsPath : string; begin CreateSetting('Settings/Updater/CheckForUpdates','True'); CreateSetting('Settings/Updater/CheckEveryXMinutes','30'); @@ -949,6 +952,7 @@ begin includePath:= CreateSetting('Settings/Includes/Path', ExpandFileName(MainDir+DS+'Includes' + DS)); fontPath := CreateSetting('Settings/Fonts/Path', ExpandFileName(MainDir+DS+ 'Fonts' + DS)); PluginsPath := CreateSetting('Settings/Plugins/Path', ExpandFileName(MainDir+ DS+ 'Plugins' + DS)); + extensionsPath := CreateSetting('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS)); CreateSetting('LastConfig/MainForm/Position',''); CreateSetting('LastConfig/MainForm/State','Normal'); {$ifdef MSWindows} @@ -961,15 +965,18 @@ begin CreateDir(FontPath); if not DirectoryExists(PluginsPath) then CreateDir(PluginsPath); + if not DirectoryExists(extensionsPath) then + CreateDir(extensionsPath); SettingsForm.SettingsTreeView.Items.GetFirstNode.Expand(false); SettingsForm.SaveCurrent; + LoadFormSettings; end; procedure TForm1.LoadFormSettings; var str,str2 : string; Data : TStringArray; - i : integer; + i,ii : integer; begin str := LoadSettingDef('LastConfig/MainForm/Position',''); if str <> '' then @@ -1009,6 +1016,18 @@ begin else ShowConsole(false); {$endif} + str := LoadSettingDef('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS)); + str2 := LoadSettingDef('Settings/Extensions/FileExtension','sex'); + ExtManager.LoadPSExtensionsDir(str,str2); + str := LoadSettingDef('LastConfig/Extensions/EnabledExts',''); + if str <> '' then + begin + data := Explode(';',str); + for i := 0 to high(data) do + for ii := 0 to ExtManager.Extensions.Count - 1 do + if data[i] = TVirtualSimbaExtension(ExtManager.Extensions[ii]).Filename then + TVirtualSimbaExtension(ExtManager.Extensions[ii]).Enabled := true; + end; end; procedure TForm1.SaveFormSettings; @@ -1032,7 +1051,8 @@ begin for i := 0 to high(data) do //First entry should be the last-opened data[high(data) - i] := RecentFiles[i]; SetKeyValue('LastConfig/MainForm/RecentFiles',implode(';',data)); - end; + end else + SetKeyValue('LastConfig/MainForm/RecentFiles',''); if MenuItemFunctionList.Checked then SetKeyValue('LastConfig/MainForm/FunctionListShown','True') else @@ -1043,6 +1063,18 @@ begin else SetKeyValue('LastConfig/Console/Visible','false'); {$endif} + if ExtManager.Extensions.Count > 0 then + begin + SetLength(data,0); + for i := 0 to ExtManager.Extensions.Count-1 do + if TVirtualSimbaExtension(ExtManager.Extensions[i]).Enabled then + begin + setlength(data,length(data)+1); + data[high(data)] := TVirtualSimbaExtension(ExtManager.Extensions[i]).FileName; + end; + SetKeyValue('LastConfig/Extensions/EnabledExts',Implode(';',data)); + end else + SetKeyValue('LastConfig/Extensions/EnabledExts',''); SaveToXML(SimbaSettingsFile); end; end; @@ -1572,6 +1604,11 @@ begin // StatusBar.Panels[2].Text:= ''; end; +procedure TForm1.MenuItemExtensionsClick(Sender: TObject); +begin + ExtensionsForm.Show; +end; + procedure TForm1.MenuItemHandbookClick(Sender: TObject); begin OpenURL('http://vila.villavu.com/mufasa/mufasa_ps_handbook/'); @@ -1667,6 +1704,8 @@ begin TT_Console.Visible:= false; {$endif} InitmDebug; + ExtManager := TExtensionManager.Create; + ExtManager.StartDisabled:= True; if FileExists(SimbaSettingsFile) then begin Application.CreateForm(TSettingsForm,SettingsForm); @@ -1704,6 +1743,7 @@ begin FirstRun := true;//Our next run is the first run. HandleParameters; TT_Update.Visible:= false; + end; procedure TForm1.FormDestroy(Sender: TObject); @@ -1722,6 +1762,7 @@ begin SetLength(DebugStream, 0); RecentFiles.Free; DebugCriticalSection.Free; + ExtManager.free; {$ifdef MSWindows} if not UnRegisterHotkey(Self.Handle,0) then mDebugLn('Unable to unregister ctrl + alt + s as global hotkey'); diff --git a/Projects/SAMufasaGUI/virtualextension.pas b/Projects/SAMufasaGUI/virtualextension.pas index d41d92d..c286a65 100644 --- a/Projects/SAMufasaGUI/virtualextension.pas +++ b/Projects/SAMufasaGUI/virtualextension.pas @@ -8,18 +8,27 @@ uses Classes, SysUtils; type + { TVirtualSimbaExtension } + TVirtualSimbaExtension = class(TObject) + protected + FName: String; + FVersion : string; + FFilename : string; + FEnabled : boolean; + procedure SetEnabled(bool : boolean); virtual; public + OnChange : TNotifyEvent; { Must be implemented } function HookExists(HookName: String): Boolean; virtual; abstract; { No Custom Arguments just yet... } - function ExecuteHook(HookName: String; fArgs: Array of Variant; out OutVariant): Integer; virtual; abstract; - private - FName: String; - - property GetName: String read Fname; + function ExecuteHook(HookName: String; fArgs: Array of Variant; out OutVariant : variant): Integer; virtual; abstract; + function GetName : string; + function GetVersion : String; + property Filename : string read FFilename write FFilename; + property Enabled : boolean read FEnabled write SetEnabled; end; @@ -33,7 +42,9 @@ type ArgumentCount: Integer; end; -var +const + SExt_ok = 0; + SExt_error = 1; EventHooks: Array [0..7] of TEventHook = ( (HookName : 'onScriptCompile' ; ArgumentCount : 1), (HookName : 'onScriptStart' ; ArgumentCount : 1), @@ -46,5 +57,48 @@ var implementation +{ TVirtualSimbaExtension } + +procedure TVirtualSimbaExtension.SetEnabled(bool: boolean); +begin + if assigned(OnChange) then + OnChange(self); + FEnabled:= bool; +end; + +function TVirtualSimbaExtension.GetName: string; +var + OutPut : Variant; +begin + Result := ''; + if FName <> '' then + Result := FName + else if self.HookExists('GetName') then + begin; + if ExecuteHook('GetName',[],OutPut) <> SExt_ok then + FName := '' + else + FName := OutPut; + result := FName; + end; +end; + +function TVirtualSimbaExtension.GetVersion: String; +var + OutPut : Variant; +begin + Result := ''; + if FVersion <> '' then + Result := FVersion + else if self.HookExists('GetVersion') then + begin; + if ExecuteHook('GetVersion',[],OutPut) <> SExt_ok then + FVersion := '' + else + FVersion := Output; + result := FVersion; + end; +end; + end. diff --git a/Units/MMLAddon/stringutil.pas b/Units/MMLAddon/stringutil.pas index 9558571..4a22a96 100644 --- a/Units/MMLAddon/stringutil.pas +++ b/Units/MMLAddon/stringutil.pas @@ -20,6 +20,7 @@ function Implode(Glue: string;Pieces: TStringArray): string; var I, Len : integer; begin + Result := ''; Len := high(Pieces); if (Len < 0) then exit; diff --git a/Units/PascalScript/uPSR_menus.pas b/Units/PascalScript/uPSR_menus.pas index 6e2600a..1920d16 100644 --- a/Units/PascalScript/uPSR_menus.pas +++ b/Units/PascalScript/uPSR_menus.pas @@ -441,7 +441,7 @@ begin RegisterPropertyHelper(@TMENUITEMRADIOITEM_R,@TMENUITEMRADIOITEM_W,'RADIOITEM'); RegisterPropertyHelper(@TMENUITEMSHORTCUT_R,@TMENUITEMSHORTCUT_W,'SHORTCUT'); RegisterPropertyHelper(@TMENUITEMVISIBLE_R,@TMENUITEMVISIBLE_W,'VISIBLE'); - RegisterEventPropertyHelper(@TMENUITEMONCLICK_R,@TMENUITEMONCLICK_W,'ONCLICK'); +// RegisterEventPropertyHelper(@TMENUITEMONCLICK_R,@TMENUITEMONCLICK_W,'ONCLICK'); end; end;