From a89d1ac603fff7df429c994155759bba60a2999b Mon Sep 17 00:00:00 2001
From: stokie-ant <58473635+stokie-ant@users.noreply.github.com>
Date: Tue, 31 May 2022 18:26:32 +0100
Subject: [PATCH] fixes and additions
Reinstated CPU type, speed and usage.
Enabled drag and drop for actions.
Fixed issue where saving actions with empty lines caused actions to be duplicated.
Fixed lines continued on next line not shown when transitioning.
Fixed program detection (for screen saver active, prog active, fullscreen active, etc.) was causing relatively high CPU usage.
General code cleanup and formatting.
---
.gitignore | 2 +-
BUILDING.txt | 7 +-
.../vcppdotnetplugin.vcproj.THEBEAST.Ant.user | 65 -
LCDSmartie.lpi | 40 +-
LCDSmartie.lpr | 2 +-
.../LegacyLoader.lpi | 0
.../LegacyLoader.pas | 0
SmartieConfigEditor.lpi | 3 -
Smartiegroupbuild.lpg | 25 -
UConfig.pas | 7 +
UCredits.lfm | 641 ++
UCredits.pas | 1 -
UData.pas | 12 +-
UDataFolding.pas | 8 +-
UDataGame.pas | 8 +-
UDataSystem.pas | 237 +-
UJSON.pas | 2 +-
UMain.lfm | 10 +-
UMain.pas | 77 +-
URLThread.pas | 4 +-
USetup.lfm | 47 +-
USetup.pas | 1752 ++--
components/README.txt | 21 +-
.../openssl-1.0.2u-i386-win32.zip | Bin
.../openssl-1.0.2u-x64_86-win64.zip | Bin 0 -> 1358294 bytes
components/openssl.cfg | 90 +
contrib/speedfan/speedfan.cfg | 37 -
contrib/speedfan/speedfan.dof | 152 -
{graphics => images}/LOGOSM~2.BMP | Bin
{graphics => images}/OPEN.BMP | Bin
{graphics => images}/SMARTIE.BMP | Bin
{graphics => images}/SMARTIELOGO1.BMP | Bin
images/bar_left.bmp | Bin 7614 -> 0 bytes
images/bar_middle.bmp | Bin 16254 -> 0 bytes
images/bar_right.bmp | Bin 7398 -> 0 bytes
images/big_arrow_left_down.bmp | Bin 3126 -> 0 bytes
images/big_arrow_left_up.bmp | Bin 3126 -> 0 bytes
images/big_arrow_right_down.bmp | Bin 3126 -> 0 bytes
images/big_arrow_right_up.bmp | Bin 3126 -> 0 bytes
images/colors.cfg | 6 -
images/hide_down.bmp | Bin 1718 -> 0 bytes
images/hide_up.bmp | Bin 1718 -> 0 bytes
images/logo.bmp | Bin 2322 -> 0 bytes
{graphics => images}/logo16x16.bmp | Bin
{graphics => images}/logo_smarties.jpg | Bin
images/setup_down.bmp | Bin 1718 -> 0 bytes
images/setup_up.bmp | Bin 1718 -> 0 bytes
images/skininfo.txt | 8 -
images/small_arrow_left_down1.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_down2.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_down3.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_down4.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_up1.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_up2.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_up3.bmp | Bin 822 -> 0 bytes
images/small_arrow_left_up4.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_down1.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_down2.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_down3.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_down4.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_up1.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_up2.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_up3.bmp | Bin 822 -> 0 bytes
images/small_arrow_right_up4.bmp | Bin 822 -> 0 bytes
{graphics => images}/smartie53.bmp | Bin
images/smartie53.jpg | Bin 0 -> 20409 bytes
release-dir/images/smartie53.bmp | Bin 105136 -> 0 bytes
uSMBIOS.pas | 7473 +++++++++++++++++
x64/release-dir/config.ini | 473 +-
69 files changed, 9813 insertions(+), 1397 deletions(-)
delete mode 100644 DLL example/vcppdotnetplugin/vcppdotnetplugin.vcproj.THEBEAST.Ant.user
rename {LegacyPluginLoader => LegacyLoader}/LegacyLoader.lpi (100%)
rename {LegacyPluginLoader => LegacyLoader}/LegacyLoader.pas (100%)
delete mode 100644 Smartiegroupbuild.lpg
rename components/{ => openssl-1.0.2u-i386-win32}/openssl-1.0.2u-i386-win32.zip (100%)
create mode 100644 components/openssl-1.0.2u-x64_86-win64/openssl-1.0.2u-x64_86-win64.zip
create mode 100644 components/openssl.cfg
delete mode 100644 contrib/speedfan/speedfan.cfg
delete mode 100644 contrib/speedfan/speedfan.dof
rename {graphics => images}/LOGOSM~2.BMP (100%)
rename {graphics => images}/OPEN.BMP (100%)
rename {graphics => images}/SMARTIE.BMP (100%)
rename {graphics => images}/SMARTIELOGO1.BMP (100%)
delete mode 100644 images/bar_left.bmp
delete mode 100644 images/bar_middle.bmp
delete mode 100644 images/bar_right.bmp
delete mode 100644 images/big_arrow_left_down.bmp
delete mode 100644 images/big_arrow_left_up.bmp
delete mode 100644 images/big_arrow_right_down.bmp
delete mode 100644 images/big_arrow_right_up.bmp
delete mode 100644 images/colors.cfg
delete mode 100644 images/hide_down.bmp
delete mode 100644 images/hide_up.bmp
delete mode 100644 images/logo.bmp
rename {graphics => images}/logo16x16.bmp (100%)
rename {graphics => images}/logo_smarties.jpg (100%)
delete mode 100644 images/setup_down.bmp
delete mode 100644 images/setup_up.bmp
delete mode 100644 images/skininfo.txt
delete mode 100644 images/small_arrow_left_down1.bmp
delete mode 100644 images/small_arrow_left_down2.bmp
delete mode 100644 images/small_arrow_left_down3.bmp
delete mode 100644 images/small_arrow_left_down4.bmp
delete mode 100644 images/small_arrow_left_up1.bmp
delete mode 100644 images/small_arrow_left_up2.bmp
delete mode 100644 images/small_arrow_left_up3.bmp
delete mode 100644 images/small_arrow_left_up4.bmp
delete mode 100644 images/small_arrow_right_down1.bmp
delete mode 100644 images/small_arrow_right_down2.bmp
delete mode 100644 images/small_arrow_right_down3.bmp
delete mode 100644 images/small_arrow_right_down4.bmp
delete mode 100644 images/small_arrow_right_up1.bmp
delete mode 100644 images/small_arrow_right_up2.bmp
delete mode 100644 images/small_arrow_right_up3.bmp
delete mode 100644 images/small_arrow_right_up4.bmp
rename {graphics => images}/smartie53.bmp (100%)
create mode 100644 images/smartie53.jpg
delete mode 100644 release-dir/images/smartie53.bmp
create mode 100644 uSMBIOS.pas
diff --git a/.gitignore b/.gitignore
index 2a09f61..b55bec1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,7 +29,7 @@ release-dir/openssl/.rnd
release-dir/openssl/cert.pem
release-dir/openssl/key.pem
# ignore extracted components
-components/WinampCtrl
+components/WinampCtrl/*
# ignore lazarus backups
backup
*.bak
diff --git a/BUILDING.txt b/BUILDING.txt
index 27e4d3a..9afd79b 100644
--- a/BUILDING.txt
+++ b/BUILDING.txt
@@ -6,11 +6,10 @@ Required Components
This project requires the following components to be installed and in
the projects path:
- WinampCtrl.
+ This can be found in the components sub-directory
-This can be found in the components sub-directory
-
-Indy 10
-This can be installed via lazarus package manager
+ - Indy 10
+ This can be installed via lazarus package manager
Install all components before loading the LCD Smartie project.
diff --git a/DLL example/vcppdotnetplugin/vcppdotnetplugin.vcproj.THEBEAST.Ant.user b/DLL example/vcppdotnetplugin/vcppdotnetplugin.vcproj.THEBEAST.Ant.user
deleted file mode 100644
index 85b0ec8..0000000
--- a/DLL example/vcppdotnetplugin/vcppdotnetplugin.vcproj.THEBEAST.Ant.user
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/LCDSmartie.lpi b/LCDSmartie.lpi
index 34449c9..5d19ad2 100644
--- a/LCDSmartie.lpi
+++ b/LCDSmartie.lpi
@@ -87,6 +87,14 @@
+
@@ -106,18 +114,25 @@
-
+
-
+
+
+
+
+
+
+
+
@@ -148,13 +163,18 @@
+
+
+
+
+
+
+
@@ -168,16 +188,16 @@
-
+
-
+
-
+
-
+
@@ -346,7 +366,7 @@
-
+
@@ -355,7 +375,7 @@
-
+
diff --git a/LCDSmartie.lpr b/LCDSmartie.lpr
index df52b4f..ae5386b 100644
--- a/LCDSmartie.lpr
+++ b/LCDSmartie.lpr
@@ -5,7 +5,7 @@
uses
{madExcept,
madLinkDisAsm,}
- Forms, Interfaces,
+ Forms, Interfaces, SysUtils,
UMain {LCDSmartieDisplayForm};
{$R *.res}
diff --git a/LegacyPluginLoader/LegacyLoader.lpi b/LegacyLoader/LegacyLoader.lpi
similarity index 100%
rename from LegacyPluginLoader/LegacyLoader.lpi
rename to LegacyLoader/LegacyLoader.lpi
diff --git a/LegacyPluginLoader/LegacyLoader.pas b/LegacyLoader/LegacyLoader.pas
similarity index 100%
rename from LegacyPluginLoader/LegacyLoader.pas
rename to LegacyLoader/LegacyLoader.pas
diff --git a/SmartieConfigEditor.lpi b/SmartieConfigEditor.lpi
index fb84c6b..79e57b2 100644
--- a/SmartieConfigEditor.lpi
+++ b/SmartieConfigEditor.lpi
@@ -107,9 +107,6 @@
-
-
-
diff --git a/Smartiegroupbuild.lpg b/Smartiegroupbuild.lpg
deleted file mode 100644
index 5024b09..0000000
--- a/Smartiegroupbuild.lpg
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/UConfig.pas b/UConfig.pas
index 4f4946a..0f68ee3 100644
--- a/UConfig.pas
+++ b/UConfig.pas
@@ -339,8 +339,11 @@ function TConfig.loadINI: Boolean;
screen[ScreenCount].settings.theme := initFile.ReadInteger(sScreen, 'Theme', 1)-1;
screen[ScreenCount].settings.showTime := initFile.ReadInteger(sScreen, 'ShowTime', 10);
screen[ScreenCount].settings.bSticky := initFile.ReadBool(sScreen, 'Sticky', false);
+
screen[ScreenCount].settings.TransitionTime := initFile.ReadInteger(sScreen, 'TransitionTime', 20);
+ screen[ScreenCount].settings.TransitionTime := initFile.ReadInteger(sScreen, 'InteractionTime', 20); // compatibilty to be removed in later version
screen[ScreenCount].settings.TransitionStyle := TTransitionStyle(initFile.ReadInteger(sScreen, 'TransitionStyle',1));
+ screen[ScreenCount].settings.TransitionStyle := TTransitionStyle(initFile.ReadInteger(sScreen, 'Interaction',1)); // compatibilty to be removed in later version
for LineCount := 1 to MaxLines do
begin
@@ -547,7 +550,11 @@ procedure TConfig.saveINI;
initFile.WriteInteger(sScreen, 'Theme', screen[ScreenCount].settings.theme + 1);
initFile.WriteInteger(sScreen, 'ShowTime', screen[ScreenCount].settings.showTime);
initfile.WriteBool(sScreen, 'Sticky', screen[ScreenCount].settings.bSticky);
+
+ initFile.WriteInteger(sScreen, 'InteractionTime', screen[ScreenCount].settings.TransitionTime); // compatibilty to be removed in later version
initFile.WriteInteger(sScreen, 'TransitionTime', screen[ScreenCount].settings.TransitionTime);
+
+ initFile.WriteInteger(sScreen, 'Interaction', ord(screen[ScreenCount].settings.TransitionStyle)); // compatibilty to be removed in later version
initFile.WriteInteger(sScreen, 'TransitionStyle', ord(screen[ScreenCount].settings.TransitionStyle));
for LineCount := 1 to MaxLines do
diff --git a/UCredits.lfm b/UCredits.lfm
index b5ab48e..c38b68e 100644
--- a/UCredits.lfm
+++ b/UCredits.lfm
@@ -48,6 +48,647 @@ object CreditsForm: TCreditsForm
Width = 255
Center = True
OnClick = CloseClick
+ Picture.Data = {
+ 0A544A706567496D616765B94F0000FFD8FFE000104A46494600010101004800
+ 480000FFDB004300020101020101020202020202020203050303030303060404
+ 0305070607070706070708090B0908080A0807070A0D0A0A0B0C0C0C0C07090E
+ 0F0D0C0E0B0C0C0CFFDB004301020202030303060303060C0807080C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C
+ 0C0C0C0C0C0C0C0C0C0C0C0C0CFFC0001108008E00F603012200021101031101
+ FFC4001F0000010501010101010100000000000000000102030405060708090A
+ 0BFFC400B5100002010303020403050504040000017D01020300041105122131
+ 410613516107227114328191A1082342B1C11552D1F02433627282090A161718
+ 191A25262728292A3435363738393A434445464748494A535455565758595A63
+ 6465666768696A737475767778797A838485868788898A92939495969798999A
+ A2A3A4A5A6A7A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6
+ D7D8D9DAE1E2E3E4E5E6E7E8E9EAF1F2F3F4F5F6F7F8F9FAFFC4001F01000301
+ 01010101010101010000000000000102030405060708090A0BFFC400B5110002
+ 0102040403040705040400010277000102031104052131061241510761711322
+ 328108144291A1B1C109233352F0156272D10A162434E125F11718191A262728
+ 292A35363738393A434445464748494A535455565758595A636465666768696A
+ 737475767778797A82838485868788898A92939495969798999AA2A3A4A5A6A7
+ A8A9AAB2B3B4B5B6B7B8B9BAC2C3C4C5C6C7C8C9CAD2D3D4D5D6D7D8D9DAE2E3
+ E4E5E6E7E8E9EAF2F3F4F5F6F7F8F9FAFFDA000C03010002110311003F00FDFC
+ A28A2800A28A2800A28A2800A28A09A002BC87F6FBF8BDAC7C00FD8A7E2978E3
+ C3F7B63A7EB9E13F0D5F6AD6135DDAFDA6233C30B488863DCBB8BB2841CE0330
+ 2410307D6A494AAE6BE15FF838E7E2D8F865FF0004A2F1D5A8904575E2DBCD3F
+ 4381BB36FBA49A55FC608261F8D6388972D2949763AB034FDA6229C1F56BF334
+ FF00E0829FB537C50FDB23F623B9F1D7C57D5ADF5AD6AFBC4D7D6FA7DCC56105
+ 9EDB18D61558CAC2AA84ACDE78DD8CE368249049FB64AE4F15F2BFFC1147E128
+ F837FF0004B3F82DA518FC992F3405D69D7A1CDFC925EF38EFFE91DEBEA7DDB0
+ 1A30F7749396E4E31C7DBC9436BB1657F2622DFDDFD6BC1FF6A5FF0082907C29
+ FD91B5FB3D03C51AEDC5F78CB5650DA7785B42B19B56D72FF3D365AC0ACEA1B9
+ C3C9B10907E6CD7967FC164FFE0A4F7DFB07FC14D2749F06DB43AB7C5BF89574
+ 746F0969C63F399256288F72D1F21C46648D554F0F248839018574BFF04CEFF8
+ 273E97FB167C376D53C413378ABE3178C145FF008D7C597B21B9BCD4AF1FE678
+ 9666F9BC943801780DB779193819CAB394FD9C0D69D08C29AAD5B67B2EAEDFA1
+ E53E25FF008388FE11FC2EF19D968DF10FE1EFC7AF85ABA83620BEF16F82DACA
+ DE551F7A455595E6641DC88FB1EB5F6D7C39F8A3A17C5EF04E93E26F0CEA963A
+ D681AE5B2DDD8DF5A482486E626190EA476EC73820F04035C8FED71FB24F837F
+ 6CEF811AE7803C69A6C37DA5EAF0B795332069B4FB803F75730B1076CB1B6083
+ D0F2A415254FC29FB5EAF8F3FE097FFB137C0DFD95FF0067BFB76BBF13BE21C9
+ 75A2E99ABB2ED96DA38D85CEA57A818B2C27CDBB0559B22089D8EECC6A4AE6A9
+ 4D394B54691A142BC5429DE32BF57A5BD4FB07F6B2FF00829AFC0FFD88CAC3F1
+ 1BE2168BA26A6EA1D34A87CCBDD49C11C1FB340AF2853C7CECA17DC75AF9075F
+ FF0083AD7F66DD2750686DF41F8B3AA44A7067B6D26C563FAE24BC471EBCA83E
+ D5F2EFC7FF00D9AFE1AFFC11066F863A9F8F3E1BDAFED41F193E2B4F7735E6A5
+ AF6A9FE8369730BDB096386DA48DC4CCED72A1269F321642DF27083F6F6CBC07
+ A15A78717478745D261D1D53CB16096918B6DBD808C0DA07B62B28D4AB524E31
+ 7CB63A2AD1C251845D48B9735ECEF6D9D99F277ECB7FF05EEFD9A3F6ACF105A6
+ 89A6F8D9BC2BAFDF32C76DA7F89ED8E9AD3C8C3E48D67CB5B9763F2AA897731E
+ 14357D93131328CED3DFA76EDFE7DABF353FE0ADBFF040CF87FF00B497C2DD67
+ C5FF0009FC33A7F827E28E990BDEC3069100B5B1F1015059E09208F08B33F559
+ 14025C8DDB81C8E57FE0D82FF82837887F683F853E24F843E34BFB9D4B58F86F
+ 0C175A2DDDD36EB89B4D9098CC0E4FCC7C89154293D12644181181452C4D4551
+ 51ACB7D98AB60694E83C4615E8AD74FA5FB1FAB9451457A078E1451450014514
+ 50014514500145145001451450014514500145145001451450014D90FCB4EA47
+ 195A0063723E86BF237FE0EBFF00195CEBBF0DBE07FC2FD3CF9979E31F12DC5F
+ A44BD59E08A3B64CFD5AFF00F31F5CFEBA30C8FAF35F8DFF00F053D917F68DFF
+ 00838ABF66AF87AAFF0068B2F07C3A76A5731372BE625C4FA84C08E9F3436D06
+ 78E9F8638F1D2FDDA8F7763D4C9A36C47B47F6537F81FAE7F0E3C1F6BF0E7E1F
+ E87E1DB150B67A1E9F069F6EA0602C70C6B1A8FC028ADB61BB23D78E6A356DA9
+ F74920743EDFCE86972AC1BE53CE7F9F1EBF8575463CB148F325772BBEECFC74
+ D17556FDBABFE0E90B88EFD8DE7877E0669F23595BB9F9124B3842EEF4DCBA85
+ E97E319D880E76D7EC6C5084FEEE718C8AFC30FF008262FC4687E0EFFC1CADF1
+ D749D79BECF71E36D53C53A4D8F9A7F8DF515BF840F7786D8E07393C0E715FB9
+ 91CB8881FE1F739CD71605F3294BADEC7AF9D7BB2A7D128A4895977065C91EE0
+ E0D65DDF82748BDF1169DAD4FA7594DABE8F6F3DAD95E491299AD6298C666446
+ EAAAE6188B018CF96BE94DF1A78E749F875E15D4B5DD7352B1D2347D26DDEEEF
+ 2F6F265860B58514B348EEC4055001C9240AA3F08FE2DE87F1D7E17F87BC65E1
+ BBC6BDF0FF008A34E8754D3AE1A2689A582540E84A300CA4AB0F958022BBA56D
+ 99E4F2BF896C7E4C7FC152E2FF0086A6FF0083853F66BF85F11FB569FE1486C7
+ 53BD84BE7959E6BFB846F66B6B5889EF83D79AFD88D8AF9CFF0010E71DFF00CE
+ 6BF1FBFE09F0ABFB51FF00C1CA5FB407C40957CFB3F87B697BA5DACB8C849A13
+ 6FA5AE3EB1C573D319E7DC57EC03B796BB94657AF1D4D70606D294EAFF0033FC
+ 8F5B34FDDFB2A1FCB15F7BD584B02F96DDB2393EBF8F5AFC53FF00820978323B
+ 7FF82E37ED497FA1AA8F0D69235FD3E2310FDD2ACBAFC4D6EA31C0FDDC0F81D8
+ 702BF497FE0A7FFB7D685FF04F8FD93FC41E33BFB980F882E216B0F0DE9CCC3C
+ CD47509148894027EE21FDE39380111BB900F83FFC1BD1FB086B3FB227ECA17F
+ E32F1A5ADD41F107E2F5D26B7A94770BB6E2CECD437D961941C1121F3659981F
+ 981B8D8C0321A2B5A55E115F67562C2CDD1C255E6FB764BEF3F41E8AF3DF8C1F
+ B57FC33FD9F3CBFF0084F3E217827C16D32978975CD6EDAC1A651D762CAEA5B8
+ FEE83597F083F6E4F83BFB40EA6B63E07F8A7F0EFC59A848A5859695E21B5BAB
+ AC723262472E0707922BB3DB43BA3CAF673DECCF56A2AB7DBB2BC14FBB919E3E
+ B9FF001F7FCF86F8A1FB567C34F81F71E4F8DBE21F81BC1F310088F5BD76D74F
+ 600E30712C8BD7208E99CD395482576C1424FA1E8545707F0A3F6A1F86FF001E
+ 0487C0FF00103C13E32118DCFF00D87ADDAEA3B00EA4F932362BB88E52EDCFCB
+ DB91EDFE7F2A719C5ECC2516B724A29A49069C0E453B92145145300A28A2800A
+ 29AEC4038AF9C7F6E3FF0082ABFC1CFF00827BD95BC5F103C41249E22BF5DF63
+ E1BD22037DABDE824852B1290115882034AC8A48201C8C544AA28ABB2A317276
+ 47D21457E7069BFF000557FDADBE3EA0BDF84FFB16EBD0684DFBD86FBC69E208
+ B4792EA23D1843308719CE41479010B9190C08D5BAFDBEFF006E2F8677125DF8
+ A7F638D2FC41A3C407987C35E38B57B919193B220D3492301D846327B81C8E6F
+ AF53F3FB8DFEAB3F2FBD1FA15457C23E13FF0083877E00DB687AAC7F121FC67F
+ 06FC5DA0A037FE17F16F876EA1D515890008D224937E49007DD6C7CC54282473
+ 56DFF072C7C1BD6A659345F86BFB40788B49627FE26BA6F83D24B31FF7D5C2C8
+ 7D701338238AAFAF61FF00990BEAB57B1FA2748C322BF3C7C43FF07307ECFA6C
+ 2C6D7C23A5FC4DF1F78BAFDDA25F0BE91E1895752B79012312094AA738E91191
+ 8775ED50C1FF0005AAF8D97AEB2C7FB0BFC765B07E44936F8660BDC989ED9482
+ 0738CE7F0E68FAED15D43EAB57B1FA22EDB1771ED5F825FF00058FBAF8BDFF00
+ 04F8FF0082D3C7FB49687E1B9B53D0A48ACEE346BEB8B5926D3180D3069F7569
+ 2C89C2484099802C1B120600819AFB5F52FF0083856CEF2FD3C27A2FECD5FB44
+ 5FFC59913CC3E0EBBF0F7D8E6863CE3CE91F2F22C3FF004D3C9E3B81D6AE58FE
+ DAFF00B7AF8DA492F34DFD90FC23A1D834664B58358F1DDA9B861FDD38911B77
+ FBF1A0FE75CB88AF4AAC546EEE9F63B72F94F0F373714D34D34DDAE99F34783F
+ FE0EA3F1F7C52B24B1F087ECC5A86BDAD48A1236D3B5EB8BF567F51043645B6F
+ 7C799ED9AFA7FF00E09ABE3DFDB0BF6AAF8F127C42F8E9A3C3F09FE1BE8F6530
+ D1FC1F6D69F62B8D56F240504B729233DC6C8E366256668F749E5B2C6029350D
+ 9FFC1693C61FB3AEA56D69FB517ECEFE35F8376370C917FC253A54E9E24F0FC6
+ C4E374D340BFB91923E54333648FA8FB93E1DFC4DF0EFC5DF0569BE24F0CEB1A
+ 6EBDE1FD5A117165A958DC25C5B5C21C6195C1C1EFD391B48382315586BB7773
+ DBA3D078AAF05171A34946FF003FB8FC84FF0082F67FC127FE255BFED276BFB4
+ B7C09B2D5AFF005ADD6D73ACD9E8B197D52C2FAD8208351B7451991764718703
+ E6468F761D646F2F8EF841FF00074EFC57F0EE8B07857C5DF03ADBC57E3C842C
+ 0D3595F5CE972CAE30332D91B699BCC272484655C93B554715FA07FB59FF00C1
+ 713E09FECC7E3EFF00841F496D7BE2C7C46794C11F863C1364353B98E6218EC9
+ 1D488D5FE56CC685E55C7318CF3E6163FF00050BFDB83E319FB47827F631B3F0
+ D69D27FAB93C5FE2A8229D0750CF0BB5BB827FB803104F2456135185472A337A
+ EE92B9D54B1929528C3134D4ADB36EC784F87BF674FDAEBFE0B87E27D32E3E3A
+ 4571F04BE03DBDC25CCBE1BB5B56B2BCD6C2B6E0BE448CD3B1381FBCB80B18FB
+ C91B62BF5D7C13E0BD33E18F82B49F0EE89631E9FA2F87ECA1D3F4FB48B3B6DA
+ 08A3091C4B93F7555540C935F091FDBE7F6D6F83F6EB7DF103F63BB2F1268F0C
+ 2AD7171E09F1641737319E4C863B5CCD34A4000840A01ECE4E2AA587FC1473F6
+ D6F8A76F1EA5E0BFD896E34DD1D983AAF89BC6B6B617D2C4D9C7EE67103C4CD8
+ 1F294214F0735B61EAD383E6776DF91C78A955ABA5928AD9268FCCEFF8247FFC
+ 15BF43FF008267FED03F19B50F8A1E0FF126AD7DE3EBF8FEDCFA6889AF74BBAB
+ 79EEDA788C72B206DCF3B6ECBA9568B1839257EF78BFE0E3ED67F69ABD9740FD
+ 9BFF00677F885E3EF114D88E39F5554B7B5B12DF7649C40D2AAA76CBCD1AFF00
+ B62B2BE23FEDA3249E3A56F8A7FF0004D6D5F57F8C1AC3AAE972C5A1D86BB6FA
+ B15525D9B52FB333214C676812614E490066BBDD07F6D0FDB73C1FA2C72683FB
+ 0CF86745F0CAA936DA75AF8CF4F8E684F4C14574230793FB95C818E3A8E4A12A
+ B185B9DEEFEC9E962AB61EB4F9DD2F7ACB7969A1A7FB2A7FC1277C75F18BF680
+ D3BE3BFED77E21B0F1C78F34D6127873C216401D07C2DCF98A30789245603E55
+ DCA190333CC76B2C3FF0500FDB47E2A7ED2BFB6343FB26FECD7AAC1E1DF125BD
+ 97DBBC7FE3629E62F856D0847114041C898A3A82CABBC34F12A346CB2346693E
+ 17FF0082957C64B38F5B9BC41F003E1142EC1E2D045ACF7F3AC7C911CCDB2750
+ 71804C7267E5F976E4E7BFFF00823B7EC07E3EFD8EE1F8C5E2AF8BD71E1DD63E
+ 287C50F1849AA5FEADA3DC3CD6F736610489B77468D1817135E1F2F6AA81B00E
+ 00AE88C79ED469A69756FAF91E5D4ACDDEAD46AEB4496C8A1FB3D7FC1BE3FB39
+ FC23B16BCF15787AEFE2D78CAE9965D4BC41E2FBC96EE7BD97EF339877796327
+ 9F9959CFF13B75AEA3E327FC1093F659F8DBA1496F37C27D17C377983E46A1E1
+ C77D2AEAD1F3C3A985846CC3191BD5803DABCD7F6D7FDAA7E2A7C6AFF82884DF
+ B38FC38F1C3FC27D07C33E0D1E2BF1578AAD74F86EF5195E47291DAC5E706486
+ 25568DDA4501CEF386508C1BF3A7F603FF0082DEFC7EF047FC140BC15F0FF58F
+ 88D27C5BF87FE2AF1B5A784BFE2796D0895E1BDBF5B48AF219D504C8EA1D64DA
+ CCE8572BB4121866EBE1155F616D763AE9E5B8CA945E253D12BEE7DC1A87FC13
+ 47F6CC4F1343F06F4DFDA4B54B6F804B11BB4F184E88DE2F8E1CEDFECB322959
+ 5987512875509C6E000B7AF5EF82DFF06F17ECB3F09B4E1FDA5E01B8F1E6B0FB
+ 9AEB57F136AB3DE5C5DB9249674464841624B12B10E4F24900D7DB1A96A36FA2
+ 69F717B70EB0DADBC4659A47E8A8A0B163EC064F35F857FB647FC16E7C5DFB41
+ 7C17D57C75A1FC68BFF855A1EB1737569E06F04784B4E8AE7C41A9C313054BFD
+ 5AEDF2D662404B2C51152108C090A96AD313F57C32BD430C0E1F138D972523F4
+ 0BE30FFC1BF1FB3778FAC96F3C27E17D4BE15F8B2C4F9DA5F887C23AA5CD8DE6
+ 9F3AF28EABE618DB04679507D0A9C30A7FB0A7ED3DF13FF67BFDA95BF661FDA1
+ B56B5F12F895F4D7D4BE1FF8E921F2478CEC63E648271DAF6351961D5842E58B
+ 90B2CBF9FBFF000415FF0082CA7C6DF1E7EDBFE13F841E3EF146A5F103C31E39
+ 8EF2DE19755027BFD26782D26BA49567DBE6BC6CB6ECAC2566037EE1B4A156FB
+ A7FE0BEFAD69FF0005BC01F01BE2F492AE9FAA7C33F8ABA4CC9A82821A1B0996
+ 517B13300584522429BC0ED183E9829D4A6E1EDE8E8BA862B0B5A856FAAD7D5D
+ B43F410CC01A413E7B75E87B1E95F9BBE22FF82EBF8B3F696D7EF341FD933E04
+ 78BBE3035ACED6D278A75356D27C3D0CA30721DB0CCB8653B64781C8CFCBD336
+ 6DFC05FF000532F8B1642FAF3C75FB3BFC3369B27FB3ACEC27BF9A1C93F2B178
+ 6E13033DA56E839EA6BA1636325EE26FD11C72C2CA3F1B4BD59FA3624CB75EBD
+ 0629D5F9EAFE30FF00828B7ECE08D7DAAF86FE05FC7BD262C3CB69A25EDC68BA
+ CB2A8F9B619962B7E7AED0AE491803240AF64FD897FE0AC1E07FDB07C717FE01
+ D4348F10FC31F8B9A2C7BF51F04F8A6DBEC9A8201925E06385B88C28DD94F9B6
+ B062A01AD29E2A0DDA575EA672C3C92BAD7D0FA9A8A844ECCC3038209CFF00F5
+ BFCE28AEA313E3BFF82BDFFC147F56FD897E1DF877C25F0F74D8FC47F1B7E2B5
+ D9D23C1BA5ECF356190B246D752277546910283F2B3B0CE5558567FF00C133BF
+ E090FA17EC9266F88DF112E97E257C7DF1339BED73C59A97FA4BDA4D2005A3B3
+ 2FF702FDD32E03BE0FDC42235F15FD923474FDB97FE0E00F8EFF0012F55DB7DA
+ 1FECEF630782FC391484FF00A1DEBF9D14B2283C655E3D4813FF004D93BA8AFA
+ 2BFE0A61F1A3C5577E23F007C05F86FAE5C7867C69F17A4BB9B52D7ACC8179E1
+ DF0FD9AA1BEB8B7627E4BA95A582DE16EA0CB2C80AB45B8796A4A4E588ABB46E
+ AC77C6949C95186EFF00AFC8E9BF69DFF82B4FECEBFB1CF882EB48F881F15341
+ D375AD3C037DA5E9F6F73AC6A161900AF9F6F6514D2C395391E62AE579E40C8E
+ 1FE10FFC1C05FB1D7C6FF132693A1FC74F0CDADE4AE117FB72CAFB41864638C0
+ 135F410C649E9C37A0AFC8BFF82A77EDCBF0A7E06784759FD9E7E03F83BC37A7
+ E93A44E6D7C41E2B99166B9BBB904F9A91CD265E562E0F993C8CDBDD5B68C0DE
+ 7F35EEB4FB1D6A26591209A32325B83B7B75C6738C1C8C83F8D70FF6DB72FE1F
+ BBDCFA38F0AC254D3F69EFBE9A1FD93FC45F805F0F3E3AEABA06B1E29F05F84F
+ C5D79A11FB5E8F77A969905E3DA3329C342EEAC064313C1C6707D08A1F16FF00
+ 6B8F847FB3A5F5AE9BE3CF895F0E7C09757480DB5A6BFE22B3D2E4954E42ED49
+ A45241C761DBD8D7E35FFC1B85FB5EFC60D5FF00627FDA8BE15786EF2EBC41AC
+ 7C2FF0A36B3F0DA39C9B892C2FAE2D2F04562824C8F27ED16F03471E0282F2E3
+ 8381F2CFEC79FB1A7C1BF8C3FF0004AAF8A1FB447C60BFF11EBDE3B9B5AB8B1B
+ 7D4A7BD92E266BD68E1789A40F9692591E5CB3BB124020F7CF76271D4A952556
+ DB9E3E0F29A95AB4A84A5B687F4B5A5C9E11860B8F1A587FC2371C7A8DA2CD3E
+ BB0F92AB736C06F576B85E1D02E186588C73C578CEA3FF00057CFD9634BD7A4D
+ 2E7FDA23E0E25D24822703C5F64F1AB9E83CC121418E87E61B4839C57F31BFB3
+ D7ED2371F0EBC3FA6F81FC6977E2EF187C13D3F536D69FE1EA6B3259E937B779
+ 523CE0993E5EE01CA7DDDD96C6E25ABD17F68BFF00829CF88FE3978126F06697
+ F0FF00E15F807C13B7C9874AD0FC3706E82307E5533BAB316DA492EA5724D71C
+ B3BA6928D3833D68F09D695FDA4958FEA5EF7E2F784F4DF86ADE329BC4DE1E87
+ C1D1DA9BE6D75F538534D58383E77DA37795E5E7F88B63F0AF9B750FF82E4FEC
+ B76775325BFC4E9358B5B59DA096FB46F0C6B1AAE9B13A0C906EED6D64B7031F
+ 303BF040C838E6BF979F02F8CEFBC21A6E9FA0DF5D6A9AF7C3FB0D5575B6F075
+ D6A337F61DD5D28C798F6A1846588F959B1B99495CE0D7D11F197FE0AFDF1C3E
+ 2DE807C3F65E20B1F03F83D2216F0787BC31A7C3A7D8C1070047F2A990F41905
+ C8E3A54D4CF972DE9C6E3A3C2326FF007B2B2FC4FE9B3E0BFED05F0B7F6D9F85
+ B73AA781FC4BE12F88BE12D415ACEF7EC73457903657F790DC447255B6B0DD1C
+ AA1B0C3230457C0DF1D7FE08C3F163C0DF156EFC0DFB387C4CBCF85FFB3E7C56
+ 91AF7C6DA42CE5DBC3F2A10251A7E479AAB748DB4A46E83F73B59BCADA8BF8B1
+ FF0004E7FDBDBC47FF0004D9FDB13C3FF13B4BD46E97C3B7D7B1D978D74EF35B
+ C9D634D77C4AD22FF14B08732C4DD55D31CABBAB7F599E3AF891A0FC36F877AB
+ 78BB5CD52CB4FF000D6896126AB7DA94CFFB8B6B5890C8F216EBB42866C8CFB7
+ A1EEA32A58BA7CED59F53C6C7612AE5F5BD9277BEC791FEC63FF0004F6F843FF
+ 0004EDF86F2699E01F0DD8E94C2DC9D535EBF2B36A7A90186792E2E5B0769237
+ EC5DB1AE090ABD2B85F89FFF0005CFFD947E126B7369FA97C64D0752BAB5631C
+ DFF08FD95EF88238587077BD8413A2E0F07278EF8E95F963FB5DFF00C155ACFF
+ 006F6D5758F14FC40BDD5747F811A5DCB47E12F87D6172D6D278B59186CBED59
+ 9082E091BD6DCFC89B54619833B7C75F18FF00E0A6DE21F12E9DFD93E1DD17C2
+ DE08F0CC20A5AD85869B042A8BD0631839C77273EFDABCBAF9D2A72F6385A7CD
+ 6EFB7C8F7303C2D2AB055F1B53953DADBFCCFE897E1E7FC169FF00657F8A5AEC
+ 3A669BF1B3C1B677D712795145ACBCBA319DF8C221BC4883B12400AB92490072
+ 45647ED43FF05C9FD98FF63EF88937843C5BF11166F125A22497965A269579AC
+ 7D803AEF5133DAC4F1C6C57E6D8CC242B86DA4104FF2E3E23F88771F11A493ED
+ D7105D198FCE5540663DC103AFE24838AFB8FF0065BF813F03FE0F7FC121BC53
+ F16FC75E0B8FC51E27D5B5A9F41D061333446DE72A7614C118DBF3C87A9F978C
+ 512CFA6A36942CCBFF0054E8F37342A371F43FA20F827FB547C3BFDA1BE05D9F
+ C4EF06F8BB48D63C05796B2DE2EB625305BC50C45BCD3379815A1688AB075942
+ B46430655C103E758BFE0E0AFD8FE4F192E8A7E32D8477525C1B65BB9342D523
+ D3490705BEDCD6A2DBCA1CE64F33CBE7EF57E31FFC13D7E3CEABA2FF00C110FF
+ 006DCF07C374F1D968FAF784AE3C90ECA122D6F5182C2F230CAC301E1B629818
+ 1F33673B8D775FF05CEF883E15F869F0D3E13FC1FF0009F843C3DA6C571E1FB3
+ F10DF5FDBDAA4772E594A45106500A82C24739241CAE318AEBC566D2A4E9CA2B
+ E247060387D559D485493F75DBA1FABDF113FE0B5DE0FD33C43E238FE1EFC34F
+ 8A9F18B44F074D25B6BBE23F09D85B1D1EDA687FD7450CF713C5F6A9231827CA
+ 0C843001F3C57B0FC0BFF82887C27FDA13F64F7F8D1E1DF1186F03DAEF8EF249
+ ED648AF34FBA46546B396DC0321B9F31D116340CD29923F2FCC12216FE55F5AF
+ DA8BC75AC7C20D0FC012789AFED7C1BA0897EC9A45A482D6D8B4B233BC922A05
+ 12BEE3D5C92030031CE7DB7F636F1478DAFF00FE0957FB5F2F87DB526F0BE89A
+ D781B57BBB8B592546B6993519DA59A2F2FF008808AD2476CE234B68DB8E088C
+ 1E695EB4A4A4AC926D1B661C3F86C3D38384EEDB573EC6FDA6FF006C6D3FE29F
+ ED21FB717C4AF0FD86BDA22E97F0FEC7C1D1A6AD1FD9EED6E649A2B390F9418F
+ 97F36E1B49DCBB7242B3155FCD7FD8EBE25685F05BF6C1F853E34F13ACEDE1DF
+ 05F8C349D7B506814C9288AD2ED276645C8CB031A90A08C918E738AEEBE09F89
+ 5B44FF00827DFC74669079DE24D5FC3BA7EE0796026B8BA71DB3F344A48E464A
+ 9E7A8F9F71B3B151DB9E4FD2BC0FAC4A55DD5EA8FAFA78184307EC2FA35F83D0
+ FEA7BE10FF00C163BE02FED11E39F0CF82BFB5AFB48BDF8908F6BA026AD6EA2D
+ F5894A92F6A2689E48E398AB0C4533233160AA0B10A7F1A7FE0A31FF000435F0
+ 4FEC0BF10DADEE3F694F867E1EF0D6A7E65E691A2F892CEFA7F105BD9191B683
+ 6D6315C4B711865743379681D930464607C53FB24F86F5CF89BFB6DFC19F0DF8
+ 3E19AFBC5971E36D227B28E25F324B430DD24AF3BF076246AAEEEC7EEAA92720
+ 71F797ED49E24F0AB7C5DFDBE3E227C41D0EDFC6FE2AB0F1AC3E0EF0C36A40C8
+ 34D777BB82168C93F2986DACD0823FE7901D1D81F72B62B9B08AAE221777D0F9
+ 6C2E5CE8E3DD1C2D5B46DA9F71FF00C1BC7FB04FECE7F0AACF54F885E03F8B1A
+ 47C6EF89515BFF0067DDEA11C0DA7FFC2330C8033450E9D37EFE032F469E51BA
+ 454C208D1A446FBC3F6B3FD8B3C0FF00B6BDA78534DF88D632EB9E17F0AEADFD
+ B8345694C769A8DE246D140D3EDF99D116490840C15988DC1972A7F9E9FF0083
+ 6D3C417DE19FF82C77C3EB5D3EEE7B5B6D7B43D6B4FBF8E26291DF40966F3846
+ 5E8504D146E07F7901F5AFDDDFF82A2FFC149BC3BFF04D7FD9E1BC4D7B6C9AFF
+ 008BBC4131D2BC21E1C8A5DB3EBB7EC32178E4431821A493185185CEF740DE8E
+ 12A539E1799AE55D4F0F32C2D78637D9A93949EC7A77C4BF8C5F0AFF00620F83
+ 70EA3E28D63C23F0CBC11A420B7B559DE1D3ED22C64AC3044B8DCE7F8638D4B1
+ 2701735F0D7C59FF0083A77E00F826794786FC21F18BC796287E4D4EC3408AC6
+ C24C1E79BD9E0981EE03440938AF857F6A6FDA1B49F837A8DBFC44F8FF003587
+ C69FDA1BC416FF0068B3D227E741F04C128052D6DADC968E18930065B32C8416
+ 623733B7C27FB417FC148BC71FB4D8B98EFAE2DD747B28F7B69FA0E9A905B5A4
+ 7D76B32AEFDBC6371254E0F18AF2A59C55A93E4C243DD5D4FA0A3C3342953553
+ 1F52D27D0FE81FF64FFF008392BF667FDAA3C5D67E1AB8D53C49F0C7C43AA4CB
+ 6D656DE33B38EC6DEF657E0225DC12CB6EAC4F00492212480064815DA7FC15EF
+ FE09D771FB647C2BD3FC69E05BDBEF0CFC6EF85664D5BC19AC5849E4CF23AE1D
+ ACD8F712141B09194908FE07903FF2CF8B5F13E8CC9F24F04F1601DA3E65E0FD
+ 00C918C139F415FD0E7FC1AC1FB7AF883F6AEFD8FBC49F0E3C61A84DACF88BE0
+ 95EDB6970EA3336E96E74AB8590D92BB75778CDBDC441BFB91479C9CB1EFC2E2
+ 7EB7174EAAD4F2734CA9606D5E83BC59F50FFC121FF6F25FF8287FEC77A4F8B3
+ 56B7B7B2F1B68B33E85E2BB251B45BEA3001B9C21E5565465902FF0001774E4A
+ 31257CD7FF0004F1B25FD9E3FE0BDBFB587C2DD2848BA078C749B4F1EA459FDD
+ DBDC16B67982AF45CCBAA4A3E5032235CF228ADA8E22718F2F6D3EE3C7AD878F
+ 35FBEA59FF008218CCBA77EDE3FB7B69B30F26F93E284D7BE530F9FC99AFB556
+ 8DBE8793F88F5AF957FE0E58FDA5BE217EC89FF053FF0087FE28F0B5FB6936DE
+ 24F85D3685677880F990CDFDA172F72533C060925B618720B0CE38DDF457C65F
+ 127FC3B2BFE0E02F0FF8AA519F027ED5FA6C7A35F5BDB7EF24B7D62268214944
+ 4BF311E6983E73C017939FE0E3E9BFF82C3FFC1283C2FF00F055EFD9C22F0D5F
+ 5F2F877C6DE19B87D4BC29E2010891B4CB9650B24520EAD6F32AA2C8AA47291B
+ 726300E70A2ABD09D09777F99D94F11F57C553AFBAB2BFDD63F975F87FE28D23
+ C1DF17BC2FE23F16784E1F885E1DD1F525BDD5BC353DECB66BAD42092F134D1E
+ 59739C82414C80194A654FEACFC3CFF82797EC0FFF000550F0AE87E20F87175F
+ 113F665F14F886636F6DA75CB3C5A66A5741829860FB579B6D33FCADB22B59A3
+ 90AFCC6302BF337F6BAFD8CFE317FC13CBC6EFE1DF8CDE09D4B425695A2B1D7A
+ DA3375A36B007DC7B7B91F23671BBCB62B228650E88783D0FECA9FB7878F3F65
+ A8AF2D7C39AA58EBDE0DD68B2EAFE16D6A25D4B41D694F0C9340FF00202C171B
+ D086F97AE383E3D3AB5709174AA474BEE7D7D5C2D2C7B55B0D579656D8FE8F7F
+ E0925FF048CF057FC1273E1C788B4BD035BD63C5DE23F18CF05C6BBE20D4A248
+ 64BB10232C30C71264450C66499829776DD2B65882A07E2AEB463F03FF00C124
+ 3F686F08C6D0471F877F682BDB18D221F208D1F6E147F77318C7A0AFB37FE090
+ FF00F05E6F0DF8BBF6B3F0A7C0FB8D27C41A17857C796EF06870EA7A81D463F0
+ D6A91A1616305C3E246B298248228E5CBC2E1114089D027C01FB5778EA3D1F47
+ FDB03C250EC861FF008689D76E61857808A2F6E02E063A003F9575E695635307
+ 19C5697479991E1AAD0CCA54AABBBB5EE78EFEC05FB0EF8A7FE0A37FB56E99F0
+ 9FC29AD693E19B99F4DB8D6750D5B5088CD1D959C4514B2C4854CCECF2C68172
+ 3EF7240C9AB1FF000510FD82BC5BFF0004CCFDAB24F857E2ED6347F134B71A2C
+ 1AFE95ABE9F0F9297F672C9343BDA2258C2EB35BCC8537370A1B382057D2DFF0
+ 6BAEA10DBFFC16344523AC6F75E01D5A385719F3184F6AC71E9F2A927E95D27F
+ C1DA50496FFF000561F02B1475827F853608AFB78665D5B562403EA37827FDE1
+ 4A38587D439EDA9D13CCABFF006AFB1E6F7763F35EFADEFF00519AC74ED261F3
+ F54D52F61B0B48F04EF96575441C7FB4C2BECCFF0082ABFF00C10E3C6DFF0004
+ 99F847F0F7C75AB7C44D27C79A4F8B3534D07568E2D35AC5B49D4A4B79AE1121
+ CC8FE7C25209C798DE5906304A7CF85F8C6EAE1ED3C45E1D92391A39575AB265
+ 7538643E72720FA8C57EFD7FC1E2616DFF00E09BFF000D64FE26F8B1A6E73FF6
+ 08D631FE7DCD180C342785949EFA959C63EAD2C7D38425A687F3FF00E28856E7
+ C3976BF74346C339C57EB6FF00C15CFF00E0A13A86A9FF000458FD907E175A5D
+ C8BA87C5CF07E93AAF8A5D66DCEF63A75A5AAF92C7AE2E2F36BF5C916AEA7393
+ 9FC94F129FF8A72F1BB79441FA1EB5EE1FB6E6B17777E1EFD936CEE15A3B5B3F
+ 80DA6BDB069372C85F57D5F748A3B67685C1FF009E759E02A38E1AA336CDA8C6
+ A63E8F36F75FE67967C46F8892EA16CD7133B2D9D8C7E5C310E02A8F45E991DB
+ A7A640AFD0DFF82227FC1B9B6FFF00050AF8509F19BE38EA9E22D17C09AC492A
+ 785FC3FA5CA2D2EB5B854ED37B34CCACD1DB960CA88AA1E4C6FDCA9B44BF979F
+ 12226D4ACEC6C7ED096DF6EB85B769A4FB910660371F619CD7F6B5F09BE17E8F
+ F057E147877C1BE1FB55B3D0FC2BA55B68DA7DBA71E4C16F0AC51AE463A2AA8C
+ F15D192E1A3C8EAB57BB3CFE28CC6A7B55460EC91FCDE7FC17FBFE0837E1DFF8
+ 2577853C35F15BE136B9E21BDF87FAC6AA9A1EABA46B138B9B8D1EE6449248A5
+ 8A55552D03089D0870591F67CCC24017CE7E23F8D98FFC119FE1068EACC4EADE
+ 3CD5EFD941FBC60B7850FE199FF5AFD36FF83C57E3F693E0BFF827D7843E1E99
+ A06F10FC42F175BDC5BDAB1225165631C924F3803FBB2C96D1E1BFE7B0C720E3
+ F1BFC55E2F37DFB0AFC1DD1096234BD5B5FB874EFF00BCFECFC7E7B0FE35CF9F
+ 5285E2D6F73AB84EA55A919467A9F417FC1347C2035DFF0082467FC142350F3A
+ 16416FE10982DC447645F62BEBABADF900F3F37031C1507B83587FF058DF147F
+ C257F1EBE1EDC2C9B97FE15AE80011D0FEE5CF1F99EBE82BE9CFF8218FC3197C
+ 6BFF000415FDBAAEB6CCD2EB116B96501560A1A7B5D01264E719FBF3267DB18C
+ 1C93F08FED97E385F88F77F0D3562CB279BF0FF4884BAB7DE31ACC87A7B8AE7C
+ D29B8D3A2DF63AF87EB2A95B1125FCD7FD0FB7BFE0DB9FF825DFC15FF8284780
+ BE366A9F187C1CBE321A46B3A7697A623EA57962DA7AAC124B2796D6D2C6C0B9
+ 78F77382100C609CFEE27C08FD89BE13FECC3F0225F867E07F01F87F44F01DCA
+ 48B79A3983ED506A5E6A0495AE4CC5DAE19D0056694BB300012702BF2AFF00E0
+ CE0D6A497C15FB45E9A557CBB4D7B48B9079DC5A5B6B856CF38C6215EDEBF87E
+ D3C9CF5E9D6BE9B0B18FB28BB743E2734A93962669BEA7F26DFB5E6A1A1783AF
+ 7E38F86FC2DA7D9E8FE1D4F8CBAB59E9B6164A52086CAC66BB8ADD635ECAAB20
+ C038C6E383800537FE0901FB15785FFE0A15FF00051CF0D7C31F1C47A84DE119
+ B48D4754D523B1BA36D3BA43091180E01C2F9CF167D471DEBC2FC4DF14BFE167
+ C3AAEA5E7798BE21F12EA9AE3B3B31C9B99B702D90727193CE71E99AFD12FF00
+ 8347BC20DE22FF00829AFC46D7E48D9A3F0FFC3D96CD0F1B6392E750B220F5EA
+ 561900F6CE7078AF9DC0D252C6C935A5CFB6CDB1128E55169EF14BEE3F63FF00
+ 60CFF823CFC02FF826D5DEA1A8FC2DF07358F88B5687ECD75AF6A37926A1A93C
+ 3B831896590911465829658C2872AA5C31518FE7EFF6C6F13CD71E24FDB3ED24
+ 99A495FF006889554B80C424777E23551F41F20AFEA858EE438AFE4BBF6F8BB5
+ F0D7ED7BFB57E891CCCEB7DF1A2FB5020F507ED5AAB9FC3F7E7F4FC7D0CF55B0
+ B65DD1E0709C9CB1CDB7BA67A1FF00C1BB9AB4163FF05ACF83F6F2B6C92F2CB5
+ D8E21D7CD75D22E9CFD3E5563F8547FF0005B8FDBBB55FDA9BFE0AB9E34D4EC6
+ F0CBE1DF83D7CFE10F0DC59FDDC525AB1179718E8CEF7424F9C004C690A9CEC0
+ 6B17FE0DFE213FE0BA5FB3E2FF000AA6BE7D7A787F521FD2BE498354BAD7BC41
+ E22D4350597EDFA86B77D7173E690CE25798B3EE61D5836727B9AE5AD2E5CBD2
+ 5D4F528C154CE1CBAC55CFB13FE0917FB06C1FF057EFDBEB50D27E216B771FF0
+ 86F84EC07887C4D0C57261BDD6A3DE9145628CA43C5133380EEBF32468554AB3
+ 23A7EF67ED75FB48FC11FF00823E7EC773DBD8F87FC2DA0C335B3E9FE16F0469
+ 96F0DBCBE25BD9079690A40B82E19997CD95B3B54B339C9C1FE593C13E2EF107
+ C24F1BC7E28F07F8A7C53E0BF10448D126ABA06AB3E997411B6864F3A1657DA7
+ 68C8CF38E6B2BE21FC67B8F1978D26F1278BBC5BAF78B3C4D30559758D5F539F
+ 53D45F6FDDDD712B331DBD817207D2AB0B8C8D3C3FB2A30D49CCB2AA95F17ED7
+ 115172FA9D4FC4FF0081375FB3378BE6F0AEA7A969F79ABE982397526B221A0B
+ 5B87512491020E1BCB24293D370206369CFEC67FC19A1F07B56D23E127C7BF89
+ B3C260D0BC69ADE99A2E9ACEBB7CD6D363BB799C7AA7FA7C6B91D59187556AFC
+ DAFF00826E7FC1237E327FC15BFC696F73A4E9F7DE0BF84AD387D6BC69A9C0C1
+ 6E577832C7661866EA73961853B031F9D97383FD327857E085AFEC23FB0F4BE0
+ BF823E13B5BE6F00F86EE13C35A1CD72231A9DD246F220965C72F34E4B3BE065
+ A4270B9AEACBB07521CD5AA3D5F43CDCFB30A357930B86F8627C6BFB1DDCFF00
+ C2D0FF008392BF699F14E96A27D17C25E09B3F0ADD4E8DBD56F18E9AC578E843
+ 5ACEA41E7311F700AB5FF06C6E93A3F88FF645F1E78FE6D5AE75AF89DE3AF1A5
+ EDC78EA5BB83C9BAB6BC462D1C4FD0B06498DC671F7EEA45EAA68ADF0B4DCE1C
+ EBAB7F99E2E226A33E57D2C667C15F0FAFED4BFF00072AFC55D7BC45B2E6CBE0
+ 2F846CF4CF0E5B4A377D9A69E2858CC3A8241BABC6048C832273F20C7D3FFF00
+ 0518FDB0B58F803A87817C0FE15D6344F0CF897C7EBAB6A33EBDACD8BDFDAF87
+ 345D2AD7ED1A8DE8815D3CE994CB6D1C68CDB7339765758D91BE67F875A927EC
+ 95FF00072A7C42D3B5A7367A4FED0FE0CB6BDD0A6906239EF6DA3855A2DC78DC
+ 7EC976768E72F18FE219EBBFE0E0AFF82777C40FDB4BF67EF0EF8B3E115D5D0F
+ 895F0C06A31DBE9515C087FE120D2F5186386FEC41242F98C90C2CA18E1846E9
+ D64041479BD94DD3DEECD23C8EB53753E1D17C8F943C55FF00073C785FC07E28
+ 5F08F8EBC3D6BFB45FC2CD62D3CBD4B55B0F0CFF0062DF45F3731CBA7DDC925B
+ 5EAB6D0C3E7B71F36304A927F2F7F6FF00F8D9F03FF681FDA8A4F12FECEBF0CF
+ 5EF861E03BAB044BFD3F5131431CF7C5DDA49A0B48659A3B584AF96364726C3E
+ 582123C1DDE37AD5EB783BC4779A2788ACEFBC35AFE972886FF4DD5E06B1BDB3
+ 95460ACB1C9860C38FBDF37CD8E84834B55F1CE97A447FE917914AE38D88C246
+ 39C02473D1B8CE39F4F4AF22AE2711521EC2A46EFB9F6387CBF0546A7D66954B
+ 25D2E7B97FC137BC1FA8F8F3FE0A9DFB34E9FA4C724DA8C3F11748D465F2C7EF
+ 16DACEE52EAE338E594430CA4FB75E82BA8FF8290EBB71A47EDEBFB4E682D1BC
+ 1F6AF8ABA9DE7964637E657656C7FB41C37D1ABF47BFE0D8CFF8243F8C3E1E78
+ FA6FDA63E2C68175E1DBE934E92C3C0BA16A1198EF6DE19D409B52963601A169
+ 21FDD44ADC94926620068D8FE77FFC1757C03AA7C12FF82CD7C68B4D761B8B5B
+ 7F165E5B7887499E65223BC827B68C8923233B943A4B196C60340EBC91CF457C
+ 23581E47BAD4E0C36634E59ABAA9FBAD5AE7A87FC1B2E07FC3EAFC3381B47FC2
+ 21AC103FED9A57A87FC1DDF2ECFF008294FC2752CDB4FC3E185F42751BACFF00
+ 4FCABE66FF008219FC608FE0DFFC166BE07DF5ADADC6A8DAEDE5DF8667B7B562
+ CE16EED6485652307E589CA48FDB6AB1257B7D9FFF000789FECF3E24D3BE367C
+ 20F8D10E9B7B75E0FB6D226F0B6A97B1216874CB95B96B883CD2012A2512CA14
+ 9E33091D4807AA945CB01CAB7B338B1528D3CDD546F4BDCFC87D50E75AF0EE3A
+ FF006C59FE932D7F409FF078BD84D7DFF04CAF01CF16D68F4FF8A5A65C4C73F7
+ 50E99AAC43EBF33A8C7BD7F3D3E27F11DBDE58DA9D36E16E35117314B66B6FFB
+ C7790382802F524B6076C9E315FD1D7FC176BE00FC58FDBDBFE0849E1BD413C2
+ 578BF1474A8340F1C6BDE14B2B7692EA3B95B53F6FB486304B33C26E653B0658
+ 88180DCC402B2BA7258771922B882A47EB909A6ADA33F9D4F13BE7C2970411BB
+ CB054FBF18FD6BEEDFF82ADFECBD3786BFE09A5FB097C6CD2EC19B496F87969E
+ 0FD6E68D73F679194DEDA13CF491E5BECE7015828E77015F9ECFF1274B9F4192
+ 0B8904770CA61681D4EE071D0E01C10783DF39F4C9FE9ABFE0981FB1D5F7ED9D
+ FF0006FBF80BE107ED03E1EBCB38B5ED026B082DEE2DFECBA85859C577236957
+ 0063E49A3852DA44246595577A9CB06CB2FC2CB9274E6B73AB3CC7D38D7A35A9
+ B4EDA9FCD578F3C3FF00F093680F1A6DDDC3A9DC0020E08E7F43E9D79E87F5C3
+ F639FF0083BBFC4DF0E3E04E87E06F88BF06F54F1D7C43D2608B49B2D634FD6D
+ 2CE1F1030C470BDCA4B1B3432B7C9BD94B8762CC1501083E15FF008284FF00C1
+ 32BE317FC128BC7375A6FC40D16F75AF01BDC18F44F1CE9903369BA8C44E104A
+ 413F66B8200061908390E50C8987AF9DA0F1B68378AB2477B6AADD40FBAC99F6
+ 1EE7BF07BFAD73D2A989C1DE0A375D0EBC451C1666A3579F95F547DBBFF055DD
+ 7AFBF686F105E7C42F8E9E35D335DF8F1AD3C167A3781FC2F762E743F869A4A3
+ B486DE79D4B24974F93F22B124BC8EC48D807CA9A9EB26E3C05A4E9CAD91A74B
+ 72EABE9B8458FCF68AE6BC2377A97C4CF16597867C09E1ED73C63E23D40886CB
+ 4BD16C25BAB89BFD858E352C4EE39E011C939E49ACDBEF1BB784B52BDD27C456
+ 37BA2EBDA4CAF677DA7DDC0D0CF6B3C6423C7223619194A90430183E95C75A8E
+ 22B4BDAC91E96131581C347D8D292BA3F7FBFE0D5DF86B0F8E3FE08C3F143465
+ 86411F8CBC67AFDB49FC3E6F9BA6D95B6E5DC08E8A0720F22BF0AED7C607C61F
+ 0CBC0ECCDBA4D37431A7B0F4F2EE2761F9ABAFE46BF78BFE0CF3F8A5AD78D3FE
+ 09E1E34D16F3497B7D17C3BE37B91A4EA022758EF84F0432CA9B88C334721249
+ 18C09541031CFE0FFC5BF87775FB32FC78F887F0FF00C490FF0063EA9E0BF11D
+ F583DB4C04388D256D8C8371F9194AB2E09055D48621857AD9A5073C3C6CB53E
+ 7787710A9E36A464F47F9DCFD9AFF83361F7E97FB4B7AFF6B6860FFDF9BDAFD9
+ AF89F7F2E97F0E7C41750C8D0CD6DA6DC4B1B8EA8CB13107F022BF1FFF00E0CD
+ FF00016A163FB3CFC72F1C35A5DC7A678ABC5569A7D8CF226D8AEBEC76CE6468
+ FBB00D7201232320A824A9AFD8ED56D61D674DB8B3B98CCD6F771B432260E1D1
+ 810467DC57AB858B54629F63E771D522F1139ADAE7F125F0B65D9E05D3CEEDBB
+ 54E37311DF39FC011D39E78C57E81FFC1BA1FF000524F857FF0004D5FDA63E29
+ 5DFC61BAD43C3BA4F8E34BB2B5D3F5A8B4A96F61B1782599DA39440AF22AB895
+ 4E5548F93E6FEF0F90BF6A7FD96FC49FF04E5FDA7BC57F083C6F6B716371A1DE
+ C8747BF997116B3A7B3B082EA16C619645553C00032B29DACA56B8AD5355D346
+ 9D235C4F66D172BF348A4773838C9EE7AFAFE15F3DCD530F8A72516D33EDA54E
+ 862F2E8C65349A47F681F08BE32785FE3D7C3ED2BC5BE09D7F47F15785F5B8FC
+ DB1D534CBB5B9B5B9504AB6D75C8CAB02A41C10CAC080462BF947FF82AC69D27
+ 863FE0AB7FB4A697FBFDB2F8E67D40ACABB4FEF944DC7A8FDF1C7FB254F7AFD7
+ 4FF833EBC29E2BF0EFFC13B3C6579AC5B5F5B785758F1B5CDEF860DD46E82780
+ 5ADBC73490E7FE589955946C1B77A4B8C9CD7E70FF00C1CB5F04F56FD9EBFE0B
+ 0DE30F166AD63358F85FE2E69DA7EADA2DFB46E6DA692DECEDECEE63DFCAEF49
+ A02EE01CAACF19C6194D7AB98C5D6C2FBAAEF7B1F3391D48E1B308DDD96AAFEA
+ 733FF04026D9FF0005DCFD9F7E60BF26BE013EA740D4B15E37FB6DFC089BF652
+ FDBE7E367C37B8B66B25F0EF8BAF5F4F4900DD2585CC9F69B37C707E6B69626E
+ 07F17E5E79F097E38F8B3E0A7ED1BE03F1AFC25BA69BE25E85AA20D020B3B74D
+ 425B99E4CC5E579186DFE60764C0C921CE30D8AFDF0FF82E8FFC1137C63FF050
+ 3F875E13F8CBE02D3F4FB1F8FBE1FD0A0B5F1268A25F22DBC4B0AC7BDEDE3624
+ A8B886667111770AE8DB4BFCA8473430EEB60FD9B5EF23D2C463161734F6ADFB
+ AFAA3F087E185DF80746F8D7E17BEF8ADA0F89BC49F0CE19E45D7AC3C3D762D7
+ 52785A27557859885DC92147DA48DE10AE46EC8FD48F0A7ED05FF048BFD90BE1
+ D45E30F03FC3BBCF8A5E368904969A16B3A46ABA95FF00DA00F944BFDA00D945
+ B4904B283C2B322C84007F273C5CB7DF0E7C637DE19F1968BABF843C4FA63F93
+ A868DAE59BD95D5AB8EAAD1C801E4107040CAB02335464D7747B21E71B9B156C
+ 9218F2413DFA1F6E0700700609078F0F8BAB855ECE50D4F531D97E1B1F255D55
+ F77D4FB73F6B5FF82B278A3F6F1F03DEDF78EF5BF14E8F6B34D241E19F86BE0E
+ D44E8FE1EF0E5AA2A24735ECA1449A84CDCE13851F314F2C38897EE8FF008344
+ FF006A1F88BF13EC3E327C3AF10788B58F147817C051E9775A1BEA333DCB68F2
+ DC9BA592DA191C96F259600C23CED42ADB42EF6CFE4FFEC51FB077C64FF8294F
+ 8C21D13E0F7846F2F34CF38457FE2BBF89AD743D214752F3B0C17E4B08A3DD29
+ E4EDC648FE92BF624FD8FF00E17FFC109BFE09F9A9DACDAB2C961A0DBCBE21F1
+ 878A6EA310DC6B978540690264ED5E12186056247C8BF33BB3B76E0615F9A55E
+ BBB2EC78B9CD4C1A8470D868DDAEA7857FC11A7488FE1EFF00C1543F6E2F08E9
+ 79B7F0EC7E23B2D562B5C8658AE2696F6490A8FE107CCC63FBAA9E9456E7FC1B
+ B9F0DB5CF17780BE2F7ED15E28B26D3F57FDA23C593EB3656F20F9A2D3A19A7F
+ 288CF214CD3DC2818C148A3604AB2D15DF8185A92BF99E062E57AADFA7E47B3F
+ FC1583FE09B8DFB7DFC26D16EFC33ACB7847E2C7C38BEFEDBF056BE84A359DD2
+ 946F259C02CB1BB4719DCBF323A238C80C8FE4BFB16FFC16AEC74CF10C7F08BF
+ 6A6D39BE0AFC6CD0A35B5BA9B568C5A689E21C6545CDBDC7FAB8C3904E4910B1
+ FF0056E41D8BFA1C62CAE32C3E95E67FB4A7EC6DF0BFF6C0F0847A1FC4CF04E8
+ 3E32D3E062D6FF00DA16C1A7B3638CB4330C4B0B6001BA365240E49E68A98792
+ A9EDA96FDBA3146AA71E49EC637C75FD8C7E087EDABA45A5D7C40F877E03F883
+ 0B45B6CB50BFD320BA99226E7F7173B7CC5439CFC8C01C9EA335CE7C12FF0082
+ 597ECD7FB2D78817C45E09F82FF0E7C3BAC5893345AA47A44525DD991D5A39A4
+ 0CF1E067EE91C67E95F3C5E7FC1B7BF09FC257B3CDF0DFE26FC78F85514C726C
+ FC39E2C296A1739C01244D2B7FC0A4383CF38A7DB7FC1B97F0DFC5BB17E227C5
+ EFDA0BE26D9AB0CE9DAF78BCC966EBD402A22F333C724483DB14296217D85F78
+ F969DBE37F71DA7ED57FF05EEFD9CFF656F1EE9BE1BBBF16B78B7529AF23B7D4
+ DBC34A351B7F0FC2CC14DC5CCCA7CBDAA4F31A334BDB66702BD8BE2C7ECE1F00
+ FF00E0A61F0AF47D43C5BE15F00FC5AF0ADC4467D27539228AEFCA47C066B7BA
+ 5F9E3CEDF9BCB7539400F4C0D0F837FF0004F0F823FB3FFC2CD53C17E13F863E
+ 12D37C37AE41F66D52D5EC16E8EAB1FF0076E649B7C9381FF4D59B15F2EEB9FF
+ 0006FF0068BF0C7C577DAC7ECF7F1A7E2A7C003A949E6DCE95A45FC97FA3B363
+ 008B7774738C0C0791C01C00A38A57C42D5A4D7608C6874BA7DCF78FD95FFE09
+ 39FB39FEC53E386F137C31F851E1BF0BF889A16B74D5019AEEEA08DC61C4525C
+ 3B988302437965770241C826BBBD0FE3EFC1FF00DA5B59F147C3FB1F14F80FC7
+ 17DA50365AEF8745EDB6A0C8300B24D6E490CBCE1B2A406054E18103E47D53FE
+ 08A5F153E2ADBB697F14BF6CCF8C9E2CF0A5C26CBCD2B47B54D13EDAA7AAC8E2
+ 599590F1952878F43C8E8FC71FF06E5FECB7E2BF07691A7E97E11D6BC1DA9689
+ 17956BAE681ACCD6FA993924C923485E3924DCC4EF78C91D06140503A9886F48
+ 2F9B1F2D36AF39BBFA1EF5F077FE09CBFB3EFECF3E33FF00849BC17F057E17F8
+ 575F4DC63D474BF0D5ADBDD41918222754DD182091B5300F239AE43C51FF0005
+ 83FD9A7C13F1ED7E19EA7F183C236BE236422476B9DDA7412860A6092F3FD42C
+ D9CE519C118C1C1E0FC69E2CFF0082627ECD5A378A35EF0BFC40FDADBE3B6BF6
+ 3E1B611EA7E1CD57C65BA1B61F2C6239C0B7E5732200176E770ED5EDBA37C11F
+ F827E7847E0F4DE038BC3DF0AE6F0EDAC515FDC1BDB67B9BD4120411CE6EE456
+ B80E44C815848081260601C5612C73BD9CA2BFEDE47A6B21C64926A8D492FF00
+ 04B6FB8FAB744F83FF000875DF14FF00C2C6D37C2BF0EAFB5C66373FF0945B69
+ B6735D1C0DE5C5DAA97E07390DEFDF35E11FB69FFC16FBE04FEC6D731E96DAE4
+ 9F10BC552483CDF0FF00840C7A9DEDBC2BF34B2CC4388E258E30EDB5DC31C74C
+ 648F0CF087FC11AFFE09F7F1BFE2443A4F8574F6BAD5A4805CA69961E24D4B0D
+ 1941306DCEC58028CAC0071C638AFB5FF658FF00827E7C1BFD8B34E921F867F0
+ F740F09CB3C6209AEEDD5A7BE9E31D11EE652D33AE79DACE4679AD2352B558FB
+ 8D7AA7738F13837869258884A32B6D24D3B7CF5EE73DFB2F7FC146BE02FEDDBE
+ 1A8E1F05F8FBC37AF5C5EC262B8F0FDF3ADB6A4836E5D25B29B6C85474242B21
+ C1C31193587F107FE08CDFB277C4CD5BEDDAB7ECFBF0A9AEA47DEF25AE830D8F
+ 98C7A9610840C4FA9EB59BFB4D7FC10FBF665FDAB3559B54F10FC33D2F4BD766
+ 62EDAA787E47D26E1DC9DC5DC405639189E4B488C73CF519AF24B7FF0083767C
+ 27E19812D7C33FB42FED41E1BD37387B2B5F1AA08553FBA98B71B78F5DD56A58
+ 94B96694BCEF6FC0E6E5A1F126D1F4CE87E0DFD9DFFE09BDE0667D3F4EF84DF0
+ 4F42BA2239268E1B1D063BC23180EFF2195B38EA589ACFF1D7EC31FB32FED9DA
+ BC3E3ED7BE17FC1FF8997D788A575F9347B1D45AF5571B775C053E6803180CC4
+ 60E3815E41F0CBFE0DE0FD9A7C19AC4BAA789342F13FC52D724528DA9F8D35D9
+ B509C8208E553CB889E786284838208201AC8D6FFE0DAFFD9867D424B8D0F48F
+ 1A783D663978346F13DC246C0670BFBEF3085192300F426AFDA623F957DE1ECE
+ 82D9BFEBE67D29AF7C76F819FB16C3E1BF01DE789BE1BFC31B7BE912CB45F0FA
+ 4F6BA5A0CE7022814A88D09F941DAAB92AB9CB00797FDA87FE0951FB3B7EDB3F
+ 102D7C57F13BE14F85BC57E26B685221AA4A2582E678D7EE24AF0B2199578016
+ 4DC00E38079F3BF0CFFC1BE3FB28F87FC21AC6933FC335D666D739B9D4F53D5E
+ EEEB510DC10D1CED26E88E4024C7B77630DB8715C7E9FF00F04185F873A7B697
+ F0EFF690FDA43C0BE1F527C8D2ACBC6528B5B452412B1222C6A9D38382477279
+ CA53AEB5715F79518D25F0C9A7FD799EFDFB457ED2FF0005FF00E0941FB2FC37
+ 5AA2E87E0DF09F86ED4DAE87E1DD2A08E196E9941296D696EB8DCC49249E02E5
+ 99C81B9ABE11FD977FE0AC5F187F64CFDA4A7B8FDAEFC3BA97813E1BFC7E9BFB
+ 7BC25A85C8F36DFC1AD85863D3EE08FF00569E4A425F7287476F31D71248E9F5
+ 7FECC3FF00044AF84DFB3F7C5EB5F88FE20D4BC6DF17BE23D8BACB69E21F1D6B
+ 0DAB5C5848A72AD0A90A8194FCC19C3BAB004302063E97F8CFF023C1FF00B447
+ C3CBEF09F8E3C3DA6F8A3C3BA926CB8B1D42212C4C7B3AF7590755752194F208
+ 3512A75E6F9AFCB6E838D4A50F76DCD7EA717F1FFF00653F839FB7B7C3CD3AD7
+ E217837C1BF12BC3D220BBD3E7BB892E9620C3FD6DB5C2FCC8194FDE8DC6E1EA
+ 2BC5FC0FFF000407FD8DFE1C6BB16A9A77ECFF00E07B9B8848C26A627D52DF8E
+ E61BA9248DBE850E4E2B98D33FE086F67F026598FC05F8DBF16FE0ED8CB29986
+ 8D6FAA9D4B47898F75B59B827FDA62CC7B935A2DFF0004C7F8F1E27DB6FE26FD
+ B2BE275E69AEE5A68B46D1ACF43B8208C7CB3C1F3A9F7FD2B4E6AAB78DD8BD9C
+ 378CCF5CFDAD3FE0A07F047FE09C9E15D1A1F1E78A34BF0CADD186D34CD1ECA1
+ F36F0C3909BE2B68B2CB6F10EAC17680B81B98AAB74FA968BF077FE0A11F04EC
+ E4BCD3FE1FFC5FF87DAA38B8805D5B5B6B160D22AE0300E195264DC4740E873F
+ 74F15E6FF043FE08E1F017E0BDDEA5A95D783D7E2178935A8648751D6FC6D31D
+ 7AFAF564187DC67050160482CA818824124122BCBBC45FF06F0FC19D3BC7579E
+ 24F867E26F8ADF04F52BE3BE58FC17E257B3B72D9C8215D5DD403D115D506480
+ A07153CD88BDDA4D76DBF10E5A16DDA7DCFA13E0CFEC17FB3FFEC8DAACDE24F0
+ 37C28F867E03D4AD6072FAC586876B69716F18521BF7FB43AAED2770DC0119CD
+ 780FC40FF8385BF669F00FED131F80EE3C4F79A8696ACD6B75E2ED3ED0DEE836
+ 7779DAB6C6742CD21203E64895E35EED8DCCB9A7FE0DECF03FC42BF864F8B1F1
+ 9BF682F8C3610B063A4F88FC633496129073F3281E67503EEC8BD2BEB1F0AFEC
+ 4FF097C17F037FE159E9BF0EFC210FC3F65DB2682FA5C53594E78CC92A3A9F32
+ 43804C8FB9C9192C4F347FB4BD6368F96E17A517AB6CE7BC51F0BFF67FFF0082
+ 8A7832D751D5F41F855F1A34341B6D6EEE2DAC75C86DCF2711CBF3846E5BEEB0
+ 232DD89AE23C1DFF000451FD927E1F6B3FDA5A77ECF3F0B1AE95B7837DA1C57E
+ 91B7AAA4E244523A8C01838C63835E5BF10FFE0DB6FD9B7C47E279359F09C7F1
+ 03E156A527FCB5F0778924B5D9CE4EC13ACC114FF75405F4008046537FC1BBFE
+ 15F107996BE23FDA1BF6A0F10695BBE4B1B8F18A792C98C147DD6E7702383B76
+ D3F69885BC53F9872517AA935F23E87FDA43FE0A11F007F600F078B3F1778CBC
+ 2BE1B1A5C3E45AF87B4DDB35F855E5238ECA05322AF6C95545EE40C91F25789B
+ E05FC4CFF82ECFC49F0DEA5F11FC23E26F835FB30786651AC69BA0EA33883C41
+ F10E7691D15EF204949B4863110650C9BF6CEC637904C2583EA3FD94FF00E08E
+ FF00B3AFEC6BAADBEABE0CF86FA4B7886DF6B26B7ABB3EABA846EBC878E5B82F
+ E41FFAE2107B57D311C0B1280BFC3D3DA9FB3A953F89F712AA421F06BEA50F07
+ F8534DF02F8634FD1747B0B5D2F49D26DA3B3B1B3B68C470DAC11A8548D1470A
+ AAA000074028AD203068AE88C5256473B77D58507914515401B46318A075A28A
+ 00334518A2800A2901247A52E4FA5007E40F8D7E1CFC3BF1E7FC14DBE3958FC5
+ 4B7F0CE89E07BEB865D4B55B5F103AEA2C01B578BCC896E5CC44CE90AF102E41
+ 1EB93EB1A8FECA1FB0DDC36B1E7F8DAE81BAD1AC6D2F7FE2797236D9C7F63FB3
+ 9FB9C13E55B72393BB9FBC6BE80F8A5FF0476F82BF18BE2578D3C59AD58F88DB
+ 58F1F153ABB43ABC91C72ED921906C51C261ADE2E9D81F5358F77FF043EF80F7
+ A750F32C7C53FF00133D36D74A9F1ADCA3305BFD9FCA03D187D962CB0E4E0E7A
+ 9AF99596E22327EE465777D77FCD7F5F87EAD538932DAB08DEBCE0D2B5A295BA
+ BD6F4E5DECF57A5F7DE5D2FEC8DFF04FFF00831F0B7C65A5FC52F8732EB37935
+ D6989616B752EA524D6F35BC70ADB2FC8C07CC122033C1C827BD7D335F23FECA
+ 1F183C51F0F3F690B9F81969E09B5D37E1CF83567B3D275B975317379791469E
+ 602EBBF703BD8A9CAF6CD7D715EC65F2A6E97EED5B5D6DDF4B9F1BC5347154B1
+ 9FED32724D5E0DEEE0DBE5BD92D5EADBB59DEEB46790FED51FB5459FC08D124D
+ 1F476D3758F899AB594973E19F0C4F318A6D76443831A1E07A8EBD71EA01F0FD
+ 3FF6D2FDA62E350B58E6FD9EE48619AEB4A8A593CE63E54771017BB93EFF00FC
+ BBC8027BE7BD6FFEDF7F0875BD0FE2F7847E3B5ABD96A1A2FC24D3E7B9BDD0A0
+ D1A3BCD5F5762E1952D652A5A239C0214F39CE0903385A4FFC15F9355D46D6DF
+ FE14FF00C4283ED371A65BEF92DD82A7DB6069831FDDF48B6EC7F46201C579F8
+ AC43559C6B5470ED65BAEFD4FA6CA7298CF034EA6070B1C4377E77294572CACB
+ DD57B3B75EF7EB67AFD01FB25FC4EF1BFC5CF8410EB1F107C1EDE06F1149752C
+ 4FA53124C71AE36B6493D727BF6AF4CAF05FDADFF6C5B5F83DE0FF000FAE81A6
+ EA9E2CFF0084E2FA4D0E0D47C3EEB74BA34AC98171215C8DA8581EA390077AF9
+ E6D7E057C7583C3B1C727ED6DE159AE174910B5C35D00AF3FDBF7FDA386FBBE4
+ FEE38EFCFB5754B1EA97EEA379B4B57A7F5F71E4D1E19AB8D8BC654B518C9BE5
+ 8DAFB68F4D2CEFDD25BECAC7E80515F027ED09FB6E78C3C75FB13F88EEFC3567
+ F11FC23E23F04F882C3449750B4D33ED77FAC00CC92CD1C3B93F7726C249DC70
+ 1B3CE2B5345D6FE31FEDC7A9B4DE03F19F883E16DBFC3FB6BAF0E6AB16AD68E3
+ FE122BB30BA43A84657F85641BC8F61C9CF13FDAD4E5251A71726D5D79F7FBAC
+ 54B81F134A9CAAE2AA46118BB49BB596D67BEB7BA7E49ADDDD2FB9EBC83F6B0F
+ 8C3F11BE133F83C7C3FF0001B78E1758D53EC9AC10C47F64DB601F3F8233CF18
+ FC7B5729FB16FED07AEEBDE2FD7BE13F8A2C7C41A8788BE1BDB245A8F8A6F216
+ 8ED35F98B0DCF06E1CA8DF8CEE27E4E40AF0EFDB2E1F8D9F00BE3741AC7FC2CC
+ F15DF785BC75E2EB64D2348D0F4B6B8FEC3B448E4F3629D8BA6D8DD9A33B8670
+ 5718E73462B1D7C37B485FCEDBAFBFEE0C9F875C736FAA62395B57714F5534D3
+ B3D1F6F7ADBEDA6ED7DF74567F8B75EFF8457C2BA9EA9F6792EBFB36D25BAF26
+ 3FBF36C42DB47B9C607D6BE0BB8F1AFC55FDB520D4BC7DE13F8B927C0DD2756D
+ 352CED3C2DE23220BBD36E22B98C3DD91904A488AC8381F339F4E7AB158C8D16
+ A36BB7D3CBB9E4E4BC3F57308CAA5F9611EBBEBA595AF7D6FBEDDD9FA09457C7
+ 7F04FE39F8C3F67BF8F16BE05F16F882FF00E2E1F887AC4AFA7EAFA61F32C3C2
+ F02BE05B4CFF0037EF3E7048F978507BD727E26F8CDF113F6D7F1BDF6A1E0DF1
+ D5FF00C07D3FC21FDA5A15CE9DE200215D7A7F29C457D013B77471310C703A01
+ CF3C73FF006AD3E5D13E6BDADFF076DBCCF51704E2FDB49392F64927CFD1A7B7
+ BB7E6DEFD3A5FB5FEF0A2BE6EFD8B3E1FF00C40F07F8FB589BC61F19747F8956
+ 72E9167141656771BDED2658E2125C1193F2C8C1981FFA698E6BE91AEDC3D675
+ 61CED58F9DCD72F583AFEC14F9B44EF66B7F5FEBD1E81451456E79A145145001
+ 4514500145145001451450014514500145145007CE7E1BFDA9BE265B7ED67E20
+ F0C78BBE1EDAF85BE1769F34B1E9FE30BBBA11C3A86230C9CB380A59B2B8239C
+ 122BD9CFC66F07A6ECF8AFC343CB41237FC4CE0F954E30C7E6E8772E0FB8F5AE
+ 13F6E5FD8FF4FF00DB8FE025C780B54D7352F0EDADC5F5B5F1BCB18D1E65685F
+ 78501F8C13C1F6AF976FFF00E0809E19BF3AB6EF89DE305FED6D22CB497C5AC1
+ FBB16DF64DB20FF6DBECAB9CF1FBC6C76AF2E52C652938D38F3ADEEDA5F23ECA
+ 9C723C5D38D4C44FD8C92B38C5369DAFADD45EFA2DEFDEED6BA5FB377C20D4A2
+ FF0082A9F8D7C716FF000C2FECBC3DAD4D752C1E358F556B9B1D5C1815032C60
+ 945C90506383B735F785717FB3C7C1B87F67BF82BE1DF05DB6A171AA41E1EB5F
+ B325DCE81249FE666DCC17807E6ED5DA5746070EE8D3B3DDBBBF26FA1E5F1166
+ 91C762B9A9FC305CB17DD26DA93D16AEFD75EEDBBB3CFF00E2DFED4FF0F7E047
+ 882CF4AF1878B34AF0FEA3A85A4D7D6D6F74CC1E682152D2C8B807850A49F4C5
+ 79EFC48FDBC3E0EF8B3E1E6BBA4D978FB41BCBDD56C4585B409318DA79AF2DDD
+ ADA30CCB8532AF2A4F18E4D7A07C5FFD947E1CFC7DF10D96ADE32F08E8FE22D4
+ B4DB49EC2D6E2EE32CF04132959635208C2BAB107D41AE66DBFE09D7F046CEE6
+ 29A2F86DE1B8E5865B49E365898147B58CC76EC3E6EB1A12ABE80D675E38C937
+ 1872F2BEF7B9D796D6C8692A756BFB6F69169BE5E4E5BAD74BEB63E016FD8EFC
+ 67A5FEC55F0474ABEF867E38B7B8F08F8EE7D5F51B59B57B659B47B6558FFD2A
+ E2530057870A7855538079E0D42BFB0FFECCBA8F8245A27ED29752D9CBE1DFB1
+ 89D6DE362D6DFDADE779E3E5E4F9FF00B9F4C7BF35FAC9ABE956FAF695756379
+ 0ACF697913C13C4DF7644605594FD4122BC561FF00826A7C07B7D396CE3F85FE
+ 178ED56D3EC2B12C2C1560F3FED1E581BBEEF9DF3E3FBDCD79F532569DE16968
+ BE2BADBB5BF53E8F0BC714674B9313CF4DABDBD9AA6EE9EB67CE9EDE565F85BE
+ 44FDB43F627F0DFECE3FB0378D24B1D7AFBC57A5FC42F1869BAFEEB9D42D3475
+ 87CC959D424D32B26CF9F21586E6E83935FA13F066358BE0FF00851546D55D1E
+ CC01E609303C84FE21C37D4706A97C4AFD9FBC17F18BE1BC1E0FF1478774FD6F
+ C336C613169D74A5A1530FFAAE33FC3818FA5753A46956FA0E956B63670AC169
+ 671241044BF76345015547D0002BD0C2E07D8D5728D92B256D7D5EE7CDE73C40
+ B1F858D3A8DBA9CCDB6D455D6AA3F0DB5B6FA5BB6ADDEC57E7DFFC1583E28F82
+ 3E2F78F3E1AF87F4ED5AC758D73C07E36863D5ACE1D72DF4E974A9A58D846241
+ 3A1F34B057C2478638CE71D7F412BC97C49FB087C1FF0017F8D6FF00C47A9FC3
+ FF000FDE6B9AA6A30EAD777B244DE74F77086114CC73F7D033007B026AB30C3D
+ 5AF4BD953B6BBDFEFD0CB85F32C1E0318B178B527CB7E5E5B6ED34EF76BA3D2C
+ F7359BE27787FF00689F801E23D4BC17A845E26D3EFB4FBCB3864B22479F2F92
+ C3CB52C3EF1DC00382391D6BF2BBE11FEC3DF0BF4FF834BA37C5AF881AF7C15F
+ 1658E83F60BBF0E6A3736F7D7763647545B98AEDDD2355CC92308C0DA3E523D4
+ 1AFD6DF845F063C2DF017C1D1F87FC1DA259787F458E57992CED4158D5DB1B88
+ 049EB815CAFC53FD89FE147C6DF16DFEBDE2CF02E85AF6B1AA5A476177777511
+ 6927B78DD644898E7EEABA2B01EA335CD8CC054AEA33972B92DD6B6FC353D4C9
+ 788B0780955A10E754A5F0B4A0E7D346A49C6CEDADBF1DD7CB7FB28FFC13ABE1
+ 86ABF1C61F1CF82FE2B6A5E28B9F05F8B2F758BCB54B58C4497373E586B77380
+ 42AFD9F82327AE7355FF006DCD0FF67BFDB43E2A68DE22D4FE395BF87EEFC33A
+ 5EB5E1EFB3D920915C98185D172CB9DF0A49BB03818E735F677C26F805E0DF81
+ 4356FF008447C3F61A0FF6F5D1BDD43ECA08FB54E73991B24FCC7279F7AE165F
+ F82737C0F9EE2699BE1A7865A4B89AEEE256F25B2F25DA08EE5CFCDD6540158F
+ 7159CB2D9AA2A9C231D757ACADE56D6FB6E74C78A30B3C74B135EA55B2B28351
+ A5CDADB9B9972F2BD52E5695EC8F917F67CD134CFD94BE24C379F00F5A9BE3A6
+ A5AEDAE97A5EBD68C563FF00847F4E5B688477BB576B379A1236273819E9C8AF
+ D24AF3FF00845FB2B7C3BF809AEDE6A5E0DF09E93E1EBFBFB486C6E26B446569
+ 608555628CE49E155540F402BD02BB32FC2CE845A95B5E8AF65E97D753C4E24C
+ E2863EA425422FDD4EF2928A94AEEFAA8A51D3A5975D750A28A2BBCF9A0A28A2
+ 800A28A2803FFFD9
+ }
end
object HTMLLabel: TLabel
Cursor = crHandPoint
diff --git a/UCredits.pas b/UCredits.pas
index 7fac506..0469f2f 100644
--- a/UCredits.pas
+++ b/UCredits.pas
@@ -94,7 +94,6 @@ procedure TCreditsForm.ForumLabelClick(Sender: TObject);
procedure TCreditsForm.FormCreate(Sender: TObject);
begin
- Image1.Picture.LoadFromFile('.\images\smartie53.bmp');
CreditList := TStringList.Create;
with CreditList do begin // add core developers here in alpha order
Add('Core Development:');
diff --git a/UData.pas b/UData.pas
index 1438e59..06d4a22 100644
--- a/UData.pas
+++ b/UData.pas
@@ -123,9 +123,7 @@ implementation
Windows, Forms, Dialogs, StrUtils, Winsock,
UMain, UUtils, UConfig,
DataThread, UDataNetwork, UDataDisk, UDataGame, UDataSystem,
- // cpu stuff doesn't work under 64 bit but libre hardware monitor
- // provides the same and more functionality
- {UDataCPU,} {UDataSeti,} UDataFolding, UDataRSS, UDataDNet,
+ {UDataSeti,} UDataFolding, UDataRSS, UDataDNet,
UDataWinamp, UDataSender;
@@ -184,9 +182,6 @@ constructor TData.Create;
DataThread.Start;
DataThreads.Add(DataThread);
-{ DataThread := TCPUDataThread.Create;
- DataThread.Start;
- DataThreads.Add(DataThread); }
// seti is broken atm
// DataThread := TSetiDataThread.Create;
// DataThread.Start;
@@ -273,7 +268,8 @@ destructor TData.Destroy;
end;
DataThreads.Free;
-
+ if assigned(AProcess) then
+ freeandnil(AProcess);
WSACleanup();
inherited;
@@ -848,7 +844,7 @@ function TData.CallPlugin(uiDll: Integer; iFunc: Integer;
LegacySharedMem^.LibraryParam1 := sParam1;
LegacySharedMem^.LibraryParam2 := sParam2;
setevent(hLegacyCallFunctionEvent);
- waitresult := WaitForSingleObject(hLegacyRecvEvent,10000);
+ waitresult := WaitForSingleObject(hLegacyRecvEvent,5000);
if (waitresult = WAIT_TIMEOUT) then
result := 'Legacy plugin function timed out'
else
diff --git a/UDataFolding.pas b/UDataFolding.pas
index 2204033..d6077d0 100644
--- a/UDataFolding.pas
+++ b/UDataFolding.pas
@@ -71,10 +71,11 @@ procedure TFoldingDataThread.DoFoldingHTTPUpdate;
begin
try
JsonStats := myJSONItem.Create;
+ JsonTeam := myJSONItem.Create;
+
if TryStrToInt(config.foldUserid, i) then
begin
- if ( strtoint(config.foldUserid) > 0 )then
- sFilename := getUrl('https://api2.foldingathome.org/uid/'+config.foldUserid)
+ sFilename := getUrl('https://api2.foldingathome.org/uid/'+config.foldUserid, 30)
end
else
Raise Exception.Create('User ID must be a number');
@@ -100,7 +101,6 @@ procedure TFoldingDataThread.DoFoldingHTTPUpdate;
foldLastWU := JsonStats.Value[iRank+2].getstr; // last wu
/// Team Stuff
- JsonTeam := myJSONItem.Create;
JsonString := JsonStats.Value[iRank+4].getJSON;
delete(JsonString, 1, 1);
JsonString := Copy(JsonString,1,length(JsonString)-1);
@@ -110,6 +110,8 @@ procedure TFoldingDataThread.DoFoldingHTTPUpdate;
foldTeamWU := JsonTeam.Value[3].getstr;
foldTeamLastWU := JsonTeam.Value[4].getstr;
fDataLock.Leave();
+ freeandnil(JsonTeam);
+ freeandnil(JsonStats);
except
on EExiting do raise;
diff --git a/UDataGame.pas b/UDataGame.pas
index a2b054e..9a61699 100644
--- a/UDataGame.pas
+++ b/UDataGame.pas
@@ -177,13 +177,13 @@ procedure TGameDataThread.ResolveGameVariables(var Line : string; qstattemp: In
if (pos(GameKeys[GameCount], line) <> 0) then begin
fDataLock.Enter();
try
- line := StringReplace(line, GameKeys[GameCount]+'1', qstatreg1[activeScreen,
+ line := StringReplace(line, GameKeys[GameCount]+'1', qstatreg1[LCDSmartieDisplayForm.activeScreen,
qstattemp], [rfReplaceAll]);
- line := StringReplace(line, GameKeys[GameCount]+'2', qstatreg2[activeScreen,
+ line := StringReplace(line, GameKeys[GameCount]+'2', qstatreg2[LCDSmartieDisplayForm.activeScreen,
qstattemp], [rfReplaceAll]);
- line := StringReplace(line, GameKeys[GameCount]+'3', qstatreg3[activeScreen,
+ line := StringReplace(line, GameKeys[GameCount]+'3', qstatreg3[LCDSmartieDisplayForm.activeScreen,
qstattemp], [rfReplaceAll]);
- line := StringReplace(line, GameKeys[GameCount]+'4', qstatreg4[activeScreen,
+ line := StringReplace(line, GameKeys[GameCount]+'4', qstatreg4[LCDSmartieDisplayForm.activeScreen,
qstattemp], [rfReplaceAll]);
finally
fDataLock.Leave();
diff --git a/UDataSystem.pas b/UDataSystem.pas
index 1357bd6..17373bb 100644
--- a/UDataSystem.pas
+++ b/UDataSystem.pas
@@ -25,7 +25,7 @@
interface
uses
- DataThread, Windows, SysUtils, Classes, Registry, shellapi, jwatlhelp32;
+ DataThread, Windows, SysUtils, Classes, Registry, shellapi, JwaWindows, jwatlhelp32, jwaWinBase, usmbios;
const
// lets put a prefix key to make it clear what they are
@@ -35,11 +35,13 @@ interface
UpTimeKey = SysKey + 'Uptime';
UpTimeShortKey = SysKey + 'Uptims';
ScreensaverActiveKey = SysKey + 'SSActive';
- FullScreenGameActive = SysKey + 'FSGameActive';
- FullScreenAppActive = SysKey + 'FSAppActive';
- ApplicationActive = SysKey + 'AppActive';
-
-
+ FullScreenGameActiveKey = SysKey + 'FSGameActive';
+ FullScreenAppActiveKey = SysKey + 'FSAppActive';
+ ApplicationActiveKey = SysKey + 'AppActive';
+ CPUUseKey = SysKey + 'CPUUsage';
+ CPUTypeKey = SysKey + 'CPUType';
+ CPUSpeedMhzKey = SysKey + 'CPUSpeedMhz';
+ CPUSpeedGhzKey = SysKey + 'CPUSpeedGhz';
MemKey = '$Mem';
MemFreeKey = MemKey + 'Free';
MemUsedKey = MemKey + 'Used';
@@ -52,6 +54,17 @@ interface
PageTotalKey = PageKey + 'Total';
PageFreePercentKey = PageKey + 'F%';
PageUsedPercentKey = PageKey + 'U%';
+ alpha = 0.15;
+
+type
+ TPROCESSOR_POWER_INFORMATION = record
+ Number: ULONG;
+ MaxMhz: ULONG;
+ CurrentMhz: ULONG;
+ MhzLimit: ULONG;
+ MaxIdleState: ULONG;
+ CurrentIdleState: ULONG;
+ end;
{$M+}
type
@@ -63,6 +76,15 @@ TSystemDataThread = class(TDataThread)
iUptime: Int64;
iLastUptime: Cardinal;
uptimereg, uptimeregs: String;
+ FullScreenGameActive: string;
+ FullScreenAppActive: string;
+ SnapTime: TDateTime;
+ CPUUse:double;
+ SMBios: tsmbios;
+ CPUType: string;
+ CPUSpeed: string;
+ systeminfo: SYSTEM_INFO;
+ PPIbuff: array of TPROCESSOR_POWER_INFORMATION;
function getIsWin2kXP: Boolean;
function getTotalPhysMemory: Int64;
function getAvailPhysMemory: Int64;
@@ -91,6 +113,7 @@ TSystemDataThread = class(TDataThread)
function isapplicationactive(application: string): integer;
end;
+
type
PMemoryStatusEx = ^TMemoryStatusEx;
LPMEMORYSTATUSEX = PMemoryStatusEx;
@@ -111,6 +134,13 @@ TSystemDataThread = class(TDataThread)
MEMORYSTATUSEX = _MEMORYSTATUSEX;
{$EXTERNALSYM MEMORYSTATUSEX}
+var
+ FSnapshotHandle: THandle;
+ FProcessEntry32: TProcessEntry32;
+ ProcList: TStringList;
+ FLastIdleTime: Int64;
+ FLastKernelTime: Int64;
+ FLastUserTime: Int64;
implementation
uses
@@ -119,14 +149,26 @@ implementation
function SHQueryUserNotificationState( p : Pointer ) : HRESULT; stdcall; external shell32 name 'SHQueryUserNotificationState';
constructor TSystemDataThread.Create;
+var
+ lprocessorinfo:TProcessorInformation;
begin
STComputername := Computername;
STUsername := Username;
+ ProcList := TStringList.Create;
+ FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
+ Smbios := tsmbios.create;
+ for LProcessorInfo in SMBios.ProcessorInfo do
+ CPUType := LProcessorInfo.ProcessorVersionStr;
+ CPUSpeed := '0';
+ setLength(PPIbuff, ProcessorCount);
inherited Create(100);
end;
destructor TSystemDataThread.Destroy;
begin
+ ProcList.Free;
+ Proclist := nil;
+ CloseHandle(FSnapshotHandle);
inherited;
end;
@@ -157,12 +199,15 @@ function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): BOOL; stdcall;
end;
end;
+// TODO: This may not be needed anymore as alot has changed in the years from
+// when it was needed. Many new features of LCDSmartie require at least Vista
+// maybe even 7
function TSystemDataThread.getIsWin2kXP: Boolean;
var
- oviVersionInfo: TOSVERSIONINFO;
+ oviVersionInfo: windows.TOSVERSIONINFO;
begin
oviVersionInfo.dwOSVersionInfoSize := SizeOf(oviVersionInfo);
- if not GetVersionEx(oviVersionInfo) then raise
+ if not windows.GetVersionEx(oviVersionInfo) then raise
Exception.Create('Can''t get the Windows version');
if (oviVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and
(oviVersionInfo.dwMajorVersion >= 5) then getIsWin2kXP := true
@@ -273,31 +318,16 @@ function TSystemDataThread.getcomputername: String;
strdispose(p);
end;
-//// crap to detect if program is active
function processExists(exeFileName: string): Boolean;
var
- ContinueLoop: BOOL;
- FSnapshotHandle: THandle;
- FProcessEntry32: TProcessEntry32;
+ i: integer;
begin
- FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
- ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := False;
- while Integer(ContinueLoop) <> 0 do
- begin
- if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
- UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
- UpperCase(ExeFileName))) then
- begin
+ for i := 0 to ProcList.Count -1 do
+ if ProcList[i] = UpperCase(ExeFileName) then
Result := True;
- end;
- ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
- end;
- CloseHandle(FSnapshotHandle);
end;
-//// detect if screensaver is active
function TSystemDataThread.isscreensaveractive: integer;
var
Reg: Tregistry;
@@ -314,17 +344,7 @@ function TSystemDataThread.isscreensaveractive: integer;
Reg.Free;
end;
-// crap for detecting fulscreen applications
-// just leave this here should it be needed
-//typedef enum {
-// QUNS_NOT_PRESENT = 1,
-// QUNS_BUSY = 2,
-// QUNS_RUNNING_D3D_FULL_SCREEN = 3,
-// QUNS_PRESENTATION_MODE = 4,
-// QUNS_ACCEPTS_NOTIFICATIONS = 5,
-// QUNS_QUIET_TIME = 6,
-// QUNS_APP = 7
-//} QUERY_USER_NOTIFICATION_STATE;
+
function TSystemDataThread.isfullscreengameactive: integer;
var
i : LongInt;
@@ -349,6 +369,14 @@ function TSystemDataThread.isfullscreenappactive: integer;
result := 0;
end;
+function DateTimeToMilliseconds(aDateTime: TDateTime): Int64;
+var
+ TimeStamp: TTimeStamp;
+begin
+ TimeStamp:= DateTimeToTimeStamp (aDateTime);
+ Result:= TimeStamp.Time;
+end;
+
function TSystemDataThread.isapplicationactive(application: string): integer;
begin
if processExists(application) then
@@ -363,6 +391,18 @@ procedure TSystemDataThread.DoUpdate;
y, mo, d, h, m, s : Cardinal;
uiRemaining: Cardinal;
sTempUptime: String;
+ IdleTimeRec: TFileTime;
+ KernelTimeRec: TFileTime;
+ UserTimeRec: TFileTime;
+ IdleTime: Int64 absolute IdleTimeRec;
+ KernelTime: Int64 absolute KernelTimeRec;
+ UserTime: Int64 absolute UserTimeRec;
+ IdleDiff: Int64;
+ KernelDiff: Int64;
+ UserDiff: Int64;
+ SysTime: Int64;
+ i: integer;
+ NextCPUUse: double;
begin
if (not Terminated) then begin
fDataLock.Enter;
@@ -458,10 +498,78 @@ procedure TSystemDataThread.DoUpdate;
end;
// remove the trailing space and assign to class member
- fDataLock.Enter();
+ fDataLock.Enter;
uptimeregs := MidStr(sTempUptime, 1, Length(sTempUptime)-1);
- fDataLock.Leave();
+ fDataLock.Leave;
+
+// crap for detecting fulscreen applications
+// just leave this here should it be needed
+//typedef enum {
+// QUNS_NOT_PRESENT = 1,
+// QUNS_BUSY = 2,
+// QUNS_RUNNING_D3D_FULL_SCREEN = 3,
+// QUNS_PRESENTATION_MODE = 4,
+// QUNS_ACCEPTS_NOTIFICATIONS = 5,
+// QUNS_QUIET_TIME = 6,
+// QUNS_APP = 7
+//} QUERY_USER_NOTIFICATION_STATE;
+ if (SHQueryUserNotificationState(@i) = S_OK) then
+ case (i) of
+ 2: begin // non d3d full screen
+ FullScreenAppActive := '1';
+ FullScreenGameActive := '0';
+ end;
+ 3: begin // d3d full screen
+ FullScreenAppActive := '0';
+ FullScreenGameActive := '1';
+ end;
+ else
+ FullScreenAppActive := '0';
+ FullScreenGameActive := '0';
+ end;
+
+ // this is a hog. better to run in the refresh proc and limit it to every 300ms or more
+ // executing CreateToolhelp32Snapshot(), Process32First() and Process32Next() everytime
+ // actions call through here cause massive cpu usage and nearly 30ms delay. Possibly more
+ // depending on the type and quantity of actions called
+ if DateTimeToMilliseconds(Now() - SnapTime) >= 300 then
+ begin
+ fDataLock.Enter;
+ SnapTime := Now();
+ FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if Process32First(FSnapshotHandle, FProcessEntry32)then
+ begin
+ ProcList.Clear;
+ repeat
+ ProcList.Add(UpperCase(ExtractFileName(FProcessEntry32.szExeFile)));
+ until not Process32Next(FSnapshotHandle, FProcessEntry32);
+ end;
+ fDataLock.Leave;
+ end;
+ fDataLock.Enter;
+ if jwaWinBase.GetSystemTimes(@IdleTimeRec, @KernelTimeRec, @UserTimeRec) then
+ begin
+ IdleDiff := IdleTime - FLastIdleTime;
+ KernelDiff := KernelTime - FLastKernelTime;
+ UserDiff := UserTime - FLastUserTime;
+ FLastIdleTime := IdleTime;
+ FLastKernelTime := KernelTime;
+ FLastUserTime := UserTime;
+ SysTime := KernelDiff + UserDiff;
+ NextCPUUse := (SysTime - IdleDiff)/SysTime * 100;
+ CPUUse := alpha*NextCPUUse + (1-alpha)*CPUUse;
+ end;
+ fDataLock.Leave;
+
+ fDataLock.Enter;
+ try
+ if CallNtPowerInformation(POWER_INFORMATION_LEVEL.ProcessorInformation, nil, NULL,
+ PPIbuff, sizeof(TPROCESSOR_POWER_INFORMATION) * ProcessorCount) = 0 then
+ CPUSpeed := inttostr(PPIbuff[0].CurrentMhz);
+ except
+ end;
+ fDataLock.Leave;
end;
procedure TSystemDataThread.ResolveVariables(var Line : string);
@@ -470,38 +578,41 @@ procedure TSystemDataThread.ResolveVariables(var Line : string);
args: Array [1..maxArgs] of String;
prefix, postfix: String;
numArgs: Cardinal;
+
begin
- if (pos(SysKey,Line) > 0) then begin
- if (pos(ApplicationActive,Line) > 0) then begin
- while decodeArgs(line, ApplicationActive, maxArgs, args, prefix, postfix, numargs) do
+ fDataLock.Enter();
+ if (pos(SysKey,Line) > 0) then
+ begin
+ while decodeArgs(line, ApplicationActiveKey, maxArgs, args, prefix, postfix, numargs) do
begin
Line := prefix;
Line := Line + inttostr(isapplicationactive(args[1])) + postfix;
end;
- end;
-
- if (pos(UserNameKey,Line) > 0) then
- Line := StringReplace(line, UserNameKey, STUsername, [rfReplaceAll]);
-
- if (pos(ComputerNameKey,Line) > 0) then
- Line := StringReplace(line, ComputerNameKey, STcomputername, [rfReplaceAll]);
-
- if (pos(UpTimeKey,Line) > 0) then
- line := StringReplace(line, UpTimeKey, uptimereg, [rfReplaceAll]);
-
- if (pos(UpTimeShortKey,Line) > 0) then
- line := StringReplace(line, UpTimeShortKey, uptimeregs, [rfReplaceAll]);
+ end;
- if (pos(ScreensaverActiveKey,Line) > 0) then
- Line := StringReplace(line, ScreensaverActiveKey, inttostr(isscreensaveractive), [rfReplaceAll]);
-
- if (pos(FullScreenGameActive,Line) > 0) then
- Line := StringReplace(line, FullScreenGameActive, inttostr(isfullscreengameactive), [rfReplaceAll]);
-
- if (pos(FullScreenAppActive,Line) > 0) then
- Line := StringReplace(line, FullScreenAppActive, inttostr(isfullscreenappactive), [rfReplaceAll]);
+ if (pos(SysKey,Line) > 0) then
+ begin
+ Line := StringReplace(line, CPUTypeKey, CPUType, [rfReplaceAll]);
+ Line := StringReplace(line, CPUUseKey, Format('%.0f', [CPUUse]), [rfReplaceAll]);
+ Line := StringReplace(line, CPUSpeedMhzKey, CPUSpeed, [rfReplaceAll]);
+ Line := StringReplace(line, CPUSpeedGhzKey, Format('%.2f', [strtoint(CPUSpeed) / 1000]) , [rfReplaceAll]);
+ end;
+ if (pos(SysKey,Line) > 0) then
+ begin
+ Line := StringReplace(line, UserNameKey, STUsername, [rfReplaceAll]);
+ Line := StringReplace(line, ComputerNameKey, STcomputername, [rfReplaceAll]);
+ line := StringReplace(line, UpTimeKey, uptimereg, [rfReplaceAll]);
+ line := StringReplace(line, UpTimeShortKey, uptimeregs, [rfReplaceAll]);
end;
+ if (pos(SysKey,Line) > 0) then
+ begin
+ Line := StringReplace(line, ScreensaverActiveKey, inttostr(isscreensaveractive), [rfReplaceAll]);
+ Line := StringReplace(line, FullScreenGameActiveKey, FullScreenGameActive, [rfReplaceAll]);
+ Line := StringReplace(line, FullScreenAppActiveKey, FullScreenAppActive, [rfReplaceAll]);
+ end;
+ fDataLock.Leave();
+
if (pos(MemKey,Line) > 0) then begin
fDataLock.Enter;
diff --git a/UJSON.pas b/UJSON.pas
index 62fecb1..ca83433 100644
--- a/UJSON.pas
+++ b/UJSON.pas
@@ -824,4 +824,4 @@ procedure myJSONItem.setType(aType: myJDType);
fType := aType;
end;
-end.
\ No newline at end of file
+end.
diff --git a/UMain.lfm b/UMain.lfm
index b45aaea..eafa06b 100644
--- a/UMain.lfm
+++ b/UMain.lfm
@@ -1,8 +1,8 @@
object LCDSmartieDisplayForm: TLCDSmartieDisplayForm
- Left = 374
+ Left = 391
Height = 91
- Top = 195
- Width = 239
+ Top = 132
+ Width = 241
HorzScrollBar.Visible = False
VertScrollBar.Visible = False
Anchors = []
@@ -10,7 +10,7 @@ object LCDSmartieDisplayForm: TLCDSmartieDisplayForm
BorderStyle = bsToolWindow
Caption = 'LCD Smartie x.x.x.x'
ClientHeight = 91
- ClientWidth = 239
+ ClientWidth = 241
Color = clBtnFace
DoubleBuffered = True
Font.CharSet = ANSI_CHARSET
@@ -553,8 +553,8 @@ object LCDSmartieDisplayForm: TLCDSmartieDisplayForm
Top = 120
end
object ExceptionLogger1: TExceptionLogger
- LogFileName = 'Debug.log'
MaxCallStackDepth = 60
+ Left = 168
Top = 120
end
end
diff --git a/UMain.pas b/UMain.pas
index aae34fd..049c443 100644
--- a/UMain.pas
+++ b/UMain.pas
@@ -28,14 +28,10 @@
interface
uses
- Menus, Graphics, WinampCtrl, ExtCtrls, Controls, Buttons,
- Classes, Forms, USetup, UConfig, ULCD, UData, lcdline, IdComponent,
+ Menus, Graphics, WinampCtrl, ExtCtrls, Controls, Buttons, Classes, Forms,
+ USetup, UConfig, ULCD, UData, lcdline, UExceptionLogger, IdComponent,
IdCustomTCPServer, IdTCPServer, IdContext, IdSSL, IdSSLOpenSSL, SysUtils,
- IdGlobal, IdIOHandler, IdIOHandlerStack, IdSSLOpenSSLHeaders, Windows
- {$IFNDEF STANDALONESETUP}
- , UExceptionLogger
- {$ENDIF}
- ;
+ IdGlobal, IdIOHandler, IdIOHandlerStack, IdSSLOpenSSLHeaders, Windows;
{ TLCDSmartieDisplayForm }
type
@@ -63,9 +59,7 @@ TOnScreenLineWrapper = class
end;
TLCDSmartieDisplayForm = class(TForm)
- {$IFNDEF STANDALONESETUP}
ExceptionLogger1: TExceptionLogger;
- {$ENDIF}
SavePosition: TMenuItem;
N1: TMenuItem;
NextScreenTimer: TTimer;
@@ -254,6 +248,16 @@ TLCDSmartieDisplayForm = class(TForm)
doesflash: Boolean;
lcd: TLCD;
Data: TData;
+ PrevWndProc: WNDPROC;
+
+ activeScreen : Integer;
+ OurVersMaj : integer;
+ OurVersMin : integer;
+ OurVersRel : integer;
+ OurVersBuild : integer;
+ ShowWindowFlag: Boolean;
+ LastLineLCD: array [1..4] of string;
+ DisplayError: boolean;
procedure DoFullDisplayDraw;
procedure UpdateTimersState(InSetupState : boolean);
procedure ChangeScreen(scr: Integer);
@@ -265,20 +269,10 @@ TLCDSmartieDisplayForm = class(TForm)
end;
function GetFmtFileVersion(const FileName: String = ''; const Fmt: String = '%d.%d.%d.%d'): String;
-
var
- PrevWndProc: WNDPROC;
- SetupForm : tsetupform;
- activeScreen : Integer;
LCDSmartieDisplayForm: TLCDSmartieDisplayForm;
- bTerminating: Boolean;
- OurVersMaj : integer;
- OurVersMin : integer;
- OurVersRel : integer;
- OurVersBuild : integer;
- ShowWindowFlag: Boolean;
- LastLineLCD: array [1..4] of string;
- DisplayError: boolean;
+ SetupForm : tsetupform;
+ bTerminating: Boolean = false;
implementation
{$IFNDEF STANDALONESETUP}
{$R *.lfm}
@@ -310,6 +304,7 @@ function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LR
(wParam = PBT_APMRESUMESUSPEND)
then
LCDSmartieDisplayForm.ReInitLCD();
+ end;
// time to go to sleep
if (wParam = PBT_APMSUSPEND) or
@@ -318,8 +313,8 @@ function WndCallback(Ahwnd: HWND; uMsg: UINT; wParam: WParam; lParam: LParam):LR
LCDSmartieDisplayForm.FiniLCD(true);
LCDSmartieDisplayForm.Lcd := TLCD.Create(); // replace with a dummy driver.
end;
- end;
- result:= CallWindowProc(PrevWndProc,Ahwnd,uMsg,WParam,LParam); // pass on all other messages
+
+ result:= CallWindowProc(LCDSmartieDisplayForm.PrevWndProc,Ahwnd,uMsg,WParam,LParam); // pass on all other messages
end;
///////////////////////////////////////////////////////////////////////////////
@@ -438,7 +433,6 @@ procedure TLCDSmartieDisplayForm.FormCreate(Sender: TObject);
IdOpenSSLSetLibPath('.\openssl\');
fillchar(ScreenLCD,sizeof(ScreenLCD),$00);
- bTerminating := false;
Randomize;
SetCurrentDir(extractfilepath(application.exename));
@@ -642,7 +636,6 @@ procedure TLCDSmartieDisplayForm.ProcessCommandLineParams;
procedure TLCDSmartieDisplayForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
bTerminating := true;
-
while timerRefresh.enabled = true do timerRefresh.enabled := false;
while ActionsTimer.enabled = true do ActionsTimer.enabled := false;
while LeftManualScrollTimer.enabled = true do LeftManualScrollTimer.enabled := false;
@@ -650,19 +643,18 @@ procedure TLCDSmartieDisplayForm.FormClose(Sender: TObject; var Action: TCloseAc
while NextScreenTimer.enabled = true do NextScreenTimer.enabled := false;
while ScrollFlashTimer.enabled = true do ScrollFlashTimer.enabled := false;
while TransitionTimer.enabled = true do TransitionTimer.enabled := false;
-
FiniLCD(true);
while Assigned(Data) do
begin
- if (Data.CanExit()) then
+ if Data.CanExit() then
begin
Data.free;
Data := nil;
end;
end;
- while not Assigned(Data) and Assigned(config) do
+ while Assigned(config) do
begin
config.free;
config := nil;
@@ -857,7 +849,6 @@ procedure TLCDSmartieDisplayForm.ScrollFlashTimerTimer(Sender: TObject);
end;
end;
-
procedure TLCDSmartieDisplayForm.ActionsTimerTimer(Sender: TObject);
//ACTIONS!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
var
@@ -867,7 +858,6 @@ procedure TLCDSmartieDisplayForm.ActionsTimerTimer(Sender: TObject);
sLeftValue, sRightValue, sAction: String;
bNum: Boolean;
doAction: Array[1..MaxActions] of Boolean;
-
begin
ActionsTimer.Interval := config.ActionsTimer;
@@ -940,7 +930,6 @@ procedure TLCDSmartieDisplayForm.ActionsTimerTimer(Sender: TObject);
// This delay impacts the user experience when using keys.
if (Pos('MObutton', config.actionsArray[counter, 1]) <> 0) then
didAction[counter] := false;
-
end;
end;
@@ -1087,6 +1076,7 @@ procedure TLCDSmartieDisplayForm.TimerRefreshTimer(Sender: TObject);
parsedLine[counter] := line;
newline[counter] := line; // Used by screen change transition.
end;
+
if (not TransitionTimer.enabled) then SendCustomChars();
Data.ScreenEnd();
@@ -1095,11 +1085,10 @@ procedure TLCDSmartieDisplayForm.TimerRefreshTimer(Sender: TObject);
// handle continuing on the next line (if req)
if (h < MaxLines) and (config.screen[activeScreen].line[h].contNextLine) then
begin
- parsedLine[h + 1] := copy(parsedLine[h], 1 + config.width,
- length(parsedLine[h]));
+ newline[h + 1] := copy(newline[h], 1 + config.width, length(newline[h]));
+ parsedLine[h + 1] := copy(parsedLine[h], 1 + config.width, length(parsedLine[h]));
end;
end;
-
gotnewlines := true;
end;
@@ -1875,7 +1864,17 @@ procedure TLCDSmartieDisplayForm.ProcessAction(bDoAction: Boolean; sAction: Stri
end;
end;
- if pos('FreezeScreen', sAction) <> 0 then
+ if pos('Freeze screen', sAction) <> 0 then
+ begin
+ if not frozen then freeze();
+ end;
+
+ if pos('Unfreeze screen', sAction) <> 0 then
+ begin
+ if frozen then freeze();
+ end;
+
+ if pos('Toggle freeze', sAction) <> 0 then
begin
freeze();
end;
@@ -2551,10 +2550,10 @@ function GetFmtFileVersion(const FileName: String = '';
iVer[3] := HiWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS);
iVer[4] := LoWord(PVSFixedFileInfo(pFileInfo)^.dwFileVersionLS);
- OurVersMaj := iVer[1];
- OurVersMin := iVer[2];
- OurVersRel := iVer[3];
- OurVersBuild := iVer[4];
+ LCDSmartieDisplayForm.OurVersMaj := iVer[1];
+ LCDSmartieDisplayForm.OurVersMin := iVer[2];
+ LCDSmartieDisplayForm.OurVersRel := iVer[3];
+ LCDSmartieDisplayForm.OurVersBuild := iVer[4];
finally
FreeMem(pBuffer);
diff --git a/URLThread.pas b/URLThread.pas
index 1c94904..a3cd256 100644
--- a/URLThread.pas
+++ b/URLThread.pas
@@ -133,8 +133,8 @@ function TURLThread.GetUrl(Url: String; maxfreq: Cardinal = 0; PostParameters: T
httpCopy := nil;
fDataLock.Leave();
- sl.Free;
- HTTP.Free;
+ freeandnil(sl);
+ freeandnil(HTTP);
end;
except
on E: EIdHTTPProtocolException do
diff --git a/USetup.lfm b/USetup.lfm
index 523754a..1f52c2a 100644
--- a/USetup.lfm
+++ b/USetup.lfm
@@ -1,7 +1,7 @@
object SetupForm: TSetupForm
- Left = 388
+ Left = 646
Height = 456
- Top = 129
+ Top = 222
Width = 823
Anchors = []
BorderIcons = []
@@ -15,6 +15,7 @@ object SetupForm: TSetupForm
Font.Color = clBlack
Font.Height = -11
KeyPreview = True
+ OnClose = FormClose
OnCreate = FormCreate
OnShow = FormShow
ParentBiDiMode = False
@@ -27,13 +28,13 @@ object SetupForm: TSetupForm
Top = 0
Width = 560
TabStop = False
- ActivePage = MultiInstanceTabSheet
+ ActivePage = ActionsTabSheet
Font.CharSet = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Tahoma'
ParentFont = False
- TabIndex = 5
+ TabIndex = 1
TabOrder = 7
OnChange = MainPageControlChange
object ScreensTabSheet: TTabSheet
@@ -1058,31 +1059,37 @@ object SetupForm: TSetupForm
ClientWidth = 552
ImageIndex = 1
object ActionsStringGrid: TStringGrid
- Left = 1
+ Left = 0
Height = 349
Hint = 'These actions are run on a timer'
Top = 0
- Width = 568
+ Width = 536
ColCount = 0
DefaultColWidth = 77
DefaultRowHeight = 16
DoubleBuffered = True
FixedCols = 0
FixedRows = 0
- Options = [goVertLine, goHorzLine, goDrawFocusSelected, goColSizing, goRowMoving, goColMoving, goEditing, goAutoAddRows, goRowSelect, goAlwaysShowEditor, goRelaxedRowSelect, goDblClickAutoSize, goFixedColSizing, goDontScrollPartCell, goCellHints, goAutoAddRowsSkipContentCheck, goRowHighlight]
+ HeaderHotZones = []
+ HeaderPushZones = []
+ Options = [goVertLine, goHorzLine, goRowMoving, goEditing, goRowSelect, goSmoothScroll, goRowHighlight]
ParentDoubleBuffered = False
ParentShowHint = False
RowCount = 0
+ ScrollBars = ssNone
ShowHint = True
TabOrder = 2
TitleStyle = tsStandard
+ OnDragDrop = ActionsStringGridDragDrop
+ OnDragOver = ActionsStringGridDragOver
+ OnMouseDown = ActionsStringGridMouseDown
OnSelectEditor = ActionsStringGridSelectEditor
OnSelection = ActionsStringGridSelection
end
object ActionAddButton: TButton
- Left = 412
+ Left = 392
Height = 25
- Hint = 'Add a new action'
+ Hint = 'Insert a new action after the current selection'
Top = 360
Width = 75
Caption = 'New'
@@ -1092,7 +1099,7 @@ object SetupForm: TSetupForm
TabOrder = 1
end
object ActionDeleteButton: TButton
- Left = 492
+ Left = 472
Height = 25
Hint = 'Delete selected action'
Top = 360
@@ -1123,6 +1130,16 @@ object SetupForm: TSetupForm
TabOrder = 3
Value = 150
end
+ object ActionsGridScrollBar: TScrollBar
+ Left = 536
+ Height = 349
+ Top = 0
+ Width = 17
+ Kind = sbVertical
+ PageSize = 0
+ TabOrder = 4
+ OnScroll = ActionsGridScrollBarScroll
+ end
end
object StartupTabSheet: TTabSheet
Caption = 'Startup/Shutdown'
@@ -1942,7 +1959,7 @@ object SetupForm: TSetupForm
Top = 1
Width = 265
TabStop = False
- ActivePage = EmailTabSheet
+ ActivePage = PluginsTabSheet
Font.CharSet = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -11
@@ -1951,7 +1968,7 @@ object SetupForm: TSetupForm
ParentBiDiMode = False
ParentFont = False
ParentShowHint = False
- TabIndex = 6
+ TabIndex = 10
TabOrder = 6
TabPosition = tpRight
OnChange = LeftPageControlChange
@@ -1969,6 +1986,11 @@ object SetupForm: TSetupForm
Items.Strings = (
'Username'
'Computername'
+ 'CPU Type'
+ 'CPU Speed Mhz'
+ 'CPU Speed Ghz'
+ 'CPU usage (%)'
+ 'CPU usage Bar (length)'
'Uptime'
'Uptime Short'
'Free Memory'
@@ -2699,6 +2721,7 @@ object SetupForm: TSetupForm
Top = 0
Width = 209
Directory = '.'
+ ExtendedSelect = False
ItemHeight = 0
Mask = '*.dll'
OnClick = PluginListBoxClick
diff --git a/USetup.pas b/USetup.pas
index 04ef46e..81ad908 100644
--- a/USetup.pas
+++ b/USetup.pas
@@ -1,4 +1,5 @@
unit USetup;
+
{******************************************************************************
*
* LCD Smartie - LCD control software.
@@ -28,16 +29,17 @@ interface
Commctrl,
Dialogs, Grids, StdCtrls, Controls, Spin, Buttons, ComCtrls, Classes,
Forms, ExtCtrls, FileCtrl,
- ExtDlgs, CheckLst, SpinEx, RTTICtrls, JwaTlHelp32, Process, FileUtil, strutils, Windows;
+ ExtDlgs, CheckLst, SpinEx, RTTICtrls, Process, FileUtil,
+ Windows;
const
NoVariable = 'Variable: ';
- { TSetupForm }
+{ TSetupForm }
type
TProcessEntry = record
- WindowTitle: String;
+ WindowTitle: string;
Pid: integer;
end;
@@ -286,6 +288,7 @@ TSetupForm = class(TForm)
ScreenSpinEdit: TSpinEdit;
ScreensTabSheet: TTabSheet;
ScreenTabsheet: TTabSheet;
+ ActionsGridScrollBar: TScrollBar;
SetiAtHomeEmailEdit: TEdit;
SetiAtHomeListBox: TListBox;
SetiAtHomeTabSheet: TTabSheet;
@@ -336,11 +339,20 @@ TSetupForm = class(TForm)
WinampLocationEdit: TEdit;
WinampLocationLabel: TLabel;
WinampTabSheet: TTabSheet;
- procedure ActionsStringGridSelectEditor(Sender: TObject; aCol,
- aRow: Integer; var Editor: TWinControl);
- procedure ActionsStringGridSelection(Sender: TObject; aCol, aRow: Integer);
+ procedure ActionsGridScrollBarScroll(Sender: TObject;
+ ScrollCode: TScrollCode; var ScrollPos: Integer);
+ procedure ActionsStringGridDragDrop(Sender, Source: TObject; X, Y: Integer);
+ procedure ActionsStringGridDragOver(Sender, Source: TObject; X, Y: Integer;
+ State: TDragState; var Accept: Boolean);
+ procedure ActionsStringGridMouseDown(Sender: TObject; Button: TMouseButton;
+ Shift: TShiftState; X, Y: Integer);
+ procedure ActionsStringGridSelectEditor(Sender: TObject;
+ aCol, aRow: integer; var Editor: TWinControl);
+ procedure ActionsStringGridSelection(Sender: TObject; aCol, aRow: integer);
+ procedure ActionsStringGridUpdateScrollBar;
procedure BitBtn4Click(Sender: TObject);
procedure ComPortsButtonClick(Sender: TObject);
+ procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormShow(Sender: TObject);
procedure LCDSizeComboBoxChange(Sender: TObject);
procedure MiConfigsListBoxClick(Sender: TObject);
@@ -415,25 +427,25 @@ TSetupForm = class(TForm)
procedure SetiEnableCheckBoxClick(Sender: TObject);
private
- DLLPath : string;
- setupbutton: Integer;
+ DLLPath: string;
+ setupbutton: integer;
shdownmessagebutton: integer;
- CurrentlyShownEmailAccount: Integer;
- CurrentScreen: Integer;
- Procedure FocusToInputField;
- procedure SaveScreen(scr: Integer);
- procedure LoadScreen(scr: Integer);
- procedure LoadHint(DisplayDLLName : string);
+ CurrentlyShownEmailAccount: integer;
+ CurrentScreen: integer;
+ procedure FocusToInputField;
+ procedure SaveScreen(scr: integer);
+ procedure LoadScreen(scr: integer);
+ procedure LoadHint(DisplayDLLName: string);
procedure LoadConfig(Sender: TObject);
- procedure CreateConfig(Sender: TObject);
procedure LoadSettings(Sender: TObject);
end;
- procedure UpdateSetupForm(cKey : char);
+procedure UpdateSetupForm(cKey: char);
-{$IFDEF STANDALONESETUP}
var
+ SourceCol, SourceRow: integer;
+{$IFDEF STANDALONESETUP}
SetupForm: TSetupForm;
ConfigFileName: String = 'config.ini';
ProcessesList: TProcessList;
@@ -441,45 +453,51 @@ TSetupForm = class(TForm)
{$ENDIF}
implementation
+
uses
- ShellApi, graphics, sysutils,
+ ShellApi, Graphics, SysUtils,
{$IFNDEF STANDALONESETUP}
UMain,
+{$ELSE}
+ JwaTlHelp32,
+ strutils,
{$ENDIF}
- UConfig, UDataNetwork, UDataWinamp,
+ UConfig, UDataNetwork, UDataWinamp,
UIconUtils, UEditLine, UUtils, IpRtrMib, IpHlpApi, lazutf8, registry;
{$R *.lfm}
-procedure TSetupForm.LoadHint(DisplayDLLName : string);
+procedure TSetupForm.LoadHint(DisplayDLLName: string);
type
- TUsageFunc = function : pchar; stdcall;
+ TUsageFunc = function: PChar; stdcall;
var
- MyDLL : HMODULE;
- UsageFunc : TUsageFunc;
+ MyDLL: HMODULE;
+ UsageFunc: TUsageFunc;
begin
UsageLabel.Caption := 'no parameters';
IDLabel.Caption := 'Warning: DLL may not be compatible!';
ParametersEdit.Text := '';
- if FileExists(DisplayDLLName) then begin
+ if FileExists(DisplayDLLName) then
+ begin
try
- MyDLL := LoadLibrary(pchar(DisplayDLLName));
- if not (MyDll = 0) then begin
- UsageFunc := GetProcAddress(MyDLL,pchar('DISPLAYDLL_Usage'));
+ MyDLL := LoadLibrary(PChar(DisplayDLLName));
+ if not (MyDll = 0) then
+ begin
+ UsageFunc := GetProcAddress(MyDLL, PChar('DISPLAYDLL_Usage'));
if assigned(UsageFunc) then
UsageLabel.Caption := string(UsageFunc);
- UsageFunc := GetProcAddress(MyDLL,pchar('DISPLAYDLL_DriverName'));
-
+ UsageFunc := GetProcAddress(MyDLL, PChar('DISPLAYDLL_DriverName'));
+
if assigned(UsageFunc) then
IDLabel.Caption := string(UsageFunc);
- UsageFunc := GetProcAddress(MyDLL,pchar('DISPLAYDLL_DefaultParameters'));
+ UsageFunc := GetProcAddress(MyDLL, PChar('DISPLAYDLL_DefaultParameters'));
if assigned(UsageFunc) then
ParametersEdit.Text := string(UsageFunc);
FreeLibrary(MyDLL);
end;
except
- on e:exception do;
+ on e: Exception do ;
end;
end;
end;
@@ -498,6 +516,8 @@ procedure TSetupForm.FormShow(Sender: TObject);
BitBtn3.OnClick := SaveAsButtonClick;
BitBtn4.Visible := true;
LoadConfig(Sender);
+ if not FileExists(ConfigFileName) then
+ exitprocess(1);
{$ENDIF}
LoadSettings(Sender);
@@ -558,7 +578,7 @@ procedure TSetupForm.LoadConfig(Sender: TObject);
if (OpenDialog3.FileName = '') then
// Brute force as calling Application.terminate would execute the rest of this procedure first
- exitprocess(1);
+ exit;
ConfigFileName := OpenDialog3.Filename;
end;
@@ -587,19 +607,14 @@ procedure TSetupForm.LoadConfig(Sender: TObject);
{$ENDIF}
end;
-procedure TSetupForm.CreateConfig(Sender: TObject);
-begin
-
-end;
-
procedure TSetupForm.LoadSettings(Sender: TObject);
var
- SR : TSearchRec;
- Loop,FindResult : integer;
- NetStat : TNetworkStatistics;
- WinampStat : TWinampStat;
- i : Integer;
- ActOpr : string;
+ SR: TSearchRec;
+ Loop, FindResult: integer;
+ NetStat: TNetworkStatistics;
+ WinampStat: TWinampStat;
+ i: integer;
+ ActOpr: string;
begin
AppendConfigNameCheckBox.Checked := config.AppendConfigName;
CustomTitleTIEdit1.Text := config.MainFormCaption;
@@ -612,8 +627,9 @@ procedure TSetupForm.LoadSettings(Sender: TObject);
LeftPageControl.ActivePageIndex := config.LastTabIndex;
{$ENDIF}
- GameServerEdit.text := config.gameServer[1, 1];
+ GameServerEdit.Text := config.gameServer[1, 1];
+ ActionsStringGrid.DragMode := dmManual;
ActionsStringGrid.colcount := 6;
ActionsStringGrid.rowcount := 1; // lazarus grids dont work with 0 rows
@@ -623,53 +639,58 @@ procedure TSetupForm.LoadSettings(Sender: TObject);
ActionsStringGrid.ColWidths[2] := 40;
ActionsStringGrid.ColWidths[3] := 46;
ActionsStringGrid.ColWidths[4] := 36;
- ActionsStringGrid.ColWidths[5] := 186;
+ ActionsStringGrid.ColWidths[5] := 165;
// Populate the grid
for i := 1 to config.totalactions do
begin
- ActionsStringGrid.Cells[0, ActionsStringGrid.RowCount-1] := 'if';
- ActionsStringGrid.Cells[1, ActionsStringGrid.RowCount-1] := config.actionsArray[i, 1];
- case (StrToInt(config.actionsArray[i, 2])) of
- 0 : ActOpr := '>';
- 1 : ActOpr := '<';
- 2 : ActOpr := '=';
- 3 : ActOpr := '<=';
- 4 : ActOpr := '>=';
- else ActOpr := '<>';
+ ActionsStringGrid.Cells[0, ActionsStringGrid.RowCount - 1] := 'if';
+ ActionsStringGrid.Cells[1, ActionsStringGrid.RowCount - 1] :=
+ config.actionsArray[i, 1];
+ case (StrToInt(config.actionsArray[i, 2])) of
+ 0: ActOpr := '>';
+ 1: ActOpr := '<';
+ 2: ActOpr := '=';
+ 3: ActOpr := '<=';
+ 4: ActOpr := '>=';
+ else
+ ActOpr := '<>';
end;
- ActionsStringGrid.Cells[2, ActionsStringGrid.RowCount-1] := ActOpr;
- ActionsStringGrid.Cells[3, ActionsStringGrid.RowCount-1] := config.actionsArray[i, 3];
- ActionsStringGrid.Cells[4, ActionsStringGrid.RowCount-1] := 'then';
- ActionsStringGrid.Cells[5, ActionsStringGrid.RowCount-1] := config.actionsArray[i, 4];
+ ActionsStringGrid.Cells[2, ActionsStringGrid.RowCount - 1] := ActOpr;
+ ActionsStringGrid.Cells[3, ActionsStringGrid.RowCount - 1] :=
+ config.actionsArray[i, 3];
+ ActionsStringGrid.Cells[4, ActionsStringGrid.RowCount - 1] := 'then';
+ ActionsStringGrid.Cells[5, ActionsStringGrid.RowCount - 1] :=
+ config.actionsArray[i, 4];
ActionsStringGrid.RowCount := ActionsStringGrid.RowCount + 1;
end;
- ActionsStringGrid.DeleteRow(config.totalactions); // now delete that first row we created
+ ActionsStringGrid.DeleteRow(config.totalactions);
+ ActionsStringGridUpdateScrollBar;
ScreenSpinEdit.MaxValue := MaxScreens;
// load curent screen into setup form
{$IFNDEF STANDALONESETUP}
- ScreenSpinEdit.Value := activeScreen;
- LoadScreen(activeScreen);
+ ScreenSpinEdit.Value := LCDSmartieDisplayForm.activeScreen;
+ LoadScreen(LCDSmartieDisplayForm.activeScreen);
{$ELSE}
LoadScreen(1);
{$ENDIF}
ProgramRefreshIntervalSpinEdit.Value := config.refreshRate;
- WinampLocationEdit.text := config.winampLocation;
- ColorSchemeComboBox.itemindex := config.colorOption;
+ WinampLocationEdit.Text := config.winampLocation;
+ ColorSchemeComboBox.ItemIndex := config.colorOption;
TrayIcon.Text := config.sTrayIcon;
SkinPath.Text := config.sSkinPath;
DrawPreviewIcons(TrayIcon.Text);
- SetiAtHomeEmailEdit.text := config.setiEmail;
+ SetiAtHomeEmailEdit.Text := config.setiEmail;
- DistributedNetLogfileEdit.text := config.distLog;
+ DistributedNetLogfileEdit.Text := config.distLog;
EmailCheckTimeSpinEdit.Value := config.emailPeriod;
DLLCheckIntervalSpinEdit.Value := config.dllPeriod;
ProgramScrollIntervalSpinEdit.Value := config.scrollPeriod;
- StayOnTopCheckBox.checked := config.alwaysOnTop;
+ StayOnTopCheckBox.Checked := config.alwaysOnTop;
HideOnStartup.Checked := config.bHideOnStartup;
NoAutoStart.Checked := True;
AutoStart.Checked := config.bAutoStart;
@@ -681,33 +702,36 @@ procedure TSetupForm.LoadSettings(Sender: TObject);
ShutdownEdit3.Text := config.ShutdownMessage[3];
ShutdownEdit4.Text := config.ShutdownMessage[4];
- WebProxyServerEdit.text := config.httpProxy;
- WebProxyPortEdit.text := IntToStr(config.httpProxyPort);
+ WebProxyServerEdit.Text := config.httpProxy;
+ WebProxyPortEdit.Text := IntToStr(config.httpProxyPort);
EmailAccountComboBox.Clear;
- for i := 1 to MaxEmailAccounts do begin
+ for i := 1 to MaxEmailAccounts do
+ begin
EmailAccountComboBox.Items.Add(IntToStr(i));
end;
- EmailAccountComboBox.itemindex := 0;
- EmailServerEdit.text := config.pop[1].server;
- EmailLoginEdit.text := config.pop[1].user;
- EmailPasswordEdit.text := config.pop[1].pword;
+ EmailAccountComboBox.ItemIndex := 0;
+ EmailServerEdit.Text := config.pop[1].server;
+ EmailLoginEdit.Text := config.pop[1].user;
+ EmailPasswordEdit.Text := config.pop[1].pword;
EmailSSLEdit.Text := config.pop[1].port_ssl;
NetworkStatsListBox.Clear;
- for NetStat := FirstNetworkStat to LastNetworkStat do begin
+ for NetStat := FirstNetworkStat to LastNetworkStat do
+ begin
NetworkStatsListBox.Items.Add(NetworkUserHints[NetStat]);
end;
WinampListBox.Clear;
- for WinampStat := FirstWinampStat to LastWinampStat do begin
+ for WinampStat := FirstWinampStat to LastWinampStat do
+ begin
WinampListBox.Items.Add(WinampHints[WinampStat]);
end;
LCDSizeComboBox.Items.Clear;
for i := 1 to MaxScreenSizes do
LCDSizeComboBox.Items.Add(ScreenSizes[i].SizeName);
- LCDSizeComboBox.itemindex := config.ScreenSize-1;
+ LCDSizeComboBox.ItemIndex := config.ScreenSize - 1;
LCDSizeComboBoxChange(Sender);
// put display plugin settings on screen
@@ -716,16 +740,19 @@ procedure TSetupForm.LoadSettings(Sender: TObject);
DisplayPluginList.Items.Clear;
DisplayPluginList.Items.Add('None');
- DLLPath := extractfilepath(paramstr(0))+'displays\';
- FindResult := findfirst(DLLPath+'*.dll',0,SR);
- while (FindResult = 0) do begin
+ DLLPath := extractfilepath(ParamStr(0)) + 'displays\';
+ FindResult := findfirst(DLLPath + '*.dll', 0, SR);
+ while (FindResult = 0) do
+ begin
DisplayPluginList.Items.Add(extractfilename(SR.Name));
FindResult := FindNext(SR);
end;
findclose(SR);
DisplayPluginList.ItemIndex := 0;
- for Loop := 0 to DisplayPluginList.Items.Count-1 do begin
- if lowercase(config.DisplayDLLName) = lowercase(DisplayPluginList.Items[Loop]) then begin
+ for Loop := 0 to DisplayPluginList.Items.Count - 1 do
+ begin
+ if lowercase(config.DisplayDLLName) = lowercase(DisplayPluginList.Items[Loop]) then
+ begin
DisplayPluginList.ItemIndex := Loop;
end;
end;
@@ -733,33 +760,34 @@ procedure TSetupForm.LoadSettings(Sender: TObject);
DisplayPluginListChange(Sender);
ParametersEdit.Text := config.DisplayDLLParameters; // set our original parameters back
- RandomizeScreensCheckBox.checked := config.randomScreens;
+ RandomizeScreensCheckBox.Checked := config.randomScreens;
GamestatsRefreshTimeSpinEdit.Value := config.gameRefresh;
- FoldingAtHomeEmailEdit.text := config.foldUserid;
+ FoldingAtHomeEmailEdit.Text := config.foldUserid;
EnableRemoteSendCheckBox.Checked := config.EnableRemoteSend;
RemoteSendBindIPEdit.Text := config.RemoteSendBindIP;
RemoteSendPortEdit.Text := config.RemoteSendPort;
RemoteSendPasswordEdit.Text := config.RemoteSendPassword;
- if fileExists(ExtractFilePath(ParamStr(0))+'openssl\cert.pem') and
- fileExists(ExtractFilePath(ParamStr(0))+'openssl\key.pem') then
- RemoteSendUseSSLCheckBox.Checked := config.RemoteSendUseSSL
+ if fileExists(ExtractFilePath(ParamStr(0)) + 'openssl\cert.pem') and
+ fileExists(ExtractFilePath(ParamStr(0)) + 'openssl\key.pem') then
+ RemoteSendUseSSLCheckBox.Checked := config.RemoteSendUseSSL
else
- RemoteSendUseSSLCheckBox.Checked := false;
+ RemoteSendUseSSLCheckBox.Checked := False;
FoldEnableCheckBox.Checked := config.foldEnabled;
SetiEnableCheckBox.Checked := config.setiEnabled;
for i := 1 to 24 do ButtonsListBox.Items.Delete(1);
- LCDFeaturesTabSheet.Enabled := true;
+ LCDFeaturesTabSheet.Enabled := True;
ButtonsListBox.Items.Add('FanSpeed(1,1) (nr,divider)');
// Screen re-arrange populate combo boxes
CopyToScreenComboBox.Clear;
MoveToScreenComboBox.Clear;
SwapWithScreenComboBox.Clear;
- for i := 1 to MaxScreens do begin
+ for i := 1 to MaxScreens do
+ begin
CopyToScreenComboBox.Items.Add(IntToStr(i));
MoveToScreenComboBox.Items.Add(IntToStr(i));
SwapWithScreenComboBox.Items.Add(IntToStr(i));
@@ -771,56 +799,78 @@ procedure TSetupForm.LoadSettings(Sender: TObject);
ActionsTimerSpinEdit.Value := config.ActionsTimer;
end;
-procedure TSetupForm.ActionsStringGridSelectEditor(Sender: TObject; aCol,
- aRow: Integer; var Editor: TWinControl);
+procedure TSetupForm.ActionsStringGridSelectEditor(Sender: TObject;
+ aCol, aRow: integer; var Editor: TWinControl);
var
- Items : array [0..27] of string = ('Next Theme',
- 'Last Theme',
- 'Next screen',
- 'Last screen',
- 'Goto Theme(2)',
- 'Goto Screen(2)',
- 'Freeze/unfreeze screen',
- 'Refresh all data',
- 'Backlight(0/1) (0=off 1=on)',
- 'BacklightToggle',
- 'Backlight Flash(5) (nr. of times)',
- 'PlayWave[c:\wave.wav]',
- 'Execute[c:\autoexec.bat]',
- 'Winamp next track',
- 'Winamp last track',
- 'Winamp play',
- 'Winamp stop',
- 'Winamp pause',
- 'Winamp Shuffle (toggle)',
- 'Winamp volume down',
- 'Winamp volume up',
- 'EnableScreen(1-20)',
- 'DisableScreen(1-20)',
- '$dll(name.dll,2,param1,param2)',
- 'GPO(1-8,0/1) (0=off 1=on)',
- 'GPOToggle(1-8)',
- 'GPOFlash(1-8,2) (nr. of times)',
- 'Fan(1-3,0-255) (0-255=speed)');
-begin
- if aCol=2 then begin
+ Items: array [0..29] of string = ('Next Theme', 'Last Theme',
+ 'Next screen', 'Last screen', 'GotoTheme(2)',
+ 'GotoScreen(2)', 'Freeze screen', 'Unfreeze screen', 'Toggle freeze',
+ 'Refresh all data', 'Backlight(0/1) (0=off 1=on)',
+ 'BacklightToggle', 'Backlight Flash(5) (nr. of times)',
+ 'PlayWave[c:\wave.wav]', 'Execute[c:\autoexec.bat]',
+ 'Winamp next track', 'Winamp last track',
+ 'Winamp play', 'Winamp stop', 'Winamp pause',
+ 'Winamp Shuffle (toggle)', 'Winamp volume down',
+ 'Winamp volume up', 'EnableScreen(1-20)',
+ 'DisableScreen(1-20)', '$dll(name.dll,2,param1,param2)',
+ 'GPO(1-8,0/1) (0=off 1=on)', 'GPOToggle(1-8)',
+ 'GPOFlash(1-8,2) (nr. of times)', 'Fan(1-3,0-255) (0-255=speed)');
+begin
+ if aCol = 2 then
+ begin
Editor := ActionsStringGrid.EditorByStyle(cbsPickList);
TPickListCellEditor(Editor).Items.CommaText := '=,<,>,<=,>=,<>';
end;
- if aCol=5 then begin
+ if aCol = 5 then
+ begin
Editor := ActionsStringGrid.EditorByStyle(cbsPickList);
- TPickListCellEditor(Editor).Items.SetStrings(items);
+ TPickListCellEditor(Editor).Items.SetStrings(items);
end;
end;
-procedure TSetupForm.ActionsStringGridSelection(Sender: TObject; aCol,
- aRow: Integer);
+procedure TSetupForm.ActionsStringGridMouseDown(Sender: TObject;
+ Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+ ActionsStringGrid.MouseToCell(X, Y, SourceCol, SourceRow);
+ ActionsStringGrid.BeginDrag(False, 4);
+end;
+
+procedure TSetupForm.ActionsStringGridDragOver(Sender, Source: TObject; X,
+ Y: Integer; State: TDragState; var Accept: Boolean);
+ var
+ CurrentCol, CurrentRow: integer;
+begin
+ ActionsStringGrid.MouseToCell(X, Y, CurrentCol, CurrentRow);
+ Accept := (Sender = Source);
+end;
+
+procedure TSetupForm.ActionsStringGridDragDrop(Sender, Source: TObject; X,
+ Y: Integer);
+var
+ DestCol, DestRow: Integer;
+begin
+ ActionsStringGrid.MouseToCell(X, Y, DestCol, DestRow);
+ ActionsStringGrid.MoveColRow(false, SourceRow, DestRow);
+end;
+
+procedure TSetupForm.ActionsGridScrollBarScroll(Sender: TObject;
+ ScrollCode: TScrollCode; var ScrollPos: Integer);
+begin
+ ActionsStringGrid.TopRow:=ScrollPos;
+end;
+
+procedure TSetupForm.ActionsStringGridSelection(Sender: TObject; aCol, aRow: integer);
begin
- if (aCol=0) or (aCol=4) then
- ActionsStringGrid.Options:=ActionsStringGrid.Options-[goEditing];
+ if (aCol = 0) or (aCol = 4) then
+ ActionsStringGrid.Options := ActionsStringGrid.Options - [goEditing];
- if (aCol=1) or (aCol=2) or (aCol=3) or (aCol=5) then
- ActionsStringGrid.Options:=ActionsStringGrid.Options+[goEditing];
+ if (aCol = 1) or (aCol = 2) or (aCol = 3) or (aCol = 5) then
+ ActionsStringGrid.Options := ActionsStringGrid.Options + [goEditing];
+end;
+
+procedure TSetupForm.ActionsStringGridUpdateScrollBar;
+begin
+ ActionsGridScrollBar.Max := ActionsStringGrid.RowCount;
end;
procedure TSetupForm.BitBtn4Click(Sender: TObject);
@@ -835,31 +885,31 @@ procedure TSetupForm.BitBtn4Click(Sender: TObject);
procedure TSetupForm.ComPortsButtonClick(Sender: TObject);
var
-i:integer;
-reg:tregistry;
-portnames: tstringlist;
-ports: string;
-aProcess: TProcess;
-lists: tstringlist;
-begin
- // List Parallel ports
- aProcess := TProcess.Create(nil);
- aProcess.Executable := 'WMIC';
- aProcess.Parameters.Add('/namespace:\\root\cimv2');
- aProcess.Parameters.Add('path');
- aProcess.Parameters.Add('Win32_ParallelPort');
- aProcess.Parameters.Add('get');
- aProcess.Parameters.Add('caption');
- aProcess.Options := aProcess.Options + [poWaitOnExit, poUsePipes, poNoConsole];
- aProcess.Execute;
- lists := TStringList.Create;
- lists.LoadFromStream(aProcess.Output);
- aProcess.Free;
- ports := 'Parallel ports:'+#13#10;
- for i := 1 to lists.Count - 1 do
- ports := ports + lists[i]+#13#10;
-
- ports := ports + 'Serial ports:'+#13#10;
+ i: integer;
+ reg: tregistry;
+ portnames: TStringList;
+ ports: string;
+ aProcess: TProcess;
+ lists: TStringList;
+begin
+ // List Parallel ports
+ aProcess := TProcess.Create(nil);
+ aProcess.Executable := 'WMIC';
+ aProcess.Parameters.Add('/namespace:\\root\cimv2');
+ aProcess.Parameters.Add('path');
+ aProcess.Parameters.Add('Win32_ParallelPort');
+ aProcess.Parameters.Add('get');
+ aProcess.Parameters.Add('caption');
+ aProcess.Options := aProcess.Options + [poWaitOnExit, poUsePipes, poNoConsole];
+ aProcess.Execute;
+ lists := TStringList.Create;
+ lists.LoadFromStream(aProcess.Output);
+ aProcess.Free;
+ ports := 'Parallel ports:' + #13#10;
+ for i := 1 to lists.Count - 1 do
+ ports := ports + lists[i] + #13#10;
+
+ ports := ports + 'Serial ports:' + #13#10;
// really should try..except this
portnames := TStringList.Create;
@@ -868,16 +918,25 @@ procedure TSetupForm.ComPortsButtonClick(Sender: TObject);
if Reg.OpenKeyReadOnly('HARDWARE\DEVICEMAP\SERIALCOMM') then
reg.GetValueNames(portnames);
for i := 0 to portnames.Count - 1 do
- ports := ports + portnames[i] + ' ' + (reg.ReadString(portnames[i]))+#13#10;
- showmessage(ports);
+ ports := ports + portnames[i] + ' ' + (reg.ReadString(portnames[i])) + #13#10;
+ ShowMessage(ports);
Reg.Free;
end;
+procedure TSetupForm.FormClose(Sender: TObject; var CloseAction: TCloseAction);
+begin
+ {$IFDEF STANDALONESETUP}
+ config.Free;
+ config := nil;
+ {$ENDIF}
+end;
+
procedure TSetupForm.DisplayPluginListChange(Sender: TObject);
begin
if (DisplayPluginList.ItemIndex > 0) then
- LoadHint(DLLPath+DisplayPluginList.Text)
- else begin
+ LoadHint(DLLPath + DisplayPluginList.Text)
+ else
+ begin
UsageLabel.Caption := 'no parameters';
IDLabel.Caption := '';
ParametersEdit.Text := '';
@@ -886,79 +945,79 @@ procedure TSetupForm.DisplayPluginListChange(Sender: TObject);
procedure TSetupForm.LCDSizeComboBoxChange(Sender: TObject);
begin
- if LCDSizeComboBox.itemindex < 0 then LCDSizeComboBox.itemindex := 0;
-
- if LCDSizeComboBox.itemindex < 5 then
- begin
- ContinueLine1CheckBox.checked := false;
- Line2MemoEdit.Visible := false;
- Line3MemoEdit.Visible := false;
- Line4MemoEdit.Visible := false;
- Line2EditButton.Visible := false;
- Line3EditButton.Visible := false;
- Line4EditButton.Visible := false;
- ShutdownEdit2.Visible := false;
- ShutdownEdit3.Visible := false;
- ShutdownEdit4.Visible := false;
- DontScrollLine2CheckBox.Visible := false;
- DontScrollLine3CheckBox.Visible := false;
- DontScrollLine4CheckBox.Visible := false;
- ContinueLine1CheckBox.Visible := false;
- ContinueLine2CheckBox.Visible := false;
- ContinueLine3CheckBox.Visible := false;
- CenterLine2CheckBox.visible := false;
- CenterLine3CheckBox.visible := false;
- CenterLine4CheckBox.visible := false;
- end;
- if (LCDSizeComboBox.itemindex < 9) and (LCDSizeComboBox.itemindex > 4) then
- begin
- if ContinueLine1CheckBox.checked = false then Line2MemoEdit.Visible := true;
- ContinueLine2CheckBox.checked := false;
- Line3MemoEdit.Visible := false;
- Line4MemoEdit.Visible := false;
- Line2EditButton.Visible := true;
- Line3EditButton.Visible := false;
- Line4EditButton.Visible := false;
- ShutdownEdit2.Visible := true;
- ShutdownEdit3.Visible := false;
- ShutdownEdit4.Visible := false;
- DontScrollLine2CheckBox.Visible := true;
- DontScrollLine3CheckBox.Visible := false;
- DontScrollLine4CheckBox.Visible := false;
- ContinueLine1CheckBox.Visible := true;
- ContinueLine2CheckBox.Visible := false;
- ContinueLine3CheckBox.Visible := false;
- CenterLine2CheckBox.visible := true;
- CenterLine3CheckBox.visible := false;
- CenterLine4CheckBox.visible := false;
- end;
- if LCDSizeComboBox.itemindex > 8 then
- begin
- if ContinueLine1CheckBox.checked = false then Line2MemoEdit.Visible := true;
- if ContinueLine2CheckBox.checked = false then Line3MemoEdit.Visible := true;
- if ContinueLine3CheckBox.checked = false then Line4MemoEdit.Visible := true;
- Line2EditButton.Visible := true;
- Line3EditButton.Visible := true;
- Line4EditButton.Visible := true;
- ShutdownEdit2.Visible := true;
- ShutdownEdit3.Visible := true;
- ShutdownEdit4.Visible := true;
- DontScrollLine2CheckBox.Visible := true;
- DontScrollLine3CheckBox.Visible := true;
- DontScrollLine4CheckBox.Visible := true;
- ContinueLine1CheckBox.Visible := true;
- ContinueLine2CheckBox.Visible := true;
- ContinueLine3CheckBox.Visible := true;
- CenterLine2CheckBox.visible := true;
- CenterLine3CheckBox.visible := true;
- CenterLine4CheckBox.visible := true;
+ if LCDSizeComboBox.ItemIndex < 0 then LCDSizeComboBox.ItemIndex := 0;
+
+ if LCDSizeComboBox.ItemIndex < 5 then
+ begin
+ ContinueLine1CheckBox.Checked := False;
+ Line2MemoEdit.Visible := False;
+ Line3MemoEdit.Visible := False;
+ Line4MemoEdit.Visible := False;
+ Line2EditButton.Visible := False;
+ Line3EditButton.Visible := False;
+ Line4EditButton.Visible := False;
+ ShutdownEdit2.Visible := False;
+ ShutdownEdit3.Visible := False;
+ ShutdownEdit4.Visible := False;
+ DontScrollLine2CheckBox.Visible := False;
+ DontScrollLine3CheckBox.Visible := False;
+ DontScrollLine4CheckBox.Visible := False;
+ ContinueLine1CheckBox.Visible := False;
+ ContinueLine2CheckBox.Visible := False;
+ ContinueLine3CheckBox.Visible := False;
+ CenterLine2CheckBox.Visible := False;
+ CenterLine3CheckBox.Visible := False;
+ CenterLine4CheckBox.Visible := False;
+ end;
+ if (LCDSizeComboBox.ItemIndex < 9) and (LCDSizeComboBox.ItemIndex > 4) then
+ begin
+ if ContinueLine1CheckBox.Checked = False then Line2MemoEdit.Visible := True;
+ ContinueLine2CheckBox.Checked := False;
+ Line3MemoEdit.Visible := False;
+ Line4MemoEdit.Visible := False;
+ Line2EditButton.Visible := True;
+ Line3EditButton.Visible := False;
+ Line4EditButton.Visible := False;
+ ShutdownEdit2.Visible := True;
+ ShutdownEdit3.Visible := False;
+ ShutdownEdit4.Visible := False;
+ DontScrollLine2CheckBox.Visible := True;
+ DontScrollLine3CheckBox.Visible := False;
+ DontScrollLine4CheckBox.Visible := False;
+ ContinueLine1CheckBox.Visible := True;
+ ContinueLine2CheckBox.Visible := False;
+ ContinueLine3CheckBox.Visible := False;
+ CenterLine2CheckBox.Visible := True;
+ CenterLine3CheckBox.Visible := False;
+ CenterLine4CheckBox.Visible := False;
+ end;
+ if LCDSizeComboBox.ItemIndex > 8 then
+ begin
+ if ContinueLine1CheckBox.Checked = False then Line2MemoEdit.Visible := True;
+ if ContinueLine2CheckBox.Checked = False then Line3MemoEdit.Visible := True;
+ if ContinueLine3CheckBox.Checked = False then Line4MemoEdit.Visible := True;
+ Line2EditButton.Visible := True;
+ Line3EditButton.Visible := True;
+ Line4EditButton.Visible := True;
+ ShutdownEdit2.Visible := True;
+ ShutdownEdit3.Visible := True;
+ ShutdownEdit4.Visible := True;
+ DontScrollLine2CheckBox.Visible := True;
+ DontScrollLine3CheckBox.Visible := True;
+ DontScrollLine4CheckBox.Visible := True;
+ ContinueLine1CheckBox.Visible := True;
+ ContinueLine2CheckBox.Visible := True;
+ ContinueLine3CheckBox.Visible := True;
+ CenterLine2CheckBox.Visible := True;
+ CenterLine3CheckBox.Visible := True;
+ CenterLine4CheckBox.Visible := True;
end;
end;
// Multi instance manager
procedure TSetupForm.MiConfigsListBoxClick(Sender: TObject);
begin
- MiConfigNameEdit.Text := ExtractFileName(MiConfigsListBox.FileName);
+ MiConfigNameEdit.Text := ExtractFileName(MiConfigsListBox.FileName);
end;
procedure TSetupForm.MiConfigsLoadBitBtnClick(Sender: TObject);
@@ -973,8 +1032,8 @@ procedure TSetupForm.MiConfigsLoadBitBtnClick(Sender: TObject);
end;
procedure TSetupForm.MiConfigsRefreshBitBtnClick(Sender: TObject);
- var
- sCurrentDir : string;
+var
+ sCurrentDir: string;
begin
// awkward shi as refresh doesnt just refresh the list
sCurrentDir := MiConfigsListBox.Directory;
@@ -999,24 +1058,26 @@ procedure TSetupForm.MiCopyConfigBitBtnClick(Sender: TObject);
if MiConfigNameEdit.Text = '' then
begin
- showmessage('Configuration file name is empty. Type a new name');
+ ShowMessage('Configuration file name is empty. Type a new name');
Exit;
end;
len := length(MiConfigNameEdit.Text);
- ext := copy(MiConfigNameEdit.Text, len -3, 4);
+ ext := copy(MiConfigNameEdit.Text, len - 3, 4);
if (ext = '.ini') then
- NewConfigFileName := ExtractFilePath(application.exename)+MiConfigNameEdit.Text
+ NewConfigFileName := ExtractFilePath(application.exename) + MiConfigNameEdit.Text
else
- NewConfigFileName := ExtractFilePath(application.exename)+MiConfigNameEdit.Text+'.ini';
+ NewConfigFileName := ExtractFilePath(application.exename) +
+ MiConfigNameEdit.Text + '.ini';
if FileExists(NewConfigFileName) then
begin
- showmessage('Configuration file ('+NewConfigFileName+') already exists. Choose another name');
+ ShowMessage('Configuration file (' + NewConfigFileName +
+ ') already exists. Choose another name');
Exit;
end;
- CopyFile(PChar(MiConfigsListBox.FileName), PChar(NewConfigFileName), true);
+ CopyFile(PChar(MiConfigsListBox.FileName), PChar(NewConfigFileName), True);
MiConfigsRefreshBitBtnClick(Sender);
end;
@@ -1043,9 +1104,10 @@ procedure TSetupForm.SelectAllButtonClick(Sender: TObject);
end;
procedure TSetupForm.MiCreateNewProgDirButton1Click(Sender: TObject);
+{$IFDEF STANDALONESETUP}
var
NewDir: string;
- CopyList, CopyPlugins, CopyRootFiles, TmpList: TStringlist;
+ CopyList, CopyPlugins, CopyRootFiles, TmpList: TStringList;
selectionform: TForm;
OkButton, CancelButton, SelectAllButton, InvertButton: TButton;
i, j: integer;
@@ -1053,7 +1115,7 @@ procedure TSetupForm.MiCreateNewProgDirButton1Click(Sender: TObject);
NewConfig: TConfig;
selectdir: TSelectDirectoryDialog;
begin
- {$IFDEF STANDALONESETUP}
+
selectdir := TSelectDirectoryDialog.Create(nil);
selectdir.Title := 'Select or create new folder';
selectdir.InitialDir:='.';
@@ -1251,23 +1313,26 @@ procedure TSetupForm.MiCreateNewProgDirButton1Click(Sender: TObject);
end;
CopyingFileLabel.Caption := 'Done';
- {$ENDIF}
+{$ELSE}
+begin
+{$ENDIF}
end;
procedure TSetupForm.MiDeleteBitBtnClick(Sender: TObject);
var
filename: string;
begin
- if MiConfigsListBox.FileName = '' then
- Exit;
+ if MiConfigsListBox.FileName = '' then
+ Exit;
- filename := MiConfigsListBox.FileName;
+ filename := MiConfigsListBox.FileName;
- case QuestionDlg('Delete Config?', 'Sure to delete' + sLineBreak + filename,
- mtInformation, [mrYes, 'Yes', mrNo, 'No', 'IsDefault'], '') of
- mrYes: DeleteFile(filename);
- end;
- MiConfigsRefreshBitBtnClick(Sender);
+ case QuestionDlg('Delete Config?', 'Sure to delete' + sLineBreak +
+ filename, mtInformation, [mrYes, 'Yes', mrNo,
+ 'No', 'IsDefault'], '') of
+ mrYes: DeleteFile(filename);
+ end;
+ MiConfigsRefreshBitBtnClick(Sender);
end;
procedure TSetupForm.MiNewConfigBitBtnClick(Sender: TObject);
@@ -1280,29 +1345,31 @@ procedure TSetupForm.MiNewConfigBitBtnClick(Sender: TObject);
begin
if MiConfigNameEdit.Text = '' then
begin
- showmessage('Configuration file name is empty. Type a new name');
+ ShowMessage('Configuration file name is empty. Type a new name');
Exit;
end;
len := length(MiConfigNameEdit.Text);
- ext := copy(MiConfigNameEdit.Text, len -3, 4);
+ ext := copy(MiConfigNameEdit.Text, len - 3, 4);
if (ext = '.ini') then
- NewConfigFileName := ExtractFilePath(application.exename)+MiConfigNameEdit.Text
+ NewConfigFileName := ExtractFilePath(application.exename) + MiConfigNameEdit.Text
else
- NewConfigFileName := ExtractFilePath(application.exename)+MiConfigNameEdit.Text+'.ini';
+ NewConfigFileName := ExtractFilePath(application.exename) +
+ MiConfigNameEdit.Text + '.ini';
if FileExists(NewConfigFileName) then
begin
- showmessage('Configuration file ('+NewConfigFileName+') already exists. Choose another name');
+ ShowMessage('Configuration file (' + NewConfigFileName +
+ ') already exists. Choose another name');
Exit;
end;
NewConfig := TConfig.Create(NewConfigFileName);
hConfig := FileCreate(NewConfigFileName);
- If hConfig=-1 then
+ if hConfig = -1 then
begin
FileClose(hConfig);
- showmessage('Configuration file ('+NewConfigFileName+') could not be created');
+ ShowMessage('Configuration file (' + NewConfigFileName + ') could not be created');
Exit;
end;
@@ -1315,15 +1382,15 @@ procedure TSetupForm.MiNewConfigBitBtnClick(Sender: TObject);
end;
// EnumWindows() callback function. Enumerates windows until function returns false
-function EnumWindowsProc(WHandle: HWND; LParM: LParam): LongBool;StdCall;
+function EnumWindowsProc(WHandle: HWND; LParM: LParam): longbool; stdcall;
+{$IFDEF STANDALONESETUP}
var
- Title:array[0..128] of char;
- sTitle: String ;
+ Title: array[0..128] of char;
+ sTitle: string;
pid: DWORD;
ProcessesListLen: integer;
Style: Long;
begin
- {$IFDEF STANDALONESETUP}
Result:=True;
GetWindowText(wHandle, Title,128);
GetWindowThreadProcessId( wHandle, &pid);
@@ -1340,17 +1407,19 @@ function EnumWindowsProc(WHandle: HWND; LParM: LParam): LongBool;StdCall;
Result := false;
end;
end;
- {$ENDIF}
+{$ELSE}
+begin
+{$ENDIF}
end;
procedure TSetupForm.MiRiRefreshBitBtnClick(Sender: TObject);
+{$IFDEF STANDALONESETUP}
var
ProcessLoop: BOOL;
ProcessSnapshotHandle: THandle;
ProcessEntry32: TProcessEntry32;
i: integer;
begin
- {$IFDEF STANDALONESETUP}
ProcessSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessEntry32.dwSize := SizeOf(ProcessEntry32);
ProcessLoop := Process32First(ProcessSnapshotHandle, ProcessEntry32);
@@ -1383,24 +1452,30 @@ procedure TSetupForm.MiRiRefreshBitBtnClick(Sender: TObject);
MiRunningInstancesListGrid.Cells[0, MiRunningInstancesListGrid.RowCount-1] := ProcessesList[i].WindowTitle;
MiRunningInstancesListGrid.Cells[1, MiRunningInstancesListGrid.RowCount-1] := inttostr(ProcessesList[i].Pid);
end;
- {$ENDIF}
+{$ELSE}
+begin
+{$ENDIF}
end;
procedure TSetupForm.MiRiStopInstanceBitBtnClick(Sender: TObject);
+{$IFDEF STANDALONESETUP}
var
pid: integer;
- hnd : THandle;
+ hnd: THandle;
begin
- pid := strtoint(MiRunningInstancesListGrid.Cells[1, MiRunningInstancesListGrid.Row]);
+ pid := StrToInt(MiRunningInstancesListGrid.Cells[1, MiRunningInstancesListGrid.Row]);
hnd := OpenProcess(PROCESS_TERMINATE, False, pid);
if hnd > 0 then
- try
- Win32Check(TerminateProcess(hnd,0));
- finally
- CloseHandle(hnd);
- end;
+ try
+ Win32Check(TerminateProcess(hnd, 0));
+ finally
+ CloseHandle(hnd);
+ end;
MiRiRefreshBitBtnClick(Sender);
+{$ELSE}
+begin
+{$ENDIF}
end;
procedure TSetupForm.MiRunningProcessesTabSheetShow(Sender: TObject);
@@ -1409,11 +1484,11 @@ procedure TSetupForm.MiRunningProcessesTabSheetShow(Sender: TObject);
end;
procedure TSetupForm.MiStartupItemAddBitBtnClick(Sender: TObject);
+{$IFDEF STANDALONESETUP}
var
sParameters: string;
pos: integer;
begin
- {$IFDEF STANDALONESETUP}
if (config.bAutoStartHide) then
sParameters := '-hide ';
@@ -1421,7 +1496,9 @@ procedure TSetupForm.MiStartupItemAddBitBtnClick(Sender: TObject);
pos := 1;
CreateShortcut('LCD Smartie '+ExtractSubstr(ExtractFileName(ConfigFileName), pos, ['.']), ExtractFilePath(Application.ExeName)+'LCDSmartie.exe' , sParameters, False);
MiStartupItemsRefreshBitBtnClick(Sender);
- {$ENDIF}
+{$ELSE}
+begin
+{$ENDIF}
end;
procedure TSetupForm.MiStartupItemRemoveBitBtnClick(Sender: TObject);
@@ -1429,11 +1506,11 @@ procedure TSetupForm.MiStartupItemRemoveBitBtnClick(Sender: TObject);
i: integer;
empty: string;
begin
- for i := 0 to MiStartupItemsCheckListBox.Count -1 do
+ for i := 0 to MiStartupItemsCheckListBox.Count - 1 do
begin
if MiStartupItemsCheckListBox.Checked[i] then
begin
- CreateShortcut(MiStartupItemsCheckListBox.Items[i], empty , empty, True);
+ CreateShortcut(MiStartupItemsCheckListBox.Items[i], empty, empty, True);
end;
end;
MiStartupItemsRefreshBitBtnClick(Sender);
@@ -1441,8 +1518,8 @@ procedure TSetupForm.MiStartupItemRemoveBitBtnClick(Sender: TObject);
procedure TSetupForm.MiStartupItemsLaunchBitBtnClick(Sender: TObject);
var
- R : TRegistry;
- Dir : string;
+ R: TRegistry;
+ Dir: string;
i: integer;
begin
R := TRegistry.Create(KEY_READ);
@@ -1450,22 +1527,23 @@ procedure TSetupForm.MiStartupItemsLaunchBitBtnClick(Sender: TObject);
R.OpenKeyReadOnly('Software\MicroSoft\Windows\CurrentVersion\Explorer\Shell Folders\');
Dir := R.ReadString('Startup');
- for i := 0 to MiStartupItemsCheckListBox.Count -1 do
+ for i := 0 to MiStartupItemsCheckListBox.Count - 1 do
begin
if MiStartupItemsCheckListBox.Checked[i] then
begin
- ShellExecute(Handle, 'open', pchar(Dir+'\'+MiStartupItemsCheckListBox.Items[i]+'.lnk'), '',
- pchar(ExtractFilePath(Application.ExeName)), SW_SHOWNORMAL)
+ ShellExecute(Handle, 'open',
+ PChar(Dir + '\' + MiStartupItemsCheckListBox.Items[i] + '.lnk'), '',
+ PChar(ExtractFilePath(Application.ExeName)), SW_SHOWNORMAL);
end;
end;
- R.free;
+ R.Free;
end;
procedure TSetupForm.MiStartupItemsRefreshBitBtnClick(Sender: TObject);
var
- R : TRegistry;
- Dir : string;
+ R: TRegistry;
+ Dir: string;
Items: TStringList;
i: integer;
begin
@@ -1474,14 +1552,15 @@ procedure TSetupForm.MiStartupItemsRefreshBitBtnClick(Sender: TObject);
R.OpenKeyReadOnly('Software\MicroSoft\Windows\CurrentVersion\Explorer\Shell Folders\');
Dir := R.ReadString('Startup');
Items := TStringList.Create;
- FindAllFiles(Items, Dir, 'LCD Smartie*.lnk', false);
+ FindAllFiles(Items, Dir, 'LCD Smartie*.lnk', False);
MiStartupItemsCheckListBox.Clear;
for i := 0 to Items.Count - 1 do
begin
- MiStartupItemsCheckListBox.AddItem(ExtractFileNameWithoutExt(ExtractFileName(Items[i])), nil);
+ MiStartupItemsCheckListBox.AddItem(ExtractFileNameWithoutExt(
+ ExtractFileName(Items[i])), nil);
end;
- Items.free;
- R.free;
+ Items.Free;
+ R.Free;
end;
procedure TSetupForm.MiStartupItemsTabSheetShow(Sender: TObject);
@@ -1493,136 +1572,139 @@ procedure TSetupForm.RssPageChange(Sender: TObject);
var
feeditem: string;
begin
- if RssTMemoEdit.text <> '' then begin
+ if RssTMemoEdit.Text <> '' then
+ begin
case RssTypeComboBox.ItemIndex of
0: feeditem := 't';
1: feeditem := 'd';
2: feeditem := 'b';
end;
- VariableEdit.Text := '$Rss('+RssTMemoEdit.text+','+feeditem+','+inttostr(RssItemNumSpinEdit.Value)+','+inttostr(RssMaxFreqSpinedit.Value)+')';
+ VariableEdit.Text := '$Rss(' + RssTMemoEdit.Text + ',' + feeditem + ',' +
+ IntToStr(RssItemNumSpinEdit.Value) + ',' + IntToStr(RssMaxFreqSpinedit.Value) + ')';
end;
end;
////// end multi instance manager
-procedure TSetupForm.SaveScreen(scr: Integer);
+procedure TSetupForm.SaveScreen(scr: integer);
begin
if scr = 0 then Exit;
- config.screen[scr].line[1].text := Line1MemoEdit.text;
- config.screen[scr].line[2].text := Line2MemoEdit.text;
- config.screen[scr].line[3].text := Line3MemoEdit.text;
- config.screen[scr].line[4].text := Line4MemoEdit.text;
+ config.screen[scr].line[1].Text := Line1MemoEdit.Text;
+ config.screen[scr].line[2].Text := Line2MemoEdit.Text;
+ config.screen[scr].line[3].Text := Line3MemoEdit.Text;
+ config.screen[scr].line[4].Text := Line4MemoEdit.Text;
- config.screen[scr].settings.enabled := ScreenEnabledCheckBox.checked;
+ config.screen[scr].settings.Enabled := ScreenEnabledCheckBox.Checked;
try
- config.screen[scr].settings.theme := ThemeNumberSpinEdit.value-1;
+ config.screen[scr].settings.theme := ThemeNumberSpinEdit.Value - 1;
except
config.screen[scr].settings.theme := 0;
end;
try
- config.screen[scr].settings.showTime := TimeToShowSpinEdit.value;
+ config.screen[scr].settings.showTime := TimeToShowSpinEdit.Value;
except
config.screen[scr].settings.showTime := 10;
end;
- config.screen[scr].settings.bSticky := StickyCheckbox.Checked;
+ config.screen[scr].settings.bSticky := StickyCheckbox.Checked;
- config.screen[scr].line[1].center := CenterLine1CheckBox.checked;
- config.screen[scr].line[2].center := CenterLine2CheckBox.checked;
- config.screen[scr].line[3].center := CenterLine3CheckBox.checked;
- config.screen[scr].line[4].center := CenterLine4CheckBox.checked;
+ config.screen[scr].line[1].center := CenterLine1CheckBox.Checked;
+ config.screen[scr].line[2].center := CenterLine2CheckBox.Checked;
+ config.screen[scr].line[3].center := CenterLine3CheckBox.Checked;
+ config.screen[scr].line[4].center := CenterLine4CheckBox.Checked;
- config.screen[scr].line[1].noscroll := DontScrollLine1CheckBox.checked;
- config.screen[scr].line[2].noscroll := DontScrollLine2CheckBox.checked;
- config.screen[scr].line[3].noscroll := DontScrollLine3CheckBox.checked;
- config.screen[scr].line[4].noscroll := DontScrollLine4CheckBox.checked;
+ config.screen[scr].line[1].noscroll := DontScrollLine1CheckBox.Checked;
+ config.screen[scr].line[2].noscroll := DontScrollLine2CheckBox.Checked;
+ config.screen[scr].line[3].noscroll := DontScrollLine3CheckBox.Checked;
+ config.screen[scr].line[4].noscroll := DontScrollLine4CheckBox.Checked;
{$IFNDEF STANDALONESETUP}
LCDSmartieDisplayForm.ResetScrollPositions();
{$ENDIF}
- config.screen[scr].line[1].contNextLine := ContinueLine1CheckBox.checked;
- config.screen[scr].line[2].contNextLine := ContinueLine2CheckBox.checked;
- config.screen[scr].line[3].contNextLine := ContinueLine3CheckBox.checked;
+ config.screen[scr].line[1].contNextLine := ContinueLine1CheckBox.Checked;
+ config.screen[scr].line[2].contNextLine := ContinueLine2CheckBox.Checked;
+ config.screen[scr].line[3].contNextLine := ContinueLine3CheckBox.Checked;
config.screen[scr].line[4].contNextLine := False;
- config.screen[scr].settings.TransitionStyle := TTransitionStyle(TransitionStyleComboBox.ItemIndex);
+ config.screen[scr].settings.TransitionStyle :=
+ TTransitionStyle(TransitionStyleComboBox.ItemIndex);
config.screen[scr].settings.TransitionTime := TransitionTimeSpinEdit.Value;
end;
-procedure TSetupForm.LoadScreen(scr: Integer);
+procedure TSetupForm.LoadScreen(scr: integer);
var
ascreen: TScreen;
begin
ascreen := config.screen[scr];
- ScreenEnabledCheckBox.checked := ascreen.settings.enabled;
- ThemeNumberSpinEdit.value := ascreen.settings.theme + 1;
- TimeToShowSpinEdit.value := ascreen.settings.showTime;
- StickyCheckbox.checked := ascreen.settings.bSticky;
- TimeToShowSpinEdit.enabled := not ascreen.settings.bSticky;
-
- DontScrollLine1CheckBox.checked := false;
- DontScrollLine2CheckBox.checked := false;
- DontScrollLine3CheckBox.checked := false;
- DontScrollLine4CheckBox.checked := false;
- ContinueLine1CheckBox.checked := false;
- ContinueLine2CheckBox.checked := false;
- ContinueLine3CheckBox.checked := false;
- DontScrollLine1CheckBox.enabled := true;
- DontScrollLine1CheckBox.checked := false;
- Line2MemoEdit.enabled := true;
- DontScrollLine2CheckBox.enabled := true;
- DontScrollLine2CheckBox.checked := false;
- Line3MemoEdit.enabled := true;
- DontScrollLine3CheckBox.enabled := true;
- DontScrollLine3CheckBox.checked := false;
- Line4MemoEdit.enabled := true;
+ ScreenEnabledCheckBox.Checked := ascreen.settings.Enabled;
+ ThemeNumberSpinEdit.Value := ascreen.settings.theme + 1;
+ TimeToShowSpinEdit.Value := ascreen.settings.showTime;
+ StickyCheckbox.Checked := ascreen.settings.bSticky;
+ TimeToShowSpinEdit.Enabled := not ascreen.settings.bSticky;
+
+ DontScrollLine1CheckBox.Checked := False;
+ DontScrollLine2CheckBox.Checked := False;
+ DontScrollLine3CheckBox.Checked := False;
+ DontScrollLine4CheckBox.Checked := False;
+ ContinueLine1CheckBox.Checked := False;
+ ContinueLine2CheckBox.Checked := False;
+ ContinueLine3CheckBox.Checked := False;
+ DontScrollLine1CheckBox.Enabled := True;
+ DontScrollLine1CheckBox.Checked := False;
+ Line2MemoEdit.Enabled := True;
+ DontScrollLine2CheckBox.Enabled := True;
+ DontScrollLine2CheckBox.Checked := False;
+ Line3MemoEdit.Enabled := True;
+ DontScrollLine3CheckBox.Enabled := True;
+ DontScrollLine3CheckBox.Checked := False;
+ Line4MemoEdit.Enabled := True;
Line1MemoEdit.color := $00A1D7A4;
Line2MemoEdit.color := clWhite;
Line3MemoEdit.color := clWhite;
Line4MemoEdit.color := clWhite;
setupbutton := 1;
- GameServerEdit.text := config.gameServer[scr, 1];
+ GameServerEdit.Text := config.gameServer[scr, 1];
ascreen := config.screen[scr];
- DontScrollLine1CheckBox.checked := ascreen.line[1].noscroll;
+ DontScrollLine1CheckBox.Checked := ascreen.line[1].noscroll;
if ascreen.line[1].contNextLine then
begin
- ContinueLine1CheckBox.checked := true;
- DontScrollLine1CheckBox.Checked := true;
- DontScrollLine1CheckBox.enabled := false;
- Line2MemoEdit.enabled := false;
+ ContinueLine1CheckBox.Checked := True;
+ DontScrollLine1CheckBox.Checked := True;
+ DontScrollLine1CheckBox.Enabled := False;
+ Line2MemoEdit.Enabled := False;
Line2MemoEdit.color := $00BBBBFF;
end;
- Line1MemoEdit.text := ascreen.line[1].text;
+ Line1MemoEdit.Text := ascreen.line[1].Text;
CenterLine1CheckBox.Checked := ascreen.line[1].center;
- DontScrollLine2CheckBox.checked := ascreen.line[2].noscroll;
+ DontScrollLine2CheckBox.Checked := ascreen.line[2].noscroll;
if ascreen.line[2].contNextLine then
begin
- ContinueLine2CheckBox.checked := true;
- DontScrollLine2CheckBox.Checked := true;
- DontScrollLine2CheckBox.enabled := false;
- Line3MemoEdit.enabled := false;
+ ContinueLine2CheckBox.Checked := True;
+ DontScrollLine2CheckBox.Checked := True;
+ DontScrollLine2CheckBox.Enabled := False;
+ Line3MemoEdit.Enabled := False;
Line3MemoEdit.color := $00BBBBFF;
end;
- Line2MemoEdit.text := ascreen.line[2].text;
+ Line2MemoEdit.Text := ascreen.line[2].Text;
CenterLine2CheckBox.Checked := ascreen.line[2].center;
- DontScrollLine3CheckBox.checked := ascreen.line[3].noscroll;
+ DontScrollLine3CheckBox.Checked := ascreen.line[3].noscroll;
if ascreen.line[3].contNextLine then
begin
- ContinueLine3CheckBox.checked := true;
- DontScrollLine3CheckBox.Checked := true;
- DontScrollLine3CheckBox.enabled := false;
- Line4MemoEdit.enabled := false;
+ ContinueLine3CheckBox.Checked := True;
+ DontScrollLine3CheckBox.Checked := True;
+ DontScrollLine3CheckBox.Enabled := False;
+ Line4MemoEdit.Enabled := False;
Line4MemoEdit.color := $00BBBBFF;
end;
- Line3MemoEdit.text := ascreen.line[3].text;
+ Line3MemoEdit.Text := ascreen.line[3].Text;
CenterLine3CheckBox.Checked := ascreen.line[3].center;
- DontScrollLine4CheckBox.checked := ascreen.line[4].noscroll;
- Line4MemoEdit.text := ascreen.line[4].text;
+ DontScrollLine4CheckBox.Checked := ascreen.line[4].noscroll;
+ Line4MemoEdit.Text := ascreen.line[4].Text;
CenterLine4CheckBox.Checked := ascreen.line[4].center;
- TransitionStyleComboBox.ItemIndex := ord(ascreen.settings.TransitionStyle);
+ TransitionStyleComboBox.ItemIndex := Ord(ascreen.settings.TransitionStyle);
TransitionTimeSpinEdit.Value := ascreen.settings.TransitionTime;
end;
@@ -1631,7 +1713,7 @@ procedure TSetupForm.ScreenSpinEditChange(Sender: TObject);
SaveScreen(CurrentScreen);
try
- CurrentScreen := max(1,min(MaxScreens,ScreenSpinEdit.Value));
+ CurrentScreen := max(1, min(MaxScreens, ScreenSpinEdit.Value));
except
CurrentScreen := 1;
end;
@@ -1643,14 +1725,17 @@ procedure TSetupForm.ScreenSpinEditChange(Sender: TObject);
procedure TSetupForm.WinampListBoxClick(Sender: TObject);
var
- WinampStat : TWinampStat;
+ WinampStat: TWinampStat;
begin
- WinampStat := TWinampStat(WinampListBox.itemindex);
- if (WinampStat >= FirstWinampStat) and (WinampStat <= LastWinampStat) then begin
+ WinampStat := TWinampStat(WinampListBox.ItemIndex);
+ if (WinampStat >= FirstWinampStat) and (WinampStat <= LastWinampStat) then
+ begin
VariableEdit.Text := WinampKeys[WinampStat];
- if (WinampStat = wsWinampPosition) then // special case, should be resolved elsewhere
+ if (WinampStat = wsWinampPosition) then
+ // special case, should be resolved elsewhere
VariableEdit.Text := VariableEdit.Text + '(10)';
- end else
+ end
+ else
VariableEdit.Text := NoVariable;
if not (VariableEdit.Text = NoVariable) then
@@ -1660,42 +1745,45 @@ procedure TSetupForm.WinampListBoxClick(Sender: TObject);
// Select currently active text field that will receive variable if 'insert'
// is pressed.
-Procedure TSetupForm.FocusToInputField;
+procedure TSetupForm.FocusToInputField;
var
- tempint1, tempint2: Integer;
+ tempint1, tempint2: integer;
begin
- if (ScreensTabSheet.visible) then // in Screens tab
+ if (ScreensTabSheet.Visible) then // in Screens tab
begin
// not all the lines will be enabled/visible because of different size displays.
- if (setupbutton = 2) and (Line2MemoEdit.Enabled) and (Line2MemoEdit.visible) then
+ if (setupbutton = 2) and (Line2MemoEdit.Enabled) and (Line2MemoEdit.Visible) then
begin
tempint1 := Line2MemoEdit.SelStart;
tempint2 := Line2MemoEdit.SelLength;
- Line2MemoEdit.setfocus;
+ Line2MemoEdit.SetFocus;
Line2MemoEdit.SelStart := tempint1;
Line2MemoEdit.SelLength := tempint2;
end
- else if (setupbutton = 3) and (Line3MemoEdit.enabled) and (Line3MemoEdit.visible) then
+ else if (setupbutton = 3) and (Line3MemoEdit.Enabled) and
+ (Line3MemoEdit.Visible) then
begin
tempint1 := Line3MemoEdit.SelStart;
tempint2 := Line3MemoEdit.SelLength;
- Line3MemoEdit.setfocus;
+ Line3MemoEdit.SetFocus;
Line3MemoEdit.SelStart := tempint1;
Line3MemoEdit.SelLength := tempint2;
end
- else if (setupbutton = 4) and (Line4MemoEdit.enabled) and (Line4MemoEdit.visible) then
+ else if (setupbutton = 4) and (Line4MemoEdit.Enabled) and
+ (Line4MemoEdit.Visible) then
begin
tempint1 := Line4MemoEdit.SelStart;
tempint2 := Line4MemoEdit.SelLength;
- Line4MemoEdit.setfocus;
+ Line4MemoEdit.SetFocus;
Line4MemoEdit.SelStart := tempint1;
Line4MemoEdit.SelLength := tempint2;
end
- else if (Line1MemoEdit.Enabled) and (Line1MemoEdit.visible) then // default to line 1 of screen section
+ else if (Line1MemoEdit.Enabled) and (Line1MemoEdit.Visible) then
+ // default to line 1 of screen section
begin // setupbutton = 1
tempint1 := Line1MemoEdit.SelStart;
tempint2 := Line1MemoEdit.SelLength;
- Line1MemoEdit.setfocus;
+ Line1MemoEdit.SetFocus;
Line1MemoEdit.SelStart := tempint1;
Line1MemoEdit.SelLength := tempint2;
end;
@@ -1704,99 +1792,102 @@ procedure TSetupForm.WinampListBoxClick(Sender: TObject);
procedure TSetupForm.InsertButtonClick(Sender: TObject);
var
- tempint: Integer;
+ tempint: integer;
begin
if VariableEdit.Text <> NoVariable then
begin
- if (ScreensTabSheet.visible) then // in Screens tab
+ if (ScreensTabSheet.Visible) then // in Screens tab
begin
- if (setupbutton = 2) and (Line2MemoEdit.enabled) and (Line2MemoEdit.visible) then
+ if (setupbutton = 2) and (Line2MemoEdit.Enabled) and (Line2MemoEdit.Visible) then
begin
tempint := Line2MemoEdit.SelStart;
- Line2MemoEdit.text := utf8copy(Line2MemoEdit.text, 1, Line2MemoEdit.SelStart) + VariableEdit.Text +
- utf8copy(Line2MemoEdit.text, Line2MemoEdit.SelStart + 1 + Line2MemoEdit.SelLength,
- UTF8Length(Line2MemoEdit.Text));
+ Line2MemoEdit.Text := utf8copy(Line2MemoEdit.Text, 1, Line2MemoEdit.SelStart) +
+ VariableEdit.Text + utf8copy(Line2MemoEdit.Text, Line2MemoEdit.SelStart +
+ 1 + Line2MemoEdit.SelLength, UTF8Length(Line2MemoEdit.Text));
Line2MemoEdit.SetFocus;
- Line2MemoEdit.selstart := tempint + utf8length(VariableEdit.text);
+ Line2MemoEdit.selstart := tempint + utf8length(VariableEdit.Text);
end
- else if (setupbutton = 3) and (Line3MemoEdit.enabled) and (Line3MemoEdit.visible) then
+ else if (setupbutton = 3) and (Line3MemoEdit.Enabled) and
+ (Line3MemoEdit.Visible) then
begin
tempint := Line3MemoEdit.SelStart;
- Line3MemoEdit.text := utf8copy(Line3MemoEdit.text, 1, Line3MemoEdit.SelStart) + VariableEdit.Text +
- utf8copy(Line3MemoEdit.text, Line3MemoEdit.SelStart + 1 + Line3MemoEdit.SelLength,
- UTF8Length(Line3MemoEdit.Text));
+ Line3MemoEdit.Text := utf8copy(Line3MemoEdit.Text, 1, Line3MemoEdit.SelStart) +
+ VariableEdit.Text + utf8copy(Line3MemoEdit.Text, Line3MemoEdit.SelStart +
+ 1 + Line3MemoEdit.SelLength, UTF8Length(Line3MemoEdit.Text));
Line3MemoEdit.SetFocus;
- Line3MemoEdit.selstart := tempint + UTF8Length(VariableEdit.text);
+ Line3MemoEdit.selstart := tempint + UTF8Length(VariableEdit.Text);
end
- else if (setupbutton = 4) and (Line4MemoEdit.enabled) and (Line4MemoEdit.visible) then
+ else if (setupbutton = 4) and (Line4MemoEdit.Enabled) and
+ (Line4MemoEdit.Visible) then
begin
tempint := Line4MemoEdit.SelStart;
- Line4MemoEdit.text := utf8copy(Line4MemoEdit.text, 1, Line4MemoEdit.SelStart) + VariableEdit.Text +
- utf8copy(Line4MemoEdit.text, Line4MemoEdit.SelStart + 1 + Line4MemoEdit.SelLength,
- UTF8Length(Line4MemoEdit.Text));
+ Line4MemoEdit.Text := utf8copy(Line4MemoEdit.Text, 1, Line4MemoEdit.SelStart) +
+ VariableEdit.Text + utf8copy(Line4MemoEdit.Text, Line4MemoEdit.SelStart +
+ 1 + Line4MemoEdit.SelLength, UTF8Length(Line4MemoEdit.Text));
Line4MemoEdit.SetFocus;
- Line4MemoEdit.selstart := tempint + UTF8Length(VariableEdit.text);
+ Line4MemoEdit.selstart := tempint + UTF8Length(VariableEdit.Text);
end
- else if (Line1MemoEdit.enabled) and (Line1MemoEdit.visible) then // default to line 1
+ else if (Line1MemoEdit.Enabled) and (Line1MemoEdit.Visible) then
+ // default to line 1
begin
tempint := Line1MemoEdit.SelStart;
- Line1MemoEdit.text := utf8copy(Line1MemoEdit.text, 1, tempint) + VariableEdit.Text +
- utf8copy(Line1MemoEdit.text, tempint + 1 + Line1MemoEdit.SelLength,
- UTF8Length(Line1MemoEdit.Text));
+ Line1MemoEdit.Text := utf8copy(Line1MemoEdit.Text, 1, tempint) +
+ VariableEdit.Text + utf8copy(Line1MemoEdit.Text, tempint +
+ 1 + Line1MemoEdit.SelLength, UTF8Length(Line1MemoEdit.Text));
Line1MemoEdit.SetFocus;
- Line1MemoEdit.selstart := tempint + UTF8Length(VariableEdit.text);
+ Line1MemoEdit.selstart := tempint + UTF8Length(VariableEdit.Text);
end;
end
else if (ActionsTabSheet.Visible) then // in Actions tab
begin
- if (LastKeyPressedEdit.text='') and (VariableEdit.text='$MObutton') then
+ if (LastKeyPressedEdit.Text = '') and (VariableEdit.Text = '$MObutton') then
begin
- showmessage ('please press the button you want to bind');
+ ShowMessage('please press the button you want to bind');
end
else
begin
if pos('$MObutton', VariableEdit.Text) <> 0 then
- VariableEdit.Text := '$MObutton(' + LastKeyPressedEdit.text + ')';
- ActionsStringGrid.Cells[1, ActionsStringGrid.row] := VariableEdit.text;
+ VariableEdit.Text := '$MObutton(' + LastKeyPressedEdit.Text + ')';
+ ActionsStringGrid.Cells[1, ActionsStringGrid.row] := VariableEdit.Text;
end;
end
else if (StartupTabSheet.Visible) then // in startup/shutdown tab
begin
- if (shdownmessagebutton = 2) and (ShutdownEdit2.enabled) then
+ if (shdownmessagebutton = 2) and (ShutdownEdit2.Enabled) then
begin
tempint := ShutdownEdit2.SelStart;
- ShutdownEdit2.text := utf8copy(ShutdownEdit2.text, 1, ShutdownEdit2.SelStart) + VariableEdit.Text +
- utf8copy(ShutdownEdit2.text, ShutdownEdit2.SelStart + 1 + ShutdownEdit2.SelLength,
- UTF8Length(ShutdownEdit2.Text));
+ ShutdownEdit2.Text := utf8copy(ShutdownEdit2.Text, 1, ShutdownEdit2.SelStart) +
+ VariableEdit.Text + utf8copy(ShutdownEdit2.Text, ShutdownEdit2.SelStart +
+ 1 + ShutdownEdit2.SelLength, UTF8Length(ShutdownEdit2.Text));
ShutdownEdit2.SetFocus;
- ShutdownEdit2.selstart := tempint + utf8length(VariableEdit.text);
+ ShutdownEdit2.selstart := tempint + utf8length(VariableEdit.Text);
end
- else if (shdownmessagebutton = 3) and (ShutdownEdit3.enabled) then
+ else if (shdownmessagebutton = 3) and (ShutdownEdit3.Enabled) then
begin
tempint := ShutdownEdit3.SelStart;
- ShutdownEdit3.text := utf8copy(ShutdownEdit3.text, 1, ShutdownEdit3.SelStart) + VariableEdit.Text +
- utf8copy(ShutdownEdit3.text, ShutdownEdit3.SelStart + 1 + ShutdownEdit3.SelLength,
- UTF8Length(ShutdownEdit3.Text));
+ ShutdownEdit3.Text := utf8copy(ShutdownEdit3.Text, 1, ShutdownEdit3.SelStart) +
+ VariableEdit.Text + utf8copy(ShutdownEdit3.Text, ShutdownEdit3.SelStart +
+ 1 + ShutdownEdit3.SelLength, UTF8Length(ShutdownEdit3.Text));
ShutdownEdit3.SetFocus;
- ShutdownEdit3.selstart := tempint + UTF8Length(VariableEdit.text);
+ ShutdownEdit3.selstart := tempint + UTF8Length(VariableEdit.Text);
end
- else if (shdownmessagebutton = 4) and (ShutdownEdit4.enabled) then
+ else if (shdownmessagebutton = 4) and (ShutdownEdit4.Enabled) then
begin
tempint := ShutdownEdit4.SelStart;
- ShutdownEdit4.text := utf8copy(ShutdownEdit4.text, 1, ShutdownEdit4.SelStart) + VariableEdit.Text +
- utf8copy(ShutdownEdit4.text, ShutdownEdit4.SelStart + 1 + ShutdownEdit4.SelLength,
- UTF8Length(ShutdownEdit4.Text));
+ ShutdownEdit4.Text := utf8copy(ShutdownEdit4.Text, 1, ShutdownEdit4.SelStart) +
+ VariableEdit.Text + utf8copy(ShutdownEdit4.Text, ShutdownEdit4.SelStart +
+ 1 + ShutdownEdit4.SelLength, UTF8Length(ShutdownEdit4.Text));
ShutdownEdit4.SetFocus;
- ShutdownEdit4.selstart := tempint + UTF8Length(VariableEdit.text);
+ ShutdownEdit4.selstart := tempint + UTF8Length(VariableEdit.Text);
end
- else if (ShutdownEdit1.enabled) then // default to line 1
+ else if (ShutdownEdit1.Enabled) then // default to line 1
begin
tempint := ShutdownEdit1.SelStart;
- ShutdownEdit1.text := utf8copy(ShutdownEdit1.text, 1, tempint) + VariableEdit.Text +
- utf8copy(ShutdownEdit1.text, tempint + 1 + ShutdownEdit1.SelLength,
- UTF8Length(ShutdownEdit1.Text));
+ ShutdownEdit1.Text := utf8copy(ShutdownEdit1.Text, 1, tempint) +
+ VariableEdit.Text + utf8copy(ShutdownEdit1.Text, tempint +
+ 1 + ShutdownEdit1.SelLength, UTF8Length(ShutdownEdit1.Text));
ShutdownEdit1.SetFocus;
- ShutdownEdit1.selstart := tempint + UTF8Length(VariableEdit.text);
+ ShutdownEdit1.selstart := tempint + UTF8Length(VariableEdit.Text);
end;
end;
end;
@@ -1804,41 +1895,47 @@ procedure TSetupForm.InsertButtonClick(Sender: TObject);
procedure TSetupForm.SysInfoListBoxClick(Sender: TObject);
begin
- case SysInfoListBox.itemindex of
- 0 : VariableEdit.Text := '$SysUsername';
- 1 : VariableEdit.Text := '$SysComputername';
- 2 : VariableEdit.Text := '$SysUptime';
- 3 : VariableEdit.Text := '$SysUptims';
- 4 : VariableEdit.Text := '$MemFree';
- 5 : VariableEdit.Text := '$MemUsed';
- 6 : VariableEdit.Text := '$MemTotal';
- 7 : VariableEdit.Text := '$MemF%';
- 8 : VariableEdit.Text := '$MemU%';
- 9 : VariableEdit.Text := '$Bar($MemFree,$MemTotal,10)';
- 10 : VariableEdit.Text := '$Bar($MemUsed,$MemTotal,10)';
- 11 : VariableEdit.Text := '$PageFree';
- 12 : VariableEdit.Text := '$PageUsed';
- 13 : VariableEdit.Text := '$PageTotal';
- 14 : VariableEdit.Text := '$PageF%';
- 15 : VariableEdit.Text := '$PageU%';
- 16 : VariableEdit.Text := '$Bar($PageFree,$PageTotal,10)';
- 17 : VariableEdit.Text := '$Bar($PageUsed,$PageTotal,10)';
- 18 : VariableEdit.Text := '$HDFree(C)';
- 19 : VariableEdit.Text := '$HDUsed(C)';
- 20 : VariableEdit.Text := '$HDTotal(C)';
- 21 : VariableEdit.Text := '$HDFreg(C)';
- 22 : VariableEdit.Text := '$HDUseg(C)';
- 23 : VariableEdit.Text := '$HDTotag(C)';
- 24 : VariableEdit.Text := '$HDF%(C)';
- 25 : VariableEdit.Text := '$HDU%(C)';
- 26 : VariableEdit.Text := '$Bar($HDFree(C),$HDTotal(C),10)';
- 27 : VariableEdit.Text := '$Bar($HDUsed(C),$HDTotal(C),10)';
- 28 : VariableEdit.Text := '$ScreenReso';
- 29 : VariableEdit.Text := '$SysSSActive';
- 30 : VariableEdit.Text := '$SysFSGameActive';
- 31 : VariableEdit.Text := '$SysFSAppActive';
- 32 : VariableEdit.Text := '$SysAppActive(LCDSmartie.exe)';
- else VariableEdit.Text := NoVariable;
+ case SysInfoListBox.ItemIndex of
+ 0: VariableEdit.Text := '$SysUsername';
+ 1: VariableEdit.Text := '$SysComputername';
+ 2: VariableEdit.Text := '$SysCPUType';
+ 3 : VariableEdit.Text := '$SysCPUSpeedMhz';
+ 4 : VariableEdit.Text := '$SysCPUSpeedGhz';
+ 5 : VariableEdit.Text := '$SysCPUUsage';
+ 6 : VariableEdit.Text := '$Bar($SysCPUUsage,100,10)';
+ 7: VariableEdit.Text := '$SysUptime';
+ 8: VariableEdit.Text := '$SysUptims';
+ 9: VariableEdit.Text := '$MemFree';
+ 10: VariableEdit.Text := '$MemUsed';
+ 11: VariableEdit.Text := '$MemTotal';
+ 12: VariableEdit.Text := '$MemF%';
+ 13: VariableEdit.Text := '$MemU%';
+ 14: VariableEdit.Text := '$Bar($MemFree,$MemTotal,10)';
+ 15: VariableEdit.Text := '$Bar($MemUsed,$MemTotal,10)';
+ 16: VariableEdit.Text := '$PageFree';
+ 17: VariableEdit.Text := '$PageUsed';
+ 18: VariableEdit.Text := '$PageTotal';
+ 19: VariableEdit.Text := '$PageF%';
+ 20: VariableEdit.Text := '$PageU%';
+ 21: VariableEdit.Text := '$Bar($PageFree,$PageTotal,10)';
+ 22: VariableEdit.Text := '$Bar($PageUsed,$PageTotal,10)';
+ 23: VariableEdit.Text := '$HDFree(C)';
+ 24: VariableEdit.Text := '$HDUsed(C)';
+ 25: VariableEdit.Text := '$HDTotal(C)';
+ 26: VariableEdit.Text := '$HDFreg(C)';
+ 27: VariableEdit.Text := '$HDUseg(C)';
+ 28: VariableEdit.Text := '$HDTotag(C)';
+ 29: VariableEdit.Text := '$HDF%(C)';
+ 30: VariableEdit.Text := '$HDU%(C)';
+ 31: VariableEdit.Text := '$Bar($HDFree(C),$HDTotal(C),10)';
+ 32: VariableEdit.Text := '$Bar($HDUsed(C),$HDTotal(C),10)';
+ 33: VariableEdit.Text := '$ScreenReso';
+ 34: VariableEdit.Text := '$SysSSActive';
+ 35: VariableEdit.Text := '$SysFSGameActive';
+ 36: VariableEdit.Text := '$SysFSAppActive';
+ 37: VariableEdit.Text := '$SysAppActive(LCDSmartie.exe)';
+ else
+ VariableEdit.Text := NoVariable;
end; // case
if not (VariableEdit.Text = NoVariable) then
@@ -1847,24 +1944,33 @@ procedure TSetupForm.SysInfoListBoxClick(Sender: TObject);
procedure TSetupForm.InternetListBoxClick(Sender: TObject);
begin
- case InternetListBox.itemindex of
- 0: VariableEdit.Text := '$Rss(https://news.bbc.co.uk/rss/newsonline_uk_edition/world/rss091.xml,b)';
- 1: VariableEdit.Text := '$Rss(https://news.bbc.co.uk/rss/newsonline_uk_edition/uk/rss091.xml,b)';
+ case InternetListBox.ItemIndex of
+ 0: VariableEdit.Text :=
+ '$Rss(https://news.bbc.co.uk/rss/newsonline_uk_edition/world/rss091.xml,b)';
+ 1: VariableEdit.Text :=
+ '$Rss(https://news.bbc.co.uk/rss/newsonline_uk_edition/uk/rss091.xml,b)';
2: VariableEdit.Text := '$Rss(https://feeds.feedburner.com/tweakers/mixed,b)';
3: VariableEdit.Text := '$Rss(https://www.theregister.com/headlines.rss,b)';
- 4: VariableEdit.Text := '$Rss(http://rss.slashdot.org/Slashdot/slashdot,b)'; // only http
+ 4: VariableEdit.Text := '$Rss(http://rss.slashdot.org/Slashdot/slashdot,b)';
+ // only http
5: VariableEdit.Text := '$Rss(https://www.wired.com/feed/rss,b)';
6: VariableEdit.Text := '$Rss(https://sourceforge.net/p/lcdsmartie/news/feed,b,1)';
7: VariableEdit.Text := '$Rss(https://sourceforge.net/p/palmorb/news/feed,b,1)';
- 8: VariableEdit.Text := '$Rss(https://news.bbc.co.uk/rss/newsonline_world_edition/business/rss091.xml,b)';
- 9: VariableEdit.Text := '$Rss(https://www.washingtonpost.com/wp-srv/business/rssheadlines.xml,b)';
+ 8: VariableEdit.Text :=
+ '$Rss(https://news.bbc.co.uk/rss/newsonline_world_edition/business/rss091.xml,b)';
+ 9: VariableEdit.Text :=
+ '$Rss(https://www.washingtonpost.com/wp-srv/business/rssheadlines.xml,b)';
10: VariableEdit.Text := '$Rss(https://news.yahoo.com/rss/entertainment,b)';
- 11: VariableEdit.Text := '$Rss(https://www.nytimes.com/services/xml/rss/nyt/Health.xml,b)';
- 12: VariableEdit.Text := '$Rss(https://rss.nytimes.com/services/xml/rss/nyt/Sports.xml,b)';
+ 11: VariableEdit.Text :=
+ '$Rss(https://www.nytimes.com/services/xml/rss/nyt/Health.xml,b)';
+ 12: VariableEdit.Text :=
+ '$Rss(https://rss.nytimes.com/services/xml/rss/nyt/Sports.xml,b)';
13: VariableEdit.Text := '$Rss(https://www.volkskrant.nl/economie/rss.xml,b)';
- 14: VariableEdit.Text := '$Rss(https://rs.vpro.nl/v3/api/feeds/3voor12/section/3voor12%20Landelijk,b)';
+ 14: VariableEdit.Text :=
+ '$Rss(https://rs.vpro.nl/v3/api/feeds/3voor12/section/3voor12%20Landelijk,b)';
15: VariableEdit.Text := '$Rss(https://www.ad.nl/home/rss.xml,b)';
- else VariableEdit.Text := NoVariable;
+ else
+ VariableEdit.Text := NoVariable;
end; // case
if not (VariableEdit.Text = NoVariable) then
@@ -1873,32 +1979,33 @@ procedure TSetupForm.InternetListBoxClick(Sender: TObject);
procedure TSetupForm.QStatLabelClick(Sender: TObject);
begin
- ShellExecute(0, Nil, pchar('www.qstat.org'), Nil, Nil, SW_NORMAL);
+ ShellExecute(0, nil, PChar('www.qstat.org'), nil, nil, SW_NORMAL);
end;
procedure TSetupForm.MiscListBoxClick(Sender: TObject);
begin
- case MiscListBox.itemindex of
- 0 : VariableEdit.Text := '$DnetSpeed';
- 1 : VariableEdit.Text := '$DnetDone';
- 2 : VariableEdit.Text := '$Time(d mmmm yyyy hh: nn: ss)';
- 3 : VariableEdit.Text := '°';
- 4 : VariableEdit.Text := '█';
- 5 : VariableEdit.Text := '$Chr(20)';
- 6 : VariableEdit.Text := '$File(C:\file.txt,1)';
- 7 : VariableEdit.Text := '$LogFile(C:\file.log,0)';
- 8 : VariableEdit.Text := '$dll(demo.dll,5,param1,param2)';
- 9 : VariableEdit.Text := '$Count(101#$CPUSpeed#4)';
- 10 : VariableEdit.Text := '$Bar(30,100,20)';
- 11 : VariableEdit.Text := '$Right(ins variable(s) here,$3%)';
- 12 : VariableEdit.Text := '$Fill(10)';
- 13 : VariableEdit.Text := '$Flash(insert text here$)$';
- 14 : VariableEdit.Text := '$CustomChar(1, 31, 31, 31, 31, 31, 31, 31, 31)';
- 15 : VariableEdit.Text := '$Rss(URL,t|d|b,ITEM#,MAXFREQHRS)';
- 16 : VariableEdit.Text := '$Center(text here,15)';
- 17 : VariableEdit.Text := '$ScreenChanged';
- 18 : VariableEdit.Text := '$Sender(127.0.0.10,6088,password1234,1,1)';
- else VariableEdit.Text := NoVariable;
+ case MiscListBox.ItemIndex of
+ 0: VariableEdit.Text := '$DnetSpeed';
+ 1: VariableEdit.Text := '$DnetDone';
+ 2: VariableEdit.Text := '$Time(d mmmm yyyy hh: nn: ss)';
+ 3: VariableEdit.Text := '°';
+ 4: VariableEdit.Text := '█';
+ 5: VariableEdit.Text := '$Chr(20)';
+ 6: VariableEdit.Text := '$File(C:\file.txt,1)';
+ 7: VariableEdit.Text := '$LogFile(C:\file.log,0)';
+ 8: VariableEdit.Text := '$dll(demo.dll,5,param1,param2)';
+ 9: VariableEdit.Text := '$Count(101#$CPUSpeed#4)';
+ 10: VariableEdit.Text := '$Bar(30,100,20)';
+ 11: VariableEdit.Text := '$Right(ins variable(s) here,$3%)';
+ 12: VariableEdit.Text := '$Fill(10)';
+ 13: VariableEdit.Text := '$Flash(insert text here$)$';
+ 14: VariableEdit.Text := '$CustomChar(1, 31, 31, 31, 31, 31, 31, 31, 31)';
+ 15: VariableEdit.Text := '$Rss(URL,t|d|b,ITEM#,MAXFREQHRS)';
+ 16: VariableEdit.Text := '$Center(text here,15)';
+ 17: VariableEdit.Text := '$ScreenChanged';
+ 18: VariableEdit.Text := '$Sender(127.0.0.10,6088,password1234,1,1)';
+ else
+ VariableEdit.Text := NoVariable;
end; // case
if not (VariableEdit.Text = NoVariable) then
@@ -1907,17 +2014,18 @@ procedure TSetupForm.MiscListBoxClick(Sender: TObject);
procedure TSetupForm.SetiAtHomeListBoxClick(Sender: TObject);
begin
- case SetiAtHomeListBox.itemindex of
- 0 : VariableEdit.Text := '$SETIResults';
- 1 : VariableEdit.Text := '$SETICPUTime';
- 2 : VariableEdit.Text := '$SETIAverage';
- 3 : VariableEdit.Text := '$SETILastresult';
- 4 : VariableEdit.Text := '$SETIusertime';
- 5 : VariableEdit.Text := '$SETItotalusers';
- 6 : VariableEdit.Text := '$SETIrank';
- 7 : VariableEdit.Text := '$SETIsharingrank';
- 8 : VariableEdit.Text := '$SETImoreWU%';
- else VariableEdit.Text := NoVariable;
+ case SetiAtHomeListBox.ItemIndex of
+ 0: VariableEdit.Text := '$SETIResults';
+ 1: VariableEdit.Text := '$SETICPUTime';
+ 2: VariableEdit.Text := '$SETIAverage';
+ 3: VariableEdit.Text := '$SETILastresult';
+ 4: VariableEdit.Text := '$SETIusertime';
+ 5: VariableEdit.Text := '$SETItotalusers';
+ 6: VariableEdit.Text := '$SETIrank';
+ 7: VariableEdit.Text := '$SETIsharingrank';
+ 8: VariableEdit.Text := '$SETImoreWU%';
+ else
+ VariableEdit.Text := NoVariable;
end; // case
if not (VariableEdit.Text = NoVariable) then
@@ -1953,16 +2061,16 @@ procedure TSetupForm.GameServerEditExit(Sender: TObject);
begin
if (setupbutton >= 0) and (setupbutton <= 4) then
begin
- config.gameServer[ScreenSpinEdit.Value, setupbutton] := GameServerEdit.text;
+ config.gameServer[ScreenSpinEdit.Value, setupbutton] := GameServerEdit.Text;
end;
end;
procedure TSetupForm.DistributedNetBrowseButtonClick(Sender: TObject);
var
- line, line2: String;
+ line, line2: string;
begin
-// remove duplicate backslash
- line := DistributedNetLogfileEdit.text;
+ // remove duplicate backslash
+ line := DistributedNetLogfileEdit.Text;
line2 := '';
while pos('\', line) <> 0 do
begin
@@ -1970,32 +2078,33 @@ procedure TSetupForm.DistributedNetBrowseButtonClick(Sender: TObject);
line := copy(line, pos('\', line) + 1, length(line));
end;
opendialog2.InitialDir := line2;
- opendialog2.FileName := DistributedNetLogfileEdit.text;
+ opendialog2.FileName := DistributedNetLogfileEdit.Text;
Opendialog2.Execute;
- if opendialog2.FileName <> '' then DistributedNetLogfileEdit.text := opendialog2.FileName;
+ if opendialog2.FileName <> '' then DistributedNetLogfileEdit.Text :=
+ opendialog2.FileName;
end;
procedure TSetupForm.EmailAccountComboBoxChange(Sender: TObject);
begin
- config.pop[CurrentlyShownEmailAccount + 1].server := EmailServerEdit.text;
- config.pop[CurrentlyShownEmailAccount + 1].user := EmailLoginEdit.text;
- config.pop[CurrentlyShownEmailAccount + 1].pword := EmailPasswordEdit.text;
- config.pop[CurrentlyShownEmailAccount + 1].port_ssl := EmailSSLEdit.text;
+ config.pop[CurrentlyShownEmailAccount + 1].server := EmailServerEdit.Text;
+ config.pop[CurrentlyShownEmailAccount + 1].user := EmailLoginEdit.Text;
+ config.pop[CurrentlyShownEmailAccount + 1].pword := EmailPasswordEdit.Text;
+ config.pop[CurrentlyShownEmailAccount + 1].port_ssl := EmailSSLEdit.Text;
- if EmailAccountComboBox.itemIndex < 0 then EmailAccountComboBox.itemindex := 0;
+ if EmailAccountComboBox.ItemIndex < 0 then EmailAccountComboBox.ItemIndex := 0;
- CurrentlyShownEmailAccount := EmailAccountComboBox.itemindex;
- EmailServerEdit.text := config.pop[CurrentlyShownEmailAccount + 1].server;
- EmailLoginEdit.text := config.pop[CurrentlyShownEmailAccount + 1].user;
- EmailPasswordEdit.text := config.pop[CurrentlyShownEmailAccount + 1].pword;
- EmailSSLEdit.text := config.pop[CurrentlyShownEmailAccount + 1].port_ssl;
+ CurrentlyShownEmailAccount := EmailAccountComboBox.ItemIndex;
+ EmailServerEdit.Text := config.pop[CurrentlyShownEmailAccount + 1].server;
+ EmailLoginEdit.Text := config.pop[CurrentlyShownEmailAccount + 1].user;
+ EmailPasswordEdit.Text := config.pop[CurrentlyShownEmailAccount + 1].pword;
+ EmailSSLEdit.Text := config.pop[CurrentlyShownEmailAccount + 1].port_ssl;
if EmailMessageCountRadioButton.Checked then
- VariableEdit.Text := '$Email('+IntToStr(CurrentlyShownEmailAccount+1)+')'
+ VariableEdit.Text := '$Email(' + IntToStr(CurrentlyShownEmailAccount + 1) + ')'
else if EmailLastSubjectRadioButton.Checked then
- VariableEdit.Text := '$EmailSub('+IntToStr(CurrentlyShownEmailAccount+1)+')'
+ VariableEdit.Text := '$EmailSub(' + IntToStr(CurrentlyShownEmailAccount + 1) + ')'
else if EmailLastFromRadioButton.Checked then
- VariableEdit.Text := '$EmailFrom('+IntToStr(CurrentlyShownEmailAccount+1)+')';
+ VariableEdit.Text := '$EmailFrom(' + IntToStr(CurrentlyShownEmailAccount + 1) + ')';
if not (VariableEdit.Text = NoVariable) then
FocusToInputField();
@@ -2003,81 +2112,81 @@ procedure TSetupForm.EmailAccountComboBoxChange(Sender: TObject);
procedure TSetupForm.ContinueLine1CheckBoxClick(Sender: TObject);
var
- tempint1: Integer;
+ tempint1: integer;
begin
- if ContinueLine1CheckBox.checked = true then
+ if ContinueLine1CheckBox.Checked = True then
begin
- DontScrollLine1CheckBox.Checked := true;
- DontScrollLine1CheckBox.enabled := false;
+ DontScrollLine1CheckBox.Checked := True;
+ DontScrollLine1CheckBox.Enabled := False;
if setupbutton = 2 then
begin
tempint1 := Line1MemoEdit.SelStart;
- Line1MemoEdit.setfocus;
+ Line1MemoEdit.SetFocus;
Line1MemoEdit.SelStart := tempint1;
end;
- Line2MemoEdit.enabled := false;
+ Line2MemoEdit.Enabled := False;
Line2MemoEdit.color := $00BBBBFF;
end
else
begin
- DontScrollLine1CheckBox.enabled := true;
- DontScrollLine1CheckBox.checked := false;
- Line2MemoEdit.enabled := true;
+ DontScrollLine1CheckBox.Enabled := True;
+ DontScrollLine1CheckBox.Checked := False;
+ Line2MemoEdit.Enabled := True;
Line2MemoEdit.color := clWhite;
end;
end;
procedure TSetupForm.ContinueLine2CheckBoxClick(Sender: TObject);
var
- tempint1: Integer;
+ tempint1: integer;
begin
- if ContinueLine2CheckBox.checked = true then
+ if ContinueLine2CheckBox.Checked = True then
begin
- DontScrollLine2CheckBox.Checked := true;
- DontScrollLine2CheckBox.enabled := false;
+ DontScrollLine2CheckBox.Checked := True;
+ DontScrollLine2CheckBox.Enabled := False;
if setupbutton = 3 then
begin
tempint1 := Line1MemoEdit.SelStart;
- Line1MemoEdit.setfocus;
+ Line1MemoEdit.SetFocus;
Line1MemoEdit.SelStart := tempint1;
end;
- Line3MemoEdit.enabled := false;
+ Line3MemoEdit.Enabled := False;
Line3MemoEdit.color := $00BBBBFF;
end
else
begin
- DontScrollLine2CheckBox.enabled := true;
- DontScrollLine2CheckBox.checked := false;
- Line3MemoEdit.enabled := true;
+ DontScrollLine2CheckBox.Enabled := True;
+ DontScrollLine2CheckBox.Checked := False;
+ Line3MemoEdit.Enabled := True;
Line3MemoEdit.color := clWhite;
end;
end;
procedure TSetupForm.ContinueLine3CheckBoxClick(Sender: TObject);
var
- tempint1: Integer;
+ tempint1: integer;
begin
- if ContinueLine3CheckBox.checked = true then
+ if ContinueLine3CheckBox.Checked = True then
begin
- DontScrollLine3CheckBox.Checked := true;
- DontScrollLine3CheckBox.enabled := false;
+ DontScrollLine3CheckBox.Checked := True;
+ DontScrollLine3CheckBox.Enabled := False;
if setupbutton = 4 then
begin
tempint1 := Line1MemoEdit.SelStart;
- Line1MemoEdit.setfocus;
+ Line1MemoEdit.SetFocus;
Line1MemoEdit.SelStart := tempint1;
end;
- Line4MemoEdit.enabled := false;
+ Line4MemoEdit.Enabled := False;
Line4MemoEdit.color := $00BBBBFF;
end
else
begin
- DontScrollLine3CheckBox.enabled := true;
- DontScrollLine3CheckBox.checked := false;
- Line4MemoEdit.enabled := true;
+ DontScrollLine3CheckBox.Enabled := True;
+ DontScrollLine3CheckBox.Checked := False;
+ Line4MemoEdit.Enabled := True;
Line4MemoEdit.color := clWhite;
end;
end;
@@ -2085,77 +2194,82 @@ procedure TSetupForm.ContinueLine3CheckBoxClick(Sender: TObject);
procedure TSetupForm.WinampLocationBrowseButtonClick(Sender: TObject);
begin
opendialog1.Execute;
- if opendialog1.FileName <> '' then WinampLocationEdit.text := opendialog1.FileName;
+ if opendialog1.FileName <> '' then WinampLocationEdit.Text := opendialog1.FileName;
end;
procedure TSetupForm.GamestatsListBoxClick(Sender: TObject);
var
- S : string;
-begin
- case GameTypeComboBox.itemindex of
- 0 : S := '$Half-life';
- 1 : S := '$QuakeII';
- 2 : S := '$QuakeIII';
- 3 : S := '$Unreal';
- else S := NoVariable;
+ S: string;
+begin
+ case GameTypeComboBox.ItemIndex of
+ 0: S := '$Half-life';
+ 1: S := '$QuakeII';
+ 2: S := '$QuakeIII';
+ 3: S := '$Unreal';
+ else
+ S := NoVariable;
end; // case
- if not (S = NoVariable) then begin
- VariableEdit.Text := S + IntToStr(GamestatsListBox.Itemindex+1);
+ if not (S = NoVariable) then
+ begin
+ VariableEdit.Text := S + IntToStr(GamestatsListBox.ItemIndex + 1);
FocusToInputField();
- end else
+ end
+ else
VariableEdit.Text := S;
end;
procedure TSetupForm.LineEditEnter(Sender: TObject);
begin
- if (Line1MemoEdit <> Sender) and Line1MemoEdit.Enabled = true then
+ if (Line1MemoEdit <> Sender) and Line1MemoEdit.Enabled = True then
Line1MemoEdit.color := clWhite
else
- if Line1MemoEdit.Enabled = true then
- begin
- Line1MemoEdit.color := $00A1D7A4;
- setupbutton := 1;
- end;
+ if Line1MemoEdit.Enabled = True then
+ begin
+ Line1MemoEdit.color := $00A1D7A4;
+ setupbutton := 1;
+ end;
- if (Line2MemoEdit <> Sender) and Line2MemoEdit.Enabled = true then
+ if (Line2MemoEdit <> Sender) and Line2MemoEdit.Enabled = True then
Line2MemoEdit.color := clWhite
else
- if Line2MemoEdit.Enabled = true then
- begin
- Line2MemoEdit.color := $00A1D7A4;
- setupbutton := 2;
- end;
+ if Line2MemoEdit.Enabled = True then
+ begin
+ Line2MemoEdit.color := $00A1D7A4;
+ setupbutton := 2;
+ end;
- if (Line3MemoEdit <> Sender) and Line3MemoEdit.Enabled = true then
+ if (Line3MemoEdit <> Sender) and Line3MemoEdit.Enabled = True then
Line3MemoEdit.color := clWhite
else
- if Line3MemoEdit.Enabled = true then
- begin
- Line3MemoEdit.color := $00A1D7A4;
- setupbutton := 3;
- end;
+ if Line3MemoEdit.Enabled = True then
+ begin
+ Line3MemoEdit.color := $00A1D7A4;
+ setupbutton := 3;
+ end;
- if (Line4MemoEdit <> Sender) and Line4MemoEdit.Enabled = true then
+ if (Line4MemoEdit <> Sender) and Line4MemoEdit.Enabled = True then
Line4MemoEdit.color := clWhite
else
- if Line4MemoEdit.Enabled = true then
- begin
- Line4MemoEdit.color := $00A1D7A4;
- setupbutton := 4;
- end;
+ if Line4MemoEdit.Enabled = True then
+ begin
+ Line4MemoEdit.color := $00A1D7A4;
+ setupbutton := 4;
+ end;
end;
procedure TSetupForm.NetworkStatsListBoxClick(Sender: TObject);
var
- NetStat : TNetworkStatistics;
+ NetStat: TNetworkStatistics;
begin
- NetStat := TNetworkStatistics(NetworkStatsListBox.itemindex);
- if (NetStat >= FirstNetworkStat) and (NetStat <= LastNetworkStat) then begin
- VariableEdit.Text := NetworkStatisticsKeys[NetStat]+ '(1)';
- end else
+ NetStat := TNetworkStatistics(NetworkStatsListBox.ItemIndex);
+ if (NetStat >= FirstNetworkStat) and (NetStat <= LastNetworkStat) then
+ begin
+ VariableEdit.Text := NetworkStatisticsKeys[NetStat] + '(1)';
+ end
+ else
VariableEdit.Text := NoVariable;
if not (VariableEdit.Text = NoVariable) then
@@ -2164,19 +2278,20 @@ procedure TSetupForm.NetworkStatsListBoxClick(Sender: TObject);
procedure TSetupForm.FoldingAtHomeListBoxClick(Sender: TObject);
begin
- case FoldingAtHomeListBox.itemindex of
- 0 : VariableEdit.Text := '$FOLDUser';
- 1 : VariableEdit.Text := '$FOLDwu';
- 2 : VariableEdit.Text := '$FOLDlastwu';
- 3 : VariableEdit.Text := '$FOLDact50min';
- 4 : VariableEdit.Text := '$FOLDactweek';
- 5 : VariableEdit.Text := '$FOLDscore';
- 6 : VariableEdit.Text := '$FOLDrank';
- 7 : VariableEdit.Text := '$FOLDteamname';
- 8 : VariableEdit.Text := '$FOLDteamscore';
- 9 : VariableEdit.Text := '$FOLDteamwu';
- 10 : VariableEdit.Text := '$FOLDteamlastwu';
- else VariableEdit.Text := NoVariable;
+ case FoldingAtHomeListBox.ItemIndex of
+ 0: VariableEdit.Text := '$FOLDUser';
+ 1: VariableEdit.Text := '$FOLDwu';
+ 2: VariableEdit.Text := '$FOLDlastwu';
+ 3: VariableEdit.Text := '$FOLDact50min';
+ 4: VariableEdit.Text := '$FOLDactweek';
+ 5: VariableEdit.Text := '$FOLDscore';
+ 6: VariableEdit.Text := '$FOLDrank';
+ 7: VariableEdit.Text := '$FOLDteamname';
+ 8: VariableEdit.Text := '$FOLDteamscore';
+ 9: VariableEdit.Text := '$FOLDteamwu';
+ 10: VariableEdit.Text := '$FOLDteamlastwu';
+ else
+ VariableEdit.Text := NoVariable;
end; // case
if not (VariableEdit.Text = NoVariable) then
@@ -2187,65 +2302,68 @@ procedure TSetupForm.FoldingAtHomeListBoxClick(Sender: TObject);
// Apply pressed.
procedure TSetupForm.ApplyButtonClick(Sender: TObject);
var
- ReinitLCD, ReloadSkin: Boolean;
- x: Integer;
- iMaxUsedRow: Integer;
+ ReinitLCD, ReloadSkin: boolean;
+ x, y: integer;
+ iMaxUsedRow: integer;
begin
- ReinitLCD := false;
- ReloadSkin := false;
+ ReinitLCD := False;
+ ReloadSkin := False;
iMaxUsedRow := -1;
- for x := 0 to ActionsStringGrid.RowCount-1 do
+ y := 0;
+ for x := 0 to ActionsStringGrid.RowCount - 1 do
begin
- if (ActionsStringGrid.cells[1, x] <> '') and (ActionsStringGrid.cells[5,
- x] <> '') then
+ if (ActionsStringGrid.cells[1, x] <> '') and
+ (ActionsStringGrid.cells[2, x] <> '') and
+ (ActionsStringGrid.cells[3, x] <> '') and
+ (ActionsStringGrid.cells[5, x] <> '') then
begin
- iMaxUsedRow := x;
- config.actionsArray[x + 1, 1] := ActionsStringGrid.Cells[1, x];
-
- if ActionsStringGrid.Cells[2, x]='>' then
- config.actionsArray[x + 1, 2] := '0';
- if ActionsStringGrid.Cells[2, x]='<' then
- config.actionsArray[x + 1, 2] := '1';
- if ActionsStringGrid.Cells[2, x]='=' then
- config.actionsArray[x + 1, 2] := '2';
- if ActionsStringGrid.Cells[2, x]='<=' then
- config.actionsArray[x + 1, 2] := '3';
- if ActionsStringGrid.Cells[2, x]='>=' then
- config.actionsArray[x + 1, 2] := '4';
- if ActionsStringGrid.Cells[2, x]='<>' then
- config.actionsArray[x + 1, 2] := '5';
-
- config.actionsArray[x + 1, 3] := ActionsStringGrid.Cells[3, x];
- config.actionsArray[x + 1, 4] := ActionsStringGrid.Cells[5, x];
+ iMaxUsedRow := y;
+ config.actionsArray[y + 1, 1] := ActionsStringGrid.Cells[1, x];
+
+ if ActionsStringGrid.Cells[2, x] = '>' then
+ config.actionsArray[y + 1, 2] := '0';
+ if ActionsStringGrid.Cells[2, x] = '<' then
+ config.actionsArray[y + 1, 2] := '1';
+ if ActionsStringGrid.Cells[2, x] = '=' then
+ config.actionsArray[y + 1, 2] := '2';
+ if ActionsStringGrid.Cells[2, x] = '<=' then
+ config.actionsArray[y + 1, 2] := '3';
+ if ActionsStringGrid.Cells[2, x] = '>=' then
+ config.actionsArray[y + 1, 2] := '4';
+ if ActionsStringGrid.Cells[2, x] = '<>' then
+ config.actionsArray[y + 1, 2] := '5';
+
+ config.actionsArray[y + 1, 3] := ActionsStringGrid.Cells[3, x];
+ config.actionsArray[y + 1, 4] := ActionsStringGrid.Cells[5, x];
+ inc(y);
end;
end;
config.totalactions := iMaxUsedRow + 1;
- // Check if Com settings have changed.
+ // unconditionally reinit lcd
+ ReinitLCD := True;
- if (config.DisplayDLLParameters <> ParametersEdit.Text) then ReinitLCD := true;
- if (config.DisplayDLLName <> DisplayPluginList.Text) then ReinitLCD := true;
{$IFNDEF STANDALONESETUP}
- LCDSmartieDisplayForm.WinampCtrl1.WinampLocation := WinampLocationEdit.text;
+ LCDSmartieDisplayForm.WinampCtrl1.WinampLocation := WinampLocationEdit.Text;
{$ENDIF}
- config.winampLocation := WinampLocationEdit.text;
+ config.winampLocation := WinampLocationEdit.Text;
config.refreshRate := ProgramRefreshIntervalSpinEdit.Value;
- config.setiEmail := SetiAtHomeEmailEdit.text;
+ config.setiEmail := SetiAtHomeEmailEdit.Text;
- config.ScreenSize := LCDSizeComboBox.itemindex + 1;
- config.randomScreens := RandomizeScreensCheckBox.checked;
- config.foldUserid := FoldingAtHomeEmailEdit.text;
+ config.ScreenSize := LCDSizeComboBox.ItemIndex + 1;
+ config.randomScreens := RandomizeScreensCheckBox.Checked;
+ config.foldUserid := FoldingAtHomeEmailEdit.Text;
config.gameRefresh := GamestatsRefreshTimeSpinEdit.Value;
- config.colorOption := ColorSchemeComboBox.itemindex;
- config.distLog := DistributedNetLogfileEdit.text;
- config.dllPeriod := DLLCheckIntervalSpinEdit.value;
+ config.colorOption := ColorSchemeComboBox.ItemIndex;
+ config.distLog := DistributedNetLogfileEdit.Text;
+ config.dllPeriod := DLLCheckIntervalSpinEdit.Value;
config.emailPeriod := EmailCheckTimeSpinEdit.Value;
- config.scrollPeriod := ProgramScrollIntervalSpinEdit.value;
- config.alwaysOnTop := StayOnTopCheckBox.checked;
+ config.scrollPeriod := ProgramScrollIntervalSpinEdit.Value;
+ config.alwaysOnTop := StayOnTopCheckBox.Checked;
config.bHideOnStartup := HideOnStartup.Checked;
- config.bAutoStart := AutoStart.checked;
- config.bAutoStartHide := AutoStartHide.checked;
+ config.bAutoStart := AutoStart.Checked;
+ config.bAutoStartHide := AutoStartHide.Checked;
config.EmulateLCD := EmulateLCDCheckbox.Checked;
config.ShutdownMessage[1] := ShutdownEdit1.Text;
config.ShutdownMessage[2] := ShutdownEdit2.Text;
@@ -2263,14 +2381,18 @@ procedure TSetupForm.ApplyButtonClick(Sender: TObject);
LCDSmartieDisplayForm.SetupAutoStart();
{$ENDIF}
- config.pop[(EmailAccountComboBox.itemindex + 1) mod MaxEmailAccounts].server := EmailServerEdit.text;
- config.pop[(EmailAccountComboBox.itemindex + 1) mod MaxEmailAccounts].user := EmailLoginEdit.text;
- config.pop[(EmailAccountComboBox.itemindex + 1) mod MaxEmailAccounts].pword := EmailPasswordEdit.text;
- config.pop[(EmailAccountComboBox.itemindex + 1) mod MaxEmailAccounts].port_ssl := EmailSSLEdit.text;
+ config.pop[(EmailAccountComboBox.ItemIndex + 1) mod MaxEmailAccounts].server :=
+ EmailServerEdit.Text;
+ config.pop[(EmailAccountComboBox.ItemIndex + 1) mod MaxEmailAccounts].user :=
+ EmailLoginEdit.Text;
+ config.pop[(EmailAccountComboBox.ItemIndex + 1) mod MaxEmailAccounts].pword :=
+ EmailPasswordEdit.Text;
+ config.pop[(EmailAccountComboBox.ItemIndex + 1) mod MaxEmailAccounts].port_ssl :=
+ EmailSSLEdit.Text;
- if not (WebProxyPortEdit.text = '') then
- config.httpProxyPort := StrToInt(WebProxyPortEdit.text);
- config.httpProxy := WebProxyServerEdit.text;
+ if not (WebProxyPortEdit.Text = '') then
+ config.httpProxyPort := StrToInt(WebProxyPortEdit.Text);
+ config.httpProxy := WebProxyServerEdit.Text;
SaveScreen(ScreenSpinEdit.Value);
{$IFNDEF STANDALONESETUP}
@@ -2278,9 +2400,9 @@ procedure TSetupForm.ApplyButtonClick(Sender: TObject);
LCDSmartieDisplayForm.Data.RefreshDataThreads;
{$ENDIF}
config.LastTabIndex := LeftPageControl.ActivePageIndex;
- if config.sSkinPath <> SkinPath.Text then ReloadSkin := true;
- if config.sTrayIcon <> TrayIcon.Text then ReloadSkin := true;
- config.sSkinPath := SkinPath.Text;
+ if config.sSkinPath <> SkinPath.Text then ReloadSkin := True;
+ if config.sTrayIcon <> TrayIcon.Text then ReloadSkin := True;
+ config.sSkinPath := SkinPath.Text;
config.sTrayIcon := TrayIcon.Text;
{$IFNDEF STANDALONESETUP}
if ReloadSkin then
@@ -2302,7 +2424,7 @@ procedure TSetupForm.ApplyButtonClick(Sender: TObject);
config.ActionsTimer := ActionsTimerSpinEdit.Value;
config.save();
{$IFNDEF STANDALONESETUP}
- if ReinitLCD = true then
+ if ReinitLCD = True then
begin
LCDSmartieDisplayForm.ReInitLCD();
end;
@@ -2327,18 +2449,18 @@ procedure TSetupForm.SaveAsButtonClick(Sender: TObject);
procedure TSetupForm.FormCreate(Sender: TObject);
var
- pathssl :string;
+ pathssl: string;
begin
{$IFDEF STANDALONESETUP}
SetupForm.BorderStyle := bsSingle;
{$ENDIF}
- pathssl := ExtractFilePath(ParamStr(0))+'openssl\';
- // check if ssl dll exists , if not block the ssl edit !!!
- if not fileExists(pathssl+'libeay32.dll') or
- not fileExists(pathssl+'ssleay32.dll') then EmailSSLEdit.Enabled :=False ;
+ pathssl := ExtractFilePath(ParamStr(0)) + 'openssl\';
+ // check if ssl dll exists , if not block the ssl edit !!!
+ if not fileExists(pathssl + 'libeay32.dll') or not
+ fileExists(pathssl + 'ssleay32.dll') then EmailSSLEdit.Enabled := False;
//point PluginListBox to the plugin dirs
- PluginListBox.Directory := ExtractFilePath(ParamStr(0))+'plugins\';
+ PluginListBox.Directory := ExtractFilePath(ParamStr(0)) + 'plugins\';
end;
procedure TSetupForm.MainPageControlChange(Sender: TObject);
@@ -2346,52 +2468,58 @@ procedure TSetupForm.MainPageControlChange(Sender: TObject);
if MainPageControl.ActivePage = ScreensTabSheet then
begin
- if LeftPageControl.activepage = LCDFeaturesTabSheet then
+ if LeftPageControl.ActivePage = LCDFeaturesTabSheet then
begin
- if pos('$MObutton', VariableEdit.text) <> 0 then VariableEdit.text := NoVariable;
+ if pos('$MObutton', VariableEdit.Text) <> 0 then VariableEdit.Text := NoVariable;
LeftPageControl.ActivePage := WinampTabSheet;
end;
- GameServerEdit.text := config.gameServer[ScreenSpinEdit.Value, 1];
+ GameServerEdit.Text := config.gameServer[ScreenSpinEdit.Value, 1];
setupbutton := 1;
Line1MemoEdit.color := $00A1D7A4;
- if Line2MemoEdit.enabled= true then Line2MemoEdit.color := clWhite
- else Line2MemoEdit.color := $00BBBBFF;
- if Line3MemoEdit.enabled= true then Line3MemoEdit.color := clWhite
- else Line3MemoEdit.color := $00BBBBFF;
- if Line4MemoEdit.enabled= true then Line4MemoEdit.color := clWhite
- else Line4MemoEdit.color := $00BBBBFF;
+ if Line2MemoEdit.Enabled = True then Line2MemoEdit.color := clWhite
+ else
+ Line2MemoEdit.color := $00BBBBFF;
+ if Line3MemoEdit.Enabled = True then Line3MemoEdit.color := clWhite
+ else
+ Line3MemoEdit.color := $00BBBBFF;
+ if Line4MemoEdit.Enabled = True then Line4MemoEdit.color := clWhite
+ else
+ Line4MemoEdit.color := $00BBBBFF;
end;
end;
procedure TSetupForm.ActionAddButtonClick(Sender: TObject);
+var
+ Selection: integer;
begin
- ActionsStringGrid.RowCount := ActionsStringGrid.RowCount+1;
- ActionsStringGrid.Cells[0, ActionsStringGrid.RowCount-1] := 'if';
- ActionsStringGrid.Cells[4, ActionsStringGrid.RowCount-1] := 'then';
+ Selection := ActionsStringGrid.Selection.Top;
+ ActionsStringGrid.InsertColRow(false, Selection +1);
+ ActionsStringGrid.Cells[0, Selection +1] := 'if';
+ ActionsStringGrid.Cells[4, Selection +1] := 'then';
+ ActionsStringGridUpdateScrollBar;
end;
procedure TSetupForm.ActionDeleteButtonClick(Sender: TObject);
-var
- counter2: Integer;
begin
- counter2 := ActionsStringGrid.Selection.Top;
- ActionsStringGrid.DeleteRow(counter2);
+ ActionsStringGrid.DeleteRow(ActionsStringGrid.Selection.Top);
+ ActionsStringGridUpdateScrollBar;
end;
procedure TSetupForm.ButtonsListBoxClick(Sender: TObject);
begin
- case ButtonsListBox.itemindex of
- 0 : VariableEdit.Text := '$MObutton';
- 1 : VariableEdit.Text := '$FanSpeed(1,1)';
- 2 : VariableEdit.Text := '$Sensor1';
- 3 : VariableEdit.Text := '$Sensor2';
- 4 : VariableEdit.Text := '$Sensor3';
- 5 : VariableEdit.Text := '$Sensor4';
- 6 : VariableEdit.Text := '$Sensor5';
- 7 : VariableEdit.Text := '$Sensor6';
- 8 : VariableEdit.Text := '$Sensor7';
- 9 : VariableEdit.Text := '$Sensor8';
- else VariableEdit.Text := NoVariable;
+ case ButtonsListBox.ItemIndex of
+ 0: VariableEdit.Text := '$MObutton';
+ 1: VariableEdit.Text := '$FanSpeed(1,1)';
+ 2: VariableEdit.Text := '$Sensor1';
+ 3: VariableEdit.Text := '$Sensor2';
+ 4: VariableEdit.Text := '$Sensor3';
+ 5: VariableEdit.Text := '$Sensor4';
+ 6: VariableEdit.Text := '$Sensor5';
+ 7: VariableEdit.Text := '$Sensor6';
+ 8: VariableEdit.Text := '$Sensor7';
+ 9: VariableEdit.Text := '$Sensor8';
+ else
+ VariableEdit.Text := NoVariable;
end; // case
if not (VariableEdit.Text = NoVariable) then
@@ -2400,7 +2528,7 @@ procedure TSetupForm.ButtonsListBoxClick(Sender: TObject);
procedure TSetupForm.StickyCheckboxClick(Sender: TObject);
begin
- TimeToShowSpinEdit.enabled := not StickyCheckbox.checked;
+ TimeToShowSpinEdit.Enabled := not StickyCheckbox.Checked;
end;
procedure TSetupForm.ColorSchemeComboBoxChange(Sender: TObject);
@@ -2408,10 +2536,10 @@ procedure TSetupForm.ColorSchemeComboBoxChange(Sender: TObject);
if ColorSchemeComboBox.ItemIndex < 0 then ColorSchemeComboBox.ItemIndex := 0;
end;
-procedure UpdateSetupForm(cKey : char);
+procedure UpdateSetupForm(cKey: char);
begin
if assigned(SetupForm) then
- SetupForm.LastKeyPressedEdit.text := cKey;
+ SetupForm.LastKeyPressedEdit.Text := cKey;
end;
procedure TSetupForm.ContrastTrackBarChange(Sender: TObject);
@@ -2428,17 +2556,17 @@ procedure TSetupForm.BrightnessTrackBarChange(Sender: TObject);
{$ENDIF}
end;
- /////// SHUTDOWN MESSAGE EDIT ///////////////
+/////// SHUTDOWN MESSAGE EDIT ///////////////
procedure TSetupForm.ShutdownEditEnter(Sender: TObject);
var
oEdit: TMemo;
begin
- oEdit := Sender As TMemo;
+ oEdit := Sender as TMemo;
oEdit.Color := $00A1D7A4;
- if (ShutdownEdit1 <> Sender) And ShutdownEdit1.Enabled = true then
+ if (ShutdownEdit1 <> Sender) and ShutdownEdit1.Enabled = True then
ShutdownEdit1.color := clWhite
else
begin
@@ -2446,7 +2574,7 @@ procedure TSetupForm.ShutdownEditEnter(Sender: TObject);
shdownmessagebutton := 1;
end;
- if (ShutdownEdit2 <> Sender) And ShutdownEdit2.enabled = true then
+ if (ShutdownEdit2 <> Sender) and ShutdownEdit2.Enabled = True then
ShutdownEdit2.color := clWhite
else
begin
@@ -2454,7 +2582,7 @@ procedure TSetupForm.ShutdownEditEnter(Sender: TObject);
shdownmessagebutton := 2;
end;
- if (ShutdownEdit3 <> Sender) And ShutdownEdit3.enabled = true then
+ if (ShutdownEdit3 <> Sender) and ShutdownEdit3.Enabled = True then
ShutdownEdit3.color := clWhite
else
begin
@@ -2462,7 +2590,7 @@ procedure TSetupForm.ShutdownEditEnter(Sender: TObject);
shdownmessagebutton := 3;
end;
- if (ShutdownEdit4 <> Sender) And ShutdownEdit4.enabled = true then
+ if (ShutdownEdit4 <> Sender) and ShutdownEdit4.Enabled = True then
ShutdownEdit4.color := clWhite
else
begin
@@ -2476,7 +2604,7 @@ procedure TSetupForm.ShutdownEditEnter(Sender: TObject);
/////////////////////////////////////////////////////////////////
procedure TSetupForm.Btn_PluginRefreshClick(Sender: TObject);
var
- sCurrentDir : string;
+ sCurrentDir: string;
begin
// awkward shi as refresh doesnt just refresh the list
sCurrentDir := PluginListBox.Directory;
@@ -2487,20 +2615,20 @@ procedure TSetupForm.Btn_PluginRefreshClick(Sender: TObject);
procedure TSetupForm.PluginListBoxDblClick(Sender: TObject);
var
- plugin_name :string;
+ plugin_name: string;
begin
plugin_name := ExtractFileName(PluginListBox.FileName);
- plugin_name := copy(plugin_name,0,Length(plugin_name)-4)+'.txt';
- if FileExists(ExtractFilePath(ParamStr(0))+'plugins\'+plugin_name) then
- ShellExecute(0, Nil, pchar(plugin_name), Nil, Nil, SW_NORMAL)
+ plugin_name := copy(plugin_name, 0, Length(plugin_name) - 4) + '.txt';
+ if FileExists(ExtractFilePath(ParamStr(0)) + 'plugins\' + plugin_name) then
+ ShellExecute(0, nil, PChar(plugin_name), nil, nil, SW_NORMAL)
else
- ShowMessage('File : '+plugin_name+' does not exist');
+ ShowMessage('File : ' + plugin_name + ' does not exist');
end;
procedure TSetupForm.PluginListBoxClick(Sender: TObject);
begin
- VariableEdit.text := '$dll('+ExtractFileName(PluginListBox.FileName)+',1,0,0)';
+ VariableEdit.Text := '$dll(' + ExtractFileName(PluginListBox.FileName) + ',1,0,0)';
end;
/////////////////////////////////////////////////////////////////
@@ -2509,26 +2637,26 @@ procedure TSetupForm.PluginListBoxClick(Sender: TObject);
procedure TSetupForm.TrayIconBrowseButtonClick(Sender: TObject);
var
bEnd: bool;
- s : string;
+ s: string;
begin
- bEnd:=False;
+ bEnd := False;
repeat
- begin
- OpenIco.InitialDir := ExtractFilePath(application.exename) + SkinPath.Text;
- OpenIco.FileName := TrayIcon.Text;
+ begin
+ OpenIco.InitialDir := ExtractFilePath(application.exename) + SkinPath.Text;
+ OpenIco.FileName := TrayIcon.Text;
- if OpenIco.Execute() then
+ if OpenIco.Execute() then
begin
- s := ExtractFilePath(OpenIco.FileName);
- if s = OpenIco.InitialDir then
- bEnd := True
- else
- ShowMessage('Error'+ sLineBreak +
- 'Tray Icon can be only in the current selected Skin path')
+ s := ExtractFilePath(OpenIco.FileName);
+ if s = OpenIco.InitialDir then
+ bEnd := True
+ else
+ ShowMessage('Error' + sLineBreak +
+ 'Tray Icon can be only in the current selected Skin path');
end
- else
- bEnd:=True;
- end
+ else
+ bEnd := True;
+ end
until bEnd;
TrayIcon.Text := extractfilename(OpenIco.FileName);
@@ -2541,10 +2669,10 @@ procedure TSetupForm.OpeIcoFolderChange(Sender: TObject);
end;
-procedure TSetupForm.DrawPreviewIcons(const sIconFileName: String);
+procedure TSetupForm.DrawPreviewIcons(const sIconFileName: string);
var
-hIcon: tIcon;
-IconPathName: string;
+ hIcon: tIcon;
+ IconPathName: string;
begin
hIcon := TIcon.Create;
IconPathName := extractfilepath(application.exename) + SkinPath.Text + sIconFileName;
@@ -2557,28 +2685,29 @@ procedure TSetupForm.DrawPreviewIcons(const sIconFileName: String);
except
on E: Exception do
begin
- showmessage('Error' + sLineBreak + 'Unable to load Tray Icon from Skin path, ' +
+ ShowMessage('Error' + sLineBreak + 'Unable to load Tray Icon from Skin path, ' +
SkinPath.Text + sIconFileName + ': ' + E.Message);
end;
end;
- hIcon.Destroy;
+ hIcon.Free;
end;
-Function MyFileExists(const FileName: string): Boolean;
+function MyFileExists(const FileName: string): boolean;
var
Handle: THandle;
FindData: TWin32FindData;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
if Handle <> INVALID_HANDLE_VALUE then
- begin
- Windows.FindClose(Handle);
- if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)=0 then
- Result:=true
- else
- Result:=false;
- end
- else Result:=false;
+ begin
+ Windows.FindClose(Handle);
+ if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
+ Result := True
+ else
+ Result := False;
+ end
+ else
+ Result := False;
end;
/////////////////////////////////////////////////////////////////
@@ -2586,22 +2715,21 @@ procedure TSetupForm.DrawPreviewIcons(const sIconFileName: String);
/////////////////////////////////////////////////////////////////
procedure TSetupForm.SkinPathBrowseButtonClick(Sender: TObject);
var
- b,f,s,x: string;
+ b, f, s, x: string;
begin
b := ExtractFilePath(application.exename);
- f:= '\images';
- if SelectDirectory('Select a skin directory', b, f)
- then
+ f := '\images';
+ if SelectDirectory('Select a skin directory', b, f) then
+ begin
+ x := f + '\colors.cfg';
+ if MyFileExists(x) then
begin
- x := f + '\colors.cfg';
- if MyFileExists(x) then
- begin
- s := ExtractRelativePath(b, f);
- SkinPath.Text := s + '\';
- end
- else
- ShowMessage('Selected directory does not contain a valid skin');
- end;
+ s := ExtractRelativePath(b, f);
+ SkinPath.Text := s + '\';
+ end
+ else
+ ShowMessage('Selected directory does not contain a valid skin');
+ end;
end;
/////////////////////////////////////////////////////////////////
@@ -2620,19 +2748,20 @@ procedure TSetupForm.LineEditClick(Sender: TObject);
FormEdit.Top := config.EditFormPosTop;
FormEdit.Left := config.EditFormPosLeft;
- with FormEdit do begin
+ with FormEdit do
+ begin
showmodal;
- if ModalResult = mrOK then
- begin
- config.EditFormPosTop := FormEdit.Top;
- config.EditFormPosLeft := FormEdit.Left;
+ if ModalResult = mrOk then
+ begin
+ config.EditFormPosTop := FormEdit.Top;
+ config.EditFormPosLeft := FormEdit.Left;
- if Sender = Line1EditButton then Line1MemoEdit.Text := FormEdit.Memo1.Text;
- if Sender = Line2EditButton then Line2MemoEdit.Text := FormEdit.Memo1.Text;
- if Sender = Line3EditButton then Line3MemoEdit.Text := FormEdit.Memo1.Text;
- if Sender = Line4EditButton then Line4MemoEdit.Text := FormEdit.Memo1.Text;
- end;
+ if Sender = Line1EditButton then Line1MemoEdit.Text := FormEdit.Memo1.Text;
+ if Sender = Line2EditButton then Line2MemoEdit.Text := FormEdit.Memo1.Text;
+ if Sender = Line3EditButton then Line3MemoEdit.Text := FormEdit.Memo1.Text;
+ if Sender = Line4EditButton then Line4MemoEdit.Text := FormEdit.Memo1.Text;
+ end;
end;
end;
@@ -2643,14 +2772,15 @@ procedure TSetupForm.LineEditClick(Sender: TObject);
function GetAllCheckboxes(_frm: TForm): TCheckBoxArray;
var
- i: Integer;
+ i: integer;
cmp: TComponent;
begin
SetLength(Result, _frm.ComponentCount);
i := 1;
repeat
cmp := _frm.FindComponent('CCharCheckBox' + IntToStr(i));
- if cmp <> nil then begin
+ if cmp <> nil then
+ begin
Result[i - 1] := cmp as TCheckBox;
Inc(i);
end;
@@ -2675,63 +2805,64 @@ procedure TSetupForm.CCharEditGridChange(Sender: TObject);
if CreateCCharRadioButton.Checked then
begin
- CreateCCharLocSpinEdit.enabled := true;
- UseCCharLocSpinEdit.enabled := false;
+ CreateCCharLocSpinEdit.Enabled := True;
+ UseCCharLocSpinEdit.Enabled := False;
- for i:=0 to 39 do
+ for i := 0 to 39 do
begin
- CheckBoxes[i].Enabled := true;
+ CheckBoxes[i].Enabled := True;
end;
i := 1;
- while box<40 do
+ while box < 40 do
begin
- CCharLine[i] := 0 ;
+ CCharLine[i] := 0;
if CheckBoxes[box].Checked then
begin
- CCharLine[i] := CCharLine[i]+16;
+ CCharLine[i] := CCharLine[i] + 16;
end;
Inc(box);
if CheckBoxes[box].Checked then
begin
- CCharLine[i] := CCharLine[i]+8;
+ CCharLine[i] := CCharLine[i] + 8;
end;
Inc(box);
if CheckBoxes[box].Checked then
begin
- CCharLine[i] := CCharLine[i]+4;
+ CCharLine[i] := CCharLine[i] + 4;
end;
Inc(box);
if CheckBoxes[box].Checked then
begin
- CCharLine[i] := CCharLine[i]+2;
+ CCharLine[i] := CCharLine[i] + 2;
end;
Inc(box);
if CheckBoxes[box].Checked then
begin
- CCharLine[i] := CCharLine[i]+1;
+ CCharLine[i] := CCharLine[i] + 1;
end;
Inc(box);
Inc(i);
end;
- VariableEdit.Text := '$CustomChar('+IntToStr(CreateCCharLocSpinEdit.Value)
- +','+IntToStr(CCharLine[1])+','+IntToStr(CCharLine[2])+','+IntToStr(CCharLine[3])
- +','+IntToStr(CCharLine[4])+','+IntToStr(CCharLine[5])+','+IntToStr(CCharLine[6])
- +','+IntToStr(CCharLine[7])+','+IntToStr(CCharLine[8])+')';
- end
- else
- begin
- CreateCCharLocSpinEdit.enabled := false;
- UseCCharLocSpinEdit.enabled := true;
+ VariableEdit.Text := '$CustomChar(' + IntToStr(CreateCCharLocSpinEdit.Value) +
+ ',' + IntToStr(CCharLine[1]) + ',' + IntToStr(CCharLine[2]) + ',' + IntToStr(
+ CCharLine[3]) + ',' + IntToStr(CCharLine[4]) + ',' + IntToStr(CCharLine[5]) +
+ ',' + IntToStr(CCharLine[6]) + ',' + IntToStr(CCharLine[7]) + ',' + IntToStr(CCharLine[8]) + ')';
+ end
+ else
+ begin
+ CreateCCharLocSpinEdit.Enabled := False;
+ UseCCharLocSpinEdit.Enabled := True;
- for i:=0 to 39 do
- begin
- CheckBoxes[i].Enabled := false;
- end;
- VariableEdit.Text := '$Chr('+inttostr(CCharLocation[UseCCharLocSpinEdit.value])+')'
+ for i := 0 to 39 do
+ begin
+ CheckBoxes[i].Enabled := False;
end;
- checkboxes := nil;
+ VariableEdit.Text := '$Chr(' + IntToStr(
+ CCharLocation[UseCCharLocSpinEdit.Value]) + ')';
+ end;
+ checkboxes := nil;
end;
// some code taken from UDataNetwork.pas to list interface numbers
@@ -2740,20 +2871,22 @@ procedure TSetupForm.NetworkStatsAdapterListButtonClick(Sender: TObject);
var
Size: ULONG;
IntfTable: PMibIfTable;
- MaxEntries: Cardinal;
- Names: String;
- i: Integer;
+ MaxEntries: cardinal;
+ Names: string;
+ i: integer;
begin
Size := 0;
if GetIfTable(nil, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
- if (Size < sizeof( TMibIftable)) then Exit;
+ if (Size < sizeof(TMibIftable)) then Exit;
IntfTable := AllocMem(Size);
if (IntfTable <> nil) and (GetIfTable(IntfTable, Size, True) = NO_ERROR) then
begin
- MaxEntries := min(IntfTable^.dwNumEntries,MAXNETSTATS);
- for i:=0 to MaxEntries-1 do
+ MaxEntries := min(IntfTable^.dwNumEntries, MAXNETSTATS);
+ for i := 0 to MaxEntries - 1 do
begin
- {$R-}Names := Names+IntToStr(i)+' '+PChar(@IntfTable.Table[i].bDescr[0])+#13#10;{$R+}
+ {$R-}
+ Names := Names + IntToStr(i) + ' ' + PChar(@IntfTable.Table[i].bDescr[0]) + #13#10;
+{$R+}
end;
ShowMessage(Names);
end;
@@ -2764,39 +2897,43 @@ procedure TSetupForm.NetworkStatsAdapterListButtonClick(Sender: TObject);
////////////////////////////////////////////////////////
procedure TSetupForm.CopyToScreenButtonClick(Sender: TObject);
begin
- if ScreenSpinEdit.value = CopyToScreenComboBox.ItemIndex+1 then
+ if ScreenSpinEdit.Value = CopyToScreenComboBox.ItemIndex + 1 then
begin
- showmessage('Destination screen is the same as this screen'+#13#10+'Choose another destination');
+ ShowMessage('Destination screen is the same as this screen' +
+ #13#10 + 'Choose another destination');
exit;
end;
- config.screen[CopyToScreenComboBox.itemindex+1] := config.screen[screenspinedit.value];
+ config.screen[CopyToScreenComboBox.ItemIndex + 1] := config.screen[screenspinedit.Value];
end;
procedure TSetupForm.MoveToScreenButtonClick(Sender: TObject);
begin
- if ScreenSpinEdit.value = MoveToScreenComboBox.ItemIndex+1 then
+ if ScreenSpinEdit.Value = MoveToScreenComboBox.ItemIndex + 1 then
begin
- showmessage('Destination screen is the same as this screen'+#13#10+'Choose another destination');
+ ShowMessage('Destination screen is the same as this screen' +
+ #13#10 + 'Choose another destination');
exit;
end;
- config.screen[MoveToScreenComboBox.ItemIndex+1] := config.screen[ScreenSpinEdit.value];
- config.screen[ScreenSpinEdit.value] := Default(TScreen);
- LoadScreen(ScreenSpinEdit.value);
+ config.screen[MoveToScreenComboBox.ItemIndex + 1] := config.screen[ScreenSpinEdit.Value];
+ config.screen[ScreenSpinEdit.Value] := Default(TScreen);
+ LoadScreen(ScreenSpinEdit.Value);
end;
procedure TSetupForm.SwapWithScreenButtonClick(Sender: TObject);
var
TempScreen: Tscreen;
begin
- if ScreenSpinEdit.value = SwapWithScreenComboBox.ItemIndex+1 then
+ if ScreenSpinEdit.Value = SwapWithScreenComboBox.ItemIndex + 1 then
begin
- showmessage('Destination screen is the same as this screen'+#13#10+'Choose another destination');
+ ShowMessage('Destination screen is the same as this screen' +
+ #13#10 + 'Choose another destination');
exit;
end;
- TempScreen := config.screen[ScreenSpinEdit.value];
- config.screen[ScreenSpinEdit.value] := config.screen[SwapWithScreenComboBox.ItemIndex+1];
- config.screen[SwapWithScreenComboBox.ItemIndex+1] := TempScreen;
- LoadScreen(ScreenSpinEdit.value);
+ TempScreen := config.screen[ScreenSpinEdit.Value];
+ config.screen[ScreenSpinEdit.Value] :=
+ config.screen[SwapWithScreenComboBox.ItemIndex + 1];
+ config.screen[SwapWithScreenComboBox.ItemIndex + 1] := TempScreen;
+ LoadScreen(ScreenSpinEdit.Value);
end;
////////////////////////////////////////////////////////
@@ -2805,19 +2942,19 @@ procedure TSetupForm.SwapWithScreenButtonClick(Sender: TObject);
procedure TSetupForm.RemoteSendUseSSLCheckBoxClick(Sender: TObject);
begin
if RemoteSendUseSSLCheckBox.Checked then
- if fileExists(ExtractFilePath(application.exename)+'openssl\cert.pem') and
- fileExists(ExtractFilePath(application.exename)+'openssl\key.pem') then
- config.RemoteSendUseSSL := true
+ if fileExists(ExtractFilePath(application.exename) + 'openssl\cert.pem') and
+ fileExists(ExtractFilePath(application.exename) + 'openssl\key.pem') then
+ config.RemoteSendUseSSL := True
else
begin
- config.RemoteSendUseSSL := false;
- RemoteSendUseSSLCheckBox.Checked := false;
- showmessage('Generate SSL certificate first');
+ config.RemoteSendUseSSL := False;
+ RemoteSendUseSSLCheckBox.Checked := False;
+ ShowMessage('Generate SSL certificate first');
end
else
begin
- RemoteSendUseSSLCheckBox.Checked := false;
- config.RemoteSendUseSSL := false;
+ RemoteSendUseSSLCheckBox.Checked := False;
+ config.RemoteSendUseSSL := False;
end;
end;
@@ -2825,13 +2962,14 @@ procedure TSetupForm.RemoteSendGenerateCertKeyButtonClick(Sender: TObject);
var
OSSLDirname: string;
begin
- OSSLDirname := ExtractFilePath(application.exename)+'openssl\';
+ OSSLDirname := ExtractFilePath(application.exename) + 'openssl\';
- if fileExists(OSSLDirname+'openssl.exe') then
- ShellExecute(Handle, 'open', pchar(OSSLDirname+'openssl.exe'), 'req -x509 -nodes -days 365 -newkey rsa:1024 -keyout key.pem -out cert.pem -subj "/C=LC/ST=DSM/L=ART/O=Mon organisation/CN=IE" -config openssl.cfg',
- pchar(OSSLDirname), SW_SHOWNORMAL)
+ if fileExists(OSSLDirname + 'openssl.exe') then
+ ShellExecute(Handle, 'open', PChar(OSSLDirname + 'openssl.exe'),
+ 'req -x509 -nodes -days 365 -newkey rsa:1024 -keyout key.pem -out cert.pem -subj "/C=LC/ST=DSM/L=ART/O=Mon organisation/CN=IE" -config openssl.cfg',
+ PChar(OSSLDirname), SW_SHOWNORMAL)
else
- showmessage('openssl\openssl.exe is missing');
+ ShowMessage('openssl\openssl.exe is missing');
end;
diff --git a/components/README.txt b/components/README.txt
index 4ff7e9d..4f06d36 100644
--- a/components/README.txt
+++ b/components/README.txt
@@ -1,4 +1,3 @@
-
This directory contains components/software that LCD Smartie needs to build.
They are here to save developers searching for them (or in case they become
@@ -8,8 +7,24 @@ unavailable) - but there may be newer versions available!
WinampCtrl:
Downloaded from: unknown [obtained from BasieP]
License: unknown [obtained from BasieP]
-Ported to lazarus
+ Ported to lazarus
Installing:
- open WinampCtrl7 click compile
+ Extract archive,
+ open WinampCtrl7, click compile,
open WinampCtrl7_design.lpk, click compile, click install, rebuild lazarus
+openssl-1.0.2u-i386-win32:
+ openssl binaries for 32 bit builds
+ Downloaded from: https://github.com/IndySockets/OpenSSL-Binaries
+Installing:
+ Extract archive,
+ copy contents to openssl directory next to the LCDSmartie.exe program
+ remember to add openssl.cfg from build tools directory
+
+openssl-1.0.2u-x64_86-win64:
+ openssl binaries for 64 bit builds
+ Downloaded from: https://github.com/IndySockets/OpenSSL-Binaries
+Installing:
+ Extract archive,
+ copy contents to openssl directory next to the LCDSmartie.exe program
+ remember to add openssl.cfg from build tools directory
\ No newline at end of file
diff --git a/components/openssl-1.0.2u-i386-win32.zip b/components/openssl-1.0.2u-i386-win32/openssl-1.0.2u-i386-win32.zip
similarity index 100%
rename from components/openssl-1.0.2u-i386-win32.zip
rename to components/openssl-1.0.2u-i386-win32/openssl-1.0.2u-i386-win32.zip
diff --git a/components/openssl-1.0.2u-x64_86-win64/openssl-1.0.2u-x64_86-win64.zip b/components/openssl-1.0.2u-x64_86-win64/openssl-1.0.2u-x64_86-win64.zip
new file mode 100644
index 0000000000000000000000000000000000000000..a06366a9280b3f5bf309e285c9dd8941846f70e1
GIT binary patch
literal 1358294
zcmV)1K+V5UO9KQH0000804HFTPptMbx_|-z0Eq+u01N;C07zkTXi08nZ!UCrbaj(E
z%9TM3hI_$1xB{76XCfj97B)7zf+UlGAS&4C+ALg>TQFXlzwmTtzTDpTNq&C+@%+R4
zDE~(I^nUp8;_;(5ujI*}-?JxWjE>mYPQF02!58z^16!fs@uRozKi8XApzGNa?h9vK
z3-m>LSPi*am|zL*ZgjXJCXXMzd;Jprb)d9+j=)B^*boWi=Vojcwst(|;-u?O5{mvE
z3vHcS$tIavia>HIcFJYoMU7Iyaii%hJgViloc3YFiNHU_1n^HWwbUcJg=dV(O-bdH
zRW}=QbmP`OF@j=U_3Ep*^qOecg7P{V+g+mwzVqKTR{*l-WcyxQFq#c3!liM1
zqOy+h@bRPPU%q_!4}v?vblQu_rlH+Fd@exi@m9142naok3Q5He{th2YZYITIn-Ymm
zi$NbCSSRnoCD71Gb)!f(?xj`m`&CD6tP2_A!}!TeJG=Ka$Oi;;=N@9q9K(CUtwy$t7218M
zDY+DEKOkUh@nK2O(0d}riZl9_ZX*LTwC2uD+c08B%p6B%Gn!8xYws?!p|uC1yD-^1QY-O00;mkV3kjP@G*Yu+aNbI(2J+;d-3FlU3oWH1<_@uw&TL#2WL@(efr$@uHuzq-5O&2GEWDvhpPY4=(s9r5uo=_-z&U76Q%
z;>Xz)+TVA&x+*?p?^zX(vh>7?lWN(QEIqg4wN3P#RB@c83)H8RJ*O`&T12psyiRo(
z3=6-}#qiXXs}E>-XAJ{VW1}nv!v~25gR48s%Q}wt1oqkkfBZd)c$@`VfB3k-&g?^_s7!w>NM2v6NF5C87q
zV1~+GK(ZkPNuOQzGH~cPwLo)JE1;!+1RBrgg-(e8uu2>IXBIjiC!3uMD^j+`~(s
z0N|#XTvmozc)r>JZk*x&zpwm>rKd7PuPZ%E^xm7E7U)Rp@efW%qFXu-1-T-K|h4B43x>J151@YzG2;Tz2*NyN!(mB2{L44wk
z@bw^kF@*1?&hedEqv4x+BYXjXR>u;)I#Z|kUI^kVyb->y5xzLW_f+TjTtR&EZ-g(6
z@Wm6p+d9Yh+`wrpj$^2jE_?8CoZMYFWf$;TW
z{;zX<{et*5-3Z^gRlt|X{GXw7|F=rR_tK5-Z0~0hsKEGpM2gPDx5Z7_^gql{o}IUWND0
zP0tg(OM%(zPM<0kofoB6m((EoQlf#!z-2(8ou3+~qyyRxDixs7~b7FaeXmwl?CDsXRz5w?mVu^Y}qCP2oH>Z~O*AMpa
z{wf_?3Iqo07Qsk;H}$-ANWFE7QIrni&41o{U;TM&kN85scyeXI8%u2l`6-k!#N~^h
z{4{mv!#>e!_vHz7_Vm<4%pdQMHQ3NZU}QwK?v^Jv#xNApMb9u)zpX>{BUC*H)fw;M
zIO3Zhpe|~ZH+?CO|lBe(3-!Z;P_EXw()n
zY9ga{T7EvpfZ8qY{-QL=0(~r^(#lCjvdRl{NkBW~3CTnhv>*o7?-{ikvS@~EBu5r3
zZgl{wP99J03fZ%*rK4ChY}Zy1wppqm3^A;&qvkR}xYOj{my!^kNk(QmGSRl*mIm7%
zr3B@)PxeKg1m+Y>C_X%@;P
zktdM%OolR0;hOYR(RZJPK+pri8_}Y-hv*ye;ju&m`3GTrKygV2{%CPnHy=cLeU0K&
zYQ9+`m}*N8ceQSg%Mz@c$0^p|*V|2jvL?^R4pXhD)H=!<>=pTn2jV0G66ld&6KbLG
zo8~~_-6osA7R)|}M5U2zCfNQ}bFSC^9cuf{b5IO1pqJei)_zf;>|A71UZT=ygFeNI
z-bog3K8L7PlAha_Xy}-)jW5TyGwgPs*a%P2OrC-T&TH$CuiCc8Ula*c8pkA7OZ*1z
zi|F5AI%NObHSRaw$H$deQZZ2(^m!9X*z4i2_TIZ)^%$$-F^W!pDn;$<(o2J%Nfe6$
z6dxP`h!h>*1-|xb9euRP7*HTT8;
zs1aMP<6e``wg$#c>DVs|$yt@(f*u10bx#62*>IitFbeq4{q*~ZstH=lOvnn2*S7Zc
zIcu4tmagSlH`cj)c2d5i4TPrXjA)WYX_t~D00AV_n-sK(<=llFyVUFgsZ=)9lq<{u
zyKey#bIQ=<5tCU2g5nE%#eo6Q3(Rf3*XNG*^Z>|R1kw{AEWdg*^O-xmBW^>!l62%f
z#<2S~QSpO8aJG$;F4`@c>XoD_l$W==hhJz+Gk;N<#_6cT9@;JitkrUi7-&uPns=kv
z8^06(Gp+HOx8k*JH&}QRFY>nwh;V&dohIE-e=n?O5>~cDwLLj<`87o;F3ByJ;~6Rz
z%^1Thq-0EAS~c_Zm*StE4GOt)`({}k_1^fUvo%jZaO$gue`aMK;g7CYBd(RH^#<1L9u_4<|VcB;9M+ly0+H(q#L+Qn*t>w=lX_pEN
zLdhjs;(KbHpag`{Bi95eVD}cFk^UZH>EW|-W}VtF2Q+d`dRBE5?_HNvrxM6!1l)H^
z1d)`_TCzv+mma?6Mb2KixGs7Ek*;bY7eS5ren1Me^%6@jB22SUV;bAcmGl&)0*mb3
zMs^1gN)Vy%;e-eD4wzzP3&qL_6e}lFteiTtay^)mOST2OV5;bSF(Zof@h_?Lkjz8x
zrH&|1K&t9%%jXjbfv+Gzlny9KpYA1?l~K|~
zm#+ZXGZXAm9m$$pnt@69QJ`u475Z4kVBO-1Qi{E<
z8P}Gd;E<0ZO6ztAx?VbF#vsqV@CY-aC?GHO?=QXRd@5hugyE&kI2Fs&g7jQT4xUa^
zgK`A;C}wZlS6qi0GYoBg*vkq-TLOE@hjy};B9-*=7j>d?Nww7q6UJYl8^v|y-J`f{
z9z_bg9g7V*T+V3#Z=iLym`XkG&8Hk3)#Z_>LQ6lYO!
zakY`uu^8zLyoLIqCy=2)N$P=@wmt|`(R7l=i~GO#<`sHOQ>0H*4M`7;=?~y^46%#W#bIg!#^AX5$#%P*Co7Nlos)uFSo~
z8_?Z}G1kpSQ3(uhw8w0BD)pW=WCm0tV^&2rRw)uAw{u3yn`o5D5lJJZ%YxKu^