Contributor: ENDRE I. SIMAY

unit ScrolLbl;
(********************************************************************
  TScrollLabel Component FOR Delphi.

  It Is A "Special" Label-Component Developed For
  Allow To Scroll A Single Lined Caption Text
  Of A Label.
  For Correct Function You Should Be Switch The
  AutoSize Property To False After Building Your Form.

  Author:  Endre I. Simay;
           Budapest, HUNGARY; 1997.

  Freeware: Feel Free TO Use AND Improve, But Mention The Source

  This Source Is Compatible With Both DELPHI 1.0 & DELPHI 3.0
*********************************************************************)

interface

uses
  SysUtils, WinTypes, WinProcs, Messages, Classes,
  Graphics, Controls, ExtCtrls, StdCtrls;

type
  TScrlDir=(sdLeft,sdRight);

type
  TScrollLabel = class(TCustomLabel)
  private
    { Private declarations }
    FRunned,
    FRunTxt:String;
    FTimer:TTimer;
    FInterval:Word;
    FRunning:Boolean;
    FTxtScroll:TScrlDir;
    FBigO,
    FMaxChar:Integer;
    procedure SetScrlDir(Sd:TScrlDir);
    function GetRunTxt:String;
    procedure SetRunTxt(S:String);
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ShiftLabelText(Sender: TObject);
    function GetInterval:Word;
    procedure SetInterval(W:Word);
    function GetRunning:Boolean;
    procedure SetRunning(R:Boolean);
    procedure TxtRestore;
  published
    { Published declarations }
    property ScrollDirection: TScrlDir read FTxtScroll write SetScrlDir;
    property RunText: String read GetRunTxt write SetRunTxt ;
    property Interval: Word read GetInterval write SetInterval Default 200;
    property Running: Boolean read GetRunning write SetRunning Default False;
    property Align;
    property Alignment;
    property AutoSize;
    property Color;
    property Enabled;
    property Font;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property ShowHint;
    property Transparent;
    property Visible;
    property OnClick;
    property OnDblClick;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
 end;

procedure Register;

implementation

