unit SlideBar; interface {$R SLIDEBAR.RES} { see below for XX3401 code for resource file } uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus; type TBarStyle = (bsLowered,bsRaised); TOrientation = (orVertical,orHorizontal); TThumbStyle = (tsBar1,tsBar2,tsBar3,tsBar4,tsCircle1,tsSquare1, tsDiamond1,tsDiamond2,tsDiamond3,tsDiamond4); TSlideBar = class(TCustomControl) private FFocusColor : TColor; FHandCursor : Boolean; FLabels : TStringList; FMax,FMin,FPosition : Integer; FOrientation : TOrientation; FStyle : TBarStyle; FThickness : Byte; FThumbStyle : TThumbStyle; FTicks : Boolean; FOnChange : TNotifyEvent; ThumbBmp,MaskBmp,BkgdBmp : TBitmap; DragVal,HalfTW,HalfTH : Integer; ThumbRect : TRect; TempDC : HDC; HandPointer : HCursor; OriginalCursor : HCursor; procedure SetLabels(A: TStringList); procedure SetMax(A: Integer); procedure SetMin(A: Integer); procedure SetOrientation(A: TOrientation); procedure SetPosition(A: Integer); procedure SetStyle(A: TBarStyle); procedure SetThickness(A: Byte); procedure SetThumbStyle(A: TThumbStyle); procedure SetTicks(A: Boolean); procedure CMEnter(var Message: TCMGotFocus); message CM_ENTER; procedure CMExit(var Message: TCMExit); message CM_EXIT; procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; procedure WMSize(var Message: TWMSize); message WM_SIZE; procedure KeyDown(var Key: Word; Shift: TShiftState); override; protected Dragging : Boolean; procedure Paint; override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; function NewPosition(WhereX,WhereY: Integer): Integer; function IsVert: Boolean; procedure RemoveThumbBar; procedure DrawThumbBar; procedure DrawTrench; procedure SaveBackground; procedure WhereIsBar; procedure SetTLColor; procedure SetBRColor; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function CurrentLabel: String; published property Enabled; property FocusColor: TColor read FFocusColor write FFocusColor default clBlack; property HandCursor: Boolean read FHandCursor write FHandCursor default True; property Labels: TStringList read FLabels write SetLabels; property Max: Integer read FMax write SetMax default 10; property Min: Integer read FMin write SetMin default 1; property Orientation: TOrientation read FOrientation write SetOrientation default orHorizontal; property ParentShowHint; property Position: Integer read FPosition write SetPosition default 1; property PopupMenu; property ShowHint; property Style: TBarStyle read FStyle write SetStyle default bsLowered; property TabStop default True; property TabOrder; property Thickness: Byte read FThickness write SetThickness default 1; property ThumbStyle: TThumbStyle read FThumbStyle write SetThumbStyle default tsCircle1; property Ticks: Boolean read FTicks write SetTicks default True; property Visible; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; end; procedure Register; implementation function MinInt(A,B: Integer): Integer; begin If A > B Then MinInt := B Else MinInt := A; end; function MaxInt(A,B: Integer): Integer; begin If A > B Then MaxInt := A Else MaxInt := B; end; procedure Register; begin RegisterComponents('Standard', [TSlideBar]); end; (****************** TSlideBar Methods ******************) constructor TSlideBar.Create(AOwner: TComponent); begin inherited Create(AOwner); Height := 15; Width := 100; ThumbBmp := TBitmap.Create; MaskBmp := TBitmap.Create; BkgdBmp := TBitmap.Create; HandPointer := LoadCursor(HInstance, 'HandPointer'); FFocusColor := clBlack; FHandCursor := True; FLabels := TStringList.Create; FMin := 1; FMax := 10; FOrientation := orHorizontal; FPosition := 1; FStyle := bsLowered; FThickness := 1; FTicks := True; Dragging := False; DragVal := 0; ThumbStyle := tsCircle1; TabStop := True; end; destructor TSlideBar.Destroy; begin FLabels.Free; ThumbBmp.Free; MaskBmp.Free; BkgdBmp.Free; inherited Destroy; end; procedure TSlideBar.CMEnter(var Message: TCMGotFocus); begin inherited; Refresh; end; procedure TSlideBar.CMExit(var Message: TCMExit); begin inherited; Refresh; end; function TSlideBar.IsVert: Boolean; begin IsVert := (Orientation = orVertical); end; procedure TSlideBar.KeyDown(var Key: Word; Shift: TShiftState); var b : Integer; begin b := MaxInt(1,(Max-Min) div 10); case Key of VK_PRIOR : if (Position-b) > Min then Position := Position - b else Position := Min; VK_NEXT : if (Position+b) < Max then Position := Position + b else Position := Max; VK_END : if IsVert then Position := Min else Position := Max; VK_HOME : if IsVert then Position := Max else Position := Min; VK_LEFT : if Position > Min then Position := Position - 1; VK_UP : if Position < Max then Position := Position + 1; VK_RIGHT : if Position < Max then Position := Position + 1; VK_DOWN : if Position > Min then Position := Position - 1; end; end; procedure TSlideBar.WMGetDlgCode(var Message: TWMGetDlgCode); begin Message.Result := DLGC_WANTARROWS; OriginalCursor := GetClassWord(Handle, GCW_HCURSOR); end; procedure TSlideBar.WMSize(var Message: TWMSize); begin if Height > Width then Orientation := orVertical else Orientation := orHorizontal; end; procedure TSlideBar.SetLabels(A: TStringList); begin FLabels.Assign(A); end; procedure TSlideBar.SetMin(A: Integer); begin FMin := A; Refresh; end; procedure TSlideBar.SetMax(A: Integer); begin FMax := A; Refresh; end; procedure TSlideBar.SetOrientation(A: TOrientation); begin FOrientation := A; Refresh; end; procedure TSlideBar.SetPosition(A: Integer); begin if csDesigning in ComponentState then begin if (A >= Min) and (A <= Max) Then FPosition := A; Refresh; end else begin RemoveThumbBar; if (A >= Min) and (A <= Max) Then FPosition := A; WhereIsBar; SaveBackground; DrawThumbBar; if Assigned(FOnChange) then FOnChange(Self); end; end; procedure TSlideBar.SetStyle(A: TBarStyle); begin FStyle := A; Refresh; end; procedure TSlideBar.SetThickness(A: Byte); begin If (A > 0) and (A < 6) then begin FThickness := A; Refresh; end; end; procedure TSlideBar.SetThumbStyle(A: TThumbStyle); begin If ThumbStyle <> A then begin FThumbStyle := A; case ThumbStyle of tsBar1 : ThumbBmp.Handle := LoadBitmap(HInstance,'Bar1'); tsBar2 : ThumbBmp.Handle := LoadBitmap(HInstance,'Bar2'); tsBar3 : ThumbBmp.Handle := LoadBitmap(HInstance,'Bar3'); tsBar4 : ThumbBmp.Handle := LoadBitmap(HInstance,'Bar4'); tsCircle1 : ThumbBmp.Handle := LoadBitmap(HInstance,'Circle1'); tsSquare1 : ThumbBmp.Handle := LoadBitmap(HInstance,'Square1'); tsDiamond1 : ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond1'); tsDiamond2 : ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond2'); tsDiamond3 : ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond3'); tsDiamond4 : ThumbBmp.Handle := LoadBitmap(HInstance,'Diamond4'); end; case ThumbStyle of tsBar1 : MaskBmp.Handle := LoadBitmap(HInstance,'Bar1Mask'); tsBar2 : MaskBmp.Handle := LoadBitmap(HInstance,'Bar2Mask'); tsBar3 : MaskBmp.Handle := LoadBitmap(HInstance,'Bar3Mask'); tsBar4 : MaskBmp.Handle := LoadBitmap(HInstance,'Bar4Mask'); tsCircle1 : MaskBmp.Handle := LoadBitmap(HInstance,'Circle1Mask'); tsSquare1 : MaskBmp.Handle := LoadBitmap(HInstance,'Square1Mask'); tsDiamond1 : MaskBmp.Handle := LoadBitmap(HInstance,'Diamond1Mask'); tsDiamond2 : MaskBmp.Handle := LoadBitmap(HInstance,'Diamond2Mask'); tsDiamond3 : MaskBmp.Handle := LoadBitmap(HInstance,'Diamond3Mask'); tsDiamond4 : MaskBmp.Handle := LoadBitmap(HInstance,'Diamond4Mask'); end; HalfTH := ThumbBmp.Height div 2; HalfTW := ThumbBmp.Width div 2; Refresh; end; end; procedure TSlideBar.SetTicks(A: Boolean); begin FTicks := A; Refresh; end; function TSlideBar.CurrentLabel: String; begin if ((Position-Min+1) <= Labels.Count) and (Position >= Min) then CurrentLabel := Labels[Position-Min] else CurrentLabel := ''; end; function TSlideBar.NewPosition(WhereX,WhereY: Integer): Integer; var H1,W1 : Integer; begin {Calculate the nearest position to where the mouse is located} H1 := Height-HalfTH; W1 := Width-HalfTW; if IsVert then Result := Round(((H1-WhereY)/H1)*(Max-Min)+Min) else Result := Round((WhereX/W1)*(Max-Min)+Min); Result := MinInt(MaxInt(Result,Min),Max); end; procedure TSlideBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var A,B,C,D,E : Integer; begin if Button <> mbLeft then exit; C := Position-1; D := Position; E := Position+1; {B is the center of the ThumbBar} if IsVert then B := ThumbRect.Top+HalfTH else B := ThumbRect.Left+HalfTW; if Dragging then A := NewPosition(X,Y) else if IsVert then if Y < B then A := E else if Y > B then A := C else A := D else if X < B then A := C else if X > B then A := E else A := D; A := MinInt(MaxInt(A,Min),Max); Dragging := False; Position := A; end; procedure TSlideBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin SetFocus; Dragging := PtInRect(ThumbRect,Point(X,Y)); If IsVert then DragVal := Y else DragVal := X; end; procedure TSlideBar.MouseMove(Shift: TShiftState; X, Y: Integer); Var LastDragVal : Integer; begin if HandCursor then SetClassWord(Handle, GCW_HCURSOR, HandPointer) else SetClassWord(Handle, GCW_HCURSOR, OriginalCursor); {Is the left mouse button down and dragging the thumb bar?} if (ssLeft in Shift) and Dragging then begin LastDragVal := DragVal; if IsVert then DragVal := Y else DragVal := X; {This test eliminates unneccesary repaints} if DragVal <> LastDragVal then Position := NewPosition(X,Y); end; end; procedure TSlideBar.RemoveThumbBar; begin {Place the background bitmap where it was last} Canvas.Draw(ThumbRect.Left,ThumbRect.Top,BkgdBmp); end; procedure TSlideBar.DrawThumbBar; var TmpBmp : TBitMap; Rect1 : TRect; begin try {Define a rectangle to mark the dimensions of the thumbbar} Rect1 := Rect(0,0,ThumbBmp.Width,ThumbBmp.Height); {Create a working bitmap} TmpBmp := TBitmap.Create; TmpBmp.Height := ThumbBmp.Height; TmpBmp.Width := ThumbBmp.Width; {Copy the background area onto the working bitmap} TmpBmp.Canvas.CopyMode := cmSrcCopy; TmpBmp.Canvas.CopyRect(Rect1,BkgdBmp.Canvas,Rect1); {Copy the mask onto the working bitmap with SRCAND} TmpBmp.Canvas.CopyMode := cmSrcAnd; TmpBmp.Canvas.CopyRect(Rect1,MaskBmp.Canvas,Rect1); {Copy the thumbbar onto the working bitmap with SRCPAINT} TmpBmp.Canvas.CopyMode := cmSrcPaint; TmpBmp.Canvas.CopyRect(Rect1,ThumbBmp.Canvas,Rect1); {Now draw the thumb bar} Canvas.CopyRect(ThumbRect,TmpBmp.Canvas,Rect1); finally TmpBmp.Free; end; end; procedure TSlideBar.WhereIsBar; var Each : Real; ThumbX,ThumbY : Integer; begin {Calculate where to paint the thumb bar - store in ThumbRect} if IsVert then begin Each := (Height-ThumbBmp.Height)/(Max-Min); If Dragging then ThumbY := DragVal-HalfTH else ThumbY := Height-Round(Each*(Position-Min))-ThumbBmp.Height; ThumbY := MaxInt(0,MinInt(Height-ThumbBmp.Height,ThumbY)); ThumbX := (Width-ThumbBmp.Width) div 2; end else begin Each := (Width-ThumbBmp.Width)/(Max-Min); if Dragging then ThumbX := DragVal-HalfTW else ThumbX := Round(Each*(Position-Min)); ThumbX := MaxInt(0,MinInt(Width-ThumbBmp.Width,ThumbX)); ThumbY := (Height-ThumbBmp.Height) div 2; end; ThumbRect := Rect(ThumbX,ThumbY,ThumbX+ThumbBmp.Width,ThumbY+ThumbBmp.Height); end; procedure TSlideBar.SetTLColor; begin {Set the Top/Left color for the trench. Controls raised or lowered styles} With Canvas do if Style = bsLowered then Pen.Color := clGray else Pen.Color := clWhite; end; procedure TSlideBar.SetBRColor; begin {Set the Bottom/Right color for the trench. Controls raised or lowered styles} With Canvas do if Style = bsRaised then Pen.Color := clGray else Pen.Color := clWhite; end; procedure TSlideBar.DrawTrench; var X1,Y1,X2,Y2 : Integer; Each : Real; Tmp,TickPos : Integer; begin {This procedure simply draws the slot that the thumb bar will travel through} {including the tick-marks. The bar itself is not drawn.} with Canvas do begin {Calculate the corners of the trench dependant on orientation} if IsVert then begin X1 := (Width div 2) - (Thickness div 2) - 1; X2 := X1 + Thickness + 1; Y1 := HalfTH; Y2 := Height-ThumbBmp.Height+Y1; end else begin X1 := HalfTW; X2 := Width-ThumbBmp.Width+X1; Y1 := (Height div 2) - (Thickness div 2) - 1; Y2 := Y1 + Thickness + 1; end; Pen.Style := psSolid; {Set the color for the Top & Left edges} SetTLColor; MoveTo(X2,Y1); LineTo(X1,Y1); LineTo(X1,Y2); {Set the color for the Bottom & Right edges} SetBRColor; LineTo(X2,Y2); LineTo(X2,Y1-1); {Now do a filled black rectangle in the center if the control has focus} with brush do if Focused then Color := FocusColor else Color := clSilver; Pen.Style := psClear; {Draw the focus highlight} Rectangle(X1+1,Y1+1,X2+1,Y2+1); Pen.Style := psSolid; {Calculate spacing of tick marks} Each := 0; if Ticks then if (Max-Min) > 0 then if IsVert then Each := (Height-ThumbBmp.Height)/(Max-Min) else Each := (Width-ThumbBmp.Width)/(Max-Min); {Now draw the tick marks} if Ticks then for Tmp := Min to Max do if IsVert then begin TickPos := Y2-Trunc(Each*(Tmp-Min))-1; if Tmp = Max then TickPos := Y1; SetTLColor; MoveTo(X1,TickPos); LineTo(X1-2,TickPos); SetBRColor; MoveTo(X1,TickPos+1); LineTo(X1-2,TickPos+1); end else begin TickPos := X1+Trunc(Each*(Tmp-Min)); if Tmp = Max then TickPos := X2-1; SetTLColor; MoveTo(TickPos,Y1); LineTo(TickPos,Y1-2); SetBRColor; MoveTo(TickPos+1,Y1); LineTo(TickPos+1,Y1-2); end; end; end; procedure TSlideBar.SaveBackground; begin {This saves the background image so it can be restored later} BkgdBmp.Width := ThumbBmp.Width; BkgdBmp.Height := ThumbBmp.Height; BkgdBmp.Canvas.CopyRect(Rect(0,0,ThumbBmp.Width,ThumbBmp.Height), Canvas,ThumbRect); end; procedure TSlideBar.Paint; begin DrawTrench; WhereIsBar; SaveBackground; DrawThumbBar; end; end. { SLIDEBAR.RES required to compile -- Use XX3401 to DECODE the following block. ..Cut the text to a text file named slidebar.xx ..execute XX3401 D slidebar.xx ..the "slidebar.res" will appear on your disk } { cut here -------------------------------------} *XX3402-004167-011195--72--85-41244----SLIDEBAR.RES--1-OF--1 zk2+zk2+2-+o+E++-U+E+0U++++U++++E+++++2++E++++++U+++++++++++++++++++++++ ++++++++zzzz++Ds+++1y+++-zU+++Tw+++Dz+++4zk++-jo+++nJ+++Mp++++A++++1++++ +k++++A++++1+++++k++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++++++y+DzzzU1zzzk+zzzw+5zzy+-zzz++Tzz k+5zzs+-zzw6+zzza+zzzzVzzzzsTzzzy5zzzzVzzzzsTzzzzDzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz+U-0 EJ6l+1++Y++++0U++++3++++0U++++2+-+++++++8++++++++++++++++++++-++++++++++ ++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz ++1zzzw+++++++Vr1RoDVkrR1sQ6W+y506UDVk++1sQ+++y5+++Dy++++++++Dw0+27-IX3B EJB9+1++Y++++0U++++3++++0U++++2+-+++++++8++++++++++++++++++++-++++++++++ ++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz ++1zzzw+w+1k++++1Ro+++rR+++6W+++06U+++++++++++++++++++++w+1k+Dw0+27-IX6+ A+0M++++8+++++M++++A+++++E+2+++++++k++++++++++++++++++++2++++++++++++6++ +6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+zzw++Dzz zk++++++05Rk++y6Q++DW51R1sVkrEy6Q6UDW5061sVk++y6Q++DW5++1zy+++++++1z+U-0 EJ6mHI3HGk+k+7U++++c++++-U++++k++++-++E++++++1+++++++++++++++++++++E++++ ++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+zk+++Dw+ zk1zzk++zzzz+D++1k+++++++++++++++Bo+++1R++++W++++6U+++++++++++++++++++++ w++D+Dw0+27-IXA+A+0E++++8+++++c++++3+++++E+2+++++++c++++++++++++++++++++ 2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+ ++1z+Dw+zzw++Dzzzk++++++++2E+EVrRrRkJJJJ1sW6W5-JJJIDzzzzU3JJJE++++++JJJJ zk6+EY3GAop-Iog+A+0E++++8+++++c++++3+++++E+2+++++++c++++++++++++++++++++ 2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+ ++1z+Dw+zzw++Dzzzk1k++++1k+++++++++++++++++++++++++++++++++++D+++++D++++ zk6+EY3GB++k+7U++++c++++1+++++M++++-++E++++++1+++++++++++++++++++++E++++ ++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+zk+++Dw+ zk1zzk++zzzz++++++++++++05RrRrRk2F2DW6W6W5-2F+y6W6W6Q-2F1zzzzzy+F2E+++++ +++++Dw0+27-IXFBEJB9+1++a++++0U++++A++++-U++++2+-+++++++A+++++++++++++++ +++++-++++++++++++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1z zk1z++++zk1z+Dzz++1zzzw+w++++++D+++++++++++F2E+++++++2F2++++++++2F2+++++ ++-2FD++++++1k++zk6+EoZGEol3AE+k+6U++++c++++0+++++U++++-++E++++++0++++++ +++++++++++++++E++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z ++1z++++zzw+zk+++Dw+zk1zzk++zzzz++++++++VrQ+06W5Q+y6W5+DW6Vk1zW6U+1zy+++ ++++zk6+EoZGEol3AIp-Iog+A+06++++8+++++U++++6+++++E+2+++++++U++++++++++++ ++++++++2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk++ +Dzz+Dw+++1z+Dw+zzw++Dzzzk1z++1zw+++1k++++++++++++++++++++1k+++Dzk++zzw0 +2F7EIpDHYEl+1++W++++0U++++6++++0+++++2+-+++++++6++++++++++++++++++++-++ ++++++++++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++ zk1z+Dzz++1zzzw++++++++5Q+++W5Q+1sW5Q+zsW5++zsU+++zk++++++1z+U-2GI3BHot2 AIp-Iog+A+06++++8+++++U++++6+++++E+2+++++++U++++++++++++++++++++2+++++++ +++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+ zzw++Dzzzk1zw+zzzk++zz++++w++++++++++D++++zz++1zzz+Dzzw0+2F7EIpDHYEm+1++ m++++0U++++A++++1+++++2+-+++++++M++++++++++++++++++++-++++++++++++0+++0+ ++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz++1zzzw+ ++++++++Xz++++Rk++1zw+++S6Q++CXk++S6W5++vj++S6W6Vk-aM+S6W6W6Q+vU1sW6W6Xk ti++y6W6Xk1is++DW6Xk+CvU++1sXk++vi++++zk++-as++++++++CvUzk6+F2Z-HIxCF17B EJB9+1++m++++0U++++A++++1+++++2+-+++++++M++++++++++++++++++++-++++++++++ ++0+++0+++++U6++U++++6++U+0+U+++U60++A1+k++++Dw++Dw+++1zzk1z++++zk1z+Dzz ++1zzzw+zzzk1zzzXz1zzk++zzzzwDzk+++DzyXkzk++++1zvj1k++++++xaM+++++++++vU ++++++++ti1k++++++zisDw+++++zyvUzz++++zzvi1zzk++zzxasDzzw+zzzyvUzk6+F2Z- HIxCF1A+A+0k++++8+++++Y++++7+++++E+2++++++-6++++++++++++++++++++2+++++++ +++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+ zzw++Dzzzk++++++-JJJJE++Q+++++++++Vr++JJJJI+W6Rk+E++++zsW5Q++++++Dy6U+++ ++++1zU+++++++++w+++++++++++++++++1z+U-2GI3BHot2Aop-Iog+A+0k++++8+++++Y+ +++7+++++E+2++++++-6++++++++++++++++++++2++++++++++++6+++6++++0+U+0+++++ U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+zzw++Dzzzk1zzkzzxJJJJTzk +Dzk++++zk++1zJJJJLk++++wE++++++++++++++w++++D++++1z+++Dw++++Dzk+Dzk++++ zzwDzz++++1z+U-2GI3BHot2B++k+A+++++c++++0k++++g++++-++E++++++3U+++++++++ +++++++++++E++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z ++++zzw+zk+++Dw+zk1zzk++zzzz+++++++++++++++5+++++++++6Rk++JJJE+6W5Q+++++ +6W6Vr+3JJIDy6W6Rk++++1zW6W+++++++zsW++++++++Dy+++++++++1k++++++++++++++ ++1z+U-2GI3BHot2B2p-Iog+A+1+++++8+++++g++++9+++++E+2++++++-M++++++++++++ ++++++++2++++++++++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk++ +Dzz+Dw+++1z+Dw+zzw++Dzzzk1zzz1zzz+++Dzz++zzw+++zz+++DzpJJLz++++1z+++D++ ++++xJJJ++++++++++1k+++++D+++Dw++++Dw+++zz+++Dzk++1zzk+Dzz+++DzzwDzzw+++ zk6+Ip3JEJ73AE+k+6U++++c++++0+++++U++++-++E++++++0+++++++++++++++++++++E ++++++++++++U+++U++++60++6++++0++6++U6+++60+U+1+kA++++1z++1z++++zzw+zk++ +Dw+zk1zzk++zzzz+++++++6RrRk1sW6Q+y6W5+DW6Vk1sW6Q+zzzs++++++zk6+Ip3JEJ73 AIp-Iog+A+06++++8+++++U++++6+++++E+2+++++++U++++++++++++++++++++2+++++++ +++++6+++6++++0+U+0+++++U+0++60+++0+U6++kA1+++++zk++zk+++Dzz+Dw+++1z+Dw+ zzw++Dzzzk+++++++++++++++++++++++++++++++++++++++++++DwA+2V-HYFEHoZCJ2JG +1+EFU2++++++U+-+0++E++-++2+B+2+++2++++c++++6++++2+++++-++2++++++6++++++ +++++++++++++++++++++++++Dzzzk+1y++++zU+++Ts+++5z+++1zk++-jw+++Px+++ApE+ +4BE+++1+++++k++++A++++1+++++k++++A+++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++DU1zzzs+zzzw+Dz zz+-zzzU+Tzzk+5zzw+-zzy++Tzz0+DzztUDzzzsTzzzy5zzzzVzzzzsTzzzy5zzzznzzzzz zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz zzzzzzzzzzzz ***** END OF BLOCK 1 *****