LazStats: Complete refactoring of FreqUnit.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@7691 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz
2020-09-23 22:34:12 +00:00
parent 6f16f11ccc
commit e3cd2dea44
9 changed files with 900 additions and 688 deletions

View File

@ -113,7 +113,7 @@ implementation
uses uses
Math, Math,
MoveAvgUnit, AutoPlotUnit, PolynomialUnit, ExpSmoothUnit, FFTUnit; MathUnit, MoveAvgUnit, AutoPlotUnit, PolynomialUnit, ExpSmoothUnit, FFTUnit;
{ TAutoCorrFrm } { TAutoCorrFrm }

View File

@ -1,45 +1,45 @@
object FreqFrm: TFreqFrm object FreqFrm: TFreqFrm
Left = 490 Left = 490
Height = 543 Height = 376
Top = 228 Top = 228
Width = 889 Width = 835
HelpType = htKeyword HelpType = htKeyword
HelpKeyword = 'html/FrequencyAnalysis.htm' HelpKeyword = 'html/FrequencyAnalysis.htm'
Caption = 'Frequency Distribution' Caption = 'Frequency Distribution'
ClientHeight = 543 ClientHeight = 376
ClientWidth = 889 ClientWidth = 835
OnActivate = FormActivate OnActivate = FormActivate
OnCreate = FormCreate OnCreate = FormCreate
Position = poMainFormCenter Position = poMainFormCenter
LCLVersion = '2.1.0.0' LCLVersion = '2.1.0.0'
object ParamsPanel: TPanel object ParamsPanel: TPanel
Left = 8 Left = 8
Height = 527 Height = 360
Top = 8 Top = 8
Width = 288 Width = 264
Align = alLeft Align = alLeft
BorderSpacing.Left = 8 BorderSpacing.Left = 8
BorderSpacing.Top = 8 BorderSpacing.Top = 8
BorderSpacing.Right = 4 BorderSpacing.Right = 4
BorderSpacing.Bottom = 8 BorderSpacing.Bottom = 8
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 527 ClientHeight = 360
ClientWidth = 288 ClientWidth = 264
TabOrder = 0 TabOrder = 0
object Panel1: TPanel object Panel1: TPanel
AnchorSideLeft.Control = ParamsPanel AnchorSideLeft.Control = ParamsPanel
AnchorSideTop.Control = ParamsPanel AnchorSideTop.Control = ParamsPanel
AnchorSideRight.Control = ParamsPanel AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = PlotOptionsGroup AnchorSideBottom.Control = NormPltChk
Left = 0 Left = 0
Height = 217 Height = 163
Top = 0 Top = 0
Width = 288 Width = 264
Anchors = [akTop, akLeft, akRight] Anchors = [akTop, akLeft, akRight, akBottom]
BevelOuter = bvNone BevelOuter = bvNone
ClientHeight = 217 ClientHeight = 163
ClientWidth = 288 ClientWidth = 264
TabOrder = 0 TabOrder = 0
object Label1: TLabel object Label1: TLabel
AnchorSideLeft.Control = Panel1 AnchorSideLeft.Control = Panel1
@ -54,7 +54,7 @@ object FreqFrm: TFreqFrm
object Label2: TLabel object Label2: TLabel
AnchorSideLeft.Control = SelList AnchorSideLeft.Control = SelList
AnchorSideTop.Control = Panel1 AnchorSideTop.Control = Panel1
Left = 175 Left = 159
Height = 15 Height = 15
Top = 0 Top = 0
Width = 104 Width = 104
@ -69,12 +69,12 @@ object FreqFrm: TFreqFrm
AnchorSideBottom.Control = Panel1 AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 0 Left = 0
Height = 200 Height = 146
Top = 17 Top = 17
Width = 113 Width = 105
Anchors = [akTop, akLeft, akRight, akBottom] Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Top = 2 BorderSpacing.Top = 2
BorderSpacing.Right = 8 BorderSpacing.Right = 4
ItemHeight = 0 ItemHeight = 0
MultiSelect = True MultiSelect = True
OnDblClick = VarListDblClick OnDblClick = VarListDblClick
@ -90,12 +90,12 @@ object FreqFrm: TFreqFrm
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Panel1 AnchorSideBottom.Control = Panel1
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 175 Left = 159
Height = 200 Height = 146
Top = 17 Top = 17
Width = 113 Width = 105
Anchors = [akTop, akLeft, akRight, akBottom] Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Left = 8 BorderSpacing.Left = 4
BorderSpacing.Top = 2 BorderSpacing.Top = 2
ItemHeight = 0 ItemHeight = 0
OnSelectionChange = SelListSelectionChange OnSelectionChange = SelListSelectionChange
@ -104,7 +104,7 @@ object FreqFrm: TFreqFrm
object InBtn: TBitBtn object InBtn: TBitBtn
AnchorSideLeft.Control = Panel1 AnchorSideLeft.Control = Panel1
AnchorSideLeft.Side = asrCenter AnchorSideLeft.Side = asrCenter
Left = 131 Left = 119
Height = 26 Height = 26
Top = 23 Top = 23
Width = 26 Width = 26
@ -117,7 +117,7 @@ object FreqFrm: TFreqFrm
object OutBtn: TBitBtn object OutBtn: TBitBtn
AnchorSideLeft.Control = Panel1 AnchorSideLeft.Control = Panel1
AnchorSideLeft.Side = asrCenter AnchorSideLeft.Side = asrCenter
Left = 131 Left = 119
Height = 26 Height = 26
Top = 56 Top = 56
Width = 26 Width = 26
@ -132,7 +132,7 @@ object FreqFrm: TFreqFrm
AnchorSideLeft.Side = asrCenter AnchorSideLeft.Side = asrCenter
AnchorSideTop.Control = OutBtn AnchorSideTop.Control = OutBtn
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
Left = 121 Left = 109
Height = 25 Height = 25
Top = 106 Top = 106
Width = 46 Width = 46
@ -143,62 +143,20 @@ object FreqFrm: TFreqFrm
TabOrder = 3 TabOrder = 3
end end
end end
object PlotOptionsGroup: TRadioGroup
AnchorSideLeft.Control = ParamsPanel
AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = BarTypeGroup
Left = 0
Height = 127
Top = 273
Width = 277
Anchors = [akLeft, akBottom]
AutoFill = True
AutoSize = True
BorderSpacing.Top = 8
BorderSpacing.Right = 8
Caption = 'Plot Options'
ChildSizing.LeftRightSpacing = 12
ChildSizing.TopBottomSpacing = 6
ChildSizing.HorizontalSpacing = 12
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
ChildSizing.EnlargeVertical = crsHomogenousChildResize
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclLeftToRightThenTopToBottom
ChildSizing.ControlsPerLine = 2
ClientHeight = 107
ClientWidth = 273
Columns = 2
ItemIndex = 0
Items.Strings = (
'2D Vertical Bars'
'3D Vertical Bars'
'2D Pie Chart'
'Exploded Pie Chart'
'2D Line Chart'
'3D Line Chart'
'Plot 2D Points'
'Plot 3D Points'
'2D Horizontal Bars'
'3D Horizontal Bars'
)
OnSelectionChanged = PlotOptionsGroupSelectionChanged
TabOrder = 1
end
object NormPltChk: TCheckBox object NormPltChk: TCheckBox
AnchorSideLeft.Control = ParamsPanel AnchorSideLeft.Control = ParamsPanel
AnchorSideLeft.Side = asrCenter
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Bevel1 AnchorSideBottom.Control = BinSelectionGroup
Left = 0 Left = 58
Height = 19 Height = 19
Top = 467 Top = 171
Width = 149 Width = 149
Anchors = [akLeft, akBottom] Anchors = [akLeft, akBottom]
BorderSpacing.Top = 8 BorderSpacing.Top = 8
Caption = 'Plot Normal Distribution' Caption = 'Plot Normal Distribution'
TabOrder = 2 TabOrder = 1
end end
object Bevel1: TBevel object Bevel1: TBevel
AnchorSideLeft.Control = ParamsPanel AnchorSideLeft.Control = ParamsPanel
@ -207,8 +165,8 @@ object FreqFrm: TFreqFrm
AnchorSideBottom.Control = CloseBtn AnchorSideBottom.Control = CloseBtn
Left = 0 Left = 0
Height = 8 Height = 8
Top = 486 Top = 319
Width = 288 Width = 264
Anchors = [akLeft, akRight, akBottom] Anchors = [akLeft, akRight, akBottom]
Shape = bsBottomLine Shape = bsBottomLine
end end
@ -217,15 +175,15 @@ object FreqFrm: TFreqFrm
AnchorSideRight.Control = ComputeBtn AnchorSideRight.Control = ComputeBtn
AnchorSideBottom.Control = ParamsPanel AnchorSideBottom.Control = ParamsPanel
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 87 Left = 63
Height = 25 Height = 25
Top = 502 Top = 335
Width = 54 Width = 54
Anchors = [akRight, akBottom] Anchors = [akRight, akBottom]
AutoSize = True AutoSize = True
Caption = 'Reset' Caption = 'Reset'
OnClick = ResetBtnClick OnClick = ResetBtnClick
TabOrder = 3 TabOrder = 2
end end
object CloseBtn: TButton object CloseBtn: TButton
AnchorSideLeft.Side = asrBottom AnchorSideLeft.Side = asrBottom
@ -234,9 +192,9 @@ object FreqFrm: TFreqFrm
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = ParamsPanel AnchorSideBottom.Control = ParamsPanel
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 233 Left = 209
Height = 25 Height = 25
Top = 502 Top = 335
Width = 55 Width = 55
Anchors = [akRight, akBottom] Anchors = [akRight, akBottom]
AutoSize = True AutoSize = True
@ -245,15 +203,15 @@ object FreqFrm: TFreqFrm
Caption = 'Close' Caption = 'Close'
ModalResult = 1 ModalResult = 1
OnClick = CloseBtnClick OnClick = CloseBtnClick
TabOrder = 4 TabOrder = 3
end end
object ComputeBtn: TButton object ComputeBtn: TButton
AnchorSideRight.Control = CloseBtn AnchorSideRight.Control = CloseBtn
AnchorSideBottom.Control = ParamsPanel AnchorSideBottom.Control = ParamsPanel
AnchorSideBottom.Side = asrBottom AnchorSideBottom.Side = asrBottom
Left = 149 Left = 125
Height = 25 Height = 25
Top = 502 Top = 335
Width = 76 Width = 76
Anchors = [akRight, akBottom] Anchors = [akRight, akBottom]
AutoSize = True AutoSize = True
@ -262,96 +220,171 @@ object FreqFrm: TFreqFrm
BorderSpacing.Right = 8 BorderSpacing.Right = 8
Caption = 'Compute' Caption = 'Compute'
OnClick = ComputeBtnClick OnClick = ComputeBtnClick
TabOrder = 5 TabOrder = 4
end end
object BarTypeGroup: TRadioGroup object PlotOptionsGroup: TGroupBox
AnchorSideLeft.Control = ParamsPanel AnchorSideLeft.Control = ParamsPanel
AnchorSideTop.Side = asrBottom AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = ParamsPanel AnchorSideRight.Control = BinSelectionGroup
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = NormPltChk AnchorSideBottom.Control = Bevel1
Left = 0 Left = 0
Height = 51 Height = 52
Top = 408 Top = 267
Width = 182 Width = 255
Anchors = [akLeft, akBottom] Anchors = [akLeft, akRight, akBottom]
AutoFill = True
AutoSize = True AutoSize = True
BorderSpacing.Top = 8 BorderSpacing.Top = 8
Caption = 'Bar Type' Caption = 'Plot Options'
ChildSizing.LeftRightSpacing = 12 ClientHeight = 32
ChildSizing.TopBottomSpacing = 6 ClientWidth = 251
ChildSizing.EnlargeHorizontal = crsHomogenousChildResize TabOrder = 5
ChildSizing.EnlargeVertical = crsHomogenousChildResize object VertBarsBtn: TSpeedButton
ChildSizing.ShrinkHorizontal = crsScaleChilds AnchorSideLeft.Control = PlotOptionsGroup
ChildSizing.ShrinkVertical = crsScaleChilds AnchorSideTop.Control = PlotOptionsGroup
ChildSizing.Layout = cclLeftToRightThenTopToBottom Left = 12
ChildSizing.ControlsPerLine = 2 Height = 22
ClientHeight = 31 Top = 4
ClientWidth = 178 Width = 23
Columns = 2 BorderSpacing.Left = 12
Enabled = False BorderSpacing.Top = 4
ItemIndex = 0 BorderSpacing.Bottom = 6
Items.Strings = ( Down = True
'Separated' GroupIndex = 1
'Contiguous' Images = MainDataModule.ImageList
) ImageIndex = 8
TabOrder = 6 end
object HorBarsBtn: TSpeedButton
AnchorSideLeft.Control = VertBarsBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PlotOptionsGroup
Left = 39
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 4
BorderSpacing.Top = 4
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 9
end
object LinePlotBtn: TSpeedButton
AnchorSideLeft.Control = HorBarsBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PlotOptionsGroup
Left = 66
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 4
BorderSpacing.Top = 4
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 10
end
object AreaPlotBtn: TSpeedButton
AnchorSideLeft.Control = LinePlotBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = PlotOptionsGroup
Left = 93
Height = 22
Top = 4
Width = 23
BorderSpacing.Left = 4
BorderSpacing.Top = 4
GroupIndex = 1
Images = MainDataModule.ImageList
ImageIndex = 11
end
object ThreeDChk: TCheckBox
AnchorSideLeft.Control = AreaPlotBtn
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = VertBarsBtn
AnchorSideTop.Side = asrCenter
Left = 148
Height = 19
Top = 6
Width = 34
BorderSpacing.Left = 32
BorderSpacing.Right = 8
Caption = '3D'
TabOrder = 0
end
end end
object Panel2: TPanel object BinSelectionGroup: TGroupBox
AnchorSideLeft.Control = ParamsPanel AnchorSideLeft.Control = ParamsPanel
AnchorSideRight.Control = ParamsPanel AnchorSideRight.Control = ParamsPanel
AnchorSideRight.Side = asrBottom AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = PlotOptionsGroup AnchorSideBottom.Control = PlotOptionsGroup
Left = 0 Left = 0
Height = 23 Height = 57
Top = 236 Top = 202
Width = 288 Width = 255
Anchors = [akTop, akLeft, akRight] Anchors = [akLeft, akBottom]
AutoSize = True AutoSize = True
BevelOuter = bvNone BorderSpacing.Top = 12
ClientHeight = 23 BorderSpacing.Bottom = 8
ClientWidth = 288 Caption = 'Bin Selection'
TabOrder = 7 ClientHeight = 37
object NoIntervalsEdit: TSpinEdit ClientWidth = 251
AnchorSideLeft.Control = NoIntervalsLabel TabOrder = 6
AnchorSideLeft.Side = asrBottom object Panel2: TPanel
AnchorSideTop.Control = Panel2 AnchorSideLeft.Control = BinSelectionGroup
Left = 121 AnchorSideTop.Control = BinSelectionGroup
AnchorSideRight.Side = asrBottom
Left = 12
Height = 23 Height = 23
Top = 0 Top = 2
Width = 74 Width = 239
Alignment = taRightJustify AutoSize = True
BorderSpacing.Left = 16 BorderSpacing.Left = 12
MinValue = 1 BorderSpacing.Top = 2
BorderSpacing.Bottom = 12
BevelOuter = bvNone
ClientHeight = 23
ClientWidth = 239
TabOrder = 0 TabOrder = 0
Value = 10 object NoIntervalsEdit: TSpinEdit
end AnchorSideLeft.Control = NoIntervalsLabel
object NoIntervalsLabel: TLabel AnchorSideLeft.Side = asrBottom
AnchorSideLeft.Control = Panel2 AnchorSideTop.Control = Panel2
AnchorSideTop.Control = NoIntervalsEdit Left = 165
AnchorSideTop.Side = asrCenter Height = 23
Left = 0 Top = 0
Height = 15 Width = 66
Top = 4 Alignment = taRightJustify
Width = 105 BorderSpacing.Left = 16
Caption = 'Number of intervals' BorderSpacing.Right = 8
ParentColor = False MinValue = 1
TabOrder = 0
Value = 10
end
object NoIntervalsLabel: TLabel
AnchorSideLeft.Control = Panel2
AnchorSideTop.Control = NoIntervalsEdit
AnchorSideTop.Side = asrCenter
Left = 0
Height = 15
Top = 4
Width = 149
Caption = 'Approximate No of intervals'
ParentColor = False
end
end end
end end
end end
object ParamsSplitter: TSplitter object ParamsSplitter: TSplitter
Left = 300 Left = 276
Height = 543 Height = 376
Top = 0 Top = 0
Width = 5 Width = 5
ResizeStyle = rsPattern ResizeStyle = rsPattern
end end
object PageControl: TPageControl object PageControl: TPageControl
Left = 309 Left = 285
Height = 527 Height = 360
Top = 8 Top = 8
Width = 572 Width = 542
ActivePage = ReportPage ActivePage = ReportPage
Align = alClient Align = alClient
BorderSpacing.Left = 4 BorderSpacing.Left = 4

View File

