From 6ee0fa1fea62d7b1adab4a22f186e29fc7520fd8 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Wed, 7 Sep 2022 16:29:58 +0000 Subject: [PATCH] tvplanit: Fix weekview not showing events on last day of week. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8455 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../tvplanit/source/vpganttviewpainter.pas | 78 +++- components/tvplanit/source/vpprtprvdlg.lfm | 348 ++++++++---------- .../tvplanit/source/vpweekviewpainter.pas | 43 +-- components/tvplanit/source/vpxparsr.pas | 156 ++++---- 4 files changed, 300 insertions(+), 325 deletions(-) diff --git a/components/tvplanit/source/vpganttviewpainter.pas b/components/tvplanit/source/vpganttviewpainter.pas index ab6ea3172..63a1b41aa 100644 --- a/components/tvplanit/source/vpganttviewpainter.pas +++ b/components/tvplanit/source/vpganttviewpainter.pas @@ -26,6 +26,9 @@ type RealLineColor: TColor; RealRowHeadAttrColor: TColor; + RealColWidth: Integer; + RealFixedColWidth: Integer; + protected procedure Clear; procedure DrawActiveDate; @@ -86,7 +89,7 @@ begin dayRec := DayRecords[ActiveCol]; eventRec := EventRecords[ActiveRow]; - dx := LeftCol * ColWidth; + dx := LeftCol * RealColWidth; //ColWidth; dy := TopRow * RowHeight; end; @@ -148,14 +151,14 @@ begin begin R1 := R; InflateRect(R1, -1, -1); - R1.Right := FGanttView.FixedColWidth-1; + R1.Right := RealFixedColWidth - 1; //FGanttView.FixedColWidth-1; DrawBevelRect( RenderCanvas, TPSRotateRectangle(Angle, RenderIn, R1), BevelHighlight, BevelShadow ); - R1.Left := FGanttView.FixedColWidth; + R1.Left := RealFixedColWidth; //FGanttView.FixedColWidth; R1.Right := RealRight-2; DrawBevelRect( RenderCanvas, @@ -165,14 +168,16 @@ begin ); end else begin - TPSMoveTo(RenderCanvas, Angle, RenderIn, FGanttView.FixedColWidth, R.Top); - TPSLineTo(RenderCanvas, Angle, RenderIn, FGanttView.FixedColWidth, R.Bottom); +// TPSMoveTo(RenderCanvas, Angle, RenderIn, FGanttView.FixedColWidth, R.Top); +// TPSLineTo(RenderCanvas, Angle, RenderIn, FGanttView.FixedColWidth, R.Bottom); + TPSMoveTo(RenderCanvas, Angle, RenderIn, RealFixedColWidth, R.Top); + TPSLineTo(RenderCanvas, Angle, RenderIn, RealFixedColWidth, R.Bottom); TPSMoveTo(RenderCanvas, Angle, RenderIn, RealLeft, R.Bottom); TPSLineTo(RenderCanvas, Angle, RenderIn, RealRight, R.Bottom); end; // Offset due to scrolling - dx := FGanttView.LeftCol * FGanttView.ColWidth; + dx := FGanttView.LeftCol * RealColWidth; //FGanttView.ColWidth; // Draw month rectangles and month captions RenderCanvas.Font.Assign(FMonthFont); @@ -184,8 +189,12 @@ begin OffsetRect(R, -dx , 0); // Clip at fixed col edge + { if R.Left < FGanttView.FixedColWidth then R.Left := FGanttView.FixedColWidth; + } + if R.Left < RealFixedColWidth then + R.Left := RealFixedColWidth; // Draw month box if FGanttView.DrawingStyle = ds3D then @@ -232,7 +241,8 @@ begin dayRec := FGanttView.DayRecords[i]; R := dayRec.Rect; OffsetRect(R, -dx, 0); - if R.Left < FGanttView.FixedColWidth then + if R.Left < RealFixedColWidth then +// if R.Left < FGanttView.FixedColWidth then Continue; // In sdmHeader SpecialDayMode we must repaint the background of the @@ -301,7 +311,7 @@ var dx, dy: Integer; top_margin, bottom_margin: Integer; begin - dx := FGanttView.LeftCol * FGanttView.ColWidth; + dx := FGanttView.LeftCol * RealColWidth; //FGanttView.ColWidth; dy := FGanttView.TopRow * FGanttView.RowHeight; if FGanttView.DrawingStyle = ds3D then @@ -324,10 +334,16 @@ begin dec(R.Bottom, bottom_margin); if R.Top < FGanttView.TotalColHeaderHeight then Continue; + if R.Right < RealFixedColWidth then + Continue; + if R.Left < RealFixedColWidth then + R.Left := RealFixedColWidth; + { if R.Right < FGanttView.FixedColWidth then Continue; if R.Left < FGanttView.FixedColWidth then R.Left := FGanttView.FixedColWidth; + } cat := FGanttView.DataStore.CategoryColorMap.GetCategory(event.Category); RenderCanvas.Pen.Color := cat.Color; RenderCanvas.Brush.Color := cat.BackgroundColor; @@ -346,11 +362,12 @@ var begin RenderCanvas.Pen.Color := RealLineColor; - dx := FGanttView.LeftCol * FGanttView.ColWidth; + dx := FGanttView.LeftCol * RealColWidth; //FGanttView.ColWidth; dy := FGanttView.TopRow * FGanttView.RowHeight; // Horizontal line terminating the col header block - x1 := RealLeft + FGanttView.FixedColWidth; +// x1 := RealLeft + FGanttView.FixedColWidth; + x1 := RealLeft + RealFixedColWidth; n := FGanttView.NumMonths; if n > 0 then begin @@ -360,7 +377,9 @@ begin x2 := RealRight; y0 := FGanttView.TotalColHeaderHeight; if FGanttView.DrawingStyle = ds3D then dec(y0); - RenderCanvas.Line(x1, y0, x2, y0); + TPSMoveTo(RenderCanvas, Angle, RenderIn, x1, y0); + TPSLineTo(RenderCanvas, Angle, RenderIn, x2, y0); +// RenderCanvas.Line(x1, y0, x2, y0); // Horizontal lines if (gvoHorizGrid in FGanttView.Options) then @@ -373,7 +392,11 @@ begin eventRec := FGanttView.EventRecords[i]; y1 := y0 + eventRec.EventRect.Bottom; if y1 >= FGanttView.TotalColHeaderHeight then - RenderCanvas.Line(x1, y1, x2, y1); + begin + TPSMoveTo(RenderCanvas, Angle, RenderIn, x1, y1); + TPSLineTo(RenderCanvas, Angle, RenderIn, x2, y1); +// RenderCanvas.Line(x1, y1, x2, y1); + end; end; end; @@ -393,8 +416,13 @@ begin dayRec := FGanttView.DayRecords[i]; x1 := dayRec.Rect.Right - dx; x2 := x1; - if x1 >= FGanttView.FixedColWidth then - RenderCanvas.Line(x1, y1, x2, y2); +// if x1 >= FGanttView.FixedColWidth then + if x1 >= RealFixedColWidth then + begin + TPSMoveTo(RenderCanvas, Angle, RenderIn, x1, y1); + TPSLineTo(RenderCanvas, Angle, RenderIn, x2, y1); +// RenderCanvas.Line(x1, y1, x2, y2); + end; end; end; end; @@ -414,7 +442,8 @@ begin if FGanttView.DrawingStyle = ds3d then begin R.Left := RealLeft + 1; R.Top := RealTop; - R.Right := RealLeft + FGanttView.FixedColWidth - 1; +// R.Right := RealLeft + FGanttView.FixedColWidth - 1; + R.Right := RealLeft + RealFixedColWidth - 1; R.Bottom := RealBottom - 1; TPSFillRect(RenderCanvas, Angle, RenderIn, R); DrawBevelRect( @@ -424,10 +453,13 @@ begin BevelShadow ); end else begin - R := Rect(RealLeft, RealTop + 1, RealLeft + FGanttView.FixedColWidth, RealBottom); +// R := Rect(RealLeft, RealTop + 1, RealLeft + FGanttView.FixedColWidth, RealBottom); + R := Rect(RealLeft, RealTop + 1, RealLeft + RealFixedColWidth, RealBottom); TPSFillRect(RenderCanvas, Angle, RenderIn, R); RenderCanvas.Pen.Color := RealLineColor; - RenderCanvas.Line(R.Right, R.Top, R.Right, R.Bottom); + TPSMoveTo(RenderCanvas, Angle, RenderIn, R.Right, R.Top); + TPSLineTo(RenderCanvas, Angle, RenderIn, R.Right, R.Bottom); +// RenderCanvas.Line(R.Right, R.Top, R.Right, R.Bottom); end; RenderCanvas.Font.Assign(FEventFont); @@ -456,7 +488,9 @@ begin ); end else begin - RenderCanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); + TPSMoveTo(RenderCanvas, Angle, RenderIn, R.Left, R.Bottom); + TPSLineTo(RenderCanvas, Angle, RenderIn, R.Right, R.Bottom); +// RenderCanvas.Line(R.Left, R.Bottom, R.Right, R.Bottom); end; // Paint event description as header @@ -482,7 +516,7 @@ begin nEvents := NumEvents; nDays := NumDays; - dx := LeftCol * ColWidth; + dx := LeftCol * RealColWidth; //ColWidth; dy := TopRow * RowHeight; y1 := TotalColHeaderHeight; @@ -503,7 +537,8 @@ begin RenderCanvas.Brush.Color := clr; x1 := dayRec.Rect.Left - dx; x2 := dayRec.Rect.Right - dx; - RenderCanvas.FillRect(x1, y1, x2, y2); + TPSFillRect(RenderCanvas, Angle, RenderIn, Rect(x1, y1, x2, y2)); +// RenderCanvas.FillRect(x1, y1, x2, y2); end; end; end; @@ -606,6 +641,9 @@ begin FGanttView.Init; FGanttView.VisibleCols := FGanttView.CalcVisibleCols(RealRight - RealLeft); FGanttView.VisibleRows := FGanttView.CalcVisibleRows(RealBottom - RealTop); + + RealColWidth := round(FGanttView.ColWidth * Scale); + RealFixedColWidth := round(FGanttView.FixedColWidth * Scale); end; end. diff --git a/components/tvplanit/source/vpprtprvdlg.lfm b/components/tvplanit/source/vpprtprvdlg.lfm index 715308c5d..160a421ab 100644 --- a/components/tvplanit/source/vpprtprvdlg.lfm +++ b/components/tvplanit/source/vpprtprvdlg.lfm @@ -14,7 +14,6 @@ object frmPrintPreview: TfrmPrintPreview OnCreate = FormCreate OnKeyDown = FormKeyDown OnShow = FormShow - LCLVersion = '1.9.0.0' object Panel1: TPanel Left = 0 Height = 58 @@ -32,7 +31,7 @@ object frmPrintPreview: TfrmPrintPreview Width = 538 AutoSize = True ButtonHeight = 25 - ButtonWidth = 25 + ButtonWidth = 23 Caption = 'ToolBar1' EdgeBorders = [ebBottom] Images = imMain @@ -63,28 +62,28 @@ object frmPrintPreview: TfrmPrintPreview ShowCaption = False end object btnPrevPage: TToolButton - Left = 82 + Left = 80 Top = 0 Action = actPrevPage AutoSize = True ShowCaption = False end object btnNextPage: TToolButton - Left = 107 + Left = 103 Top = 0 Action = actNextPage AutoSize = True ShowCaption = False end object btnLastPage: TToolButton - Left = 132 + Left = 126 Top = 0 Action = actLastPage AutoSize = True ShowCaption = False end object ToolButton8: TToolButton - Left = 157 + Left = 149 Height = 25 Top = 0 Caption = 'ToolButton8' @@ -92,7 +91,7 @@ object frmPrintPreview: TfrmPrintPreview Style = tbsDivider end object btnCancel: TToolButton - Left = 162 + Left = 154 Top = 0 Action = actCancel AutoSize = True @@ -164,209 +163,150 @@ object frmPrintPreview: TfrmPrintPreview TabOrder = 1 end object imMain: TImageList - left = 272 - top = 160 + Left = 272 + Top = 160 Bitmap = { - 4C690600000010000000100000005B4848005B4848005B484800564343008679 - 799CD1CDCDF3D1CDCDEFD0CCCCEFD1CCCCEFD2CDCDEFD3CDCDF38E8181A75747 - 47025D4D4D005D4D4D005D4D4D005642420056424200554242004D3A3A009387 - 87AFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F9494BB4F3F - 3F05584848005948480059484800444141004F4444005C464600563F3F009386 - 86ABFDFDFDFFFFFFFFFFFBFFFFFFF8FFFFFFF5FFFFFFFAFFFFFF9F9393B75945 - 4504614C4C0050464600464545004041410043444400584C4C00513F3F009B8C - 8CA5FDFDFDFFFEFFFFFFF8FFFFFFF5FFFFFFF1FFFFFFF8FFFFFFA79898B25443 - 43005C51510045454500424444004141410041414100454949002A2C2C13958B - 8BC1FFFFFFFFFAFFFFFFF5FFFFFFF2FFFFFFEEFFFFFFF9FFFFFFA29797CC2A2C - 2C1C474A4A0042424200434444003F3F3F094D4D4D686D6B6BB97E7B7BDEACA5 - A6FDF9F7F6FFF5FAF9FFF0FAF8FFECFAF9FFE8FBF9FFEFF9F9FFB4ACADFE7E7D - 7DE2727172BD5351526F4143420C59575787C8C2C2FFF6EFEEFFEAE5E5FFC3B4 - ABFFEEDCCCFFEFE2D4FFECE2D6FFEBE3D7FFEAE3D6FFEADFD0FFC5B6ADFFE0D7 - D9FFEEE4E3FFC7C0BFFF5F5E5E988F8E8EE0FFFBFAFFF8F4F5FFDFDBDBFFE0CB - ABFFFDE5BBFFFCE0B3FFFBD9A3FFFCD396FFFBD090FFFECF88FFE4C088FFD4CB - CAFFCDCCBBFFE2DBCFFF968F93E8B0B0B0F0FFFFFFFFF1EEF2FFDDD5CFFFF0C0 - 73FFFFB749FFFFA625FFFEA218FFFEA116FFFEA116FFFF9F11FFF09C21FFDBCD - BDFFE4E3E8FFF2EBEBFFB7B2B3F1A69F9FF1EDE4E4FFEBEBF1FFE5D1C0FFF987 - 22FFFF7500FFFF7500FFFF7600FFFF7600FFFF7700FFFF7700FFFA7502FFE7C4 - AAFFECF0F8FFEAE0E0FFB1A6A6F0988D8DEFCEB9B9FFCEBFC1FFD8C3BCFFE0A7 - 8AFFE6A580FFE9A276FFE99D6EFFE99D6EFFE9A175FFE6A67EFFE0A88BFFD9C1 - BAFFCEC0C2FFCEB9B9FFA39494F0958E8EE6E2D0D0FFC2B2B2FF625F60FF666A - 71FF6D7279FF6C727AFF6D727AFF6D727AFF6C737BFF6D737AFF686D74FF5F5D - 5EFFB9ACABFFE2D0D0FF9E9696EB878585CEF5E9E9FFD1C8C8FF787676FFB5B5 - B4FFC2C1C1FFBCBBBBFFBCBBBAFFBAB9B9FFB9B8B7FFBBB9B9FFB5B4B4FF7877 - 77FFC9C2C2FFF8ECECFF908C8CD96465656BC7C2C2F5DDD5D5FFDED5D5FFFFFF - FFFFFFFDFDFFFCF8F8FFFAF5F5FFF8F1F1FFF5EDEDFFF1E9E9FFF6EFEFFFE1D6 - D6FFDDD6D6FFCCC8C8F66A6A6A7A52535304666868497E7373A4E8E3E3FFFFFF - FFFFFBF9F9FFFAF7F7FFF8F4F4FFF6F0F0FFF3ECECFFF0E8E8FFF2EBEBFFECE5 - E5FF827676B6625D5D4D55585806525454006E68680087787884D8D4D4F3DBD7 - D7F0DBD7D7F0DAD7D7F0DAD6D6F0DBD5D5F0D9D4D4F0D9D3D3F0D9D3D3F0DDD8 - D8F38778789C5A4848005E505000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00A8360000A8360000A8370000A8370000A936 - 0000AD3A036FA74716FF9A35057B99310000942E0000B13D0000C1450000BF43 - 0000BC3E0026C35115D5C85511DDA2340000A2330000A3320000A33100009F26 - 0068BE7552FFDDBA92FFA0380DC0972600019D2C0000BA410000C0450000BD3D - 0019C14B16C9ECC4A6FFDA7D41FB9B3200009B2D00009C2B00009A25005CAF5A - 32FBF6F4CFFFE9C392FFA43606BE9B2A0001AD370000C6490000BE420007C043 - 07C2E7B491FFFFFAD6FFDF7832F89C3200009C2E00009A26004BA95029F1EEDB - B0FFFFE7ABFFD78D53FFA63602A0A8360000C1460000C1440009BF4102B5E2A2 - 7BFFFFE7BDFFF9C383FFDD6618F19C32000098240036A24321E6E8D0A6FFFFD3 - 8BFFE38E4BFFAA3C08D5A737001FB4410000BE3D0001BC3A00A3DF986DFFFFD9 - A7FFFBB064FFE26E20FFD8510072982A00299C3916D9E2C397FFFFC475FFE880 - 2EFFAC3F0AE1A535002CB6420000C3450004BC3B0093DB8C5DFFFECD96FFFE9B - 42FFE46E1AFFD64C0083D95200009E3B0FD0DEB688FFFFB760FFEE6F0FFFAF3F - 02E6A9370031A93A0000BF450000C144006CD8824DFFFDC185FFFF8622FFE765 - 0BFFD953008CDD580000DD590000A04417D8E69950FFFF7D0FFFEC6605FFB347 - 0FE1B73F0026C64B0000C5490000C5490374E0803BFFFF8C2AFFFF6D00FFE866 - 0CFFE15B0583EF5F0000FB690000992F0034A93904E1EB7A1EFFFF8214FFEA80 - 36FFBD5118DAC2460024CC500000C64C0007CE4B00A1E96D13FFFF8219FFFE80 - 22FFEF7F32FFEE600276FB6700009C330000A1340043B9490AEDF18022FFFF85 - 1AFFEA7C2DFFC7520CC9D0510019CE510000CF510006DA5601AEF1781BFFFF84 - 1DFFFE8425FFF6791EFCFA6800649B330000A4370000AF3C0059C6540CF7F685 - 25FFFF8318FFE7660AFFD1510098D1520000CF520000DF59000FE86002C0F77F - 1DFFFF8621FFFE7911FFFE6C03ED97300000A0350000AE3C0000B9410066D35E - 10FFFC902DFFF57610FFD85500BED6550001D4540000DE590000EB600011F467 - 03CDFE8726FFFF8622FFFF6E02F7B7440000BB460000C1490000C54B0000C94B - 0075E16C17FFF48225FFDF5B03C0DC560001DB570000E05A0000EA610000F566 - 0024FE6F07D1FF8C2BFFFF770FFAD0530000D0530000CF520000CE520000CD51 - 0000D655027CE36209FFE45F0284E35D0000E35D0000E45C0000EA600000F668 - 0000FF6A0031FF7106DFFF7005E4FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000932900009730 - 00009A350000952B0000952C00009A330000983100008F20004A9A350FD9A84E - 24FFA23905CCFFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000932900009730 - 00009A350000952B0000962C0000983000128F200090A0411EFCDFBEA8FFE7C0 - 9DFFA93C0DF7FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000932900009730 - 00009A350000952B000094290047922602CFB86F51FFF1D6BBFFFFFFD8FFE9BF - 8BFFAF3F0AF7FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000932900009831 - 0000993300069226008C9C3A15F8D5A488FFFDE4C0FFFFD99EFFFDD496FFD588 - 4FFFB33F03E8FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000942A00009429 - 0036902400CDB26443FFECCDADFFFFD7A1FFFFBA6DFFF1A65FFFC56227FFB039 - 00CCB7420041FFFFFF00FFFFFF00FFFFFF00FFFFFF00983100098E2000829832 - 0FEBCE9A7BFFFBDBB0FFFFB568FFFD9437FFDC782DFFB5460CF6AC33008CB742 - 000EB9460000FFFFFF00FFFFFF00FFFFFF00FFFFFF00952D00C3B25F37FFECC5 - A0FFFFC382FFFF841FFFF6740EFFC2510DFFAE3B00CEB23E0038B13C0000B642 - 0000B8460000FFFFFF00FFFFFF00FFFFFF00FFFFFF00962E02CCBA6D40FFF3A9 - 61FFFF861AFFFF7201FFF56B03FFC35312FFB6460EC6C0430029CB4B0000D655 - 0000E15C0000FFFFFF00FFFFFF00FFFFFF00FFFFFF009832000A92250090A83A - 05F4DC7523FFFD8E29FFFF7A0CFFFD8121FFE28649FFC85A1BEFC746007DD654 - 000CE15C0000FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000972E0001A235 - 0045AB3B01D8CD5E14FFF58524FFFF7E10FFFF7C14FFF58C39FFDB6E24FFD554 - 02C2E05A002DFFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000972D0000A539 - 0000B241000DB842009BC65107FEEB771CFFFE7D14FFFF7307FFFE821EFFEC6E - 13FFE25C00E2FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000972D0000A539 - 0000B3420000BA440000C3490058CB4F01DAE36A12FFFB7D18FFFF7608FFF96E - 06FFEA6201F7FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000972D0000A539 - 0000B3420000BA440000C44A0000D151001ED653009EE46208FFF87814FFFA72 - 0AFFF26500F7FFFFFF00FFFFFF00FFFFFF00FFFFFF0098310000972D0000A539 - 0000B3420000BA440000C44A0000D1530000DA570000E2590057ED6303E4F56C - 06FFF76A01D6FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF009A3505C7A74D25FF9B36 - 11DD9725004FA83B0000B5420000BB410000C5480000D2540000DB560000E659 - 0000F0640000FFFFFF00FFFFFF00FFFFFF00FFFFFF009A340CF7E1BB9AFFE2C4 - ACFFAB4A22FFA22B0095B33F0016BB420000C5480000D2540000DB560000E659 - 0000F0640000FFFFFF00FFFFFF00FFFFFF00FFFFFF009A330AF7E3BA88FFFFFE - D7FFF4D9BEFFC97C56FFB13802D3BA3F004EC5480000D2540000DB560000E659 - 0000F0640000FFFFFF00FFFFFF00FFFFFF00FFFFFF009F3302E5CD814CFFFDD3 - 96FFFFD89EFFFEE4BFFFE5B08CFFC45318FBC4430092D1520009DB560000E659 - 0000F0640000FFFFFF00FFFFFF00FFFFFF00FFFFFF00A3380039A63200C9C45F - 24FFF2A65EFFFFB86CFFFFD39EFFF6D2AFFFDB7E48FFD04902D1DA50003CE659 - 0000F0650000FFFFFF00FFFFFF00FFFFFF00FFFFFF00A53B0000AD3C000DAF34 - 0086C14C0BF3E57C2DFFFE9437FFFFB064FFFDD9AFFFEDAF7FFFE05D12EFE451 - 0088F0640009FFFFFF00FFFFFF00FFFFFF00FFFFFF00A53B0000AC3C0000B33D - 0000C0460032C74900C9DB5F0BFFFA750FFFFF801CFFFFBD7DFFFACCA2FFEF84 - 3AFFF16100C7FFFFFF00FFFFFF00FFFFFF00FFFFFF00CD510000CD4F0000CD4D - 0000CE4B0024CF550DC0DE6314FFF96D05FFFF7000FFFF8117FFFDAC60FFF791 - 43FFF76602D0FFFFFF00FFFFFF00FFFFFF00FFFFFF00CD510000CD4F000BCB48 - 0077D56018ECEB8B48FFFE8224FFFF760AFFFE8B27FFF88423FFF46606F7F65E - 0095F969000FFFFFFF00FFFFFF00FFFFFF00FFFFFF00CC500028CC4E01BFDC6C - 22FFF88D3BFFFF7B16FFFF7A0DFFFC8724FFF67515FFF36502DCF664004AF764 - 0001F9690000FFFFFF00FFFFFF00FFFFFF00FFFFFF00CE5000DFE46A11FFFD82 - 1EFFFF7306FFFF7B12FFF97F1BFFF26A08FFF56400A2F7680010F7660000F764 - 0000F9690000FFFFFF00FFFFFF00FFFFFF00FFFFFF00D65601F7F46D07FFFF77 - 08FFFC7C16FFF37412FFF06401DDF465005EF6680000F7680000F7660000F764 - 0000F9690000FFFFFF00FFFFFF00FFFFFF00FFFFFF00DD5A00F7F66F09FFF978 - 14FFF06908FFF06300A5F3660024F4660000F6680000F7680000F7660000F764 - 0000F9690000FFFFFF00FFFFFF00FFFFFF00FFFFFF00E45D01D1ED6606FFEE65 - 03E8F063005CF3670000F3670000F4650000F6680000F7680000F7660000F764 - 0000F9690000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00B24810D3B44B17E0B2370031BA410000C548 - 0000B5400000973100009D3400009F380468A34517FF972D057C9E330000A036 - 0000A03500009F3500009E340000C26838F9E9C3A8FFBA4C1DD1B83B0024C448 - 0000C04500009B2B000090230000993109A6D8B18AFFBE7D5BFF97240073A030 - 0000A4330000A7360000AB3B0000C36329F6FFF6CEFFE7BB9CFFBC450ACDC044 - 0010D2510000AB3600008C210000972C04A4E0B887FFFCFCD2FFB6633CFF9E25 - 0066A8310000B2370000BB420000BD5114EBF2BD7EFFFFE9BAFFE3A983FFC144 - 04C0C949000ED45200009F320000972D0088CD824BFFFFE5A8FFF3E0B3FFB55D - 30F7A52B0058B0370000B9410000B63D0064C95E1CFDF9AD62FFFFD7A2FFE2A1 - 76FFC64200AED5500007B4430000932E001AA03506C9DF8947FFFFCF87FFF0D8 - A8FFB65428ECAD2E0042B9410000B7400000B83C0078D46218FFFC983FFFFFCA - 90FFE19564FFCC46009FDF590006BA460000992E0025A83B07DBE57D2DFFFFC0 - 6FFFEDCC9CFFB84D1CE1B63A0034B8400000BA400000C0430082DB5D09FFFF84 - 1EFFFEBF80FFE48E54FFD751007FD04F00009B330000A5370027B03F01DFEC6D - 0FFFFFAF58FFEBC08DFFBE5113D9CA4D0000C8490000C54B0478DB600FFEFF6F - 00FFFF8924FFE9883EFFD8560487D3510000AF3E0000AE3A001AB1460DD9EA66 - 06FFFF790BFFF09B4EFFC35A1AE0CA4C0000C6490169D9712FFDFC8224FFFF82 - 17FFE96F15FFD64E00ABDE590009C74D0000AD39001EB14814D4E57E37FFFF80 - 13FFF17E1EFFC34906EABC41003FC94C0056D7651BF7FA8326FFFF841AFFEC77 - 1CFFD75401B9DC56000BC34A0000AE3D0012B0430ABDE2762CFFFF851AFFF583 - 22FFC5530BF3B841004FBE460000D15302E7F57310FFFF871EFFF07B1FFFD956 - 03CADB570016DB570000B4410000AE3E0082D65C08FFFF8316FFF88625FFCA58 - 0FFABA410064BB430000BE460000DA5901F6FF871EFFF38327FFD95804D5D955 - 001DE05A0000C2490000AD3E0000B44100A4E96E0DFFFE922CFFCD5C12FFBA41 - 0070BB430000BB430000BE460000DE630DF9F5872AFFDB5C08DBD853002FDB57 - 0000D4530000BA430000B33F0000B94402A6E67923FFD7681AFFBB430082BE46 - 0000BF470000BE460000C0480000D95B05DBDD5D07E8D954003BD9560000DC57 - 0000CD500000B7450000BB470000BD49016FC65108FFC0490287C0480001C149 - 0000C1490000C1490000C1490000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF - FF00FFFFFF00FFFFFF00FFFFFF001919770014146E1F252596C32424A8F41A1A - 7B5818187A00161680001515850013138700111188000E0E85000E0E884B2525 - B0F22323A9CF01018A29030393001818731F22228EC35A5AEBFF6868FFFF1D1D - B3F618187B5B16167E001515850013138700111186000D0D844C1F1FB5F18787 - FDFF8484F2FF1E1EA9CC00008F2B2D2D95C95B5BEDFFC9C9FFFFEDEDFFFF6969 - FBFF1111B9F61515805915158400131386000F0F864A1515B8F17474F8FFEBEB - FFFFDEDEFFFF8B8BF3FF2D2DB0D53535A8F66E6EFFFFD4D4FFFFDFDFFFFFD3D3 - FFFF5D5DF7FF0808B6F413138553101086450B0BB3F26262F4FFD2D2FFFFD9D9 - FFFFD6D6FFFFAAAAFFFF4343C2FB19197B5A3333B6F46767FDFFBBBBFFFFC8C8 - FFFFC4C4FFFF4D4DF4FF0101B6FB0202B0F84C4CF1FFC1C1FFFFC6C6FFFFBFBF - FFFF9494FEFF4343CAF80505986A13137900151579592929BDF65C5CFCFFAAAA - FFFFB4B4FFFFB0B0FDFF3D3DECFF3636EAFFABABFDFFB3B3FFFFACACFFFF8181 - FDFF3B3BCDFB0404936B0000940015157A001010780014147E5B2020B9F74B4B - FAFF9393FFFFA0A0FFFF9696FDFF9595FDFF9F9FFFFF9696FEFF6A6AFBFF2C2C - C8FB0303946B000091000101960015157A0012127A000F0F7C00101082501818 - B7F94242F4FF8585FFFF8F8FFFFF8E8EFFFF8787FEFF5757F5FF1F1FC5FC0101 - 955D0000920000009400010196000A0A8900080887000A0A8500101084402222 - B5F70E0EE7FF2A2AE8FF4242EAFF4242EAFF3737E7FF2929E7FF2323C2FA0101 - 964D0000980000009E000000A3000A0A8900050585000F0F844C2C2CB7F21818 - F0FF0000E0FF0000D5FF0000CCFF0000CCFF0B0BD4FF2020DFFF3D3DEEFF3030 - C6F602029A5B00009C000000A300080888000C0C844A3535BCF11E1EF5FF0000 - EAFF0000DFFF0000D7FF0101DBFF0606DCFF1313D7FF2222DEFF2F2FE7FF4E4E - F4FF3D3DCCF603039D590000A2000F0F894E3838B8F22525FAFF0000F1FF0000 - E5FF0000DFFF0505E3FF0A0AC5FD0B0BC1FB1616E3FF2121DFFF2E2EE4FF3C3C - EEFF6060F9FF4343CBF40404A45E3939B1F23030FFFF0000F8FF0000EBFF0000 - E7FF0A0AEBFF1313C7F80A0A9660060695511313C5F42929E9FF2F2FE6FF3C3C - EAFF4646F4FF7777FFFF4545C9F72E2EAAD43636F3FF0505FAFF0000ECFF1010 - F1FF1C1CCCFB0909956B080893000606940002029A591E1ECBF63A3AEFFF3B3B - ECFF4C4CF6FF7171F7FF3434C0DF09098B2B2B2BA9CC2E2EF1FF1A1AFBFF2424 - C9FB0A0A966B0505920009099500070795000101970001019C5B2727CAF64F4F - F7FF6161F5FF2E2EBDD70000A2380A0A8E0006068B292323B2CD2828C2F90909 - 9869050593000707940009099500070795000202990000009A000202A45B2A2A - C9F52525C1DA0000A0370101A400 + 4C7A060000001000000010000000911000000000000078DACD97075055D7B7C6 + D7BD7450411144A2A8081A2CC458B087008222A0227640B11144D1BFBD1B4510 + 13093152C4125154C460C18614518A0D052B55441050BAF47B69F77E6F5D306F + 3289C973266FE6BD3BF3CD3973CFFE9D75F6DA7BEDB596E39429E4F851732C2C + 68DFD6ADC79FA7A5D5B3AA9FA5A6563F67BDE0FB97FC9FDF9E3DE7E64E9E2C74 + B6B3A3DF35C7DCBC5DB35976E3C691BF8FCF65FCCD2F2420206EBAA9A9C23CB6 + 35FFA3269999D1F44993C8C9CA8AE6989A92FFBE7D111289A47D7C2BAB89D5C8 + 6A91F1FEFE37E75B5ACA2FB6B5A5193CDECAD292BE65DE82F979FC9F3DF3C77C + 7DCFCA78E91FD8DA8FF7E78283AFCEE2393AD9DB9325B3E6CC99312F93A5B535 + 0D1A324433F0C081447CB42763EB581F58CDACD0C38753794CAFC953A79239CF + 5766D7D4D454C5CECECECD63E5CA985DDBB7BFB970364CD22C16A1B1A519352D + 4DA8E46B696B33AA9B9B71FDC245E9AE9D3B0BD7AD5D17EF603F738D998579A7 + F973E7FA3C4C4A82A8FA03CADFBD43F2F5087C789D8AEAC274541666A2A2280B + E5459928CF7F867B5117519095830FC545789070078B162E0CFED9CFAF00AD2D + 686A68447E6E2E0A1E4740F22E0E6D05D7D09A731A6D2F83D0FAEC20A44FF7A3 + 38613FD21F3F425A6A1C0A739F22E867FFD2C8C8C81AD97C6B3FD4212FE3296A + 12D60337AD813043484375203DA5DD2E847445CDF17EC84D8B47715129EA2A2A + 70F3EAB5DAB09090DAAAE2625454D4E2DDF30434FBE8031BA9439B3E6A73875A + 360A5172F73754D634A1BCA00057C2C26A827FFAA9FA494C0C9EDC494476F22D + 149CFB11EFCFEE4659E82694FDBABA43A736E27DD82E14841F404E622C9E2424 + 41C69C0E08A809F4F37B5FF8EC1992AE5EC592452E70755F0B8F755BB16ADD36 + BE7668D5FAEDF058BF0D6E1E1BB0C87921622E4440C69C080AAAF0F1F67ED258 + 5686E70F1F62CBA64DB871E33A921213712B2E8E158B58B613137D13717CBD71 + FD3AB66CDE8C145EAFA6CA4A1CF4F5CD59B67CF9CA0749498D79191978C36AFF + F1FE6B6B6A424B63239A6A6BD15855855AB621AAAEC6DBCC4CE4B1521F3E14B9 + BBBB6F9BE9E020EFEAE666BD6BFDFA33A545451DFB9EF74A8B58CC6BDA00514D + 0DEAD9564D6987CF2B798F786EDA14B5C4D9D96EF6BC798A3367CDA2D56E6EE4 + B3658B57767A7A7D6E56568D4CAF64CACCACC9CDC8A8C9494FAFC979F9B25D79 + D9D9F53CF6F8028EBD853366F0C2E05F29DC843A34BA43E7F9FEE238B935E726 + 6BE3E82885ED47BE260A3026BA329128D192E88E05D1AD6F6840B2BD56C6C3D9 + 5DF3424712858E203A3D9CC563430690DBED8D3391177B0827C7744E383C8004 + BF0E218A35234A603E7E22F54CB4D14EA9BC1B86573BCD5A8F31776C28D1F1C1 + 44470DC9E9F282E1ADA286A7284B3E8433268AB78F0D22C145FEAEFBD644B7CD + 4929C14229A9E4FA2F1CE099C8DF32BCE938F3C7F9FB8E0E209BF3338C6A3FE4 + 46022511C8FAC9016126C293B2B9255AB12691CA1D33E18DC2D0EDFC3C1ECDC9 + 7B91E7AA532BE3830DC824D4A2DFFBD26761C0CB0328F2B3C16F139433CE8DA6 + 3ED7F9BB6F4F24C1AD71743A3FD803C83987D6C865285CDD17D9F6B42E781019 + 1D1FAB9D53987C18B8BB11A5BB8D71C154F5EDD9513424CA9C28D992E46F8D27 + FF5C5F6748D382203D668EE2D5BAC8B4A5BD3933894E8C577FF6266A3FC7AC0B + 3EAC51C76553E1FBF3A3E9EBF3E3D8D796EDDFBD2ADBD30E92446F609F3E4A96 + AB21C7817CF3E611E5CD273A39A947F6FB2333809DEAA87455C0B5C9EA6F6F9A + D280FB3644F7AC6592DB50B07B3CE03B08F02094BA76C25B4785BDD58B885A57 + 101DF98A469E1F2BFFB6629B1EE0D91DE5BB4D106FAFF32AC98A0C5267B0DF6D + 49E9890D9D2AF3D0E4E73D21DDAD8FEAEF87E3838B7053EB77EC7B5EFB5323C9 + 22C65AB5AA969FC15B17E53B86E2C1CC4E29CFECA9E7137BA2A7F6A4F86A8EE0 + 52ED962F00AFDE907A1942B455AFADC58D961D63FE0CAFEFE50934FFFEAC4E62 + 91B721B0570725AEAA786E4FC1CFD9474F59F9F349BDD4459820FEBE37FBA11F + A45BBB42BA4AAEEAF030F6C128A24B138862CCC8F5E5420DB41D1C8AC64D1AC8 + 9E4DB7336793207D16D11BF655850B756DF84E2E4DEA33A0DD97582D14DF9C44 + 1427DB1F325FB1CF526C68E3DB553DD0E069887C47B984D77348903B97A86001 + 51F962A246573290AE517A0EDFC17C26AAB73C73209249F68D4F58693CDFCCD9 + C21D454B5450BC48E855E44C2453B113F32E44223722B8D3D758AB988FFF2814 + FFDBF8FDDF5230C7AEBF1191CC9F47D99F811C8F811CB747797D64CF7EEE4B53 + 8F8E52CF099F6680D0B10AA99FC307311F3C8CBA317BF0A4995E5BFEED709424 + FC8AF3133A8B3F870F30A2C98706089F46AFB1476D661C0FCB46D99D031C23AA + 7FCBCBAE474690E2A101E47B7C9C5653C699FD90142770DC9E80243D0819FBA7 + E39AA95CE9A7F88041ED364D0E1A50DAD56516A84CBB08649D02623D501BB608 + F7960C44E4584ABD694E669FE055FCFA9267F070F58A2747B7A355760EDD7083 + 2460345E6F198A1B569D441746902FB35D6278BFFD990F1C4AC957178D46E5BD + 9340B227C7491F88367441927D675C1A4F4FAE7E4363AEF01E979D29D19FE083 + 8C85A9B11EDFA2FEFC62DEDBBAC03A011A57CA21D9A11BA2ACBADC4FB020A3C7 + 36B2BD49F4D6E9AF7CF070523D644807C3C72934BCDED81F123F23605B2748F6 + F443E13E6B3C5CF045F5032BDA99398B3A7D9267FF1D362641E828B28C182FC8 + 4E5BD81D8DDE06C02E0D6007DFFB8E45EE6A0364CC1226712C0DFD24CF79E0EC + 58A2AB66D439DA9C8EDDB75792566CEE05E9CEEEC07A25483DF550B95A13854E + 54F84FFC35F6512CC775B235CD7B3C5DF0AAC8BD1B5A77EA702DA38CE6D58A28 + 5F22107F0E7F772A119F417A990E74A27889329AB67447CB3A55D42DA7CFE7F9 + 6C78C5E747E17C9A5BB554AEB8719522C4EE82CCFF2F71FFBB38D73F38676788 + 63265DF30E1BD2F4F0F14437781E719CFFEE4D217AC16768EE1CA2F77C8ED62C + FBEBFA1F1DD949FC36EE280AEF5E40C4547D840EA6C06BA6A41D67FE99FC0855 + 71512CE74169161A726E2365C71C5C19237C196B4AD33E870F19217C97B6C716 + 12AE97917D02D2E23B7817E98BBB0E3AAD772DE810E711957FE24F8FA1B161C3 + 29E5EE2203D4852D04A257712D7002A2179791BB6B0A9E590B9FBF9A4113DAF9 + E57FE5CFB2BF2E4EA0CE9747D2BE445BB5FA779C03A51CFBE05A419273195597 + BF478173B7EA627BDACFF6553EC55FE0F8BEC6755682150D7F604D29B98BD4B8 + E6560776F702E277A2253514D55EE350BB981EFC9997E59DB4E92C3BCE433664 + F07476E784374BBBA3D94301F80F0FD9D303920B2E10FF6201B1ABF0D9DFF06A + 8FA7D0E60C179DCA8A035338DE387E37A9427A60209ABCFAA3C155512C5A4881 + CD2B48FDCF3CD70A5FA64E13DC79BD4A1F4D3F71BDB19D7B8E6D9DD1E66300D1 + 462DD42F17BE162DA3A9E2652460FE2FFE7B3283F28BDDBB42C2318EF58ACC77 + 43F3F75FA0CE5D198DCB2854EC461A625722E6E9537CE61C81B8C1438973B232 + DA7668A37E4337D42C13E4352CA785B29C2B96E91FF8BC052416AD514133C778 + CD0A65D42CA5B3F59CEB1B5C3B72F6FFC4173B0B9E57B92AE2C372B952669DEA + B9369289ED7F16FF7FA5AB53345E5EB7E95170956BCED88FB17EE35B3ECBF83C + FB956BFB9031F26EA72D7BE0F050851D27B8163869D2516F85B04EF0F324B731 + CD65C9E188B5EDFD3C7A3C19DC9DD251E71FE3FC7DB03FE7E2AF55C2B2AFFC88 + DB3B1D71D880D69FE4FC7E86DF738EDF13C17B3E79A99108A22728893B8E5B96 + AA69099348E305EFC5087EEEDB8FBF6388FC9982681FB4B5BD40D4D209386148 + AEE1FC6DFCBD243B5BE2EDBB57D4C5EF02CA6251747E2F1227C927A458539774 + AEC54286B79FC9FBD33C6D8077E1A8E79EFA86F330F1D9C1342F72747BBD4851 + 136959CAC25E92E68B4B38D787A2F0D426DC37A74B193348E93AF73AFEC6A47B + 7294624AFE0F9381A73EA8C90E47D4AC2F2B2F1A93B98CBFC9BE8A9E405BD297 + E8A02DD8147874106F039721D58A42B866558CE55C7DC4980CC3C72BE5BEDBC9 + 692F610DAA528F23DAAED7DBA87134329AF95816E767CF5C673E16BCF420BDB3 + 1BC57EB390654FDF3FE39896D5C86747D3C04853417EA50787DEE579A848F809 + B7ED35731E71BC3F6CAF5DE5B7E4BAA84BB18697F5070394EDFF06D973E47D5E + B22F2F7FC3F5F138D2BD62D539A79CF728B6AAA1E6D834242FD02D78642BEBAD + 042B72D67E256993C5BB670F94ADD142E6348AE09A59E501BFFFE258D2BB32A5 + 7BFABB5D7C9EEDD644ED2E3D245B2B96DF3223D3145B9A93B5FC0B71CB5EAEA9 + BD7451C9F93A6B962086EB66B564CE7F972652B7480BD5F8C24D43DA7B83C6BD + FAB8E7A0561F6D46D36F5BC9F2A3B0A4713DD7083E7AA8D9DE073973E41E71BD + AD2DABB965BDD7A56FC833D349997B026D34ED33C4A379EA2DBC4F97C5F1DAC8 + F857F30522195BBF772072E6C967E4CCA6DEB25A3D897D72F19BF6779C295BDD + 19D2434390E6D40DCCFE47C6FECEBF59DAB9B9D16710729D9473B31DE82B99DD + 74CED9B1FC9CF317C54C1286BDDFDA1F596EBA60C653C6DC99DCC126F05ECF71 + 54C8CD73562ACD9945E37338BFBC663E8DFBA69B1C03713C2EDE5AB0E6BEBD32 + 12AC853E3C5E20EB33FEA87F1BBF3D7B6EA6EEDD57F731340C4A3630086FD0D5 + DD3E4F47671B696BEF262D2D6FD2D4F4A1AE5DF753972EDEACFD3686869175FD + FB9F7F2A10FC682427E74F3A3AEBFBE8EBFB252F5850013737A077EF6B221D9D + ED8EDADABBFEC0EFA3CE9DBD6CFBF4B951EBE3238197571DF4F4CEA772573078 + E8D0C01447C72AA4A4005555C08A15ADE8DA3546A4A5B57BBE969617F3FB485D + 7DDF542DADE8DA0D1B9A505101BC79031C38508FA1432333468D0A17AD5E0DA4 + A703F9F99C725F02CECE62282B4735686A7A3B6868ECB35453BB56B76449035E + BCE0323E07C8E4EAE9B7DF000B8BA4D69E3DB72F183122AAE1BBEF2488E316E1 + E1436EC3EF0276760D1008A25A85C2C8265BDB5A242602F7EF0377EE00010152 + 661F35292804BB6B6A6EE5796E9D6F64142F72726A6B7FEFF5EB9CB623259838 + B1122626E5888890E0DA35E0C2054EA37B24183F3EAD555EDE7F25770BCC6E23 + 0D8D2DBC06BB1CFBF68D11DBD8B4C0DF1F38C9657C5090048181128484C8EEA5 + 70776FC590210F5BE5E40298FD850482A076BE5BB76DECA31DFC1ECF193A3A37 + 9BCDCD1BE0CDEDFECF3F037E7E1C1A3E52CC9DDB883E7DEEB5090481DC4D1E22 + 996D19AFAAFA03292BFBF0D59B79AF6FF5F56F88BB7429C1A041A530372F6FD7 + E8D12530322A41FFFE492DCC704407337F8275BA9D5750F066FB5EB64386DCAC + D3D1A90177BBAC0C566ABBD4D4D2D1B76F3EFBE303860DBB2F120A8F3A72E7DF + CE2B2BEFA74E9DBCA68E1A75AB564FAF91C797B3F25959ECFF5C282ABE86A666 + 16F4F5DFE0ABAF4A306D5A03BF27552427F72B5752A16CF7876963C644D7191A + B63053CB7AD7CE2B28144155F59E444D2DB1555BBB08FDFAE5C3D8B81813267C + 808B4B33AFDFE30679F9330BC78EBD52376C18070235B12A5825CC55B0CD074D + AAAA412E8A8A81F69A9AF71A8C8CCAD8FE7BE6CB6165D580CD9B014BCB14B1B1 + F16FE92626F56C4F66BF121A1AB5E8D52BB555452570A5B2B23F292A0610CF77 + BE9EDE63D1B871D5BCF695B0B51561ED5A31468E4CC85751393078F0E0F3A9C6 + C6B5D0D56D8581414A2BDB5DA9A07088F81DA4A414C8EB749875DC71E0C047A2 + E9D3C558BCB891E7129FC5F31FA3AAEAC7360E18F5EF7F35EDCB2F939A555482 + 572828F83317F0DFBC5078847D7D94AF671C070D4A6934344C7CC55978B44070 + 86FE0B678DEAB0 } end object actMain: TActionList Images = imMain OnUpdate = actMainUpdate - left = 192 - top = 160 + Left = 192 + Top = 160 object actPrint: TAction Caption = '&Print' Hint = 'Print' diff --git a/components/tvplanit/source/vpweekviewpainter.pas b/components/tvplanit/source/vpweekviewpainter.pas index 1528d7655..d81126c67 100644 --- a/components/tvplanit/source/vpweekviewpainter.pas +++ b/components/tvplanit/source/vpweekviewpainter.pas @@ -365,21 +365,15 @@ begin Day := StartDate + ADayIndex; end; - { adjust the DayRect for the next day } + // Adjust the DayRect for the next day case FWeekView.Layout of - wvlVertical: - { 0 3 - - 1 4 - - 2 5 - 6 } - if (ADayIndex = 2) then begin - // Move the dayrect to the top of the next column - DayRect := Rect( - RealLeft + DayRectWidth, - RealTop + FHeaderHeight, - RealRight - 1 - delta, + wvlVertical: // DayIndex layout + if (ADayIndex = 2) then begin // 0 3 + // Move the dayrect to the top of the next column // + DayRect := Rect( // 1 4 + RealLeft + DayRectWidth, // + RealTop + FHeaderHeight, // 2 5 + RealRight - 1 - delta, // 6 RealTop + FHeaderHeight + DayRectHeight ) end else @@ -400,25 +394,28 @@ begin end; wvlHorizontal: - begin - if (ADayIndex in [0, 2, 4]) then - begin - DayRect.Left := RealLeft + DayRectWidth; - DayRect.Right := RealRight - 1 - delta; - end else if (ADayIndex <> 5) then - begin + begin // DayIndex layout + if (ADayIndex in [0, 2, 4]) then // 0 1 + begin // + DayRect.Left := RealLeft + DayRectWidth; // 2 3 + DayRect.Right := RealRight - 1 - delta; // + end else if (ADayIndex <> 5) then // 4 5 + begin // 6 DayRect.Right := RealLeft + DayRectWidth; DayRect.Left := RealLeft; end; if (ADayIndex in [1, 3]) then begin DayRect.Top := DayRect.Bottom; - DayRect.Bottom := DayRect.Top + DayRectHeight; // - 8; + DayRect.Bottom := DayRect.Top + DayRectHeight; end else if ADayIndex = 4 then DayRect.Bottom := DayRect.Top + DayRectHeight div 2 else if ADayIndex = 5 then - DayRect.Top := DayRect.Top + DayRectHeight div 2; + begin + DayRect.Top := DayRect.Bottom; + DayRect.Bottom := DayRect.Top + DayRectHeight div 2; + end; end; end; // case end; diff --git a/components/tvplanit/source/vpxparsr.pas b/components/tvplanit/source/vpxparsr.pas index 965085ed8..b4b198df1 100644 --- a/components/tvplanit/source/vpxparsr.pas +++ b/components/tvplanit/source/vpxparsr.pas @@ -337,6 +337,7 @@ type read FValue write FValue; end; + {== TVpNotationInfo ==================================================} TVpNotationInfo = class(TObject) private @@ -387,7 +388,7 @@ begin FContentModel := ''; FContentType := 0; end; -{--------} + destructor TVpElementInfo.Destroy; var i : Integer; @@ -399,7 +400,7 @@ begin end; inherited Destroy; end; -{--------} + procedure TVpElementInfo.SetAttribute(const sName: DOMString; oAttrInfo: TVpAttributeInfo); var @@ -467,7 +468,7 @@ begin FHasExternals := False; FXMLDecParsed := False; end; -{--------} + destructor TVpParser.Destroy; var TempFilter : TVpInCharFilter; @@ -496,7 +497,7 @@ begin FDocStack.Free; inherited Destroy; end; -{--------} + procedure TVpParser.CheckParamEntityNesting(const aString : DOMString); var OpenPos: Integer; @@ -516,7 +517,7 @@ begin raise EVpParserError.CreateError(FFilter.Line, FFilter.LinePos, errMsg); end; end; -{--------} + procedure TVpParser.Cleanup; var i : Integer; @@ -539,12 +540,12 @@ begin FNotationInfo.Clear; end; end; -{--------} + procedure TVpParser.DataBufferAppend(const sVal : DOMString); begin FDataBuffer := FDataBuffer + sVal; end; -{--------} + procedure TVpParser.DataBufferFlush; begin if FNormalizeData and @@ -569,7 +570,7 @@ begin FDataBuffer := ''; end; end; -{--------} + procedure TVpParser.DataBufferNormalize; var BuffLen : Integer; @@ -606,18 +607,18 @@ begin j := j + 1; end; end; -{--------} + function TVpParser.DataBufferToString : DOMString; begin Result := FDataBuffer; FDataBuffer := ''; end; -{--------} + function TVpParser.GetErrorCount : Integer; begin Result := FErrors.Count; end; -{--------} + function TVpParser.GetErrorMsg(wIdx: Integer): DOMString; begin {$IFDEF DELPHI} @@ -630,7 +631,7 @@ begin Result := UTF8Decode(FErrors[wIdx]); {$ENDIF} end; -{--------} + function TVpParser.DeclaredAttributes(const sName: DOMString; aIdx: Integer): TStringList; begin @@ -640,7 +641,7 @@ begin else Result := TVpElementInfo(FElementInfo.Objects[aIdx]).AttributeList; end; -{--------} + function TVpParser.GetAttributeDefaultValueType( const sElemName, sAttrName: DOMString): Integer; var @@ -665,7 +666,7 @@ begin end; end; end; -{--------} + function TVpParser.GetAttributeExpandedValue(const sElemName, sAttrName: DOMString; aIdx: Integer): DOMString; var @@ -700,7 +701,7 @@ begin end; end; end; -{--------} + function TVpParser.GetElementContentType(const sName: DOMString; aIdx: Integer): Integer; begin @@ -710,7 +711,7 @@ begin else Result := TVpElementInfo(FElementInfo.Objects[aIdx]).ContentType; end; -{--------} + function TVpParser.GetElementIndexOf(const sElemName: DOMString): Integer; begin {$IFDEF DELPHI} @@ -719,7 +720,7 @@ begin Result := FElementInfo.IndexOf(UTF8Encode(sElemName)); {$ENDIF} end; -{--------} + function TVpParser.GetEntityIndexOf(const sEntityName: DOMString; aPEAllowed: Boolean): Integer; begin @@ -734,7 +735,7 @@ begin end; Result := -1; end; -{--------} + function TVpParser.GetEntityNotationName(const sEntityName : DOMString) : DOMString; var @@ -748,7 +749,7 @@ begin Result := oEntity.NotationName; end; end; -{--------} + function TVpParser.GetEntityPublicId(const sEntityName : DOMString) : DOMString; var @@ -762,7 +763,7 @@ begin Result := oEntity.PublicId; end; end; -{--------} + function TVpParser.GetEntitySystemId(const sEntityName : DOMString) : DOMString; var @@ -776,7 +777,7 @@ begin Result := oEntity.SystemId; end; end; -{--------} + function TVpParser.GetEntityType(const sEntityName : DOMString; aPEAllowed : Boolean) : Integer; @@ -791,7 +792,7 @@ begin Result := oEntity.EntityClass; end; end; -{--------} + function TVpParser.GetEntityValue(const sEntityName : DOMString; aPEAllowed : Boolean) : DOMString; @@ -806,7 +807,7 @@ begin Result := oEntity.Value; end; end; -{--------} + function TVpParser.GetExternalTextEntityValue(const sName, sPublicId: DOMString; sSystemId: DOMString): DOMString; var @@ -840,7 +841,7 @@ begin raise; end; end; -{--------} + function TVpParser.GetInCharSet : TVpCharEncoding; begin if FFilter <> nil then @@ -849,7 +850,7 @@ begin { If no current filter then return last known value. } Result := FInCharSet; end; -{--------} + procedure TVpParser.Initialize; begin FDataBuffer := ''; @@ -860,7 +861,7 @@ begin SetInternalEntity('apos', ''', False); SetInternalEntity('quot', '"', False); end; -{--------} + function TVpParser.IsEndDocument : Boolean; var TheStream : TStream; @@ -882,13 +883,13 @@ begin end; end; end; -{--------} + function TVpParser.IsWhitespace(const cVal : DOMChar) : Boolean; begin Result := (cVal = #$20) or (cVal = #$09) or (cVal = #$0D) or (cVal = #$0A); end; -{--------} + function TVpParser.LoadDataSource(sSrcName: string; oErrors: TStringList): Boolean; var aFileStream: TVpFileStream; @@ -921,7 +922,7 @@ begin raise; end; end; -{--------} + function TVpParser.ParseAttribute(const sName: DOMString): DOMString; var sAttrName, sValue: DOMString; @@ -957,13 +958,13 @@ begin if sAttrName = 'xml:space' then Result := sValue; end; -{--------} + +{ Conditional section } procedure TVpParser.ParseCDSect; -{conditional section} begin ParseUntil(Xpc_ConditionalEnd); end; -{--------} + function TVpParser.ParseCharRef : DOMChar; var TempChar: DOMChar; @@ -1032,7 +1033,7 @@ begin VpUcs4ToWideChar(Ucs4Chr, Result); DataBufferAppend(Result); end; -{--------} + procedure TVpParser.ParseComment; var TempComment : DOMString; @@ -1048,7 +1049,7 @@ begin if Assigned(FOnComment) then FOnComment(self, TempComment); end; -{--------} + procedure TVpParser.ParseContent; var TempChar: DOMChar; @@ -1191,7 +1192,7 @@ begin end; EntRefs.Free; end; -{--------} + function TVpParser.ParseDataSource(const sSource : string) : Boolean; begin FErrors.Clear; @@ -1212,7 +1213,7 @@ begin FUrl := ''; Result := FErrors.Count = 0; end; -{--------} + procedure TVpParser.ParseDocTypeDecl; var sDocTypeName : DOMString; @@ -1248,7 +1249,7 @@ begin if Assigned(FOnDocTypeDecl) then FOnDocTypeDecl(self, sDocTypeName, sIds[0], sIds[1]); end; -{--------} + procedure TVpParser.ParseDocument; begin FXMLDecParsed := False; @@ -1266,7 +1267,7 @@ begin if Assigned(FOnEndDocument) then FOnEndDocument(self); end; -{--------} + procedure TVpParser.ParseElement; var wOldElementContent, @@ -1371,7 +1372,7 @@ begin FCurrentElement := sOldElement; FCurrentElementContent := wOldElementContent; end; -{--------} + procedure TVpParser.ParseEndTag; var sName : DOMString; @@ -1391,7 +1392,7 @@ begin if Assigned(FOnEndElement) then FOnEndElement(self, FCurrentElement); end; -{--------} + function TVpParser.ParseEntityRef(bPEAllowed: Boolean): DOMString; var msg: DOMString; @@ -1420,14 +1421,14 @@ begin end; end; end; -{--------} + procedure TVpParser.ParseEq; begin SkipWhitespace(True); Require(Xpc_Equation); SkipWhitespace(True); end; -{--------} + procedure TVpParser.ParseMisc; var ParsedComment : Boolean; @@ -1450,7 +1451,7 @@ begin Exit; end; end; -{--------} + function TVpParser.ParseParameterEntityRef(aPEAllowed: Boolean; bSkip: Boolean): DOMString; var @@ -1493,7 +1494,7 @@ begin end; end; end; -{--------} + procedure TVpParser.ParsePCData(aInEntityRef : Boolean); var TempBuff : DOMString = ''; @@ -1531,12 +1532,12 @@ begin DataBufferAppend(TempBuff); end; end; -{--------} + procedure TVpParser.ParsePI; begin ParsePIEx; end; -{--------} + function TVpParser.ParsePIEx : Boolean; var sName : DOMString; @@ -1558,7 +1559,7 @@ begin else DataBufferToString; end; -{--------} + procedure TVpParser.ParsePrim; begin try @@ -1592,7 +1593,7 @@ begin FFilter := nil; end; end; -{--------} + procedure TVpParser.ParseProlog; begin ParseMisc; @@ -1602,7 +1603,7 @@ begin ParseMisc; end; end; -{--------} + procedure TVpParser.ParseUntil(const S : array of Longint); var TempStr : AnsiString = ''; @@ -1630,7 +1631,7 @@ begin QuotedStr(TempStr)); end; end; -{--------} + procedure TVpParser.ParseWhitespace; var TempChar : DOMChar; @@ -1642,7 +1643,7 @@ begin TempChar := ReadChar(False); end; end; -{--------} + procedure TVpParser.ParseXMLDeclaration; var sValue: DOMString; @@ -1707,17 +1708,16 @@ begin DatabufferToString; DatabufferAppend(Buffer); end; -{--------} + procedure TVpParser.PopDocument; begin Assert(FDocStack.Count > 0); - if FDocStack.Count > 0 then begin FFilter := FDocStack[Pred(FDocStack.Count)]; FDocStack.Delete(Pred(FDocStack.Count)); end; end; -{--------} + procedure TVpParser.PushDocument; begin Assert(Assigned(FFilter)); @@ -1725,7 +1725,7 @@ begin FDocStack.Add(Pointer(FFilter)); FFilter := nil; end; -{--------} + procedure TVpParser.PushString(const sVal: DOMString); var MemStream: TVpMemoryStream; @@ -1744,7 +1744,7 @@ begin FFilter := TVpInCharFilter.Create(MemStream, BufferSize); end; end; -{--------} + function TVpParser.ReadChar(const UpdatePos: Boolean) : DOMChar; begin Result := FFilter.ReadChar; @@ -1753,7 +1753,7 @@ begin if UpdatePos then FFilter.SkipChar; end; -{--------} + procedure TVpParser.ReadExternalIds(bInNotation : Boolean; out sIds: StringIds); var HasEntRef : Boolean; @@ -1779,7 +1779,7 @@ begin sIds[1] := ReadLiteral(0, HasEntRef); end; end; -{--------} + function TVpParser.ReadLiteral(wFlags: Integer; var HasEntRef: Boolean): DOMString; var TempStr: DOMString; @@ -1914,7 +1914,7 @@ begin EntRefs.Free; end; -{--------} + function TVpParser.ReadNameToken(aValFirst: Boolean): DOMString; var TempChar: DOMChar; @@ -1965,7 +1965,7 @@ begin end; SetLength(Result, CurrLen div 2); end; -{--------} + procedure TVpParser.Require(const S : array of Longint); var TempStr : AnsiString = ''; @@ -1995,7 +1995,7 @@ begin raise EVpParserError.CreateError(FFilter.Line, FFilter.LinePos, TempStr); end; end; -{--------} + procedure TVpParser.RequireWhitespace; begin if IsWhitespace(ReadChar(False)) then @@ -2007,7 +2007,7 @@ begin 'Line: ' + IntToStr(FFilter.Line) + ' Position: ' + IntToStr(FFilter.LinePos)); end; -{--------} + procedure TVpParser.SetAttribute(const sElemName, sName : DOMString; wType : Integer; const sEnum, sValue : DOMString; @@ -2031,7 +2031,7 @@ begin oAttrInfo.Enum := sEnum; oElemInfo.SetAttribute(sName, oAttrInfo); end; -{--------} + procedure TVpParser.SetElement(const sName: DOMString; wType: Integer; const sContentModel: DOMString); var @@ -2055,7 +2055,7 @@ begin if sContentModel <> '' then oElem.ContentModel := sContentModel; end; -{--------} + procedure TVpParser.SetEntity(const sEntityName: DOMString; wClass: Integer; const sPublicId, sSystemId, sValue, sNotationName: DOMString; aIsPE: Boolean); var @@ -2078,13 +2078,13 @@ begin {$ENDIF} end; end; -{--------} + procedure TVpParser.SetInternalEntity(const sName, sValue : DOMString; aIsPE : Boolean); begin SetEntity(sName, ENTITY_INTERNAL, '', '', sValue, '', aIsPE); end; -{--------} + procedure TVpParser.SetNotation(const sNotationName, sPublicId, sSystemId: DOMString); var oNot : TVpNotationInfo; @@ -2105,12 +2105,12 @@ begin {$ENDIF} end; end; -{--------} + procedure TVpParser.SkipChar; begin FFilter.SkipChar; end; -{--------} + procedure TVpParser.SkipWhitespace(aNextDoc : Boolean); begin while (not FFilter.Eof) and @@ -2123,7 +2123,7 @@ begin SkipChar; end; end; -{--------} + function TVpParser.TryRead(const S : array of Longint) : Boolean; begin Result := False; @@ -2132,7 +2132,7 @@ begin IsEndDocument; end; end; -{--------} + procedure TVpParser.ValidateAttribute(const aValue: DOMString; HasEntRef: Boolean); begin if (not HasEntRef) then @@ -2145,13 +2145,13 @@ begin if (VpPos('"', aValue) <> 0) then raise EVpParserError.CreateError(FFilter.Line, FFilter.LinePos, sInvAttrChar + '''"'''); end; -{--------} + procedure TVpParser.ValidateCData(const CDATA: DOMString); begin if (VpPos(']]>', CDATA) <> 0) then raise EVpParserError.CreateError(FFilter.Line, FFilter.LinePos, sInvalidCDataSection); end; -{--------} + procedure TVpParser.ValidateElementName(const aName: DOMString); var msg: DOMString; @@ -2165,7 +2165,7 @@ begin raise EVpParserError.CreateError(FFilter.Line, FFilter.LinePos, msg); end; end; -{--------} + procedure TVpParser.ValidateEncName(const aValue: string); var i: Integer; @@ -2193,7 +2193,7 @@ begin raise EVpParserError.CreateError(FFilter.Line, FFilter.LinePos, sInvEncName + QuotedStr(aValue)); end; end; -{--------} + procedure TVpParser.ValidateEntityValue(const aValue: DOMString; aQuoteCh: DOMChar); var TempChr: DOMChar; @@ -2212,7 +2212,7 @@ begin end; end; end; -{--------} + function TVpParser.ValidateNameChar(const First: Boolean; const Char: DOMChar): Boolean; var @@ -2238,7 +2238,7 @@ begin else Result := VpIsNameCharFirst(UCS4); end; -{--------} + procedure TVpParser.ValidatePCData(const aString : DOMString; aInEntityRef : Boolean); begin @@ -2257,7 +2257,7 @@ begin FFilter.LinePos, sInvPCData + ''']]>'''); end; -{--------} + procedure TVpParser.ValidatePublicID(const aString: DOMString); var Ucs4Char: TVpUcs4Char; @@ -2277,7 +2277,7 @@ begin end; end; end; -{--------} + procedure TVpParser.ValidateVersNum(const aString : string); var i : Integer;