constructor TScrollLabel.Create;
 begin
  Inherited Create(AOwner);
  Parent := TWinControl(AOwner);
  Caption:=FRunTxt;
  FTimer:=TTimer.Create(Self);
  FInterval:=200;
  FTxtScroll:=sdLeft;
  Alignment:=taCenter;
  AutoSize:=True;
  ParentFont:=False;
  Transparent:=False;
  WordWrap:=False;
  With Font do
   begin
    Color:=clBlack;
    Name:='Arial';
    Pitch:=fpDefault;
    Size:=10;
    Style:=[fsBold];
   end;
  FBigO:=Canvas.TextWidth('OWQTEKSZY\')div 10;
  If FTimer<>NIL then
   begin
    FTimer.OnTimer := ShiftLabelText;
    FTimer.Interval := FInterval;
    FTimer.Enabled :=FRunning;
   end;
 end;

destructor TScrollLabel.Destroy;
 begin
  FTimer.Free;
  inherited Destroy;
 end;

procedure TScrollLabel.SetScrlDir(Sd:TScrlDir);
 begin
  FTxtScroll:=Sd;
 end;

procedure TScrollLabel.SetInterval(W:Word);
 begin
  FInterval:=W;
  FTimer.Interval := FInterval;
 end;

function TScrollLabel.GetInterval:Word;
 begin
  Result:=FInterval;
 end;

procedure TScrollLabel.SetRunning(R:Boolean);
  begin
   FRunning:=R;
   FTimer.Enabled:=FRunning;
   if not R then TxtRestore;
  end;

function TScrollLabel.GetRunning:Boolean;
  begin
   Result:=FRunning;
  end;

procedure TScrollLabel.SetRunTxt(S:String);
 begin
  FRunned:=S;
  FRunTxt:=S;
  Caption:=FRunTxt;
 end;

function TScrollLabel.GetRunTxt:String;
 begin
  Result:=FRunTxt;
 end;

procedure TScrollLabel.ShiftLabelText(Sender: TObject) ;
   var
    TxtL:integer;
    Pc:PChar;
   begin
    FBigO:=Canvas.TextWidth('OWQTEKSZY\')div 10;
    FMaxChar:=Width div FBigO;
    TxtL:=Length(FRunned);
    Case FTxtScroll of
    sdLeft:
     begin
      FRunned:=FRunned+FRunned[1]+#0;
      Pc:=@FRunned[2];
      FRunned:=StrPas(Pc);
     end;
    sdRight:
     begin
      FRunned:=FRunned[TxtL]+FRunned;
     {$IFDEF WIN32}
      SetLength (FRunned,TxtL);
     {$ELSE}
      FRunned[0]:=Chr(TxtL);
     {$ENDIF}
     end;
    end;
{Set the textlength to scrolling region of label}
    if (TxtL*FBigO) > (FMaxChar * FBigO)
     then
      Caption:=Copy(FRunned,1,FMaxChar-1)
     else
      Caption:=FRunned;
  end;

procedure TScrollLabel.TxtRestore;
 begin
  FRunned:=FRunTxt;
  Caption:=FRunned;
 end;

 {This allows font changes to be detected so the label might be adjusted}
procedure TScrollLabel.CMFontChanged(var Message: TMessage);
begin
  inherited;
  FBigO:=Canvas.TextWidth('OWQTEKSZY\')div 10;
end;

procedure Register;
begin
  RegisterComponents('MyComps', [TScrollLabel]);
end;

end.

{ ------------------            CUT              ----------------------}

{ the following contains addition files that should be included with this
  file.  To extract, you need XX3402 available with the SWAG distribution.

  1.     Cut the text below out, and save to a file  ..  filename.xx
  2.     Use XX3402  :   xx3402 d filename.xx
  3.     The decoded file should be created in the same directory.
  4.     If the file is a archive file, use the proper archive program to
         extract the members. 

{ ------------------            CUT              ----------------------}



*XX3402-008723-050897--72--85-62167----SCROLLBL.ZIP--1-OF--2
I2g1--E++U+++Cm+-GA++++++++++++++++2++++F12q9p-9+kEI++6+0++RirgWbrbJXtY+
++0S+E++2++++2ElBWxHEp7DH2l0H0t2Ep7pHvgCkm+EAuJGpckRArN2MgXQJhqE6fLxY2Xw
+4AzWnyXxm+o4T0-nv7wsWUbTBuDpl70iBqT+Kvw4i+8s38jkFaAmS0+gOYY-mZdsq898CRA
Hd41IfFlgILYir0qgMBeOcuTIvNvjQwQNfg+71t6YbZ4xB92fm4mpY5peUztCZ1XAi1ODl0r
C+pMh+pcmvXd4TxjpkKuy+3EGkA23++0++U+OEg26tHUZPg52+++o-w++-++++-2AHMjIoBG
HolAEYkiF2BJnJZxQ3HLRHzrvRirPxxeVMH2But-UAlb1ENQBy-86-10c06Ec1I66c3KO94o
IZMfUFlLsYi+29VUX6kd6XWqgNcllbLgVBP4rXXM-i64dmqCNnlZmBTIsvWiAoo4Ec5hvxnv
RjShl2nwJuRWvdtvnjrRQwwxxxmDwpVEh4c4sSyLJ2KbTFAmLfHznT+jx0zlZqGytTeXGLFK
NwkjnC41ZqitsaILTSqzxbvwSa47W2VkZYOoCAbxgVzq52NyLxlRvny6DK8KrLPQUPZ5IzFS
QGAdRNjZ4mCBxIgrp-AxxC-px4KVIRvK5+oq2Ar8h0+E2hTKj0cOeawa8flpfvWiV-KVwAeq
dW02KuhakTm2g0nGi-50zveyKBmfV8L-tiPeHMmQLvMStf5EIpFTrRnAgXxw2V493L-Fd9ed
9gGxTrBpXpWjV2KBsGXAVD1IySBkYVEir-chWYNMq5aGtunAXBPMkaxxnhC5dNet2dCgLl08
T08yVBpN8+bTAK4daHJ4wZm5p4WiKFegXGdCsXnBBGh0ayeWGULzOFYfdSzeZpNj0BPDp9uY
PD7CouKPZqjQoJgeMwDaH57tjehlOsiqFugmnsY+N2GzXxj96rwnOP6brrr6b4pSxSlkLnNS
xl1hx-GjO+a5UnJa1rHpOawFnpJ7JquBaXpWiTPxVBEcLVZe02PA5aqtRY2vbRj5Eazlsb+o
44ahfXSDELtB8l2GP2f3cT+awnX2pvIb6BuXvPG8cJNBnil3EtO9drp-qyYibVzOhAkw+RZs
3lNFN9aUcvFuOp3RRQEw0T2Q8GPONNI5cvPPgwogqDqOZwXXtlbLidHfdGxvhJrSFQ4caYeq
CFn6bpU7N9R9nEfujCIdo-W+HWF-PxXe40deLPjwFOL3W-SM3BsIfAbCa+VoYmxnY29zmYOT
4fJ8i6ZocmUGf6s4NkmT1hV4vpFPeOIfK8MJEUldiaR-g-YVq9Nwy2D+5T5SWWjQB9L2BASZ
NtPLVKeXAVdK-hbAEW-j7wqgh1IO4gkQvx7xa5JWJP9B2a1xGSlCLGrEfk+fRw98+9iKRCEN
KmK1lHJBhtEXSI4nnE0UxIaBJzEbd2N9pupm-uc8e66YWhl86KB37O-kxkdAj12Gn1Pf+0rr
7O1tPXLlvqjyEGdIgB9-XR3EMpXkkUPQjJcwDgSZhghmXPO-P3Cay1qwYj0Fs1LPsOs3efgT
oWiRunQHQlQwmRDiGjp9S0Q3jQ-f7GqLGbZGUerziTgAI3ToB8LYYvvpiyTJVnO3lNSNVoLQ
DMrWwLwTSJUsQFYcDrTvjF9L2+l5lEkh78MMHk3vn5gi1SiL6SUrtvJ24wh1XkTZw8iBks-y
s6+8iPa7Hfjxve94ygO6O-1hchps09UTXHcgDVplK11iNXkS5kHQ3ADjKFWirZ+Tf72Oysn7
ECOCDdmaAEgZsDPf5D10bxIi9Vin+0g+H-yd396ngz2HRzhxNRIFH2MBnodj4pC-nfsbLSZU
4JdyGu4ZOUNDxYk-i9+TC2RiIrya+dTLBKsd0RYRpbcKgvzuRQXZewzkaqbErNsGEAC+HbKM
DEEzhkqzPqKYChnQ7+SEuBQxHT1gS0hx6MOWvDPsDOh1nG4sHG8jSWN-vuUzGnRV4AdO67S3
Wyd14lwHtpoVMNeD+wb34ML1wRBby8pZsEIPuZDUqSMC+5To+szUIxvoytO3GlhPacA94fS2
lReQkq8XyEWEXzF1XwHDOWC79apg1Mez+zeEiE963TrEcz0noTFvPTGe7eaNO+pkOzdVFwiB
eNgfUdh0iAQXkak0zvnQijfzekS66Lxrw3sbZn3jqNNkA16qEtvFTD+qS3puSP0yRdsVFLn5
eVvTIHoGXLlM7lfTwjunOhH8OwNOC7QHZrcGDGRBpIq33VI+vsESDaMyHsqvou3ugXLAGVir
oatYsr3AhhF5lNpsdOq2Smmq5ZIxl+ecjs6KREcbBJlleCymKhDJblacDVszMmhFpdyppNSD
dLUrtgLbONyJpB1haCdbpdJoxPKizifRZVGm2cDixwrrXTNtTBlQ5UnLM4IgSRrl-SNEAmpZ
dMvfMWZQk09p15-dNFj3HGasYHFubGzB1ftoIihlI1Juv+TX-2jSvrlPDyt9RbYXPEYHTnUt
tJj87DKMaqX9+nMhgqaHj+S6VZCqd4BgSNIwmz2EhjbdBWqlOO3BuqmuJPvTwj59sluU4t7y
dXI7dWT3Fl6p4zfNYV5+gSP7C9ELmJ3Bei0L+ymchTYhc6yVhVhoD51DU4sLSyaIXTgdu-8o
LtJu7l7vjNuGnrKH5AxobFnDQwLMnz6AQXn5gmXp17xCXiTrJ56wiwSHsvYxaVnDv-eFH04k
m-xbzWsjcvlclP8ZGyQjzTCmSSLgULyHirQJj9oOTITb1AsNtn4w4TXnYqwE0CJZo6XQ6HGA
Bn7oIVE4KsDwUrWfhc3zb3lYyLHSX5lcRL0n9pjbfPM9T0SOAroSrYlRMDQVcWnTs0mRxwd-
0+udRhsBFw1qc1pzq9+QbMDxC+Gxf5ucnZ5u549UFJUt84yEtROd70hDoyKmmN+N-OzYu-mk
vs9vANglAYTbO9k6k0Lagz7oDVgjMn2ysa2HVlsTcNlrXAF446b1RGGCkrhcXnO4SfKlS2LZ
sLoxXetdsyauBc4mLDYorbITnee7q78Hg72b6yWbk75HQRfBk8Nv+8TDH-lDgr-AnAMtwW1q
oJzUJTMBj+Tao+vrL9ko5gMXtexkwFTUBJ46mqMS9hvtiAy8u98l+1TfEWEPlPU73l5TjuzX
ifveSEFLq-8OPGv3RJB8VwmzlZ4z5CCicUMjXxoAaxdkmYv2qCroiLQKvBW3wPhkq1o6Kkv0
pWDINoq4rQRVtrDYwHq+kyFtaixv+HOyWrZQdARxIu1rAcLxEuXLCstyXLbfvjgcP1s+TWP8
9AVacnm6yZnEVqalzX-paCh-jsZGVJ7BsuoKh9SXv+8a0yIUR1k5LQzHDCA34iTicmKi5p0D
ulnwDtEyiCwJGFDZuJ3HI0v8yYrAPtSqXYe9TUNy45obdsNqi4fcetkU1QihdJlj9FLYPe9O
r1du18zVtmRgFXa3we52XwPupBoTc7xu+qHQxmXJZfK0DYjfdfw2SUvZ5NHr79MrBkxZ1HIA
LIANklfc3oD1xACVXO1PETR9n3Hn5heQII234RJo84AnmWaI1l312p+acbk1AQHfIc2GE-kx
WXVOUyho1K7d9S8c2f3KWTJTVzJTXzLy7hOt0iiz+T4p4RX5I-ekFUqUMTE7UnMW-ViVhlbp
3h+qXBA4LRz4abwPT1hkqv1iqx0y5TLhYCr0pPUPxRqcRu3zBq8V4yrvIRyDyU4gyk4o5QER
xlFYHu3y-95z1C9Y4RVx3DEcu9CE5wR3RE9p2uUz-nhDMFyw-DcGMeUDTTdUmxxXLhx1zKL2
p4ZE9eyUzUfqpOicjkPgOu+z+CLm7jez0HpjEbMCx-ncCx1z9iVtX5ISx1rk3s5v2DFbGAOL
sHbJEFgcF3CmZgXxuodyFoVyCd-j4DKh6D4-65IRTJSXzwCzh8wFm3gtVm-DaXHt1eDYYHp2
0XVHGov7nhDu7rLCgJ6s9mJGiM5h8XJ97b-rJM-HAt4qAHSByVa0iocZOplzOY0fbp6d4jC5
ol+etIcaNideXwSHJhWtZYf5G3vBzPjXRfGHA-PBGiih2WiNSX2zRI1bkSFAi3UwNE+aVlld
3YgL1s1YIfzYGfp7ydgmV2kbM80fVt6nYK97d+3X1OB2yYHmqYpZF6Zw872omMSv6kZ8d20C
J6aZngkbYTQs2mEKCzCRF9PXH6hMvAln2ZZC8VZmnsi2eiihNFL9JmtQIfvaoQdJLPwtexAl
-izwEhzKPZ5IrDa38ELlpglsOwOAKBbtRgCcQ6UYbrzysTnsifacPzyUFlUJHd+NPnJS3KJb
WTs7JdR78RfnindvhDmi6oSpz+wuXqYL8DzxnZuBBahqlwoWdKEnzSYuennzBvCuqazh9vun
4Iqqz-q2AymttSWGf3iCiYXJvGvERqtTEgqnzqXFxHweioxcyRpgj8zne-ORPpE+XxaJqJpu
B6R3wHSCOTpZyneDOqJCcTGotqzl9hxtriUiBfdLalQjKMHZa-39nGq3Hpg3qRYhelQj4MtC
yschvfQLLYpju3MBLT1u+Dhgt3Yh2EMOEvg-vGeyoppwty6ZzKt15BTiDegK8qLcrJJnhvr3
wLr3QJjpKF8mTTgL7DPzutAzrjzdfEBjIzmxJijZvlqOzdzzzQ8Hbn6zh2634xOb9esoCgIW
7Pt9I3uwN8NvBk4kIhrM5ATS2B6qEvBhAvGj2mE9wtvBjrsChOvCYymV5dfyOzUFhJth9fIw
QS1havQR2v3bQTCCZ+5p18bhYcd8Vw4IBgLw+tp5OTyvLQIripPTIXfWfPTWfHTjriCrWyO8
ZW83kv8WrLJ14ZWKXfxvvrqm-xOxVpFsM5PLLnmVRJy+9ZaPwuDqeQaNeAtmEohgGL6ESs1T
tWFFLqCF-YtyMBSohIhdkLYJPrL2t7xSF9P0IxdKpBXEp7lyDgeyuZHf8fvJhTfCUTNPEmgq
qx5n2zgauMWd0ugXlcblIZ1CWoNH7BMbvwN6v3KNiUJWRFfTb63MYwONMm0qHSDYCl1P0vcG
x814GLYURZ9XOnAEyoXXanYEykGo2jEOu3lEt2x6mUCl8h+Oo8oiHfvFrwJdPm1Kty7YjW1q
WQ4tOo4AD7mY3wFAo+KUKFuy8+hWNM9Hus7MZN+T-K6HrNnwIqmAaqzLG8l2DXEu0fomdKTO
GEPalqZv3zVgSzuaT3-2MdDYtOvwAEsoGpvh3DjAnSZtFsmz4Ws1tEw9m6-X7xqQpbT6QFd-
yIA2ohnMet1j-wwT8+u0Jc2yXLYh-bqNzE1uCinaQGtVLDvkw0xqjmz+wqSxrxAGqSsLUNW7
mV-ELcQFEi4aU-wCyIml79ORDly+5kCy5-F9HVIqfUtw0SFBBfwTDDjhONgz+tvxxoCPzlVw
+DlJo-VbhvPwicX6STkD8BzHQJgyGgDu+HxC8sXlVx6tBZo9COTsvO1PtOhNwSxfu0TICbqa
wpgZ6irZi8W1j7e0VRSYDsDPa2Mc8CStlTPHARgzdoXBsnJGxfkBiZTuQobgcAn8CkfNXjw+
nr5wCp1qrqpE5gw9jz5wVUX44HEGz2C6iobUyMDE6u7X4xBG2MnlEucGx+NzN+9xWfxB00fY
zr6u7BFw28elCjVX0CmOXc18+zyJnYzTJ9iWGYySnLgQwezgiCBtninLndHbzNQq9PDxhR4V
jobiKwLbMjvJAWZEwtf8xgaDN6VPYhxLd9yu7At5HxfwMJjD0yG9-R1jDNjzqCvr-ljb2YeS
0wfyLmCIDHIqPFDdRcqlvIrA8ljfRFHmgFXzKz7nav7nhhoy0D6qyL9h81HZj1fYzn9RWrpn
2gusDzYGzZxEGkA23++0++++ws+36k++++++++++++++++M+++-2An7TAmxEGkA23++0++U+
E7au6cCXID4a++++s+2++-6+++-2An7TAmxHEp7DH2l0H0t2Ep7pHvgC+W2E5AHWv8uojB8G
V6NKXNq7WTd-71Fy3by4yk0wAq4LrNbgnFs1+0lIdKXxlwQ+EPvjwAM9Jnnlk3rmX+hiV0rQ
***** END OF BLOCK 1 *****



*XX3402-008723-050897--72--85-27584----SCROLLBL.ZIP--2-OF--2
TBUrTe6upX9EwK8qztsvWr6Eck6bYNkn6Iy851Mck0Zy0zkkbCrREHa-syioqnJTOnOvkk-2
DcaGSo1m+X8j6Vf3GLbIWrlRe57NQDoRG2pC0lPR+PZAXETwbZoB1CA9I2g1--E++U+6+54j
xG7hSKMFIks++DQQ+++G++++F1AmLnAjIoBGHolAEYkiF2BJlJVvI3jLaHzbEsy996FAV+m2
I226GlWUWgBsMWzi+C7VIhsGdbuZiIVLsWN0IeG9PH979WpyUMPR74sSHhgoqqabgngN7opr
hUtBdxr+q4aaav7CBgpiAXjHzB3BBsxuDQHqSXlWjrDijR8J65yja5DjyLvTwrnbTCSQGwSd
oSvfpMEwwj6LRLiqfRwYnt02rFxAleDFmKVfEYmxRCG9CV6Gz2f6dmGXeIgpkMOkDS0PGGbl
uE3lIcdSwGuJFodOXR-juDZzXpEOYRMyGS4RU5FQyTAPbxpNk-u88r7M1ce856xlRZYSSoGI
MudOFFviZtHC4GLiZlyJhX18i32t2diKBCLP0oA87AJM8W2ahlPkPlOs9Iz+ZtF2FRcufcZs
AXGF3-CQKtKjBhUPXmay8H2KYI8A5kk7DQSJL5shUM+w9GJTcPsR2KifGWlQ1bsE8J5vFgTP
BEVR1gRsJwhT3iuD8J9me-Uh3Cy7WNDFP++y1+ZbbEQEQTU4jxYvD-HkvSgQuijdfbVyvRwW
Ck8OG4ir3-NbcgcyAFO8OiseXIkt7coYskYdeQVGGgyClgOYyu6mdbAs8IRYROvRavZXIZ+d
A6mwPiac57EMc8yWDBLid-XdblMXahCm94xA2YByFQyM8sjvJNr-S2Ueo21CG4vKbINwG7mK
0h07K+U55BFLW6Pqln1dQYVrunG2YwWitnmLLT4NK2UBjXG9XmRo2vUiy5fyzOZI+WTGcAVV
PLsBg0wSXGQ9whGTseVTWGTJiHR2b9wcwcTBZWl5mkqa44Wkh4BnzfM86QjAqenOnDBDlMzh
ovCIBqJtb2d1B1fXmwOqLov7C1WSmaq-kTVAGictWevSyil56y3G3FWA5pL-ypj4TsJG2r7A
gr-yyz9byGb7vaIv+bpMuJBmA3Q28LnDOeKZATLOtWatzflrAakCg+nwx51DfcW1RzAbnFeA
RYL3sAD1rHyqMSbf+hY3aBANYNLU3-yLXKCQTaP3RHtG52tctTdtR44zkIdqnwlNwGinKbNI
8tmy48ww5v42IprlO8WawazqglIasgdChP9VHwUVNIcRdhIL3JAdGFqZ1IQtbMX5A74zyAdD
H5lNObHfE3kAORBHOM1rOwIm7gLo+NMPq-B7KN3mFJlhMDb3gCEHcx4Sso2dYHp-L62F8NaG
IkcHuImZg260QOraBb4oIKSDWqhrjvULXnZy9ArmxT1XYewDFEF3x2ZgClptlzL5GBaM343K
YhZEIajzYCn14FyIIWaq1rrqwAbbko7+6qAjV5MU2tQIqmosImI1gkZ77zqneL33Xb6mMj2f
mF2lJRryxgwlkQXeXwa88aV-Gd4aiERPNmkZcuUQWtmcqhQRBf51tpP5lLw7KvjWwOUYlgFz
5jzvg7KR--2dyS+L+my49ENtOq-swW5QQHxuebMlMisJcmbdhMTS4gLeIT5K6SZMTmmZW94U
jcJeXBuY7CJlH65YX9HAZCoRT24cFxLp5xl+l8X3dIhI4OpQiB0qXU4Af1AI4dD05--I6-Il
I9tcwWyyypF5lB4V5Y8xQUnbLnJEn0I4B6KkSEEDqiHPpfC56dM-8FNFdUXyB1g613zMglel
XwTYFqMYBGLQQX5KUo5QkQKn45RYwgIHgtmfiaEYNtFkgXQNbqOi2lSyYdIEZG31X2XSmwXU
LNNIO2+88siTr-VyfdaEiumdo7UQaJ6KDyI+B+Y-j7B3iyLYaPD15zmtiE5jKycZXRwctcPd
HzufZHHNXS0NcxtHRrcxo5dDS0RdjAr6oisDQqkCm8VtiuahpiGLca4rppN9Kxqv99KKni3X
AGbdRUgS-7l0gB4JNo0PARL0kLi2f+3-BF-gr72bnrMLRE0eWWCbEKf-5r6rEv0lcZ-3jvac
CZuX1dpkSnOdx-KeC8gxKFKDNIl8sHvcxd+hcViPWQJkvZKpgPnlX9bfBcqbfo11IJqrqJ2R
Cb7jsGVkL34pDgntgRFGTvXaFe30Lvt0QrJBJi3CrIoBngvhyKuat51iieqezg3gR4PlGv2E
nawXS2lcTQ-R9rVU7CVigVKC39bcVtqcedrSWdmNM4BJzf6mLalJwHa1pnefhV4uer5e-5rr
b4ApE9vVP+gqqbYVmszmvk+Jbufp62DUPUMacrCgs6Wn3eJx+PXuCFN5OFwFW5RjISw-ir+B
m0B3uxvJDFPGPCpZImG3GArq6dL+gN0Oqe7aGmyz--DHDILBlPruYW4Sne7acJSPJp9LLxFg
uoIJRMGYSP0cqRnP7IS4GToc2lkIXvDu7jJWIMghhw17SXao34QbXekTER8T6oSVdGEjIPGc
pD58lgN7O9KcRPZORjCfJer0JXD3oC96bp1HiUkhqkm9rPHSUc1T0BF0WmqrG2rfDQ-XnB8v
YQtBfKbxQT0KeUD36S+SXTZrBHh9ARRnDsJm69nbhP7-M+GiaX6C563FbGLcjZoS3oROc-N6
PF5LMHtRRKuCxw-i6AFftaShWpFkY2qehnVvz9d6JEsKx2ww3ubKIT0OyHr7FKdoeBHA6xEi
g0vWmQaOK9NRd0sfmWDSNfWViYVxHhmKitquG2ACRyHTH3qYAQQHQaVHUFj1BuG9BCT4NRLi
cmvGafBX5MvV3p1kMFTltdil1QSu7uAOPqS-Wy2MjvlqlsxVFhiqNf8PfMjgmaQKOwnlV6jQ
ZwQ8RaBJeLt8BnMqzddoM9SH+Ba33FRxfQu2N35qK87gFDm-Dyoookyl1d9vjMXBN80LgPq-
vIDmzzRnw0Rcp8fqTdADmD28uySRemlwOluW1z+CYhqamXbk1W2PVgGkrAs7d91CX92M7Mi7
LatPGP1sP0FPRJxWV4kXSjoleaxnEAFCp37YzRSrs7SEL3omydQcQtWEX0t1SEenFQekU4N4
ywqlmWkZOgImc9j+1LgvWJuu1-cdgA1ORg9faB4xKlUc6wO0Nb1D3Z8r2IBpAzGV9MFQd81I
4ITS6eFm6VV3hdc+Bn3i++nlPS3l-x3r+kPx00JMAuu40e7j1Elu0PYj3IVI2gASkJ-Q3-jF
+e2eMhkg46klPGU3IfQHsuv-sAREsf20eKeGqnvwymRCL3O2yRIf5nByybzGzt4yYLvvrgjd
GmfkLjdGKhUMPIwzmpOiXjviJTdrfACdVRCzlKTsoiYpLbwLHvz1o3R-2ruJeWMCNspiveGD
XK1z6iwjhq4kKXw5qYUKL0ljnoYgvqDxozyc-zAO2nlrzLwLHfz9B5Vc7ryBru3HqLV9Tzvg
KdObKbnqQXtksUD33jdPAyjCfxfHZvvtk82JUhjd-cAuYn6jL7NHVX4DklCXUNujykwSk-9n
vwQYLYaTmZd9jnDrIIO93mpPhKvu6ZcxwkH9pYfufT10aHISr9yatv8O8y5o52BLB7gfNovl
GBQApYxwA8BPF5i9QolUNHnxuGXCvQ9sfTHvuNtPOX7zDHsZsXiosEohS7PaqNON5ZRtGzBj
4eXoKIuhO4c51lk69HWbK+OLB3gfTq9DHutUMUsQMR3RFHwLJHox36nV6In4FDdxtfaTuduL
5qFHBfxdmh7L3bv47wprrvbfaMLtxpaTFuY4RKJlbiKeaGOhme2z9P1gzqlJXGZxZbIKmvXU
lgmh8MKmAH3kiIUrg7GnhLGQ9a3ehAIrTgj+yiHSb9r+ncpwWLFuBRxOyXpJM7s3LjfmZTEj
SBGz9rptvGyjzhKRO4cYzPjyNJck3DGh7jSH2hJJMOt5u7TZSigpln1x5DSbrxS0mop5bdR1
8mWWxNTPm7OHgQ-5RCV9r6rmuZwkpOTTjTQr3ydptMAfKYZMwHosmzuzYW8s15+Fg0LEa3pw
j6tmczpePdErQ7F5JiNPy2uvAjoO2DBJEeyqoegBtbJ0pmjciY0jwSSuYpc2ycl+KkLuVY-L
-JcA+bpCc3u-DWzE7kFe2yUSULM6x0a-TYSUBkKuIu-h+hoZoDg2qWvEfkaoGu1R+ioJu1u-
rWxEio+3UHeeuShCybc3DEZptai2Lehb1Yppx8eHZYArTJqUFx1L89HFTl7c0rNfMFSx6B+S
vCt4RA-7VvnoSovej6xSu8J77loFu3UXjS0YUHOeCCZyULuXUN25qxbnw-vqT809DFwIu4Ef
ApMaI-TbVhfc0xroVThdS6-C1R1kDjBBBvlN-zXt5GqX5VjITEqQxL0s13lZI32-FqrodUAS
9MD58i1PRhMzUMUP3hid11OcfsS4CaXwhfYMei0h0cWtsPRZtb7ka4iV+FdgtVNkabR18nGu
sL32Sv0BUUTSRi864q4h4hOe63e3V-Aiqy5R0jAFe65r54MNeh4-anJM566Dly-X7l6Sy4wr
z4QJb2T3FjWs2HuhUcwSU1yu63f1vAWObQDalp4KqPOPHs6ReamMTvEIA1w77XPpHq9kDxld
TVdQx4acc1Sew6JuPjAttBykKwv-2mwQc5iRo6FeNHWsFbkug4Zz7Ugy8pUnJI4vmMJGxOMi
mo2oscORUULg+W0r4dwC0m1eF-hiVWDJ1RLspoMw3Xi91G2jR80p8YgR52ORBhC+cwe25mpQ
NUEgI+RJUUbT1aWrS+4UqRF2XXs7A3t2bX7t0KaTR7e-f1fC2j8RtqvW5Hh-PXLN81E7aGM9
VP4A4Ss4kEnacgmhvtgm4Kn3w0-yUd+GX5EvFZI0UQlqPCIA7eEGPwBr+638g4Tik3OfkbQV
T1T0RoBNtWtcnPE+jzfS+uktAfhJarjFNWTOr+g1aItgDOdIDv-ansl0Vo+GCwSVqn6CfqGC
e2cW8YWc8271Fg6a+xuI2qLHs9LAk+y3KNU3qmnw+H6nI498H+ApNltbRdrYKq0lT+iuAWSN
6GRNE567QvI2fgk0X4GS-6y+rdw41uP3SMux0-5z1p-9+E6I+-E++U+++Cm+-GA+++++++++
+++++++2++++++++++++A+++++++++-2AHMjI2g-+VE+3++0++U+5Phv6dxtpMyN++++bU2+
+-+++++++++++++U++++6U+++2ElBWxHEp7DH2l0H0t2Ep7EGk203++I++6+0+-d0kEXZC0J
ikQE++1E5k++2++++++++++++0++++1d++++F12q9pB1IYxAH27A9YF1JJ-9+E6I+-E++U++
+DC+-GA++++++++++++++++4++++++++++++A++++-sF++-2An7TAmxEGk203++I++6+0+-+
aPcWUuBEwOM+++1U+E++2U+++++++++++0++++-02E++F1AmLnAjIoBGHolAEYkiF2BGI2g-
+VE+3++0++U+QOzp6aptNV3H1U++xlk++-6++++++++++++U++++4-6++2EnAZwn9pB1IYxA
H27A9YF1JJ-9-EM+++++-U+4+46-++0P6+++++++
***** END OF BLOCK 2 *****