@ -9,7 +9,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
StdCtrls, Buttons, ExtCtrls, ComCtrls, Spin, StdCtrls, Buttons, ExtCtrls, ComCtrls, Spin,
Globals, MainUnit, FunctionsLib, GraphLib, DataProcs, ReportFrameUnit, ChartFrameUnit; Globals, MainUnit, GraphLib, DataProcs, ReportFrameUnit, ChartFrameUnit;
type type
@ -17,7 +17,10 @@ type
TFreqFrm = class(TForm) TFreqFrm = class(TForm)
Bevel1: TBevel; Bevel1: TBevel;
BinSelectionGroup: TGroupBox;
ThreeDChk: TCheckBox;
ComputeBtn: TButton; ComputeBtn: TButton;
PlotOptionsGroup: TGroupBox;
NoIntervalsLabel: TLabel; NoIntervalsLabel: TLabel;
PageControl: TPageControl; PageControl: TPageControl;
Panel1: TPanel; Panel1: TPanel;
@ -32,11 +35,13 @@ type
Label1: TLabel; Label1: TLabel;
Label2: TLabel; Label2: TLabel;
SelList: TListBox; SelList: TListBox;
PlotOptionsGroup: TRadioGroup;
BarTypeGroup: TRadioGroup;
ParamsSplitter: TSplitter; ParamsSplitter: TSplitter;
ReportPage: TTabSheet; ReportPage: TTabSheet;
NoIntervalsEdit: TSpinEdit; NoIntervalsEdit: TSpinEdit;
HorBarsBtn: TSpeedButton;
LinePlotBtn: TSpeedButton;
AreaPlotBtn: TSpeedButton;
VertBarsBtn: TSpeedButton;
VarList: TListBox; VarList: TListBox;
procedure AllBtnClick(Sender: TObject); procedure AllBtnClick(Sender: TObject);
procedure CloseBtnClick(Sender: TObject); procedure CloseBtnClick(Sender: TObject);
@ -45,7 +50,6 @@ type
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure InBtnClick(Sender: TObject); procedure InBtnClick(Sender: TObject);
procedure OutBtnClick(Sender: TObject); procedure OutBtnClick(Sender: TObject);
procedure PlotOptionsGroupSelectionChanged(Sender: TObject);
procedure ResetBtnClick(Sender: TObject); procedure ResetBtnClick(Sender: TObject);
procedure SelListSelectionChange(Sender: TObject; User: boolean); procedure SelListSelectionChange(Sender: TObject; User: boolean);
procedure VarListDblClick(Sender: TObject); procedure VarListDblClick(Sender: TObject);
@ -54,11 +58,15 @@ type
{ private declarations } { private declarations }
FReportFrame: TReportFrame; FReportFrame: TReportFrame;
FAutoSized: Boolean; FAutoSized: Boolean;
procedure CalcIntervals(var AMin, AMax, AIntervalSize: Double;
out ANumIntervals: Integer);
procedure ClearTabs; procedure ClearTabs;
function CreateChartFrame(AColIndex: Integer; AVarName: String): TChartFrame; function CreateOrGetChartFrame(AColIndex: Integer; AVarName: String): TChartFrame;
function GetPageCaption(AVarName: String): String; function GetPageCaption(AVarName: String): String;
procedure PlotFreq(AColIndex: Integer; AVarName: String; const xLabels: StrDyneVec; procedure PlotFreq(AChartFrame: TChartFrame; AColIndex: Integer;
AVarName: String; const xLabels: StrDyneVec;
const Freq: DblDyneVec); const Freq: DblDyneVec);
procedure PlotNormalDist(AChartFrame: TChartFrame; Freq: DblDyneVec);
procedure UpdateBtnStates; procedure UpdateBtnStates;
public public
{ public declarations } { public declarations }
@ -74,8 +82,8 @@ implementation
{$R *.lfm} {$R *.lfm}
uses uses
Math, TAChartUtils, TALegend, TASeries, Math, TAChartUtils, TALegend, TASources, TACustomSeries, TASeries,
Utils, FreqSpecsUnit; Utils, MathUnit, FreqSpecsUnit;
{ TFreqFrm } { TFreqFrm }
@ -92,6 +100,22 @@ begin
end; end;
procedure TFreqFrm.CalcIntervals(var AMin, AMax, AIntervalsize: Double;
out ANumIntervals: Integer);
var
intervalSize: Double;
m: Double;
e: Integer;
begin
intervalSize := round((AMax - AMin) / NoIntervalsEdit.Value);
MantisseAndExponent(intervalSize, m, e);
m := round(m);
AIntervalSize := m * IntPower(10, e);
AMin := floor(AMin / AIntervalSize) * AIntervalSize;
AMax := ceil(AMax / AIntervalSize) * AIntervalSize;
ANumIntervals := round((AMax - AMin) / AIntervalSize);
end;
procedure TFreqFrm.ClearTabs; procedure TFreqFrm.ClearTabs;
var var
i: Integer; i: Integer;
@ -118,22 +142,20 @@ var
cumfreq: DblDyneVec = nil; cumfreq: DblDyneVec = nil;
XLabels: StrDyneVec = nil; XLabels: StrDyneVec = nil;
XValue: DblDyneVec = nil; XValue: DblDyneVec = nil;
normDistValue: DblDyneVec = nil;
value: double; value: double;
NoVars: integer; NoVars: integer;
plottype: integer;
cellval: string; cellval: string;
mask: String;
col: integer; col: integer;
min, max, range: double; min, max: double;
incrsize: double; incrSize: double = 1;
nointervals: double;
nInts: integer; nInts: integer;
NormDist: boolean;
Sumx, Sumx2, Mean, Variance, StdDev, zlow, zhi: double; Sumx, Sumx2, Mean, Variance, StdDev, zlow, zhi: double;
X, zproplow, zprophi, zfreq: double; X, zproplow, zprophi, zfreq: double;
nCases: integer; nCases: integer;
oldPageIndex: Integer;
found: Boolean;
lReport: TStrings; lReport: TStrings;
chartFrame: TChartFrame;
begin begin
if SelList.Count = 0 then if SelList.Count = 0 then
begin begin
@ -141,8 +163,6 @@ begin
exit; exit;
end; end;
NormDist := NormPltChk.Checked;
SetLength(freq, NoCases); SetLength(freq, NoCases);
SetLength(pcnt, NoCases); SetLength(pcnt, NoCases);
SetLength(cumpcnt, NoCases); SetLength(cumpcnt, NoCases);
@ -150,23 +170,16 @@ begin
SetLength(cumfreq, NoCases); SetLength(cumfreq, NoCases);
SetLength(XValue, NoCases); SetLength(XValue, NoCases);
(* ---------------> causes flicker
// Remove already existing chart pages
oldPageIndex := PageControl.PageIndex;
for i := PageControl.PageCount-1 downto 1 do
PageControl.Pages[i].Free;
*)
lReport := TStringList.Create; lReport := TStringList.Create;
try try
lReport.Add('FREQUENCY ANALYSIS BY BILL MILLER'); lReport.Add('FREQUENCY ANALYSIS BY BILL MILLER');
lReport.Add(''); lReport.Add('');
{ Analyze each variable } // Iterate through all variables
NoVars := SelList.Items.Count; NoVars := SelList.Items.Count;
for i := 1 to NoVars do for i := 1 to NoVars do
begin begin
{ get column no. of variable } // Get column index of variable
col := 1; col := 1;
cellval := SelList.Items[i-1]; cellval := SelList.Items[i-1];
for j := 1 to NoVariables do for j := 1 to NoVariables do
@ -180,7 +193,7 @@ begin
end; end;
end; end;
{ get min and max values for variable in col } // Get min and max values for variable in col
min := Infinity; min := Infinity;
max := -Infinity; max := -Infinity;
for j := 1 to NoCases do for j := 1 to NoCases do
@ -190,39 +203,14 @@ begin
if value > max then max := value; if value > max then max := value;
if value < min then min := value; if value < min then min := value;
end; end;
(*
range := max - min + 1.0;
incrsize := 1.0;
{ if too many increments, set increment size for 15 increments }
if range > 200.0 then incrsize := range / 15;
nointervals := range / incrsize;
nints := round(nointervals);
{ Get user's approval and / or changes } CalcIntervals(min, max, incrSize, nInts);
FreqSpecsFrm.VarName.Text := cellval;
FreqSpecsFrm.Minimum.Text := FloatToStr(min);
FreqSpecsFrm.Maximum.Text := FloatToStr(max);
FreqSpecsFrm.range.Text := FloatToStr(range);
FreqSpecsFrm.IntSize.Text := FloatToStr(incrsize);
FreqSpecsFrm.NoInts.Text := IntToStr(nints);
FreqSpecsFrm.NoCases := NoCases;
if FreqSpecsFrm.ShowModal <> mrOK then
exit;
incrsize := StrToFloat(FreqSpecsFrm.IntSize.Text);
nints := StrToInt(FreqSpecsFrm.NoInts.Text);
if nints > 200 then
nints := 200;
*)
nInts := NoIntervalsEdit.Value;
incrSize := (max - min) / nInts;
SetLength(freq, nInts); SetLength(freq, nInts);
SetLength(XValue, nInts); SetLength(XValue, nInts);
SetLength(XLabels, nInts); SetLength(XLabels, nInts);
{ Get frequency of cases in each interval } // Get frequency of cases in each interval
nCases := 0; nCases := 0;
for j := 1 to NoCases do for j := 1 to NoCases do
begin begin
@ -233,13 +221,19 @@ begin
if (value >= min + k * incrSize) and (value < min + ((k+1) * incrSize)) then if (value >= min + k * incrSize) and (value < min + ((k+1) * incrSize)) then
freq[k] := freq[k] + 1.0; freq[k] := freq[k] + 1.0;
end; end;
// Create x axis labels for the chart
if HorBarsBtn.Down then
mask := '%.2f to %.2f'
else
mask := '%.2f' + LineEnding + 'to' + LineEnding + '%.2f';
for j := 0 to nInts-1 do for j := 0 to nInts-1 do
begin begin
XValue[j] := min + j * incrSize; XValue[j] := min + j * incrSize;
XLabels[j] := Format('%.2f'+LineEnding+'to'+LineEnding+'%.2f', [XValue[j], XValue[j] + incrSize]); XLabels[j] := Format(mask, [XValue[j], XValue[j] + incrSize]);
end; end;
{ Get cumulative frequencies and percents to midpoints } // Get cumulative frequencies and percents to midpoints
cumFreq[0] := freq[0]; cumFreq[0] := freq[0];
pcnt[0] := freq[0] / nCases; pcnt[0] := freq[0] / nCases;
cumPcnt[0] := cumFreq[0] / nCases; cumPcnt[0] := cumFreq[0] / nCases;
@ -252,143 +246,96 @@ begin
pcntileRank[k] := (cumFreq[k-1] + freq[k] * 0.5) / nCases; pcntileRank[k] := (cumFreq[k-1] + freq[k] * 0.5) / nCases;
end; end;
{ Print results to report } if NormPltChk.Checked then
lReport.Add(' FROM TO FREQ. PCNT CUM.FREQ. CUM.PCNT. %ILE RANK');
lReport.Add('');
for k := 0 to nInts - 1 do
lReport.Add('%8.2f%8.2f%8.0f%8.2f %8.2f %8.2f %8.2f', [
min + k*incrSize, // from
min + (k+1)*incrSize, // to
freq[k], // freq
pcnt[k], // pcnt
cumFreq[k], // cum.freq.
cumPcnt[k], // cum.pcnt.
pcntileRank[k] // %ile rank
]);
(*
{ Now, prepare plot values as indicated in options list }
if NormDist = false then
SetLength(GraphFrm.Ypoints,1,nints+1)
else
SetLength(GraphFrm.Ypoints,2,nints+1);
SetLength(GraphFrm.Xpoints,1,nints+1);
for k := 1 to nints+1 do
begin begin
GraphFrm.Ypoints[0,k-1] := freq[k-1]; // Get mean and standard deviation of xvalues, then height of
GraphFrm.Xpoints[0,k-1] := XValue[k-1]; // the normal curve for each normally distributed corresponding z score
end; *)
// Create ND plot if checked.
// BUT: Only 3D-vertical plots when normal curve is desired
if NormDist then
begin
lReport.Add('');
lReport.Add('Interval ND Freq.');
// Only use 3Dvertical plots when normal curve desired
PlotOptionsGroup.ItemIndex := 1;
// get mean and standard deviation of xvalues, then height of
// the normal curve for each Normally distributed corresponding z score
sumx := 0.0; sumx := 0.0;
sumx2 := 0.0; sumx2 := 0.0;
for k := 1 to nints do
begin
sumx := sumx + (XValue[k-1] * freq[k-1]);
sumx2 := sumx2 + ((XValue[k-1] * XValue[k-1]) * freq[k-1]);
end;
Mean := sumx / Ncases;
Variance := sumx2 - ((sumx * sumx) / Ncases);
Variance := Variance / (Ncases - 1);
StdDev := sqrt(Variance);
for k := 1 to nints+1 do
begin
X := XValue[k-1] - (incrsize / 2.0);
if StdDev > 0.0 then
zlow := (X - Mean) / StdDev
else
zlow := 0.0;
X := XValue[k-1] + (incrsize / 2.0);
if StdDev > 0.0 then
zhi := (X - Mean) / StdDev
else
zhi := 0.0;
// get cum. prop. for this z and translate to frequency for k := 1 to NoCases do
zproplow := probz(zlow); begin
zprophi := probz(zhi); if not ValidValue(k, col) then continue;
zfreq := NoCases * abs(zprophi - zproplow); value := StrToFloat(OS3MainFrm.DataGrid.Cells[col, k]);
(* !!!!!!!!!!!!!!!!!!! sumx := sumx + value;
GraphFrm.Ypoints[1,k-1] := zfreq; sumx2 := sumx2 + sqr(value);
lReport.Add(' %2d %6.2f', [k, GraphFrm.Ypoints[1,k-1]]);
*)
end; end;
Mean := sumx / nCases;
Variance := sumx2 - sqr(sumx) / nCases;
Variance := Variance / (nCases - 1);
StdDev := sqrt(Variance);
SetLength(normDistValue, nInts);
for k := 0 to nInts-1 do
begin
X := XValue[k];
if StdDev > 0.0 then
zLow := (X - Mean) / StdDev
else
zLow := 0.0;
X := XValue[k] + incrSize;
if StdDev > 0.0 then
zHi := (X - Mean) / StdDev
else
zHi := 0.0;
// Get cumulative proportion for this z and translate to frequency
zPropLow := NormalDist(zLow);
zPropHi := NormalDist(zHi);
zFreq := nCases * abs(zPropHi - zPropLow);
normDistValue[k] := zFreq;
end;
// Print results to report
lReport.Add(' FROM TO FREQ. PCNT CUM.FREQ. CUM.PCNT. %ILE RANK ND FREQ.');
lReport.Add('');
for k := 0 to nInts - 1 do
lReport.Add('%8.2f%8.2f%8.0f%8.2f %8.2f %8.2f %8.2f %8.2f', [
min + k*incrSize, // from
min + (k+1)*incrSize, // to
freq[k], // freq
pcnt[k], // pcnt
cumFreq[k], // cum.freq.
cumPcnt[k], // cum.pcnt.
pcntileRank[k], // %ile rank
normDistValue[k] // normal distribution value
]);
end
else
begin
// Print results to report
lReport.Add(' FROM TO FREQ. PCNT CUM.FREQ. CUM.PCNT. %ILE RANK');
lReport.Add('');
for k := 0 to nInts - 1 do
lReport.Add('%8.2f%8.2f%8.0f%8.2f %8.2f %8.2f %8.2f', [
min + k*incrSize, // from
min + (k+1)*incrSize, // to
freq[k], // freq
pcnt[k], // pcnt
cumFreq[k], // cum.freq.
cumPcnt[k], // cum.pcnt.
pcntileRank[k] // %ile rank
]);
end; end;
// Show report in form // Show report in form
FReportFrame.DisplayReport(lReport); FReportFrame.DisplayReport(lReport);
// Plot data // Plot data
PlotFreq(col, cellVal, xLabels, freq); chartFrame := CreateOrGetChartFrame(col, cellVal);
chartFrame.Clear;
if NormPltChk.Checked then
PlotNormalDist(chartFrame, normDistValue);
PlotFreq(chartFrame, col, cellVal, xLabels, freq);
end; end;
(*
plottype := PlotOptionsGroup.ItemIndex + 1;
if Histogram then
GraphFrm.barwideprop := 1.0
else
GraphFrm.barwideprop := 0.5;
if NormDist then
GraphFrm.nosets := 2
else
GraphFrm.nosets := 1;
GraphFrm.nbars := nints+1;
GraphFrm.Heading := cellval;
GraphFrm.XTitle := 'Lower Limit Values';
GraphFrm.YTitle := 'Frequency';
GraphFrm.AutoScaled := true;
GraphFrm.GraphType := plotType;
GraphFrm.BackColor := clCream;
GraphFrm.WallColor := clDkGray;
GraphFrm.FloorColor := clLtGray;
GraphFrm.ShowBackWall := true;
if plotType in [2, 6, 8, 10] then
begin
GraphFrm.ShowLeftWall := true;
GraphFrm.ShowRightWall := true;
GraphFrm.ShowBottomWall := true;
end;
GraphFrm.ShowModal;
GraphFrm.Xpoints := nil;
GraphFrm.Ypoints := nil;
end; // for novars list
*)
{
for j := PageControl.PageCount-1 downto 1 do
begin
found := false;
for i := 0 to SelList.Count-1 do
if GetPageCaption(SelList.Items[i]) = PageControl.Pages[j].Caption then
begin
found := true;
break;
end;
if not found then
PageControl.Pages[j].Free;
end;
}
finally finally
lReport.Free; lReport.Free;
(*
XValue := nil;
cumfreq := nil;
pcntilerank := nil;
cumpcnt := nil;
pcnt := nil;
freq := nil;
*)
end; end;
end; end;
function TFreqFrm.CreateChartFrame(AColIndex: Integer; AVarName: String): TChartFrame; function TFreqFrm.CreateOrGetChartFrame(AColIndex: Integer; AVarName: String): TChartFrame;
var var
sheetTitle: String; sheetTitle: String;
tabSheet: TTabSheet; tabSheet: TTabSheet;
@ -433,12 +380,22 @@ begin
ComputeBtn.Constraints.MinWidth := w; ComputeBtn.Constraints.MinWidth := w;
CloseBtn.Constraints.MinWidth := w; CloseBtn.Constraints.MinWidth := w;
(* Panel1.Constraints.MinHeight := AllBtn.Top + AllBtn.Height;
Panel1.Constraints.MinHeight := BarTypeGroup.Top + BarTypeGroup.Height - Panel1.Top; Panel1.Constraints.MinWidth := Max(Label1.Width, Label2.Width) + AllBtn.Width + VarList.BorderSpacing.Right*2;
Panel1.Constraints.MinWidth := Label2.Width * 2 + AllBtn.Width + 2 * VarList.BorderSpacing.Right; ParamsPanel.Constraints.MinHeight := Panel1.Constraints.MinHeight +
Constraints.MinWidth := Width; NormPltChk.BorderSpacing.Top + NormPltChk.Height +
Constraints.MinHeight := Height; BinSelectionGroup.BorderSpacing.Top + BinSelectionGroup.Height +
*) PlotOptionsGroup.BorderSpacing.Top + PlotOptionsGroup.Height +
Bevel1.Height +
CloseBtn.BorderSpacing.Top + CloseBtn.Height;
ParamsPanel.Constraints.MinWidth := Max(
3*w + 2 * CloseBtn.BorderSpacing.Left,
Panel1.Constraints.MinWidth) + ParamsPanel.BorderSpacing.left*2;
Constraints.MinWidth := ParamsPanel.Constraints.MinWidth + 300;
Constraints.MinHeight := ParamsPanel.Constraints.MinHeight + ParamsPanel.BorderSpacing.Top*2;
if Width < Constraints.MinWidth then Width := 1; // trigger autoscaling
if Height < Constraints.MinHeight then Height := 1;
Position := poMainFormCenter; Position := poMainFormCenter;
FAutoSized := true; FAutoSized := true;
@ -515,38 +472,117 @@ begin
UpdateBtnStates; UpdateBtnStates;
end; end;
procedure TFreqFrm.PlotFreq(AChartFrame: TChartFrame; AColIndex: Integer;
procedure TFreqFrm.PlotFreq(AColIndex: Integer; AVarName: String; AVarName: String; const xLabels: StrDyneVec; const Freq: DblDyneVec);
const xLabels: StrDyneVec; const Freq: DblDyneVec);
var var
ser: TBarSeries; ser: TChartSeries;
chartFrame: TChartFrame; isRotated: Boolean;
margin: Integer;
source: TListChartSource;
i: Integer;
begin begin
chartFrame := CreateChartFrame(AColIndex, AVarName); isRotated := false;
chartFrame.Clear;
ser := chartFrame.PlotXY(ptVertBars, nil, Freq, xLabels, nil, '', clDefault) as TBarSeries; // *** BAR series ***
ser.BarBrush.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)]; if VertBarsBtn.Down or HorBarsBtn.Down then
if BarTypeGroup.ItemIndex = 1 then
begin begin
ser.BarWidthPercent := 100; ser := AChartFrame.PlotXY(ptBars, nil, Freq, xLabels, nil, 'Data', clDefault);
ser.BarPen.Color := ser.BarBrush.Color; with (ser as TBarSeries) do
begin
BarBrush.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
DepthBrightnessDelta := -30;
end;
if HorBarsBtn.Down then
isRotated := true;
margin := 0;
end
else
// *** LINE series ***
if LinePlotBtn.Down then
begin
ser := AChartFrame.PlotXY(ptLines, nil, Freq, xLabels, nil, 'Data', clDefault);
with TLineSeries(ser) do
begin
LinePen.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
DepthBrightnessDelta := -30;
end;
margin := 4;
end
else
// *** AREA series ***
if AreaPlotBtn.Down then
begin
ser := AChartFrame.PlotXY(ptArea, nil, Freq, xLabels, nil, 'Data', clDefault);
with TAreaSeries(ser) do
begin
AreaBrush.Color := DATA_COLORS[(AColIndex-1) mod Length(DATA_COLORS)];
AreaLinesPen.Color := AreaBrush.Color;
AreaContourPen.Color := clBlack; //AreaBrush.Color;
DepthBrightnessDelta := -30;
end;
margin := 0;
end; end;
chartFrame.Chart.Margins.Bottom := 0; ser.Legend.Order := 0;
chartFrame.Chart.BottomAxis.Marks.Source := ser.Source; if ThreeDChk.Checked then
chartFrame.Chart.BottomAxis.Marks.Style := smsLabel; ser.Depth := 20;
chartFrame.Chart.BottomAxis.Marks.Alignment := taCenter;
chartFrame.SetTitle('Frequency distribution'); source := TListChartSource.Create(AChartFrame);
chartFrame.SetXTitle(AVarName + ' categories'); for i := 0 to ser.Source.Count-1 do
chartFrame.SetYTitle('Frequency'); source.Add(ser.Source[i]^.X, ser.Source[i]^.X, ser.Source[i]^.Text);
chartFrame.Chart.Legend.Visible := false;
AChartFrame.SetTitle('Frequency distribution');
AChartFrame.Chart.Legend.Visible := NormPltChk.Checked;
if isRotated then
begin
ser.AxisIndexX := 0;
ser.AxisIndexY := 1;
AChartFrame.SetXTitle('Frequency');
AChartFrame.SetYTitle(AVarName + ' categories');
AChartFrame.Chart.Margins.Bottom := 4;
AChartFrame.Chart.BottomAxis.Marks.Source := nil;
AChartFrame.Chart.BottomAxis.Marks.Style := smsValue;
AChartFrame.Chart.BottomAxis.Marks.Alignment := taCenter;
AChartFrame.Chart.Margins.Left := margin;
AChartFrame.Chart.LeftAxis.Marks.Source := source;
AChartFrame.Chart.LeftAxis.Marks.Style := smsLabel;
AChartFrame.Chart.LeftAxis.Marks.Alignment := taCenter;
end else
begin
ser.AxisIndexX := 1;
ser.AxisIndexY := 0;
AChartFrame.SetXTitle(AVarName + ' categories');
AChartFrame.SetYTitle('Frequency');
AChartFrame.Chart.Margins.Bottom := margin;
AChartFrame.Chart.BottomAxis.Marks.Source := source;
AChartFrame.Chart.BottomAxis.Marks.Style := smsLabel;
AChartFrame.Chart.BottomAxis.Marks.Alignment := taCenter;
AChartFrame.Chart.Margins.Left := 4;
AChartFrame.Chart.LeftAxis.Marks.Source := nil;
AChartFrame.Chart.LeftAxis.Marks.Style := smsValue;
AChartFrame.Chart.LeftAxis.Marks.Alignment := taCenter;
end;
end; end;
procedure TFreqFrm.PlotOptionsGroupSelectionChanged(Sender: TObject); procedure TFreqFrm.PlotNormalDist(AChartFrame: TChartFrame; Freq: DblDyneVec);
var
ser: TLineSeries;
begin begin
BarTypeGroup.Enabled := PlotOptionsGroup.ItemIndex in [0, 1, 8, 9]; // Bar series only ser := AChartFrame.PlotXY(ptLines, nil, Freq, nil, nil, 'Normal Dist.', clBlack) as TLineSeries;
if HorBarsBtn.Down then
begin
ser.AxisIndexX := 0;
ser.AxisIndexY := 1;
end;
if ThreeDChk.Checked then
begin
ser.LinePen.Color := clGray;
ser.LinePen.Width := 1;
ser.Depth := 20;
end else
ser.LinePen.Width := 2;
end; end;
@ -558,8 +594,6 @@ begin
SelList.Clear; SelList.Clear;
for i := 1 to NoVariables do for i := 1 to NoVariables do
VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]); VarList.Items.Add(OS3MainFrm.DataGrid.Cells[i,0]);
BarTypeGroup.ItemIndex := 0;
PlotOptionsGroup.ItemIndex := 0;
NormPltChk.Checked := false; NormPltChk.Checked := false;
ClearTabs; ClearTabs;
@ -599,8 +633,6 @@ begin
AllBtn.Enabled := VarList.Items.Count > 0; AllBtn.Enabled := VarList.Items.Count > 0;
BarTypeGroup.Enabled := PlotOptionsGroup.ItemIndex in [0, 1, 8, 9]; // Bar series only
FReportFrame.UpdateBtnStates; FReportFrame.UpdateBtnStates;
for i := 1 to PageControl.PageCount-1 do for i := 1 to PageControl.PageCount-1 do
begin begin

View File

@ -9,333 +9,449 @@ object MainDataModule: TMainDataModule
Left = 48 Left = 48
Top = 40 Top = 40
Bitmap = { Bitmap = {
4C7A080000001000000010000000C20700000000000078DAED987B5054F715C7 4C7A0C0000001000000010000000030A00000000000078DAED98795C54D715C7
7F8D3149D324CD1F0E5A282663ACCE24CD946A1F33E96813A3AC4A8C28105C59 6F6B4C4D9A2E7FF8410BC1F4638C7E3E26B6469BB6696A1A1041252A6B701441
417C624587B684BF34DD48CBBA0BB210E4B52CE02B18D24899C4568DDA6AD1A8 5C102B24B425540D985112761908B20DC3A25014A304173685AA4501111444A8
0802220476AFBAEE00092B0F798BAF93737ED7BB591CEE72EFC6BF4CEECC77EE CC8C3A52C130ECAB5BE2E9B96F7C3883F386F7066CAAE67E3EBFCF7B73DFFDDE
DD7B7F9FF3F8DDDF39F70700C0E07B2C665E8C7A9BB11D6F3196B600F06CE3BF 73CE7DF79CFB0000083CC3229265A8A584EC7C9F90C845805739F39BE9E7231C
F97D25C2B1690B1933BC09FB5A9A8119E7A18D10C6D2178DA1FB3E682CB2058E 1BB9989090F99079A31148D8029CC39690A82523E8810D3A16D964550D9093A9
5A60278A80FD732BB094378019E602DB2E27F461D250ACE5CC341F52AE9C0576 40BE0C04126C0124C40A482897D046B80DF53597842F84E0AB1540CEC8809C96
DA0AEC9405D65C3D03B18EB3107BAD525ECEF3B0B6AD0E882525DA8E03AB46FE C2BA6BE5E0A1AA008FEB95DC6A3A07EB5B6A81B2547EF21220D5C89F936AAE17
BC453CD71403ABDD25AFBADDC01AF6238BF3C5D84C8A75ED979F016BC26747FE D280D4A473AB763790FABDC8E27A113297FABAFEDF47805CC667459FA2FFD447
86F1538CC138171A7911FBBEE6049F3F6E2318C26DE5C869449BCAF492FB1DD0 6B5C0B1B6E5176BBCD4966FD9839ACC1499E8B9C8D664E7E7A75E81DD0DF91B6
EFB41060FF985FA7FCDD2D660F1C64733A5371C0F7BC7E1E8DFA5758E73BDEB2 403E5F58CBFFDD2D23C31A9D730611D0E019CF9FA723FF79E6F9CEF7A50F6A04
DCEF114CEA11AA7C616FE03D02EB5DF4CD6DFE8BD732D5B45CBD532FA09E40BD 616B84205B581B981A81F9AEB1CDCCF91593CB34A7B9F29DD6025A13686DC01A
017B04EF15920DAC5FAA65AA69AF358F3D817A03F508EA15BC67F0FA5F20D632 C1D40A760ECC5F9ACB34A70DE63CD6045A1B688DA0B582A9194CFE2FD2E432CD
D5B4B79AA79EE0D12378CF207EEBDC326EC35BAD532FA09E40BD017B04EF1594 6943394F6B82568D606A06E503AD7298390CE53AAD05B426D0DA803582A91534
93586F2F28AE77EC0DBC4760AFE0BF55F569D4BBAFE7F01EE1C9AA3B7E763F96 264DBEBDC23BDFB1363035026B05F35B509D467DFC5E3C5323B45961ED170F7C
47B6FE471CB42E4D1A5093AFFB30CC018BA39E8BAE55F1B8E6D3EDE771BD1472 796AF35FA7D17D196E0342E21D6A21962055D531A2F78278DCF3518A73B85F52
F1EBED7CBD8CCDA72D846D4225B093B866FF5B200AAF93E91E3E1B93FFBBA69A 1831F7A1CC7E19998F5C0C3B9495404EE19EFD67B246781F44FBF0D988FC6736
19717D95E15AAD281255A6077E0F9F29887F9AF83D9B037F7256013BB7DB73AD D5240CF7570EEED5D2548D72C4C0F4E1331EFE4FD79C6796F0E7A62A2067776B
4F533C7F98AFF61AD6E8F93DA26FB5F38FFD24C47112EB76B758833EF0B3AF62 EFF5E9BCD70FE3155DC71C3DB747635BE8FA633DB1559DC2BCDDADC94123F877
8D5FF4950F86A0AB87B0B7EC91BEE92AD74F30BCE4F81458B3AFBC06FC1C9F00 AF618E5F3496B786D9D70AB0B6EC61CF7481FBC71A5E551D06D2682C6F0326AA
137CE49179CA5902CCE1236FC49EF8D57E51C605EA797DF031665A085C74AD96 03409446F2C84C68CA02A232920FC39A7873AF46618B84F362EB6212BE1818D1
676C8A47EF9CA29AE77B4BCDB7FB4CB5BC2918F25C6DB05EB834A287A859FF29 7BA13C2153B56AE754C13CF36D69F3F03B53281F6E0D89EA16D8A0BCA4534384
2D36604771FD99827DE293AE61EFF9DF2E9FF9F58E6AAC7FDFFD2FBB8CDFDB33 ECFFE01B7220C771FF855B1BC5FB5FC7DA7322DD687E83AA1AF3DF78FBCBAFE0
7B7CAEBF0502D66FA5EFFC6BF6A3C02EECF5B97E5FB61FC47D818FEB1FBFF701 795BBEC7E8FC5BA4C4FCAD349EFF83E23890F31946E7EF4CC551FC2E3072FFE3
CD587F97768BDF7EA5FC8E45A7F97EE1C87BC0EAB1FFD71789D714033E1BBBFF 796FD688F97769B7E6ECE7CBEF5C7286F95E28DA06A40EEB7F5DAAE69EFA80CF
874058533984B94E61EFB172D135DDA3670AE2E7FB0C761C7D5E2E1675FC3DF7 46AEFFB6E07839171CD5A7B1F6C818D17BDA479FF1F09FF9CE202568F34A9A46
DF250AF3471BB837AAD8268AAEEFEF1B54D4EF4C968A7B95D410F0DC73A8FA7E 25DB86FE2EE1193FCE81DF46A53B34A2F70FBE1B04E4EF5C1281DF2A11B6A0FD
7F5BFFB2DFEF7D6B7F035A6D9F6A1147F61E06DFD1D5A55A3FF00F8FF7550F9B CD21E8FC7E98FF9CE777E6FADF8048D4275894A3F38D05DFDED92958DFF363C7
FFCFF1CF65A59497B3F308F311DF65FE3C0F7BEEC63E7BF606184D42EEC6217B 1BABB1E6F34B8E718A2FCF35CF53CC3B8F66FDB49B2261539F226E23E8933261
56DCEBDEFE38A27172C7509B00972D0903426EDC9CB1F841FB2918683CEA16FD D32D45ACD77B86FE38A2E3B8DAAD16255C91FA0E2813BC2C47E20715A761A0E1
E6F7F16F6721377ED017FFD24163D4FAF78CE1413E3B3BFB99828282FEFCFC7C F890E86FA61FFF765626780F1A639F6D748C50FBDA3E0CE7E3E2E25E4A4E4EEE
50EA9FC622D7AFD7EB9FB1582C6F979696F6B4B5B529E6692CF23D8989898B0A 4F4A4A02BEF6E958E4FAC562F14B52A974697676764F4B4B0B6F9E8E45BEC7CF
0B0B8B2B2A2AEE391C0EB05AAD70E0C001AFA23134B6ACACECDEA64D9B8A9177 CF6F494A4A4A5A6969E97D954A0532990C0E1E3C6850740C1D9B939373DFC7C7
D96C36A8AAAA82F2F2726EDB9B680C8DADABAB83F8F87817E542C23CF8392727 270D79B55C2E87AAAA2AC8CDCD65E636243A868EADADAD056F6F6F358D850AE3
07CC6633188D46484E4E862D5BB640525212242424C0860D1B60DDBA75101717 60AEF1F1F1209148202C2C0C82828220202000FCFDFDC1D7D717366EDC089E9E
C7CF2462C8AE7496E4743A411004686C6C84DADA5AEE531271D259E20A2CF963 9EE0E5E5C55CA92843E765AFAC9A9A9A40A95442434303D4D4D4303659518EBD
FA95B4397EA39BA77889BF9CBF19941E3456E2B3B2B2A0B5B5D5679E624E4D4D B25CB2346944BBAC3EF4DE34C4537F297F25E943E0DBE858968F8D8D85E6E666
55CD4BB948EB90EEA991C43DB132FFD5A7575B3F1FA7CD2861511F3CA7F61F22 A379EA73444484609E8D85DD87B44F8858EEF9D549B35E5C2B3B364E149D4556
4F213BA3A4132627FF1F1E5F9651C942CDCFABE1C76933F707269F8419255D68 7EF153A1FF109980EC9CAC0E9812F42F786E797425B193FC5C083F4E14B3D73C
A3C26D634292F1D98989A93F19D340C4F69F3EAECDF82210FD4B36C6EB326B03 E814CCC9EAC4394A87E698E81FF693497E113F1E7102E7D09F3D278A2E3347FB
D20BAB034DF9E98A82407F928DA0BD5F43A0796FEBAC334DF0B2E5A31AA6D73F EC1CE35D636ACCA252AACDC393A2783981F6D83966677C0DE6928CE679E59761
A6D4C6785D4675A0795FEB9C737688AC69818059F577FC430F37BC6AB66E9FA0 A674DF052216FF90EF1CE35DA3ABCD2599CD966715E072E10698CDABFBC6D4AE
37FA7BC329DFC9E6A2EAB99576D0D5B5C2D4793698FE861D763A7A20D7711DA2 B07E9644163A511C666A08A7F14E91A4565B552AC0B5B619A62D90C30C0B05EC
CA8F397F9551943975D3074F8EC6D35CBD9866490F2A28AD099C5D7FE7956001 52F54082AA0D56E61637FD3A3A35669ACF173FD2C7D3B5FA65A4346A7672F605
AC2D7DF059D74D387263183EE918044353EBDDDFE67D583DD99039D3CB7FB47F F377EBBE79DD5A09B21B7D70A4F3361475DF8103ED831072B9F9DBB712FF513D
F442F8B106620F750FC385C17BFCBCABBD1F4CCE6EF88BAD1D66951DFB6A8AB9 252466AE81FF68FFE015A7E27ACA1674DD81F383F7996B7A6B3F843775C15FE5
F86080216BD45EFEBBECBDA5E48FFC927F6253917D5770414C632BCCAF71C0AF AD302FA7F8E65449DA51B39058BDB5FCB77119D9D41EB54BED533602D98F956A
CFD860D28EC2C3A3F1419945468BB313F6B90620AFAD170CD7BAE0AF76174437 706F6886851754F066B91C26EF4C29D4C7CF8E490D93367540A67A00125B7A21
88EC8C7302041CFCE2D6C494ECB5A3F1FE7AF38CF527AA7B29DEAD573A20BEF9 E47A27FC4DA106B77A0D3BE7AC12CC8E96DD9D141CB75E1F6F2A96CCD970B2BA
6BD05E6A8179171C1074D60E01271B60624651258BF878DCA85380EFFC0FC507 97FA1B78B51DBC1BBF06D1A51BB0E0BC0A665728C0EC543D4C8A4EAD24CEFBC7
2E2560AEAB1ADB60C94527FCB1EA0AFC92623ED1007E3925C284949DD3BCBDCF E95D027CE7EFA41DBCE48BB1AE696801FB8B4DF0A7AAABF006F5F9643D98C467
E9666B4E6895001A8CF7F79502FCE27413F81DA9BAE797B1AB6ED2B6F457C65A 292706EF9A6EE87DCE90C8E2EDAA946083FEFEAE5209AF9DB90C264555F74DA2
4EFEFAB409532D1FDBC867C0BFCFDDF5CBFBA87992297FE7CFFF9CFE63A5B5E5 D36B27EF887A7DA4ED642A8E9C384DBA5F4E6D9AE59DFDD624715FE3E4F0A45D
6FC8D34E4CB37EEA67C88AF3D7EB9F961B17BB6635AC5CB34AD4EA588859B512 2FFF25EA05BEB9651A92289A14293B6C1212EB652A16BFC835CE63DD5A58BD6E
56C4C6806E6534E862564054B40E96AFD08137FED6AD5B5CC3C3C370F3E64D18 8D466B3DC07DCD6A58E5E10EAEABDDC0D57D15AC74738515AB5CC1107FF7EE5D
1C1C84BEBE3EB871E3067476768256B75C9627BFB76FDFE6926C10DFDFDFEFE6 4677EEDC81DBB76FC3E0E020F4F5F54177773774747480C87505274FEDDEBB77
23A3B4AA79F2DFD3D3035DB8DF8DD046CAE64239CBF997F8F0C808D95C629097 8F113B07E5FBFBFB8778979522C13CB5DFD3D3039DF8BDEB2C72E18C85C6CC65
F2273D983FF14BDF0997CD251AE79B7C4A73373434C47DF7F6F6BA9925E16123 9FE59D5C9C396371479E8D9F6A78FC9477F8C0893316375C6F6A935DBB5BB76E
72F1E4E95D1123696060C09D7B777737E743C3978EC865048FEF991812F99558 31B67B7B7B87187B27479D58B479FAAE28C36A60606028F6AEAE2E86B77372D0
29F68E8E0E581CB664442E9EBC2E269AC72A49F24B63C9F7F5EBD7DDBC948B27 894587C7F74C192A6A976559DFDBDBDB6199A3BD4E2CDABCABBB1BE32B2BD62E
1F85EF859E91889362965897CB058B972E19918B27BF1CDFA9349E44F11227B1 1D4B6DB7B5B50DF16C2CDAFC4A7C2FF41915E5589F5956AD56C332077B9D58B4
EDEDEDDCBF672E23785C0FCBF09D462ED7F2B90DC3F9591A11C6FD84E2581A4F F915F84ED9F154D45FCAB16C6B6B2B635F3B161D1EF7C3727CA72E2B44CCDA3A
67CF5CE4D6A2D25CE478A5B9C8F20A7391C67F03DAE7A495 E2FA38383B3276EC702C1D4FAFDAB170ED45BEB170F17C63E1E479C642BE83E6
2F73036D19C397A88E311A4B9EAF5F86783E7E3D49BCBE3511CAF3E9FB9EE75E
6B3E7DFF0F6DB85F8634D2BE34A4C7C98FC6FFC7B97E42EB1A9F781F07FFBF5C
AFD1BC3F7DBEF1DD3F5C6B3316FC68FC1F4D93456C862791B7B0287FC7DAFACC
1BC6F056566536F3E797B7595854CCA57CDDC9DCAF68BFF6D5CAEADCD48B270E
E53EDA5F6663BBB8ECB69555C51FE96F7DF6716E17D46DD4092BABD3531EF697
2DC4BE56EA3B57FCF8DC1DD56461717A06DAF0A47ECE9F5FF191A565993DDEDF
44FB6F72AD1F8E5BFE60CC2CB6CFD2B27C0EF635A03A70BEDF73AD3FCE2F1ACE
B2EDEDB7CB5EC0E76686DE1FB2FBD0FEAF8C79FFFAD69FEFF549DDBF63C98F46
DFC5F742BEBFC3CBF95B967EA9F7D9D6A56B0A031D6AF2B62C597542FCDE04ED
67FBC5CECFE77D6217501860D79FB775E923BE176C5EF2564180FDA03CDD0FCA
22DD070B03ED078AC48E29F95B96CDCCDB66BFA0689B43CBD9288F41F5A1CF60
385F24B63729DC66DF7635733374174430521FFA1C2E493FBA777CBB636FC98E
0F7AAFEF0B187AA6CD57797A8E3F16E870FE62A2CF3DF6B98EF2C3A10BA5DDA7
CDA35F99153B3D06BB878D31246D9EDE771C0D65FAFF73341852F6FA4274A637
941EDC0AED7AE6AC3FB41D426357E8F205E1907FE0EFF069FA7A483D150DFBAB
7743F4E100FCBD0EB2B3FD40712488E1E2B37C607B8697CEF99319E400C1191B
20E6F02790D798AB73CE15288EE07C1208CADC083B507BCA12A0F86AE123E7DF
FEF37B0C9F99D78E41F1B5A2C776FE3EABE7FF7F0194742A66
} }
BitmapAdv = { BitmapAdv = {
4C69020000004C7A080000001800000018000000760E00000000000078DAED9B 4C69020000004C7A0C0000001800000018000000561300000000000078DAED9B
7B5454D715C60F6A2C69A882511E0690B7DAD4C6684DADAE658C9A9826514104 0B5C8C69FBC76F87DDB5BB96B2E960E510B5ECD161EDBBCBE7B5540E593AD0A4
1410D1F80C6AD59A56139282828ABC41C01964C047951045F3109028C417F840 922467E1BF2C5684A2289D4B65264DA17F122AD2413A089D54D2693495166151
91D7C84B8A220882082A6810FDBACFC0A5034C741CAEFF7471D7FAD6CC70E7FE 2A87D212D77B5F53D33BA651D3F4B4FFF7DDFF3C9FCFEF33CF3C87EF753FD77D
F699BDCF3DFBBB7706000CBDEA95864A4F4FEFAC9CF3FAE9157913E9B956B77D 3FF7F57B9E29002020975C322A3535F56D15642BA756154DA1EBBDDAED93416F
1AA8D3A6AB6DC056BF2F6121F6CDF44A9B89BB69B1BF4F8919F593B4493F6609 2D0AFD54C886196CE2B5A0917EEB47985D7A915FB583BEBEC069500E5A01F4FB
E8F540D1C8BADA46C49659A6456349C9398C4EFC1A83639761709C86DABD02BF 40C6C80AFDD4289B3B2A2510569467C1B8C85DA014BC0A944264D49135F091FF
8D74A9601683DE617AAF9AB135D30E5A1D0F7F64959500EB8BF178AB200923E4 A22AA231E87BA2F8E108F28BEEA9D149BE4DA373234033271CBE2D898331BC38
4918294FD64C85A918F2FD66300BBD4F28C687BA87363E31BDF22D58663449AA 18CB8B974DA58930F8EC5E201A8A73698CD90AA76D5F0FBB7E12486620154744
A468CD742E06ECDBCF39DF9619E8FC896DB2CB60A7825AD9E55D6097683F7FCC 81B2292B08C8C92DC837242AFDBF237B8C32C8258F6672ED30903CBA1F3FF383
8ED15C39B16087FFD1C6676C003319388379CFCA6417778015C8C0923C69FF7A 6457413090A8AD2D7C420610F581F388834126C93908A4840B24CE8EEEDF2CBB
CDF51DB177B9373273BD0F89DF87A4C7F45F9BCEA2E697B2BC28B01837D0BECF CE50F661AB2764A4E26CCAEF4DA548943F9E4502165790A20020419640F76DA1
29FE3A0DB5968E7767BFE937AC636E32A6A388B1CDFE228B747C4AAF4DF9CCEA F137C9A88DF47C2BF241DFE16D639390FE8218CE0B7288BFC91BFA7D188EAC6E
817448FD3ACD7FFE39CC07CD651FD84428F226FED6A73DB621A9BF18C0C99327 A83F55DFB7C63F5EC7C841A664A6969F206FCC2FBD5B63AB52BDCF0470DAB469
BF54F5AEF1BDEA55AFD4F63F9A494BE199B8777A96FFD17CD3567826EE9DB887 3D2AF91C2F975C7249ED7F64532F816742EFD491FF917DE927F04CE89DD04331
127F1BC83D13F74EDC43B5F792B6CD72D0D4DF46B9B470CFA2B1DF21AFC43D13 BF0C44CF84DE093D546B2D6959460DD2F92860D14BF42C32FB1DEA95D033A177
F74EDC432962089FC3426F26F72ADCB368EA77B857E29E897B27EEA1C84B35B1 420F258821BC0E0D457DF42AE85964F53BE895D033A177420F45BD5403F91F1D
BF4DE5B932547808EE55B867D1D4EF74F14CDC4BE91EDCD84CDE6AAA82CFBD0A CC95AAC043A05741CF22ABDF11F34CE8A5144ED936526FA523E0A35741CFD21D
F72C3DF13CCADE897B29EEA90C74C6528C592C7661ABC2B3F4C4F370CFC4BD13 CF23EA9DD04BA1A752E93F91C63020C14B9B059EA53B9E073D137A27F450E8A5
F750DC4B714FC53D82763F6B8AB1A2075E679DC22B71CFC4BD13F750DCE7702F D053A147E8D75793C658D30DAFB349E095D033A177420F853E07BD488B5F78AF
D2E6175E69F7223DF13AA62CCA112CD0B18C19FECEAEDDFB688938FF0790678A D58B74C7EB0C23012640DC4D2A89EA2746ADDEA71783E37F00F54C01340F9674
A23CB8D1F3C122B359BB57326CCF49DF5EFFD3AB97ADCEDDA39F0E9B3B66E388 5D89613669F54AAAAD39E923F73F72F5B4DEAE1E7DFB13D309B663426C9E90CD
388F46B67E6AACAA1ED203BE16737A7BC3A8C37EB57F2FCAC2D4E3B226B6F2BD 3AC1926A4837F8BDC8C2F1DBBE8E72A9FE959F0B3A49DC06B26EFA21F11832F2
9D5D6368C8D7621F5B2F323EE4DB30EBD231E81DDF8349E77FC0F854EA53EBDE 7B919F35AD879E76AA37C83B0F8A4947616A760CFC9048EBD4A6E96FD5A92EF3
EBD4A75E98AFDD4F97B98C8BD44DF4793CE5722AD8315ADB5369FD4D95E20F99 FBF555208B26F92B443ABED2BE9608E43C9DDB13E9FC9BC881AF32A3412B2504
4760931607F6F93419D37DD55023BEE5EBEFB348E7C76689DE189CB80923320F C8165D2E51F8505526FEA84F67107FF35723221D4029720F8CC93C0524291094
821D8FC6E0937B3122351266F4372659D8CCDEB75ECBD7490DC66F4DBDD983D6 D28EC198447F1841B711F6D24632437323CE9332B45F93D6661B3AFF6EF93C78
DFCF87C72EC7CCFCE3602724187E2E01338F85804D34D949FB5731BD57C7F335 35E81727014966C3E75911A07FDE0BC814F54374FF7AA2F8E10F38E7C890FFF7
4783FCF76F5FB74D6DE256604601F1D325B0B9908019A9A1747DACEBDC7E8F85 5BE7ED615A216B605E09E5A7B241EB6A04CC4BF4A6CFC70AE6ADEF58F03D4EAF
DFC7D1EAC1FCD1B526FEC7F29FC04E4AA88727E0E3630ABEAD48F353D792F8D3 6E8C1F054DCAFF997701481A9BD6F008F8F9BC806FC8D0F8541845F9B378B48F
E554E3D31258667D83E9C78245E59BC72DC754790AD81909CC2FC5636A4AA0A8 2FB36154EE099875DE9351FEC890D5A0C34B0072850D23F3C24127C19D51FE70
FC61C47FB730192C438261D9F17837254054BE0979B4894547C923496072E500 CAFFA9341E48061B86E787C34F096E8CF2D5A9479BC28FA51E890DEAD78FC394
26A6F8F3FB1FA2F1DF885D8A3F17FD007641823772F7E3CF297EA2F28D883FB6 04577CFFC118FFB3E095F00F7E0C90AB6CF8AC300CFE91E0C2285F8DF227969D
F87BF24F1218E5FD1B6393B789CA37885D82B74A8E903793C0207F1FDE4ADE22 A5FE890D6A45FF0B13E39D19E5AB04AF806FCBA3A93763834A71287C1BBF8F51
2A7F48EC62BC5972983CA40443E47BF166B28FA8FCC1C41F519A08962BC1E0AB FEE0E0E5F0657914F5906C18CC3B065FC63B32CA57A2FC311591400AD9A07483
B4FE88CC1F447CAB325ADFF2251854B41756C99B44E50F8C5D84616509607209 CE3F0CF30751FEE84A3ABF15B36110FF188C8EDFC3287F60B0350CAF8C00C263
0616EFC6B0642F51F903886F5C1E0F7675270694EE8671F2BF44E5EBC42D82D1 C3C0B223303CDE9E51FE00CA1F7A2B1CC88D4330A0E2080C8DDFCD28BF7F8835
0DE2174BA153B61B46295F8BCAD796CE7FA09B130E96E50FEDEC60E826AE7BC4 A8DDA1FC320EF4AF3C026A09BB18E5F7E32C7EAE50E00B24D715FAE57B8242E4
CC077D22125F87BD67E1CDA659C5B1A996BBD934D2144B7F3650FBF722F1F93D A6263272D05C86F8FDC9740D07A23B3A84E88C3A4274A9B447B99281FDBE6088
4CEE15CC48E6ED8F4349AF8AC5FF4DB05D81B16C054C6296C158B61C0322E6B5 8FEF30D12B8CA01AD9FA3984EA43A6F81F781A950CE5AE01F5A0553094BB1A06
DD7B17293F16719FC15D7E1E13CE256146763AA62585B4DD7B17A9BE36B19F11 F899B5BC7B67283F1A216BC18A970D93B3E2605E7E2AE8C679B5BC7B67A87FB5
F7045DC3496173EA5BCC48091375FDB789A5FE9E7342E1816CCE72BEB8FDD79A 82D7526E327D86E380D6A593302FC187D1F95F2B98D6F782648107D24A473EB3
F81FE5507F4FA5FE7E36011F258788DBDF89FF410EF5F7E3D4DF33BEC107C922 F55793F2E714D0FA9E48EB7B7A04CC89F762B6BE53FECC025ADF93687DCF3801
F777F2575372A9BFA7517F3F178F29C922F7779A939372A9BFFF4CFDFD7C3C26 33E319AEEFD45F6917D2FA9E42EB7B563868C7335CDFE9989C5A48EBFB455ADF
2589DCDF65CB30218FFAFB29294C2E1EC0842471FBFB50D9528CCBFF11ECAC14 B3C3616A1CC3F59DBB0A2617D1FA7E8903EA39C761721CB3F57D0877254C2A3E
43B3F663DC5191FB3BF1C714507FCF90C2E8D27E8C392A727F972DC11FE5D4DF 07249D034372C360522CC3F59DF22794D0FA9EC101B5BC309810CB707DE7AE80
CF537FCFDE873F1E15B7BF0F962DC64839F5DF8BD47F73F661E45171FBEFEBC4 6F78B4BE67D3FA9E1F0ADFC4325BDF95B8CB612C8FD6DF1C5A7F0B42616C2CB3
B7B97A88D67F095ECFDD0B9BA39B45E5EBC93E8545E1B70AFFA397B7071647BD F5F753CAD7BA719ACEFF6CF8B4F01868C5EE6594AFC85D061AA52705FE47B1E8
C5EDBFC43729A2FE7E458201F97B607254DCFEAE23A3FE5B4CFD3797FAAF9CFA 2868C43A305B7F295F9D4FEBFB75360C283E0AEAB1CCD6F7FE5C5A7FCB68FD2D
EF8F22F4DFA103C6B2157F49674BDF39F35AB41BF48BF783E549F1DAD538E87F A4F59747EBEF3906EAEF900113C99A1F53C9CAEFAF7C1C6809CA6561408A38F0
FF05D8AAF1F98AFDE34C1669747D64F8BBB7D93687B3EC72782B2B89256F42D7 F18D10503EBB1DC8FA1F8A05FB27A95BCBF47CA4FAC978E2CC4A27D77C9B4979
A672699B8A656045A45D4B8AD9E8A17334BCBEE3DFABCE649B666532EE1D8A76 30F526F4D994C769511917089FEAF08A32326E88B18CCF77F8BBAA3ED9639049
510C095821C5C98F043BE051CDFE60B098DE3744A3EB53E5EF5577BA96B23C8A D03BF00FD3186C20A5344EB13F90E3360FC8572ACBE97183657A3E15FD5DF590
514A310A7782C5137BFCB0F5B45F5FF80E53E3FB03C2F7AA3EB6992C734B2B93 450529A2312A688CD24340C229FB87E19BE97E65E16F9832BF1F10FEAEEA6898
BA97B68F5BBF47F707BA7EAF6AAA3B937C4F041B65B8B8DDAFF413697E0AB91A 4932F735138E55456BBB95BBF57E40FC77D5610AFAD4F7F891AF5597B7FA95BE
D0EE7B0675653F8BBF6FC99FC0356FDE7DD1243079DCFF177E5D7DBD68EAE5F7 0C8D4F61AE06B4FA9E41E2EC8EF8A12BBE039499D933C6246462DCBF0BBFA6B6
F27BF99DF92F43FF8FFCA413A96A4B53BEBAB17AF9BD7C7A747899FCAE31C49E 9631C9F972BE9CFF36BF27F477E4C725274A2D59F9D2C692F3E57CFAC9EA49BE
FFAAB692288FFB25112BF03C9546793C2C095F3EF945BFCCE5C7AAB33DAC2AC5 780CA6C7BFA4A53CC0E659B9DF1AE84C1501362FCA7D574FEBEA8FB978AE34CB
35E99AA6D2A8E5535E065FD31802FF7143159AE43FA95473E9D98E18CD378B28 8BFB157093F34B4345C06AED9EE0CB1A43C87F557F1F1A781724AAB122BD2D46
572B9B5F94FFB4A5192DB74BD15253D24D8F1B2A3B7D0E7ECCCBC84F4FF8CFCA E35D3ECDD5BAC6AEF2DFBC6C84978F2AE0E5C3F2767A557FEFADEBC0737A223F
8F20FE9EE7F1A552A9B74422812075F2A310EDE3EF11F8CA8C1D3B76780BFC98 DDE177941FA1F098CEF81C0EC781CD668350D2E44720BA0F8F11F24519070F1E
9898A2BCBC3C54555529A4697E84E3B3B3B3E1EFEF5FC8D99191917AD1D1D18F 7410F2838282F845454570FFFE7D8164CD8FF0FCFCFC7C7075752D45B6BFBFBF
6EDEBC291ABFA2A2025F7EF9E5A3B56BD70EA2DC38262626360AFBD2D2D2707E 62606060D3DDBB7719E3575555C18E1D3B9A366EDC3888E6C6243232F289705F
6F80620C2F227E0C3F56E06CDFBEBD71E9D2A50EB1B1B1FB3232329E0A7F8F8F 4A4A0A641F7313B4A12BC273F05C21E7C081034F56AE5CC90A0E0E0ECDC8C878
8F477E7E7EC7FBD4153F861F2BBC3E72E4C8D3D5AB57EFDBB56B576D7171B1E2 23DC1E1E1E0EC5C5C56DC7492B3C07CF157E8F8E8E7EB361C386D0C3870F5797
6F65656590C96450CE95BAAAACAC048D55C1E0AF793D57AD5A55AB5C73CA55A7 959509B65556560297CB05D15C49AB7BF7EE016DAB8081DFB13FD7AF5F5F2DDA
3940B541585818020303E1E7E7075F5F5F787B7BC3D3D3131B366CC0FAF5EBB1 E734576F8D01DA37E0E3E303EEEEEEE0E2E2024E4E4EE0E0E000767676B06DDB
66CD1A78787860D9B265A07C60F9F2E58A47419C238C41F97957DDB871433136 36D8BC7933FCF2CB2F60636303AB56AD029A0F58BD7AB5E05328E408DB20BA2E
FE59E5723972737371F9F2656465657512675EBA74A9E3B93A7C9EAFF2F27294 AE3B77EE08DA86D7CAE3F1A0B0B010AE5DBB06B9B9B96F09997979796DEBD2F0
9696A2B0B05091EB2B57AE74630B4CE5E7CFE3F3BC5EBF7E1DD7AE5D43515111 315FB76EDD828A8A0A282D2D15E4FAFAF5EBEDD842A6E87A677CCCEBEDDBB7E1
0A0A0A909393D331C6E7F1A3A2A23A38D152C90BE7BBAB56AFF4E8C48F8888E8 E6CD9BC0E7F3A1A4A4040A0A0ADADAD8193F2020A08D13C8617739DFE2DAB0CE
E05F93AC464F37CE50E6878787BF547E686868470D5F063F2828080101018A7C E62DBE9F9F5F1BFF267B037477418628DFD7D7B747F9DEDEDE6D7DD8137C0F0F
8BC557AE87F23A2D16FFD7FA00DF2786BA819D4326F59D1B72A88F535000B30D 0F70737313E49B29BE687F88CED34CF1DF5507701F136A0736F79ADAC7D4EB74
D615F5976BC4D659B6A7CE6C6B26F45627B46A3904953387202BB1F07DE7851E EF851E6EC4D05381D1BF5CA3ECFEAB8ED68CD89F098A1B229A7BB13C6E1196C7
E4EC31FBEB61139A8721FFF81E7D1C832AC48AD1C72930908F9BB3153142448E 68A6F07DCCBC4F217B42582D687917C1E0AD67A1B789471553317A2F7477C776
41F9D6720A2AE7CC5F8B61E8B5D54CDF2BF024F3F2EAA7510C62508CEBAA62BC 235B10C38BE11834DFBD167ADC42E6BB62A8DAEF1FA16CEF9E46ECEDFBCA1483
E21A586DE41B566116B9BFD9C83BD05EE3CFA1228675D00518F944DC1B73221B 32688CDB9262BC67E1FE40CDC9A76A847F58A39A83FB0299AF43420C4D8FABA0
93CFCA61B275C7851EE56A6EB0999663D07F780CABE00B30DE2A697C27ED0AFE E6E8F77442723E4C4BE781FAFE8357BB952B53CF11BD4C3C7EC718A33DAFC2D0
9A5D0E87BC0A98AE4CBCD3DF267D6E8F62D0E7E8EF1A708B8F7B7CFA157C72E5 FDEC27DFA75C07BDFC5BC02AAA8261EB221FBFAF956ADAAD18F43ADEB770FB03
3A9CF36F627AE475F479251F03479F6AB6F68B28B3DE167940FF2BFFBFBC289E DBFD43EA75987BFD369817DF8559FEB7A1F77BC53070DCA5464D17BF4A4D67FF
D772A86FF8CD093FE76056CE0DCC2FA8C427D115E8DB3F1F6F8C2AC696827A48 E3CA3B5D7FEC2A1EFB728893EFDDC9170BC0A0E00E2C2EB9077303ABA0CFFBC5
6FDDC3A6DC6BF870EFE1BAE1DB765C32DC18F07BB5F99B827FB6DE79A0E9A373 F0D9D765B0AFA416387F3C853D853761F6B1A89ACF9D0FE6A9DABA7D21357F8F
457023F6CC5DFF63075C6DC09E9A073858D78C23771EE250DD43041757627498 E745CD43C71BE664F1C192B2F50FFF9BED76A31E8E3E7C0EA76A1A21FAF10B38
ACC67CCB0E4FC6F0FCDFADD21C34FADADFCEC4372CD37C65E26D9E13D3B78B11 5DF3023CCBEEC1381FEEC391FB0EDA11029DFFDD2A1D836ABB5C8DD49D7C3247
52D480F8DA26FC78F7114E34B620B5A1058729C66E8A175AD18059878FDF37DF AE8B7C84391936BE0CBCF8F5105EDD00E7EA9A20F9C94B48AC7F095134C6111A
127EF10D2F3F63B57FF43AFCB88BDEDBA79BDBD8CD48BEFB0B321EB4E2ECFD56 CFBBAA1E0CA2929E8DDCE79BF399BDCB50A9FFE8F5F3A4458AE32F37B6B01B21
C5F303146F67D53DF8DDB88B2FAED5C225B3E0A96540F42D139F70D9D08D5B46 BEEE4FC878DE0CE9CF9A05EBC769BC43F79F82CB9D3AD87EB31A166596BC19E5
A813E3CD0049C5BEDB4DF8A1FE117EBEF718A7899D42EC6F285EF4ADFB08A8B8 16F887BAA32F7788EDBE31D2C4F8D28D5D15FAA801626A9BE0E2D3577099B213
0BCFB23AAC2AAE51E493D76C5CCAF9A7A62171B5869B83C39EC71FEE1755CA59 28FB048D17F8C73370ABAA03BBCA1A585FF650904FECB34909D96F86798554AB
9CCFC7FC1D3DEEA77812AAB13FB1BF22F66A622F9057C296D8EF5DFA0FC69C2F EEF5F4E98CFFB94B4005B2908F6D3E433FC3683C36ED6357CADE49D91B287B09
C5B083694F0D36857CF13CFE88ED91E7626ED42BC6CBF3115BFD0011958DD846 EF1E1852F6F4BCDF614276050C3F95F246658FD7F6CEF8630EF86705DDA915B4
39F95231EEEA0EF614628F25B6D59942E807C554EB7B6EB77C1EDFCA27CC7B5D 17F311FCE039F8DD7B02CE34273B04ED7ED0C6D6A6EC89943DFA4A29287B043D
46EE539E8B48CA7520D57273F91DFC93F2FD5951355CDB73325931EE12057BC8 50B63B30AA33FE68471F874D19856F3017FE34D7EEB42FF7DE7A0CBFD17CAFE5
8F9930DC1C7A5AADF9FAD5D671D3F67D57EB4FE3F529AF578C796D490D965CBD 3F008BD69C4C13B4BB5CC01E7C2E1354F77A5F966ABCEEDC3F4937F44CB52B6D
857974DEF1F36F525619469F2B810567A7E5417F6B648D81D7560BF5CEE784BE AFE3AD5A419B37963F841537FE00337ADFE1FD3735B712C665958306B2538A40
36DBA32AF9FC5857721B2B8ADAF2619F5B81E9B46E4CB8780DA3328B6176FA2A 79BFFF4315FBFD1AD2DDCF117DB40E04DCC3F1B1A9FC11ACE1B7E463416115CC
86A4E7C32034EE8EA15788DB8B9CD3E65BC2F6CC3999FD74A1BC0A4E79373183 A2F3C6E49C9BF07566198CB87C0306A716838A77C863557B2FCBAEDCD323F7F9
C6CC73FD0EE57A6446118C4F11FB442EF4836575063EA11B5E74CDE0751A1916 1C354ECB7FB394771F1616DD8579B4CD98EBEF69AEC766F061E825CA4E2E0465
57CDF3FCFEE5724CA431F37CF05C1B9E9463C891334F0CB64454197906CCD674 4F6E8D8AA3F7B6AECE19D84F637D421E609E675CBB0553689B311F986BD5341E
D933F60D4F197BECC293B1ED6336E5F9387286C61C5BA3EF1396A4FF856F8FFE 0C8EBEF25A659FDF7D353BB7F9B24E7B439D7C13269EBFFA7A626B9B87613EA2
6F64A857C060BEEE991E3905036942BDC196F02AC3CD61DF1879FA8D14CB0B18 AFD036073F5476F48953DEEED4ADFF1B1962EFA684F3DEB0E84BA0C289A855D9
78F94FD1F70DDD61F8D5F677DFF4F27AA1FF2F5CB8F8532C5CBCA843EE9FB669 E77B5F75AFCF09353B97B14C7901157B576D6527EF83AA3B0FFCF4A5BD7D97FE
C1A70BE1B6C81D6E0B1760BEFB02B8BABBC175C17CB8B8CD87B39B2B9CE7BB42 BF70E9F265B074B9759BAC96B568C9B2A560696D05964B97C062AB2560616509
3DFE22B4B4B4E0F1E3C71DE2AF7FF9E5173C7AF408CDCDCD78F0E001EEDDBB87 164B16C322CBC5606E6901E68B2D403ABE35BC7CF9125EBD7AD526FCFEE79F7F
868606D4D7D7E3CE9D3B98E7EA0275C7CF99ADADAD1D528EF1F0E143343535E1 42535313343636C2F3E7CFE1E9D3A7505F5F0FB5B5B5F0F8F16330B35804D2B6
FEFDFB686C6CC4DDBB7715FCB92ECE6AF395D9CA31043EFF0C5DF94ECE73D5E2 1F99CDCDCD6D128DF1E2C50B6868688067CF9EC193274FA0AEAE4EC0375D642E
BB537E38EFC993271D52E60B39EACA7798E7A4563D9EC5E739FA35FE9CB98E6A 355F942D1A43C8C76B10E72F3437958A6F45F383BCD7AF5FB749942FCC91389F
D5435D3EAFB132DFDEC941AD7AF0B9A84E7EBAF2673BCE51AB1E7C9E3FABBEBF 65B650AAFEE8888F397A17DFD8D444AAFE90968F7D2CCA5FB09025557FE05894
961F3B07FB6EF550C95FB450A3F9693B6776B77AA8E6BB3FF7FCE27CE5F3ABAE 263FE2FCF926C652F5078EF38EFAF75DF931622D68D71F12F9D64B651A9F86C6
AE0EB6F6B3BBD543159FAF019CC5998204B6F2D8BBF267D9DB75AB874A3EAD2F F3DBF58764BE55A7F717F245EFAF9A9A1A305C30BF5D7F48E2E31C802C640A25
9CC5257005B650D7AEB951C5E7F550C59F4F7CCEE13C8129E44460775D7B6A6B 648BB65D9C6FB0C0A85D7F48E4D3F90559282157C816F6AB786E24F1B13F24F1
6B316BB65DB77AA8E2F3759173384F903257602B8FBD8D6FDBAD1E2AF90BDC14 17533E729027640A7322648BCF3DD5D5D56030DFA85D7F48E2E3BC881CE40925
0CCE13C45FF3B171A962DFBE7DBB1B9FE74B15DF85D610FE3E2E65A6C01572A2 CA15B245DBDEC2376CD71F12F94B2C050CE40985DFB16D2849EC478F1EB5E363
CCAFA9A951F0BBD643259FD627CE50A5AE5C3E6ECE6EE3DB75AB87CACB6C5AFB BE24F117D139048F438932855C614E44F90F1F3E14F0C5FB43229FCE4FC89024
048EB204A620815D5D5DAD101F6FD77AA8E4D3BACAD73EBE3E3939CF539CE7FC 712EB61BD92D7CA376FD21F1319BCE7D428EA8844CA184EC070F1E0884ED15EF
5CB47774C06C9A7376342F78ED384F59B6A4AEF550A71FF4A41E6AF17B500FB5 0F897C3AAFE2DC87F3D3427333C17D8EF7E2021316CCA763CE888E0BEC3BE489
6E7BF4A01E6AF17B500F65CE7F01AA970E564C7A080000002000000020000000 CA904ABC3FA4A907DDE90FA9F8DDE80FA95E7B74A33FA4E277A33FC87FD1B235
FA1100000000000078DAED9C095454579AC76FC6A567FA4C26A6130A454D4C7A 70C94A49B2655B8D6182BFE3E88A672157FC41549EB1BB016330C1DF1DBAB63A
FA24DD718CA1D3D39D4E34715F92B820288AA26892D1563BCE9871A28214A8EC F95622880A63FC9DF85B022DFEB92B746DA4B87684AC0863828FEB87925D21AA
8B4B04AAD0A88991446D63DA256A5A0141446511447651F67D2D1645CC37DF77 30FC2DED3CB6AA8E293E6E133F0ECF95F3FF6FF9DB02974CB4E55A37E0BAA870
5FBDE25152A8C5AB474E4EBD73FEE7D6F7DEF3FDEEFDEEFADDF7100018586595 1BEE6382EF11B3AB1D03B7C9F972FEDF858F354DBCCE61ED438663C4C6763510
5556F5814C1CFD59C0F4E32CE47DBA612053F6E8C7B64E3CCA0EFB020B9A4EFC B7E13E69EA23D6E277D5E95FD9664AB2EC63AABEFF272C1DE5471A617DEDCC23
A795654F38CABEF1840DC5D9C0FC27125FA5187B0BB20F7BC2829C78F02ECE04 49EA5F698475156B75677C49E3531A619D96F3BBCFC7FB50BC064A23F4489DF9
E6FD26309FF1C07C27C8282C93FF14C0FA3DC1EB59ACEFAD9362D9514F58929F 30BC0FF15E9746B27A789C4F70CEEA4858D365E54B937F69FC8A9CFF9FD7BF7F
00EC7C387C569E0DEF97A7C1ECCA0C70A8BC219BE6546582535D3EF2A7906F9F C5F894F5FE9224644953DF6595B4FE41CEEF7E7D94A4AEF81F59F557F91FB6BD
440D6001D36AD8712F587AEB12B0382DB00B1A5484441AF944CF4FDC8F3E984C FD476CE7DF86F5143FD06DDBC4C3AEBF71E4FCBF866F6F0FBD757573347EFC31
7C1BD42016301546E69C865F5CC5F3899116D66E60295F0A7520B4AD6799FBF8 E3C39EE0CF999313C76215D4CE99935BAAA717F701F24F073A4796A49D195F94
18F6BD17B06B7B8125E13D57B582E8B7DC4A467E7A173ED5C128F67F6363D969 16B58C9F1AA35472E9AC01EF5294E18DA4C84F711BEF52CC0469F7CFD1CBA9F7
35B08C7DC0D2760BA2DF995FC8AB2C64E77D8DF53F4DE4F7E73E60CC9EE7E12C F07801C6C6853533666469229FEBB5839B9B1BF3119E1B1111D1A7F0F2394514
FA211BB93958179BA9ED633DF94D914FBCED23DB7352BCBEFE85BE27CD4334E6 AEE336DC27CD7E0FFB84D1B3675FAD9A35EBEA8B9F7FCE8DC55C75961F3C861E
A1284AB89FB1A9A80932EB6DD42B7ADFB307F3F0762C4BF00116F82EF15FD2FB 9B40AFBB6EEEDCDCBDEF3A6ED6AC8C413A3A99E93A3A19B3BBD2BF3A3AD95A2C
494ED9E8D9FD1F1883843CFC9EF94C2D612133941CFFA47950713F30F69AC2E3 56611D5EB39E5E8EC4F75953A65CF984B2537574B28CBB3A7E66CC481FA7A797
BF780C403DC5C706E5E73F450FEB1AC82AABACB2CA2AABACF1BFCCC740BE8740 DB646C5CF0424F2FBB9E32BE11676B6B675ED4D6CE6075757CCE9891FD1DBDDE
7B090FAE3595389EE67B08B497407B0AC2DA52C943457B087C2FE11B4FE07B0B 6264E298D3D3CBFA82B633936EDB43F3154EAFA7585737A380F2F5BA3AFEA74F
0FE661000B7AAF81C725149BCB19EBD3DE81F79B7C2F81F614686F81EF3174CD BFFA256515CE9C99FE95E8F669D352FBD1ED315656FCD7BB76D5001D8795D2DE
C3208AC52926A7D85CCE589FF60E680F81F612684F81EF2D1CA53C74A90B158F 5F385EE9751A51A6296D5311C690740E6DF3787DFDFCA74B97963751FE1169F9
C5292637C4FE72C9680F019FCFF7188E637CE733456C932AEE7B8AC92936B770 73E7E6855B59953DD7D7CF6BD6D5CDEAF06FE9A64FCF9A48F36448AFA76F67FC
FC4F7B0CB4D7407B0EFA184CE0534C4EB1B925627EE97E02ED31D05E03ED3930 28EE8198928BD1FF3437CDBEEFE0500BD6D6FC3F9D765E0828488F542E4E3B63
F62BCEA7789862728ACDE58EF78DF713688F81626CDA7310CB1FF89E8EE7C17F C74B3B3315F7E37A496AAC6AF1A5E8E5C517CFAC9066BF68FB67CFCEFA868E95
8ABCB13EED1DD01E02ED25D09E02ED2D086C7B7D9CDB5F1FE3519C39DE0271FE 02DA77619DB54B3E3FCBF9427E90EBB61B188369A12F417F82317A42C8FE6F7C
549E0FDA4BA03D8575636324EC7E9258739005627C15DF3BA03D04DA4BD832B9 9F14C162F549D83E5FAD27D8E776184C3EBF6B7ED5B91DFA9DFE7E146F673027
86C7F55DD9961FFF680F21607A23FE7E0365ABF018FCB4BE6EFF80B2D3FB5AC9 C99E9596B0CB6869A4ADD1A71D1D9B6ACFEA9FE4601C72D965F1E3027F1BE88C
63A0BE6E07F501DB1AFF5B65D5CFF5FD9CDFE4632C80F6C631ED616D6D01BEF0 1F6767382AC9C1A4FACE899D50CC59FFF2A2A3D9E36407D68D0B7B4DEC719FE8
8EEC2B0FC86EEF004A4DAC6B2DC117D8073DE0446D058CB87084A7649BCA838C B117EC4D4C92F6B01E961FD9D25C1FEF0AA5C19B3AE49FDF3CF3E34407E3CABB
7C621F61519B20BCEC26B0531A83B88DE7BBCB834CFC01B8462F6387D4B0EE66 2777031E2F54F5D97DC00FF9F54DBAEB923ACABB9BE2641A94BCC7E44AB6E7F2
1AAEA1702D77861429A468F3F3789DF94CEA920719F8189FBC5BCB8EF9C2BCBC 67D567F7B71DD7111F08E97561F7820BFCE05F5F8AB2C5551BEB02BF87D9C29D
245CC7E33AEA874841FFD8DDF91BCFF3EB781FF39D764A6C9332F007F11892E2 70BB76FB3AE227EC3676C9F359F5B42376677A173F61E73C934BCE1635757107
386AEF5BC6C0BEAA5BC844DFFF43CB536EE3797E9DEE13DE5B3F291BBF737D38 80697E9CADC117171C588F6A62F6778B2D897FE137D6C0F3BBE7FF7EEF947DB7
95F98E87DDD5B7918D31C5390D4FB98DE7F5EF8AC6E9D7B64FC9C41FA85FC708 D9B5F107E002771D70F61B3BB7DD13B6F396151E5AD7247A5C4DBC0B44456C81
EB39E444D620EF3CF2A3353CE5B6C017DF153D2DBEB790B9FFA988A3215E34F2 83611B20EAE456C889DC0977CFBDFBDA7E8F7182487ADCFE636BC1F1F80670F7
63343CD574F25516EEFF2A8A6B7754617F8B417EAC86A7DCA67857217E50559E 303BF6EF7B4E7F255E93F0D8BCE8DDE01CBA1682D3BC20961F0DE1395C084C3A
1053C6093126B715E4FB55623C1D87FC780D4FB9AD20DFAB3213D9C8BFA8E129 009E915BC1256C3D049CD8046722B7437ED42EB81C6907DEE194776A33846672
B715E34F04F7CAEBC02E21FB9296A7DCF69DA8187F5D258EB58958FE440D4FB9 20B1324EF08C2A897FEFDC3EE0866F04CFD35B05DC773D3FC7F1CFD098C11094
AD20FFE38A546097917F59C3536E2BC85F598EE37C12F293343CE5B682FC0FCA E40241296EED8E15E79FD9A1BF3A22C4069CC3D6C1A96B4719797E17E57B789A
AF004B467EB286A7DC5690EF5A7E09580AF253343CE5B6827CE7B28BC0AE21FF 847846DBC2F99B718CBD1F10E5BB78990730FDFE0199F2F733FF3FDEFF6CE35A
9A86A7DC568C3F091CCAE280A5690CE2369E578A3FA33C1658BAC6206E2BC89F 6B6C39BC98C5A490F95778897F01DDDD5BDB4C7A0C0000002000000020000000
5A1E0D2C436310B715E48F2BFF01D80D8D41DC568C3F19DE2C3F032C33C2206E 721900000000000078DAED9C09581457B6C72BA3316F3293899944708D49E6CD
FB4E568CFF9F15DF03CBC1B26747F094DB0AF25FAB3C092C0FE79E5C2D4FB9AD 97E425931893596312954D6394457117C56D348A9AD1A8EC8D0BC8EE3222CDE2
14DF7F1A8CAC3F0DAC783FB0A2FD3CE5B6FF3425F836CC73623C67F94EE914D9 169588CA2282A031ACB228A220AB202A28AB8ACAA62839EF9CDB5DD834DD084D
74BEF37B2A4BF19FD47F37F5F6237C4F65097E7F3DC3E611BFA7929F4FDF6D52 7591C9747DDFFFBB7DABAAEB77EEB9EBB9D500001CE8A4934E3AF582D41C7D39
9C43DFA6FA4D1452B2BB7ECF6939FF23EB935B59B0362F1D3E41F1146D9E07CB 8F2FA3389F8974433F4EDCA30FB7D9308C3BE2069CD797C47F455CB6411877D8
FBDF86F94D80C8F2426027B0EF9FD0F094DB7E134081F6C7E39FC80AE49DA4D8 19ECCA0B81733724BE9E68EC4DC83EE20C338B526043793E701B3E05CE752C70
5FCB536E2B16FF20BF1279A735FAD85F23D80AF223CA0B908DFCB35A9E725BC1 6E06020ACBE46E0258BF27583DF3F5BDD928910B73867925A9C0FDB80BFE5D59
F86F7B39C67B6723843D004CB9AD60FC135896D725FEE7B682FCAD65D8DFCE21 08132BB3C1BC3A172CAAF304D3E49A7CB0BC5B827C13F2ED4BA8E7398FF1B7B9
FFBC86A7DC5690EF599AD965FF81DB0AC67FEB4BAE0BB17FAC96A7DC5670FDBD 2817987F2D0DB8E400E092A4287F054985133D3F7D1FFAC098F80350FD398F71
B6244DFF7E59785FCD6D05F9AB8B5385D83F5ECB536E2BC8FFAFE22421F6BFA8 F07E512CBC701ECFA7076A5941C0657D27AB0359DB7A8D73189BC09D7401EED2
E529B715E4BB1563BC9780FC042D4FB9AD20DFA528A14BFCCD6D05E32FA7A278 1EE032F19EF30132D167A17501F939EDF854071F70EB3E4FE46225C0E5EE052E
60573406715BC1F8636611C65B573506715B41FEB4A2687DEC2F88DB0AF22714 3B4826FA9CBF5F581520BBF87BACFFF13CBF2FF301C78D64369C423F1422B708
9DD3C7FE82B8AD60FC35A6E82CB0546CFBA91A9E725BC9F8AB08E38D34AD3EFE EB6223B57DACA72D26C289B57D643B1BA5C8EB5FD6F7146D88471BCA4264F773
D70AB662FC49F05A21C65BE95A83B86D39FF0FE4DF30D07714F42D87F7381859 DC389481C0FA02F59EDCF75C471BBE48E4525D81F39C40FCB7E57E125203E4EC
F81DB0EB5A83B88DE7F975BA4FF8BB09B9F6DF9F62DE93CFB10BBEC00AA330DE BE1DC620990D1F73AEE36E723E93C41CFF146DD0637EE0B88F441EFFF9E379D4
C4982F6B37C6FDDA4E914DE7E93ADD47F7CBF7FE81D6F4AFF2BF4939AF0696BF CB6C6C107FFE13F5D0AD8174D249279D74D24917FF0B7CF4637B08B497D071AD
17E3EE488CFB359D229BCED375BA8FEE97EFFD4B7FFDBADE9EAD1B8B79F01458 29C6F10ADB43A0BD04DA5390AD2DC53CF4680F81ED251C7606B6B7D0D186E739
39C8CCD20829677B02BF2E7C5F6323E3FBA7AE7F9B438C1864DD4266FE6E218D AFAFEEB1B884627321637DDA3BD8F029DB4BA03D05DA5B607B0CED6DE84FB138
E9C27E56E6F76FDDE7E18217B0B203C053136C8BBC7F15F3B07EDC451EF7536A C5E4149B0B19EBD3DE01ED21D05E02ED29B0BD8530B2A15D5DE8B1589C62F2B6
826DB1F7CF028BDEB1BDA54F9F55E8FDB3F13EC0AF4CC5FD8FCA3FF0E1EB206A D85F2829ED21E0F3D91E4314C677AE267C9BD463BEA7989C62732DC7FFB4C740
FE7C9D45256589F9B3F27F3AFC9ABA3A8BCACAB7F2AD7C2BDFCAFF69F2959495 7B0DB4E7208FC1647C8AC92936D746CCAFB89F407B0CB4D7407B0E1CF77BC6A7
FFD3E69F3A77D62CC9C937273F56BE956FE55BF98FC177EA4BBEA93C2835FE9A 789862728ACD858EF795F713688F81626CDA73E0CBEFF9553DB3C1DD44D8589F
3AF2C257EAF276AD0073941FBEB22D6FE7F2777AF37741F41C738FB6B27CB8A9 F60E680F81F612684F81F61664EC91F238B7AF3CC6A33873AC16E2FC71CC0EDA
5DD3921FBE7C7C5FF0E5C8436FF9BDCD8331BFEDF65568C9FCA147D13DC6476B 4BA03D85B59F2728B0FB28C49AFDB510E3EBB1BD03DA43A0BD844DC6B7595CDF
490EB68755AD7DC5A7839ED517FEFF39F11FC5FFA6EAE1E7C0B7A4FFF7ECD9F3 9EADFDF18FF6103CBEBC8F9FFF8ED217790C7E455EB77F460D96FB5ACCA39FBC
64646464B346A3015172F3E999616161B07DFB7608090969F6F7F7377C2B85D7 6EFBF7025B17FFEBA4D32FF5FDDC16E308CE83F6C631ED646DAD05BEEC1DD941
9C8E1C39D258565606A2E4E64B9FADD56A1BDDDDDD1D25E5FF363131F147A5F8 47286C790294AA59D76A832F631F72841377AAE08DA4A32CA5BC3A1B04E413FB
67CE9C810D1B367C4BEC43870EF5DBBD7B7773414181E17A717131E511A4F5D1 2817E204BB2AAE0217236D13CBE379553608C47F1ED7E8155CA804D65ECDC635
1BD1B3E899E2F373737361F5EAD5CD6AB5BA3F5E1F77F0E0C12EBE4F4F4F87C3 14AEE5E24881B214F3EC3C5EE75C8DDAD920001FE3930977B8083798569C89EB
870F77C9736F44CFA2674ACF6DDCB8B171F9F2E5EF60BB0B8F8989E9905E8B8E 785C479D0E94E987A0A79FF13CBB8EF7716EE363F8362900BF3F8B21298EA3F6
8EE6928BDFDDF3A2A2A23A56AE5C19F6F9E79F576667673F34BFBD5177FE4C4D BEE933D85B730D99E8FB1F0258CAF2789E5DA7FB64EFAD5F128CFF747D388E73
4D8555AB5655765757C6E7A8DFECDCB91342434321282808B0EF808F8F0F6CDE 1B0B41B5D7918D31C519294B591ECFCBDF158D91AF6D5F1688DF4FBE8E91ADE7
BC19B00E01DB32AC5FBF1ED6AD5B076BD7AE85356BD6D0B361C58A15F0D1471F 9013781B793F223F5ECA529697F1F97745AFF0EF2D04EE7F7AC491122F1EF909
1984FEE6929EA3E74BF3656C77A7929212282C2C046AB379797990959505376E 52964A9FF2F5B4DCFFF528AEDD5E83FD2D01F9895296B23CC5BB22F1BD6A8A65
DCE0E5A472252525752BE225272777B11F976FCCA6BA23F6F5EBD77B64CBC5A7 3165B22CC6647911F95BAA319E4E467E8A94A52C2F22DFA53A1FD9C83F2B6529
7E74FBF66DC8CFCF879C9C1CC8CCCCE4ECB4B434484949B128BF3BBF67646470 CB8BC6370487EACBC0A5213B2D80A52CEF66281A7F6D358EB5E958FE74294B59
F6C3CA2EF28C6D635E64843C6DAD3BFDF52FCB1FE047444418D8A5A5A57053F3 5E44FECAAA8BC065203F43CA52961791BFAC12C7F94CE4674A59CAF222F21756
57B0D441CF36E653DFEA4BFEAE5DBBFA944F75DD977C5A0F886C6ADF4AF3B76D 9E03EE02F22F4859CAF222F2AD2AD380CB427E9694A52C2F227F7AC559E02E21
DB46EB11435BB734DFB84F18AFC52CCD7FD8BA93EEB1A44C829D42DE667343DC FF9294A52C2F1ADF082C2A9281CB96B689E5F1BC58FC499589C0E548DBC4F222
D99CA0C56C56E82045FFC355E71D7BFA2FDCD5F4D4CAA88E818BC275CC29B89A F2C755C603972B6D13CB8BC81F53791AB83C699B585E34BE317C5A19075CBE7F
3904BCA9081CCB3DC065976EF41755F0DBB05C18E19300835645C1138EC12DCC 9B58DECD5834FE5FAA4E025784652FF46729CB8BC8FFA83A1AB8629C7BAE04B0
31F01D8BF3D1E7FF86E526B6FDC1BACE3CACFE5A993C607D0F740DD73DEF7311 94E5C5E2BB8F87F7EB62812BDF075CD93E96B2BCFB7831F8033867C314C67233
FA240FD4D69C82AB06AD8E8247CD83DD86007B1B0FDFD764CB03B535A7A06662 792ACAD3F9A7BFA7D216FF25F9EFA6BEE8C2EFA9B4C1EF2B670CE8E2EFA984E7
3D2C0F2A8FC037066F0A6C1BAC0E4996D50F54BE87E461A06B509BEDA6A0D697 D3EF3629CEA1DFA66E3194A5946FFF7B4EEDF91F596BAE15C0EAE21C58836229
8FC5C210AFD096C1EB837EA7541E9EDB7206907DEF95BFC7C198A402F88F2FBE E6990DDAF7FF006E8B010456DE00EE04F6FD135296B2FC160310A1FDB1F827B0
6BB75307ED90BF3F06BDF58453B04EDA1E46EEC906F477FBA8E371F04EF22D98 0A79D114FB07B094E5458B7F905F8DBC58A93CF697CAF222F2FD2B4B918DFC53
9E5A08EF5ECA86219EC1BA116AF53F5B320FC3B79C467668FBAB27136042CA2D 012C657911E3BF6D9518EF9DF297ED0160CAF222C63F9E15C5EDE27F961791BF
78FF5A11CCBB5E02F32F95C22F5FB8D4D1EF99CB45833D7CFF207B3EB02E787D B902FBDB19E4FF286529CB8BC877BE95DF6EFF81E5458CFF6C6F5E96C5FE8901
7B06DF1B8DECC929B761565A112CC82881458965A07A251BC7F20CF8E5D094FB 2C657911D7DFAB6F66CBDF2FCBDE57B3BC887C9BF28BB2D83F2580A52C2F22FF
2F054434D87904B53FBF797B9C6AA3FF2239F2C2DBB967708B3DB2A7A4DE0687 9FE599B2D8FF6C004B595E44BE7539C67BA9C84F0D6029CB8BC89F5596DA2EFE
F4625874A314DCAE9481ED2881FDCC886CD874B5163E2B6D84B0E23A5813970A 667911E32FCBB214E0CE49DBC4F222C61FA665186F9D97B689E545E48F2F8B97
7F0E3FA01BEE15526DB729D08D3178C21C36F56FEA63F6C7E3612AB2E720DB15 C7FE32B1BC887C83B233F2D85F26961731FEFAACEC147017B1ED5F94B294E5C5
D94B913D78540E673FFB42367827D582B65C075F5436C3D7D52D70B8A6150E55 8CBFCA30DEC80E90C7FF01B2BC687C23F8E806C65B39016D6279EDF9BF1FFB0D
B782EFF50278353452F7BC7768FC50B5FFB0C7E5DB6C08188DFD2BD9CE2BA4D5 03FD8E827ECBB1610CBC7F2312B8CB016D62793CCFAED37DB2BF9B106AFFFD65
FEC0F176C72BD9B0EC6A57F6D6E45AD85BA1436E2B7C5BDB0627EAEE701DC3DF 6E83F1192EC90DB81B21186F62CC571084717FC053519ECED375BA8FEE17EEFD
746E4F5913387F77BE7DA85770D3508FC0B966F9C1DDFF253B75C8CE21EAE026 03ADE93F647F93F2A304B8923D18770762DC2F7D2ACAD379BA4EF7D1FDC2BD7F
6A6BC4B679311B7C53EB613F9699CA7BB2FE0E9C6B6C87F38DF7E04CC35DCE3F E92B5FD78FE4D67E8E3638CB5845C82C90CA52C67606765DF6FB9A0102BE7F6A
58D50291E8976D250DF071720EBCE8B7AB79983AE4F0739FFA9AF57F99FFFBEA FFB739C44840D635649604C9D28476ECD7047EFFA6DA862417E02A0E004BD5B0
1DBFE8F74C62E9BF0E4BF9D127A58EB38F20FBFBFABB7041770F2E37DF87D8A6 B5F2FE95B7C176CC5916F753AA86ADB5F7CF3216BD631B254F5F13E9FDB3F23E
7B700A6DCAD3DE8A66DE26FC8BEAC1A3A0063ECE2A833FEE3FDA86E5D0D97905 C0EFD5C5FD5DE51F58F409F09A31A35EAB5264F1F6E9F83F1FFEEDBB77B52A1D
7B0E5DEFF3CC63B7C78DFE2E63F71C6E229F531D53B9639079B9E53EC4E93AE0 5FC7D7F1757C1DFFE7C917533AFECF9B1F73E694461292AF893D3ABE8EAFE3EB
3496FD6F356DBC2D84A1EF0391ADBE550B9FE457C18AEC0ADE76A72564C2CB11 F8DDE05BF6265F9D0D628DBFEA8EE25DCBEA8B772E054D54B26B5973F18E25A3
512D433C71FCF60E8DA67A7E54BEED26FF09F63BF7D57F85BEA5FA265F47239F 7BF27741F41C4D8FE68A12B81AB0AAB164D792B1BDC117C2869EF27B6A8332BF
7C4FE53EA26787233BA8B81EBC90FDBFC8FE4B4E052CCE2C05476CC3D49669EC F9FA7968CC3FDDA9E81EE5A3E96611B687E54DBDC5A7839ED51BFEFF25F1BBE2
1C7D310B8686EEBD6BEB1EB0FA51F94336063D3F62CBB6666A5B54C727B0FCE4 7F75F5F04BE06BD3FFC1C1C12F0506063648A552E025349F9EE9E7E707DBB66D
03FAFD4DB5E0F35DE873B1DCC6EC6938668E45F6EF2FE7C34B1773C0D6775783 031F1F9F067777F7B6DF4AE135CBA3478FDEAFA8A8005E42F3159F1D101070DF
ED46FF3F3D7205A8D5FF64E711D8BEB7B41E0E611D533D535EBEC432535BDBA1 C1C1618A42F9C3D3D3D37F128B1F171707767676E1C40E0D0DED131414D4505A
AF6FCF5B35DCE7A6D82F237BD8A92B80E35A2D3EF3B1FE4F562CFF8D4D29B9BC 5ADA76BDBCBC9C6C04C5FAE889E859F44CFEF957AE5C011B1B9B068944D217AF
FDEDAB10B854E690E206D85A5807EED8D6FE27AF0A966797F3FA9E23F1B9C81E 8F3974E8503BDFE7E4E4C0912347DAD9DC13D1B3E8998AE7ECEDEDEF2F59B264
7E210B6CC3BEC2793478CBE3B6C1E15EC19FB91C8FBD4FED6BA79EEB5754C7FD 34B6BB5D0909094F14AFC5C7C73309C557F5BC90909027CB962DF3DBBD7B7775
FDE9CD6AF838B7123ECC2A07978C52989D5EC4C7CDB7AE16807D621EF7F93064 6161E133EDED8954F9F3E2C58BB07CF9F26A5575A57C8EFACD8E1D3BC0D7D717
ABFE9E80650FAA37A72F627B796FF48ECF1B02D0CF3E585EAFDBB5B0A1A01AD6 BCBCBC00FB0EB8BABAC2C68D1B01EB10B02D83ADAD2DAC5DBB1656AF5E0DAB56
E609FE76CB2C03679C1F66E03C3111E78B3F5FBD09A391FD1B640FBD900936E7 ADA267C3D2A54B61F1E2C56D427F33299EA3E72BDAA59C57A59B376FC28D1B37
D2C076EBCE661CDB179A330E0CFBEF907F19EA19D4F6697629ACC7F2523DAFCE 80DA6C717131141414405E5E1E2B27952B333353A58877E1C28576F9EEF295D9
ADE065267F535DBF7BAD10C6E11CFDA72B3761D4A55CF8753CCED3B1C88ECE00 5477C4BE7CF972A76CA1F8D48FAE5FBF0E25252550545404F9F9F98C9D9D9D0D
55E89E169CC7F7F5665E1AE61D7AE2BD93177E5C85E5FD08EB99DA9833CEC733 5959595AE5ABF27B6E6E2E633FABEC3C4F39AFCC0BF417A6ADA9D28AAF9774E0
D3047F533B7B1DEBFA95845C78212E1B6C636F60B9D341B5635F0BCE67718FDB FBFBFBB7B16FDDBA0557A52B405B073D5B994F7DAB37F93B77EEEC553ED5756F
E61E1887DC0326FF3A20BC89B8F3D1D70E58CFD3B1CCE3B1CC6FE8FD4D75FD5C F2693DC0B3A97D8BCDDFBA752BAD47DADABAB6F9CA7D42792DA66DFEB3D69D74
5C16D8C420FB4C32D8FA853563B98FD038DAFB85013C81F352C1F83389DCD713 8F36A5166CE9F30537D5C7819BEC359733F3ED2FEA3F5C9DBE3DB8EFEC9D0F5E
714D32465FE6917A7FDB89FEFEF2E47D5B75702BCEA51EE6CEC5DD8FC5017386 5E16F2A4DF9C5DF59CA5772D67E1F1A928702CF7F3B376D68FD85F03EFFA5D81
FB85E9C66079FF78251F5ED597F9792CB30AB93687CE81CA374C87EC24D9D7A8 375C53A1FFF210786E8A772337C573B4D6F9E8F3DF61B9893DF2D0DDA736D87C
E278E81512FF9B0327EEFD3601E7372AF3C9CBA0DA7BACC3D63BB459E51592A2 2F8E0D58DFFDAC76D50F773D0BBD6203B5354BEF9AFE3621D0551B06DB798C1C
72F77790B3CC0FCCCD1B8387DBAA831A86ECDCDF628B6B712C6B058E697B1E67 E0E8F6916036505BB3F46A20D6B36CD073F4FCFB4027CFE681129F0B82FA81CA
4EE9B50F36FABF6EEBEEF7A1ADDAF745399EE7F6E132588A32A41F2C83251F2C F70C1BFA597935EB3B7935BD139108835C7C1B07DA7AFD9F5836BCBE290E90FD
15B4CC0D169396BA81EBD225E0EAB61816A1162E7185858B5DC165F12241AE0B F8BDE3C9F0596629FC697F64CB6089D776E1FBA3D7A8E72CBDEB15DBC3FBC185
6101AAB77C37297F99944FEC250FB25D1771EE82452417B3F84BF5FC7BF7EE75 80FE6EF9202A19465FB8065F5EBC0113D20A6190B377FD1B12C9FF68D386619B
517B7B3BD79D3B77A0ADAD0D5A5B5BA1B9B9199A9A9AA0B1B111EAEBEBA18EBE 6291EDDBF261742A18645D838997CA60DAE59B3023ED16BCF866DA933EAF6694
B1ACA981F90B5DB8CCE553B93B3A3A0C92E6E1EEDDBB3C0F225FA7D3717E4343 0D7474FBB3E076605DB0FA76F67E3C02D9C659D7C12CBB0C66E6DE8439E915A0
8381EFBC700138BB2C30DBFFC67C310FC6FC9696966EF9F35CE673F5967FFFFE F75E218EE5B9F0E290ACD6B73DFCEF0D76F46A19BE715BB29EBDFB1C216C61ED
FD077C20F2A90E443ED581C8AFADAD85B90B9CB9E4E08B7930E64BCB6FCC779A DCD9BB7124B24D2E5E078B9C729893770BACCF5580FE0732F6AB6F1482D3F93B
3F8FCB9C7E21B679916DEC03B10D9AE293FF1D9DE77299D32FC4FE66CAFFD23E F0EF5BF7C1AFFC2EAC4ABE08FFD875A07E988B4FED60274F6B8E83E7346153FF
605CFFD407A8FC73E6397199D32FDCF463CDE3B43F63FF3BCC75E432A75F88E3 A63E36322A05C6217B32B2AD903D1FD9033F2862ECD7DE2C840D997720A0B21E
DCA3F43F69F9A5E574709A03B351E6F40B1AE7688C239E29B674FCE98E3FDB11 F65737C0F7B58D70E4761384D63681DBE552F8D037B07EF806DF942112F7A1DD
F98E0E66F50B29DF78ECEB8E2F32A4FC59C89ED50D5FEC173DF1C5F15D649A62 E50FB0F31881FDEBC260179FA69107A25AA69C2B8405E7DBB3375FB8037BAAEA
4BEB5E2C3F31387FCE6C2E53FDA247BE7E6E239E54C496D6BBE87B69F945FE4C 91DB04E1779AE1C4DD874C11F899CE05573C80E9913FB60C71F17E30C4D173AA
64934CF58B9EF9C2DC26F24489E596D6BBC896FAB8BABA1A663ACCE632D52F7A 467E70707F7BB0C467C72089F7036A6BC41EF05621B85DAC837D58662A6F74DD
E28BF33A71A44CB1DCC67E179F2FE5CF7098C565AA5FF4C8A7797DC962034B2A 433873BF057EBCFF18E2EE3D62FC43358D10887ED97AF31EACBC50046F6DD9D9
69B9A5BE95B27BE28BFDA227BEB8A6209628628A32C5A6E713BBAAAA0A66CC16 3054E273E4F5F56E1AFD2FF3FFB5D9FE429F57D36FFD7668D64FAE597719FB28
F8A6FA458F7C9A3350C43116718DD9E2B345B6946FAA5FF4C42736CD19C41059 B24FD63D82A4FAC790D1D00A890F1E430CE6C9A63D550DAC4DB897D58163E96D
5249B9F45CA9DF3BF933791E4CF58B1EF93467E17C45FFCE58C65CE372932A2B 585950017FDD17D68CE5A81FECE2ED3CC4D6F5D56EB7477BF7599F071F79403E
2BBBF8BFBB7ED1135F9CA7A51CE96F2957CA262EA9A2A2C2C037D52F1EC6A7B9 A73AA672272033A3B11592EB9F402C96FDD8ED66D616FCD0F79EC8965CBB036B
9A18DD49E476C736F01D3AF9DDF58B1EF9FA7502CDD3345FD27C45738693F33C 4A6A606961156BBBE353F3E11DFF90C641CE387E6FF08DA77AEE2A5FDFC9DD60
709C3717E6CC7512FA31F6256ACBBC4ED1A7E2B345CD4499EA173DF185758AB0 E48EBD7507D1B754DFE4EB78E493EFA9DC47E5EC5DC8F62AAF0317647F8BECAF
4EA0B97ADE02E4CF37E63BF27184F7277D9B12F33053149E33D52FCC5917CAD9 8BAA606EFE2D98826D98DA328D9D23CE16C010DF3D8FF41D3C6CBACA1F64EF35
2FCCE2CBD82FCCE1CBD92FCCE5CBD52FCCE2CBD82FCCE1CBD92F8C9FFDFF2E2B FC8D4D5B1BA86D511D9FC0F2930FE8F3E15A99CF77A2CFF9722BB3C7E398F939
5E2A B23FCE2881B7CF1681BEDBCE7BFAF6EE7FEB72054824BF1AECE8D9B2E7561D84
621D533D932DDF6199A9AD6D97D7B7F3B5DBCCE7EAD8EF207B68CC39C071ED0E
3EB35BFF9315CB9FE7947585B5BFBD55322E95D9A7FC1E6CBE71171CB0ADFDAB
B806961456B2FA9EACE0739E3D2CA900F4FD0EE23CEABDA9BB6D70988BF7BF67
4525B652FBDA21E76E29BBCBFCBDFE6A2DACBC520D8B0A2A6156EE2D30CF2963
E3E6A8F3A53032BD98F97C28B2F58EA762D9BDEA34E98BD85EBE1AB17DF73D0F
F4B32B96D7E5FA1DB02BAD85D5C5327F5BE757C0749C1F26E13C6188F3C53FCE
5F8511C8FE23B28724E5C38033D9A0BF7947038EEDB3351907867EE3F3EB21CE
5ECDEB0B6F812D9697EAD9E64A152B33F99BEA7AC2A51B3006E7E8BF9DBB0A1F
A45D813FA4E03C9D88ECF85CD0F30D6EC4797C6F4FE6A5A11B7C4F7C159DF4D3
722CEF62AC676A63D3713E36CD96F99BDAD92758D7EFA55E8137930B413F310F
CB9D037ADBF736E27C96DCDD36D7611C72F030FE83C7AE07C49D81BEB6C07AFE
12CB3C16CBFC77B9BFA9AE5F4F2E800109C88EBB00FA5BFC1AB0DC47691CEDF9
C2009EC379A9746C5C3AF3B521AE493E9397F97DB9BF07F3FEFE2EBA555FE2DD
8473A9A3A673B1EAB1D863F2B02D7EF59F6179FF7AAE043E9497793896590FB9
0342CF809E9B5F3DB233055FA3F2E3A18B4FCA1F0F9C78FC6E2ACE6F54E6E80C
D0DB13F1447F836F839E8B4F969E83BB859065EE3037DB7B0FD39778DD1BB463
5FA33EAEC5B1AC5538A60577674EE9B10FECDD3FD177D8B2485FE2F69610CFB3
5EB400E6A3DAD2850B60DEC2F9322DB086B9A4F9D660357F1E5859CF8539A8D9
F3AC60F65C2B9835778E4C56B36126AAA77C6B45FE02453EB1E775645BCD61DC
997348B334E2CF97F31F3F7EDC4E2D2D2D4C0F1F3E84E6E666686A6A82868606
78F0E001DCBF7F1FEAEAEAE02EFDC6F2F66D98317B1693A67C2AF793274FDAA4
68C3A3478F980D3CBFBEBE9EF1EFDDBBD7C69F3E7B264C9F355363FF2BF3791B
94F98D8D8D2AF9D366CD60EA29BFB5B5B5830F783ED501CFA73AE0F977EEDC81
A933A73309C1E76D50E62B965F996F39631A9326FD826FF33C5BD9077C1B54C7
27FF4F993E9549937EC1F73775FE57EC03CAF54F7D80CA3F799A259326FDC25A
3ED674A7FD29FBDF62EA14264DFA053FCE75A5FF29965FB19C169693C11CA549
BFA0718EC638E2A9632B8E3FAAF8E653903FC542A37EA1C8571EFB54F1798622
DF0CD9662AF87CBFE88CCF8FEF3C531D5BB1EEF9F21383F1279B33A9EB179DF2
E5731BF114456CC57AE77DAF587E9E6F8A6C92BA7ED1395F36B7F13C5E7CB915
EB9D672BFAB8B6B6164C2DCC99D4F58BCEF8FCBC4E1C45265F6E65BFF3CF57E4
4FB2306352D72F3AE5D3BC3E6F6E1B4B518AE556F4AD22BB333EDF2F3AE3F36B
0A62F122262F756C7A3EB16B6A6A6092B98CAFAE5F74CAA73903451C65115799
CD3F9B672BF2D5F58BCEF8C4A63983183C4B518A5C7AAEA2DF9FF24D990DEAFA
45A77C9AB370BEA2EF294B99AB5C6E527575753BFFABEA179DF1F9795A91A3F8
5991ABC8262EA9AAAAAA8DAFAE5F3C8B4F7335315489E7AA62B7F12D9EF255F5
8B4EF9F27502CDD3345FD27C457386E5F4693065DA54983CD552D68FB12F515B
66758A3EE59FCDCB14A5AE5F74C697AD5364EB049AABA7CD44FE0C65FE14368E
B0FE246F53BC0DA6BCF09CBA7EA1C9BA50C87EA1115FC07EA1095FC87EA1295F
A87EA1115FC07EA1095FC87EC1E90EAD1F6B775B4B6DF7CEAF56A7F5BBADD3B4
C9B7DBB720C6FF8C2784E77CDF4107D203806CD0367F6F8A1F9CB97EAA83C806
1DFFE7C75F1764F5CFB54156EBD4695DA095A936F9767B16547945D8B66C8D76
79A42CD7A36B1EDBEF5B18AD4D3E9DA36BAABE43CFA267EAF83AFE7F337FCD6E
2B431C0BA033D13DDAE44B0E2EAB8F2D3E01AA44D7B4CD773968F340D53D24BA
A6E3EBF83ABE8EFF9FC8A7D84055CC40B104CF773AB8B441D53D24BAC6F3BB1B
7F504CD459CC4431D5BA80D9FFB0DD33BF42ED7D788DEEE9EDF84B77FCE71DCF
6A7FDD15C53314537595DF59FFD344144B51DCD61DBEBAF1471351DCA6E3EBF8
DDE1D39C41F39610A23D83EEF069CEA0794B28D17E4577F64C68DEA2B9B3BB12
6AFCA3B993E66F5A437445146B51BC2718BF9BED8FE23D1D5FC7FFC5F07BB9FF
F5F6F823F4F8DB9988A5EDF9479D88D1DDF84F4869127FEAF8FF1D7C21E30F75
D234FE1752BAF8FFE7750479ADBF16E4653FBCD7F89EEBEA76FBAE7F4BC7D7F1
B5798C1993F2B681419A176A85A5655E3F31F9E3C7270D30364E7FB0706149EB
E4C939CD2626E9FB15F969D1FBE7A5A686FE3A2F21E2B3A2F8A8D7F2E2C34764
271E7F3327F9D85BB9C9611F6625850EA06BEC9EF8C87100F05C7E52B8197D3F
2F317212FD1FB5BCA47083E2F498DF61FA97C294C8C19713C3DECD898F7AE7D2
99A821DFAE885F696676E981AF6F33B8B8DC0513938C5A45FEF9B81067F6DDC4
8899F9678E0DCF4D8A30C94F8A1A99931CFE31FB8CE7E85AE6E9D097731322BE
0690FC2A373182C5F7790991FF2A8E8979E17262F882ECB3617A971322CC894B
F6E6C5878D223B8EED3DB9C0C828FDF1D2A5A530756A6EF3B871194734F1FFE8
D1F17D0D0DD347191AA6FEA9ABBE9748E0570606E9C163C7A6E5191B9FFB1EBF
BFD1D838FB37DDE55B5A86F6C1EF9F9D30E17C13FAAF19CBE3D815B6A161DA6E
6C73E7D0F6FE3D69FF63C6A47F3C7EFCF9461F9F26D8B0A10E905FDFF937E039
2CB31FB273A8FDF5B4FF191A66BE6E6C9CF1C4C1A116962FBF416DA8BA3336FA
DCFF59ECAEF2657598B6C7C828ED1ADA50636272AED4C020F50632624D4C3207
29B711BC37A4339F77874FF54ECFC37ACC1C352AB9EDEF86274ECC7C11CF6F43
558F1D9BBA0AEDAAC47B9E605ADA55F6B3F9E4C754293E2F7FF4E8730355D74B
EA4CAC8BC73636653FB9BA3E800913325BD12F537A3AFEF27E542EB7AA03EBA3
E0DB6F2BC0DBBB09264DBAD880ED6EA226FC4F3F4D7969DCB8F321589EEB4646
19173B2BB7E281E535C2FED044630C8EADC964BB267C23A3735BA74FCF7B686F
5F0B13275E68C5722CEAEA7390F9DBD1A3D387525BEDEEFC9775FAC8AE821FC2
5E9D3D33B570D5AA72A0717ADEBCC29645F392037213C267D0188AE3F0373437
5C4E087765E37D62C42ED9F81FB18DE685DCA470C7CB8911C3F212C317D3B84D
F3028ED51373138EFF99CEE5A544BD9E9B18E9909919F522E6B72AF2E3C3FCC7
C5C7C7F75DBE307131B6DFE62953B29B8C8DD3EAD7AF48FE383BFED8D0ECB8B8
DFE42746FD91EEC98F0F7B9F71718EA294E6279A8FC8469A0768DEA279222F3E
7A20893ED339D91C11F62EDD4BDF51D7FE8C8D53DFC13667A1DCAF75EB1F1D5F
C7D712DFC3F60BB2412C29C69B2CFE441B4415327591FF7FDF11B976D2E0185B
534FB1B9A112CB7ED176932431F6A68F4E3A985774F7FB68B35D8CDDC44DD1B6
A67F954824DD5A5F44DB998D38E960967366E3B486FCE06F20CED1BCAA5B6C7B
D369B10EE60F337C163C8A75347F849FEFC538981E88B237358F5B63FC1B75DF
A36B310E66DB91FD28576AD35A17ED0137439DBBC58FB69FF4C94907D3E6B2C3
8E70EFA42753E53117C80D5CD19AE03AB33EDACEB435D6C9FCD209BB89EBD047
6DFFEB24C6CED42AC6D1AC2ED5D3BAB9266273DB77BBC33FB17EC22B687B457E
F0CA9FF8EF2BAB2A7C23E407AF82E42DB39BA2ED4D5BE39C2697A23DC9E8A787
57F67DDBE1FEAEF2A98EF13989193EF31FA9632BEBF6093728F96E1DE4F82F87
DB516E2AEFE92AFFA4A3F9B6C4CDD31BEF46BB4357F95D5157F8D1F666334E39
4F6EAE89DC2C28BB2BFC28BB892395DB9B58FC28C9C4D7621DCDAA0A767FF393
36D89DF1432D2DFBC43A989DCDDCBEE8A1B6D83C1FDB75077E9C93856BC2A619
CD42B7375E75273DE072A40BEC3B60031BFCAD1E77E0A34FCA0F3BA8FCEEB970
07D8B877216CDAB7180243564274E8B79019EE04374FB83E937BFDC46688C2FB
37EF5F0CCEFB1781CF7107700AB26E55C527DF287EF7067ED7FFD00A7039F035
1CCEDA07C7F38EC0813429F89D7205F7D07F81DD6E6B70DEB708FCD0A6C8C36B
2023CC01AE476D86AA982D9070CC16B61E58C6EED916E508872FEC851FAEC5C9
7E27FA0CFEED180F083FBC1A1CF62C803D89DBE0F4B558B5EFB3628A22E1FBF3
BB21F08C07F886AD0527F4D3FAE0B9B03DC28E9D3F5D1ADBE1FD5767FCDC4809
B8EF5F02EE475643645E68B7DFAFFD80BCD8E2A84EDFBFA9E2474A2C6AFDF62F
0527F4E7C18C40ADBEFF53C57791CE7DE21B690F27AF1CD7FAFB47557C3A27D6
FB4F557CFBDDD67562F189D5E1FDEB9EF955A2BDFF45968EAFE32BF3696CD7FA
FB7F64A8E2AF0FB64E65BFED1741C4D245A2B2E3FF017450A9F8
} }
end end
end end

View File

@ -47,7 +47,7 @@ type
YMax : real; YMax : real;
YMin : real; YMin : real;
XProp : real; XProp : real;
Colors : Array[0..11] of integer; Colors : Array[0..High(DATA_COLORS)] of integer;
procedure Bar2D(Sender: TObject); procedure Bar2D(Sender: TObject);
procedure Bar3D(Sender: TObject); procedure Bar3D(Sender: TObject);

View File

@ -11,7 +11,7 @@ uses
Globals, MainDM; Globals, MainDM;
type type
TPlotType = (ptLines, ptSymbols, ptLinesAndSymbols, ptHorBars, ptVertBars, TPlotType = (ptLines, ptSymbols, ptLinesAndSymbols, ptBars,
ptArea); ptArea);
{ TChartFrame } { TChartFrame }
@ -173,7 +173,7 @@ begin
TLineSeries(Result).ListSource.YErrorBarData.IndexMinus := -1; TLineSeries(Result).ListSource.YErrorBarData.IndexMinus := -1;
end; end;
end; end;
ptHorBars, ptVertBars: ptBars:
Result := TBarSeries.Create(self); Result := TBarSeries.Create(self);
ptArea: ptArea:
Result := TAreaSeries.Create(self); Result := TAreaSeries.Create(self);

View File

@ -943,7 +943,7 @@ begin
end; end;
} }
function ValidValue(row, col : integer) : boolean; function ValidValue(row, col: integer): boolean;
var var
valid: boolean; valid: boolean;
xvalue: string; xvalue: string;

View File

@ -73,10 +73,15 @@ const
DEFAULT_ALPHA_LEVEL = 0.05; DEFAULT_ALPHA_LEVEL = 0.05;
DEFAULT_BETA_LEVEL = 0.20; DEFAULT_BETA_LEVEL = 0.20;
{
DATA_COLORS: array[0..11] of TColor = ( DATA_COLORS: array[0..11] of TColor = (
clMaroon, clRed, clBlue, clGreen, clNavy, clTeal, clMaroon, clRed, clBlue, clGreen, clNavy, clTeal,
clAqua, clLime, clFuchsia, clGray, clSilver, clOlive clAqua, clLime, clFuchsia, clGray, clSilver, clOlive
); );
}
DATA_COLORS: array[0..10] of TColor = (
$A1A45D, $3153C4, $0996E7, $4AE8F6, $A7A2B1, $84A7C9, $51798C, $87CDD8, $536508, $7BD8F3, $846402
);
DATA_SYMBOLS: array[0..5] of TSeriesPointerStyle = (psRectangle, psCircle, psDiamond, DATA_SYMBOLS: array[0..5] of TSeriesPointerStyle = (psRectangle, psCircle, psDiamond,
psDownTriangle, psHexagon, psFullStar); psDownTriangle, psHexagon, psFullStar);
@ -89,8 +94,6 @@ const
GRAPH_WALL_COLOR = clGray; GRAPH_WALL_COLOR = clGray;
GRAPH_FLOOR_COLOR = clLtGray; GRAPH_FLOOR_COLOR = clLtGray;
TWO_PI = 2.0 * PI;
TAB_FILE_FILTER = 'Tab field files (*.tab)|*.tab;*.TAB|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*'; TAB_FILE_FILTER = 'Tab field files (*.tab)|*.tab;*.TAB|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*';
CSV_FILE_FILTER = 'Comma field files (*.csv)|*.csv;*.CSV|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*'; CSV_FILE_FILTER = 'Comma field files (*.csv)|*.csv;*.CSV|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*';
SSV_FILE_FILTER = 'Space field files (*.ssv)|*.ssv;*.SSV|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*'; SSV_FILE_FILTER = 'Space field files (*.ssv)|*.ssv;*.SSV|Text files (*.txt)|*.txt;*.TXT|All files (*.*)|*.*';

View File

@ -9,9 +9,16 @@ interface
uses uses
Classes, SysUtils; Classes, SysUtils;
const
TWO_PI = 2.0 * PI;
SQRT_PI = 1.7724538509055160;
SQRT2 = sqrt(2.0);
function erf(x: Double): Double; function erf(x: Double): Double;
function erfc(x: Double) : Double; function erfc(x: Double) : Double;
function NormalDist(x: Double): Double; function NormalDist(x: Double): Double;
function NormalDistDensity(x, AMean, AStdDev: Double): Double;
function Beta(a, b: Double): Extended; function Beta(a, b: Double): Extended;
function BetaI(a,b,x: Double): Extended; function BetaI(a,b,x: Double): Extended;
@ -27,6 +34,9 @@ function Chi2Density(x: Double; N: Integer): Double;
function CalcC4(n: Integer): Double; function CalcC4(n: Integer): Double;
procedure MantisseAndExponent(x: Double; out Mantisse: Double; out Exponent: Integer);
implementation implementation
uses uses
@ -40,7 +50,6 @@ uses
function erf(x: Double): Double; function erf(x: Double): Double;
const const
xup = 6.25; xup = 6.25;
SQRT_PI = 1.7724538509055160;
c: array[1..18] of Double = ( c: array[1..18] of Double = (
1.9449071068178803e0, 4.20186582324414e-2, -1.86866103976769e-2, 1.9449071068178803e0, 4.20186582324414e-2, -1.86866103976769e-2,
5.1281061839107e-3, -1.0683107461726e-3, 1.744737872522e-4, 5.1281061839107e-3, -1.0683107461726e-3, 1.744737872522e-4,
@ -117,8 +126,6 @@ end;
// Cumulative normal distribution // Cumulative normal distribution
// x = -INF ... INF --> 0 ... 1 // x = -INF ... INF --> 0 ... 1
function NormalDist(x: Double): Double; function NormalDist(x: Double): Double;
const
SQRT2 = sqrt(2.0);
begin begin
if x > 0 then if x > 0 then
Result := (erf(x / SQRT2) + 1) * 0.5 Result := (erf(x / SQRT2) + 1) * 0.5
@ -129,6 +136,11 @@ begin
Result := 0; Result := 0;
end; end;
function NormalDistDensity(x, AMean, AStdDev: Double): Double;
begin
Result := 1.0 / (sqrt(TWO_PI) * AStdDev) * exp(-0.5 * sqr((x - AMean) / AStdDev));
end;
function Beta(a, b: Double): Extended; function Beta(a, b: Double): Extended;
begin begin
@ -307,5 +319,21 @@ begin
} }
end; end;
procedure MantisseAndExponent(x: Double; out Mantisse: Double; out Exponent: Integer);
var
s, sm, se: String;
p: Integer;
res: Integer;
begin
str(x, s);
p := pos('E', s);
sm := copy(s, 1, p-1);
se := copy(s, p+1, MaxInt);
val(sm, Mantisse, res);
val(se, Exponent, res);
end;
end. end.