From 43535dbb005198f3ff672781eb91fadb19a51064 Mon Sep 17 00:00:00 2001 From: Carlo Barazzetta Date: Wed, 29 May 2024 16:41:23 +0200 Subject: [PATCH] Versione 2.3.0 - Finestre con bordo ombreggiato - Fogli di stile AssoSoftware e PA aggiornati - Corretto Layout per mancanza codice articolo - Aggiunta gestione pulsanti arrotondati - Aggiunte Dialog moderne con animazioni - Compilato con Delphi 12.1 --- Docs/Templates/FoglioStileAssoSoftware.xsl | 139 +- .../Foglio_di_stile_AssoSoftware_custom.xsl | 159 +- ...io_di_stile_fattura_ordinaria_ver1.2.2.xsl | 3345 +++ .../Schema_del_file_xml_FatturaPA_v1.2.2.xsd | 1454 ++ Docs/Templates/fatturapa_v1.2.1_de-it.xsl | 4 +- Ext/AllPackagesGroup.groupproj | 108 - Ext/AllPackagesGroup_D11.groupproj | 120 + Ext/AllPackagesGroup_D12.groupproj | 120 + Ext/External Projects.md | 17 +- .../Source/BegaHtmlPrintPreviewForm.pas | 20 +- Ext/HTMLViewer/Source/BegaMetaFilePrinter.pas | 241 +- Ext/HTMLViewer/Source/BegaPreview.pas | 392 +- Ext/HTMLViewer/Source/FramBrwz.pas | 19 +- Ext/HTMLViewer/Source/HTMLSubs.pas | 597 +- Ext/HTMLViewer/Source/HTMLUn2.pas | 344 +- Ext/HTMLViewer/Source/HtmlBuffer.pas | 12 +- Ext/HTMLViewer/Source/HtmlFonts.pas | 84 +- Ext/HTMLViewer/Source/HtmlGlobals.pas | 140 +- Ext/HTMLViewer/Source/HtmlImages.pas | 30 +- Ext/HTMLViewer/Source/HtmlPrinter.pas | 338 + Ext/HTMLViewer/Source/Htmlsbs1.pas | 33 +- Ext/HTMLViewer/Source/MetaFilePrinter.pas | 170 +- Ext/HTMLViewer/Source/ReadHTML.pas | 25 +- Ext/HTMLViewer/Source/StylePars.pas | 48 +- Ext/HTMLViewer/Source/StyleTypes.pas | 61 +- Ext/HTMLViewer/Source/StyleUn.pas | 332 +- Ext/HTMLViewer/Source/URLSubs.pas | 2 +- Ext/HTMLViewer/Source/framview.pas | 285 +- Ext/HTMLViewer/Source/htmlcons.inc | 187 +- Ext/HTMLViewer/Source/htmlmisc.pas | 2 +- Ext/HTMLViewer/Source/htmlview.pas | 412 +- Ext/HTMLViewer/Source/vwPrint.pas | 158 +- Ext/HTMLViewer/package/FrameViewer11.dpk | 5 +- Ext/HTMLViewer/package/FrameViewer11.dproj | 12 +- Ext/HTMLViewer/package/FrameViewer12.dpk | 5 +- Ext/HTMLViewer/package/FrameViewer12.dproj | 30 +- Ext/HTMLViewer/package/FrameViewer12.res | Bin 448 -> 448 bytes Ext/HTMLViewer/package/dclFrameViewer12.dproj | 15 +- Ext/HTMLViewer/package/dclFrameViewer12.res | Bin 448 -> 448 bytes Ext/SVGIconImageList/Image32/Readme.md | 10 +- .../Image32/source/Clipper.Core.pas | 247 +- .../Image32/source/Clipper.Engine.pas | 754 +- .../Image32/source/Clipper.Minkowski.pas | 11 +- .../Image32/source/Clipper.Offset.pas | 581 +- .../Image32/source/Clipper.RectClip.pas | 271 +- .../Image32/source/Clipper.inc | 18 +- .../Image32/source/Clipper.pas | 418 +- .../Image32/source/Img32.CQ.pas | 46 +- .../Image32/source/Img32.Clipper2.pas | 7 +- .../Image32/source/Img32.Draw.pas | 274 +- .../Image32/source/Img32.Extra.pas | 1048 +- .../Image32/source/Img32.FMX.pas | 1 + .../Image32/source/Img32.Fmt.BMP.pas | 26 +- .../Image32/source/Img32.Fmt.JPG.pas | 9 +- .../Image32/source/Img32.Fmt.PNG.pas | 19 +- .../Image32/source/Img32.Fmt.QOI.pas | 9 +- .../Image32/source/Img32.Fmt.SVG.pas | 96 +- .../Image32/source/Img32.Layers.pas | 139 +- .../Image32/source/Img32.Panels.pas | 35 +- .../Image32/source/Img32.Resamplers.pas | 530 +- .../Image32/source/Img32.SVG.Core.pas | 178 +- .../Image32/source/Img32.SVG.HashConsts.inc | 2 + .../Image32/source/Img32.SVG.Path.pas | 51 +- .../Image32/source/Img32.SVG.PathDesign.pas | 5 +- .../Image32/source/Img32.SVG.Reader.pas | 701 +- .../Image32/source/Img32.Text.pas | 14 +- .../Image32/source/Img32.Transform.pas | 269 +- .../Image32/source/Img32.Vector.pas | 1121 +- .../Image32/source/Img32.Vectorizer.pas | 2 +- Ext/SVGIconImageList/Image32/source/Img32.inc | 47 +- Ext/SVGIconImageList/Image32/source/Img32.pas | 261 +- .../Packages/D11/SVGIconImageList.res | Bin 96 -> 0 bytes .../Packages/D11/SVGIconImageListFMX.res | Bin 96 -> 0 bytes .../Packages/D11/SVGImage32Package.dpk | 2 + .../Packages/D11/SVGImage32Package.res | Bin 96 -> 0 bytes .../Packages/D11/dclSVGIconImageList.res | Bin 96 -> 0 bytes .../Packages/D11/dclSVGIconImageListFMX.res | Bin 96 -> 0 bytes .../Packages/D12/SVGIconImageList.dproj | 21 +- .../Packages/D12/SVGIconImageList.res | Bin 96 -> 0 bytes .../Packages/D12/SVGIconImageListFMX.dproj | 16 +- .../Packages/D12/SVGIconImageListFMX.res | Bin 96 -> 0 bytes .../Packages/D12/SVGImage32Package.dpk | 2 + .../Packages/D12/SVGImage32Package.dproj | 23 +- .../Packages/D12/SVGImage32Package.res | Bin 96 -> 0 bytes .../Packages/D12/dclSVGIconImageList.dproj | 16 +- .../Packages/D12/dclSVGIconImageList.res | Bin 96 -> 0 bytes .../Packages/D12/dclSVGIconImageListFMX.dproj | 14 +- .../Packages/D12/dclSVGIconImageListFMX.res | Bin 96 -> 0 bytes .../FMX.SVGIconImageListEditorUnit.fmx | 697 + .../FMX.SVGIconImageListEditorUnit.pas | 4 +- .../Packages/FMX.SVGIconImageRegister.pas | 2 +- .../FMX.SVGTextPropertyEditorUnit.fmx | 225 + .../FMX.SVGTextPropertyEditorUnit.pas | 216 + Ext/SVGIconImageList/Packages/GetItLogo.png | Bin 0 -> 7405 bytes .../SVGIconImageCollectionComponentIcon.png | Bin 0 -> 4157 bytes .../Packages/SVGIconImageComponentIcon.png | Bin 0 -> 4155 bytes .../Packages/SVGIconImageListEditorUnit.pas | 2 +- .../Packages/SVGIconImageRegister.pas | 2 +- .../SVGIconVirtualImageListComponentIcon.png | Bin 0 -> 4005 bytes .../Packages/SVGTextPropertyEditorUnit.pas | 2 +- .../Source/FMX.Image32SVG.pas | 2 +- Ext/SVGIconImageList/Source/FMX.ImageSVG.pas | 2 +- .../Source/FMX.ImageSkiaSVG.pas | 6 +- .../Source/FMX.SVGIconImage.pas | 6 +- .../Source/FMX.SVGIconImageList.pas | 8 +- .../Source/Image32SVGFactory.pas | 2 +- Ext/SVGIconImageList/Source/SVGIconImage.pas | 15 +- .../Source/SVGIconImageCollection.pas | 28 +- .../Source/SVGIconImageList.inc | 3 + .../Source/SVGIconImageList.pas | 2 +- .../Source/SVGIconImageListBase.pas | 13 +- Ext/SVGIconImageList/Source/SVGIconItems.pas | 2 +- Ext/SVGIconImageList/Source/SVGIconUtils.pas | 39 +- .../Source/SVGIconVirtualImageList.pas | 5 +- Ext/SVGIconImageList/Source/SVGInterfaces.pas | 44 +- Ext/SVGIconImageList/Source/SVGMessaging.pas | 2 +- .../Source/SkiaSVGFactory.pas | 4 +- Ext/SVGIconImageList/Source/dlgExportPNG.dfm | 21 +- Ext/SVGIconImageList/Source/dlgExportPNG.pas | 12 +- .../packages/D11/StyledComponents.dpk | 90 + .../packages/D11/StyledComponents.dproj | 154 + .../packages/D11/StyledComponents.res | Bin 0 -> 736 bytes .../packages/D11/dclStyledComponents.dpk | 52 + .../packages/D11/dclStyledComponents.dproj | 132 + .../packages/D11/dclStyledComponents.res | Bin 0 -> 736 bytes .../packages/D12/StyledComponents.dpk | 90 + .../packages/D12/StyledComponents.dproj | 166 + .../packages/D12/StyledComponents.res | Bin 0 -> 736 bytes .../packages/D12/dclStyledComponents.dpk | 52 + .../packages/D12/dclStyledComponents.dproj | 141 + .../packages/D12/dclStyledComponents.res | Bin 0 -> 736 bytes .../packages/StyledAnimatedButton.dcr | Bin 0 -> 78308 bytes .../packages/StyledAnimatedTaskDialog.dcr | Bin 0 -> 79476 bytes .../packages/StyledAnimatedToolBar.dcr | Bin 0 -> 156780 bytes .../packages/StyledButton.dcr | Bin 0 -> 317392 bytes .../packages/StyledButtonGroup.dcr | Bin 0 -> 84080 bytes .../packages/StyledCategoryButtons.dcr | Bin 0 -> 78988 bytes .../packages/StyledDbNavigator.dcr | Bin 0 -> 165924 bytes .../packages/StyledTaskDialog.dcr | Bin 0 -> 80836 bytes .../packages/StyledToolBar.dcr | Bin 0 -> 154512 bytes .../Vcl.StyledAnimatedComponentsRegister.pas | 378 + .../Vcl.StyledAttributesFrameUnit.dfm | 343 + .../Vcl.StyledAttributesFrameUnit.pas | 142 + .../Vcl.StyledButtonCustomEditorUnit.dfm | 225 + .../Vcl.StyledButtonCustomEditorUnit.pas | 357 + .../packages/Vcl.StyledButtonEditorUnit.dfm | 1382 ++ .../packages/Vcl.StyledButtonEditorUnit.pas | 626 + .../packages/Vcl.StyledComponentsRegister.pas | 1004 + Ext/StyledComponents/source/Animations.RES | Bin 0 -> 173612 bytes Ext/StyledComponents/source/Animations.rc | 7 + .../source/BuildResFileOfAnimations.cmd | 3 + .../source/CommandLinkBMP.RES | Bin 0 -> 9368 bytes .../source/CommandLinkPNG.RES | Bin 0 -> 3400 bytes .../Skia.Vcl.StyledTaskDialogAnimatedUnit.dfm | 28 + .../Skia.Vcl.StyledTaskDialogAnimatedUnit.pas | 154 + .../source/StyledComponents.inc | 180 + .../source/StyledNavButtonsBMP.RES | Bin 0 -> 14240 bytes .../source/StyledNavButtonsPNG.RES | Bin 0 -> 71952 bytes .../source/Vcl.AngularButtonStyles.pas | 532 + .../source/Vcl.BootstrapButtonStyles.pas | 330 + .../source/Vcl.ButtonStylesAttributes.pas | 2203 ++ .../source/Vcl.ColorButtonStyles.pas | 453 + .../source/Vcl.SkAnimatedImageHelper.pas | 321 + .../source/Vcl.StandardButtonStyles.pas | 658 + .../source/Vcl.StyledAnimatedButton.pas | 614 + .../source/Vcl.StyledAnimatedTaskDialog.pas | 58 + .../source/Vcl.StyledAnimatedToolbar.pas | 421 + .../source/Vcl.StyledButton.pas | 6205 ++++++ .../source/Vcl.StyledButtonGroup.pas | 1491 ++ .../source/Vcl.StyledCategoryButtons.pas | 1513 ++ .../source/Vcl.StyledCmpMessages.pas | 219 + .../source/Vcl.StyledCmpStrUtils.pas | 171 + .../source/Vcl.StyledCompResources.dfm | 83 + .../source/Vcl.StyledComponentsHooks.pas | 74 + .../source/Vcl.StyledDbNavigator.pas | 2261 +++ .../source/Vcl.StyledGraphicsUtils.pas | 140 + .../source/Vcl.StyledMessagesHooks.pas | 81 + .../source/Vcl.StyledTaskDialog.pas | 633 + .../source/Vcl.StyledTaskDialogFormUnit.dfm | 354 + .../source/Vcl.StyledTaskDialogFormUnit.pas | 1006 + .../source/Vcl.StyledTaskDialogStdUnit.dfm | 16944 ++++++++++++++++ .../source/Vcl.StyledTaskDialogStdUnit.pas | 130 + .../source/Vcl.StyledToolbar.pas | 2273 +++ .../source/Vcl.TemplateButtonStyles.pas | 274 + Ext/SynEdit/Packages/SynEdit_D11.dproj | 19 +- Ext/SynEdit/Packages/SynEdit_D12.dproj | 19 +- Ext/SynEdit/Packages/SynEdit_D12.res | Bin 4812 -> 4812 bytes Ext/SynEdit/Packages/SynEdit_R11.dproj | 16 +- Ext/SynEdit/Packages/SynEdit_R12.dproj | 16 +- Ext/SynEdit/Packages/SynEdit_R12.res | Bin 4812 -> 4812 bytes Ext/SynEdit/Source/FSynHighlightProp.pas | 2 +- Ext/SynEdit/Source/FTestPrintPreview.pas | 6 +- Ext/VCLStyleUtils/Common/Vcl.Styles.Ext.pas | 30 +- .../Common/Vcl.Styles.FormStyleHooks.pas | 4 + .../Common/Vcl.Styles.OwnerDrawFix.pas | 1 - .../DDetours/Source/DDetours.pas | 25 +- Ext/dclFrameViewer11.dpk | 40 - Ext/dclFrameViewer11.dproj | 153 - Ext/dclFrameViewer11.res | Bin 448 -> 0 bytes Images/About.png | Bin 24004 -> 22433 bytes Images/FEViewer.png | Bin 146206 -> 166075 bytes Images/SettingsAnteprima.png | Bin 21026 -> 29689 bytes Images/SettingsAvanzate.png | Bin 22449 -> 23953 bytes Images/SettingsCarattere.png | Bin 22541 -> 23450 bytes Images/SettingsColoriTesto.png | Bin 58115 -> 64531 bytes Images/SettingsPDFLayout.png | Bin 28646 -> 30559 bytes Images/SettingsTema.png | Bin 47867 -> 53001 bytes Images/Setup.png | Bin 36984 -> 37914 bytes README.htm | 180 + README.md | 14 +- Setup/FExplorer.iss | 31 +- Setup/SupportingDelphi.jpg | Bin 9006 -> 8788 bytes Source/FEViewer.dpr | 21 +- Source/FEViewer.dproj | 104 +- Source/FEViewer.res | Bin 1313960 -> 1313960 bytes Source/FExplorer.About.dfm | 139 +- Source/FExplorer.About.pas | 34 +- Source/FExplorer.ContextMenuHandler.pas | 2 +- Source/FExplorer.InvoiceToImage.pas | 2 +- Source/FExplorer.Main.pas | 2 +- Source/FExplorer.Misc.pas | 2 +- Source/FExplorer.PreviewForm.dfm | 103 +- Source/FExplorer.PreviewForm.pas | 74 +- Source/FExplorer.PreviewHandler.pas | 2 +- Source/FExplorer.PreviewHandlerRegister.pas | 2 +- Source/FExplorer.Resources.dfm | 1015 +- Source/FExplorer.Resources.pas | 3 +- Source/FExplorer.Settings.pas | 34 +- Source/FExplorer.SettingsForm.dfm | 67 +- Source/FExplorer.SettingsForm.pas | 21 +- Source/FExplorer.Splash.pas | 2 +- Source/FExplorer.ThumbnailHandler.pas | 2 +- Source/FExplorer.ThumbnailHandlerRegister.pas | 2 +- Source/FExplorer.ThumbnailResources.pas | 2 +- Source/FExplorer.ViewerMainForm.dfm | 86 +- Source/FExplorer.ViewerMainForm.pas | 282 +- Source/FExplorer.dproj | 879 +- Source/FExplorer.res | Bin 1313964 -> 1313964 bytes Source/FExplorer32.dpr | 2 +- Source/FExplorer32.dproj | 881 +- Source/FExplorer32.res | Bin 1313964 -> 1313964 bytes Source/dlgReplaceText.pas | 2 +- Source/uFilePreviewHandler.pas | 4 +- Source/uMisc.pas | 2 +- Source/uPreviewContainer.pas | 2 +- Source/uPreviewHandler.pas | 5 +- Source/uPreviewHandlerRegister.pas | 2 +- Source/uStreamPreviewHandler.pas | 5 +- 248 files changed, 59818 insertions(+), 7798 deletions(-) create mode 100644 Docs/Templates/Foglio_di_stile_fattura_ordinaria_ver1.2.2.xsl create mode 100644 Docs/Templates/Schema_del_file_xml_FatturaPA_v1.2.2.xsd delete mode 100644 Ext/AllPackagesGroup.groupproj create mode 100644 Ext/AllPackagesGroup_D11.groupproj create mode 100644 Ext/AllPackagesGroup_D12.groupproj create mode 100644 Ext/HTMLViewer/Source/HtmlPrinter.pas delete mode 100644 Ext/SVGIconImageList/Packages/D11/SVGIconImageList.res delete mode 100644 Ext/SVGIconImageList/Packages/D11/SVGIconImageListFMX.res delete mode 100644 Ext/SVGIconImageList/Packages/D11/SVGImage32Package.res delete mode 100644 Ext/SVGIconImageList/Packages/D11/dclSVGIconImageList.res delete mode 100644 Ext/SVGIconImageList/Packages/D11/dclSVGIconImageListFMX.res delete mode 100644 Ext/SVGIconImageList/Packages/D12/SVGIconImageList.res delete mode 100644 Ext/SVGIconImageList/Packages/D12/SVGIconImageListFMX.res delete mode 100644 Ext/SVGIconImageList/Packages/D12/SVGImage32Package.res delete mode 100644 Ext/SVGIconImageList/Packages/D12/dclSVGIconImageList.res delete mode 100644 Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.res create mode 100644 Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.fmx create mode 100644 Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.fmx create mode 100644 Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.pas create mode 100644 Ext/SVGIconImageList/Packages/GetItLogo.png create mode 100644 Ext/SVGIconImageList/Packages/SVGIconImageCollectionComponentIcon.png create mode 100644 Ext/SVGIconImageList/Packages/SVGIconImageComponentIcon.png create mode 100644 Ext/SVGIconImageList/Packages/SVGIconVirtualImageListComponentIcon.png create mode 100644 Ext/StyledComponents/packages/D11/StyledComponents.dpk create mode 100644 Ext/StyledComponents/packages/D11/StyledComponents.dproj create mode 100644 Ext/StyledComponents/packages/D11/StyledComponents.res create mode 100644 Ext/StyledComponents/packages/D11/dclStyledComponents.dpk create mode 100644 Ext/StyledComponents/packages/D11/dclStyledComponents.dproj create mode 100644 Ext/StyledComponents/packages/D11/dclStyledComponents.res create mode 100644 Ext/StyledComponents/packages/D12/StyledComponents.dpk create mode 100644 Ext/StyledComponents/packages/D12/StyledComponents.dproj create mode 100644 Ext/StyledComponents/packages/D12/StyledComponents.res create mode 100644 Ext/StyledComponents/packages/D12/dclStyledComponents.dpk create mode 100644 Ext/StyledComponents/packages/D12/dclStyledComponents.dproj create mode 100644 Ext/StyledComponents/packages/D12/dclStyledComponents.res create mode 100644 Ext/StyledComponents/packages/StyledAnimatedButton.dcr create mode 100644 Ext/StyledComponents/packages/StyledAnimatedTaskDialog.dcr create mode 100644 Ext/StyledComponents/packages/StyledAnimatedToolBar.dcr create mode 100644 Ext/StyledComponents/packages/StyledButton.dcr create mode 100644 Ext/StyledComponents/packages/StyledButtonGroup.dcr create mode 100644 Ext/StyledComponents/packages/StyledCategoryButtons.dcr create mode 100644 Ext/StyledComponents/packages/StyledDbNavigator.dcr create mode 100644 Ext/StyledComponents/packages/StyledTaskDialog.dcr create mode 100644 Ext/StyledComponents/packages/StyledToolBar.dcr create mode 100644 Ext/StyledComponents/packages/Vcl.StyledAnimatedComponentsRegister.pas create mode 100644 Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.dfm create mode 100644 Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.pas create mode 100644 Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.dfm create mode 100644 Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.pas create mode 100644 Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.dfm create mode 100644 Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.pas create mode 100644 Ext/StyledComponents/packages/Vcl.StyledComponentsRegister.pas create mode 100644 Ext/StyledComponents/source/Animations.RES create mode 100644 Ext/StyledComponents/source/Animations.rc create mode 100644 Ext/StyledComponents/source/BuildResFileOfAnimations.cmd create mode 100644 Ext/StyledComponents/source/CommandLinkBMP.RES create mode 100644 Ext/StyledComponents/source/CommandLinkPNG.RES create mode 100644 Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.dfm create mode 100644 Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.pas create mode 100644 Ext/StyledComponents/source/StyledComponents.inc create mode 100644 Ext/StyledComponents/source/StyledNavButtonsBMP.RES create mode 100644 Ext/StyledComponents/source/StyledNavButtonsPNG.RES create mode 100644 Ext/StyledComponents/source/Vcl.AngularButtonStyles.pas create mode 100644 Ext/StyledComponents/source/Vcl.BootstrapButtonStyles.pas create mode 100644 Ext/StyledComponents/source/Vcl.ButtonStylesAttributes.pas create mode 100644 Ext/StyledComponents/source/Vcl.ColorButtonStyles.pas create mode 100644 Ext/StyledComponents/source/Vcl.SkAnimatedImageHelper.pas create mode 100644 Ext/StyledComponents/source/Vcl.StandardButtonStyles.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledAnimatedButton.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledAnimatedTaskDialog.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledAnimatedToolbar.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledButton.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledButtonGroup.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledCategoryButtons.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledCmpMessages.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledCmpStrUtils.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledCompResources.dfm create mode 100644 Ext/StyledComponents/source/Vcl.StyledComponentsHooks.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledDbNavigator.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledGraphicsUtils.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledMessagesHooks.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledTaskDialog.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.dfm create mode 100644 Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.dfm create mode 100644 Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.pas create mode 100644 Ext/StyledComponents/source/Vcl.StyledToolbar.pas create mode 100644 Ext/StyledComponents/source/Vcl.TemplateButtonStyles.pas delete mode 100644 Ext/dclFrameViewer11.dpk delete mode 100644 Ext/dclFrameViewer11.dproj delete mode 100644 Ext/dclFrameViewer11.res create mode 100644 README.htm diff --git a/Docs/Templates/FoglioStileAssoSoftware.xsl b/Docs/Templates/FoglioStileAssoSoftware.xsl index 7d30e1b..1027c12 100644 --- a/Docs/Templates/FoglioStileAssoSoftware.xsl +++ b/Docs/Templates/FoglioStileAssoSoftware.xsl @@ -111,40 +111,57 @@ - - - - - + + + + + - - - - - + - - - - del - - - - - - CUP: - - - - CIG: - - + + + + del + + + + + + CUP: + + + + CIG: + + + + + + + Commessa/convenzione: + + + + + + + + + + + + + + + + @@ -216,16 +233,10 @@ - - - - - - + + - - - + @@ -242,12 +253,9 @@ - + - - - - + @@ -268,12 +276,8 @@ - + - - - - @@ -294,12 +298,8 @@ - + - - - - @@ -319,12 +319,8 @@ - - - - - - + + @@ -2068,24 +2064,16 @@ - + - - - - - + - - - - @@ -2093,24 +2081,17 @@ - + - - - - + - + - - - - @@ -2119,12 +2100,8 @@ - + - - - - diff --git a/Docs/Templates/Foglio_di_stile_AssoSoftware_custom.xsl b/Docs/Templates/Foglio_di_stile_AssoSoftware_custom.xsl index 58fb849..9d25514 100644 --- a/Docs/Templates/Foglio_di_stile_AssoSoftware_custom.xsl +++ b/Docs/Templates/Foglio_di_stile_AssoSoftware_custom.xsl @@ -1,4 +1,4 @@ - + - - - - - + + + + + - - - - - + - - - - del - - - - - - CUP: - - - - CIG: - - + + + + del + + + + + + CUP: + + + + CIG: + + + + + + + Commessa/convenzione: + + + + + + + + + + + + + + + + @@ -216,16 +233,10 @@ - - - - - - + + - - - + @@ -242,12 +253,9 @@ - + - - - - + @@ -268,12 +276,8 @@ - + - - - - @@ -294,12 +298,8 @@ - + - - - - @@ -319,12 +319,8 @@ - - - - - - + + @@ -2043,7 +2039,7 @@ - Cod. articolo + Cod. articolo Descrizione Quantità Prezzo unitario @@ -2068,24 +2064,16 @@ - + - - - - - + - - - - @@ -2093,24 +2081,17 @@ - + - - - - + - + - - - - @@ -2119,12 +2100,8 @@ - + - - - - @@ -2981,10 +2958,6 @@ width:48% } - th.cod-articolo { - min-width: 80px; - } - th.perc { width:50px; } @@ -3009,7 +2982,7 @@ th.import2 { - width:40px; + width:42px; } td.import2 @@ -3055,7 +3028,15 @@ text-align:right; } - + table.tbNoBorder + { + border-collapse: collapse; + margin-bottom: 5px; + font-size:small; + text-align:center; + width:100%; + } + diff --git a/Docs/Templates/Foglio_di_stile_fattura_ordinaria_ver1.2.2.xsl b/Docs/Templates/Foglio_di_stile_fattura_ordinaria_ver1.2.2.xsl new file mode 100644 index 0000000..49521f4 --- /dev/null +++ b/Docs/Templates/Foglio_di_stile_fattura_ordinaria_ver1.2.2.xsl @@ -0,0 +1,3345 @@ + + + + + + + + + + + + + + + + + Gennaio + + + Febbraio + + + Marzo + + + Aprile + + + Maggio + + + Giugno + + + Luglio + + + Agosto + + + Settembre + + + Ottobre + + + Novembre + + + Dicembre + + + Mese non riconosciuto + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +

FATTURA ELETTRONICA

+ + +
+
+ Versione +
+ + + +
+

Dati relativi alla trasmissione

+
    + + + +
  • + Identificativo del trasmittente: + + + + +
  • +
    + +
  • + Progressivo di invio: + + + +
  • +
    + +
  • + Formato Trasmissione: + + + +
  • +
    + +
  • + Codice identificativo destinatario: + + + +
  • +
    + +
  • + Telefono del trasmittente: + + + +
  • +
    + +
  • + E-mail del trasmittente: + + + +
  • +
    + +
  • + Destinatario PEC: + + + +
  • +
    +
    +
+
+
+ + + + +
+

Dati del cedente / prestatore

+ + +

Dati anagrafici

+ +
    + + +
  • + Identificativo fiscale ai fini IVA: + + + + +
  • +
    + +
  • + Codice fiscale: + + + +
  • +
    + +
  • + Denominazione: + + + +
  • +
    + +
  • + Nome: + + + +
  • +
    + +
  • + Cognome: + + + +
  • +
    + +
  • + Titolo: + + + +
  • +
    + +
  • + Codice EORI: + + + +
  • +
    + +
  • + Albo professionale di appartenenza: + + + +
  • +
    + +
  • + Provincia di competenza dell'Albo: + + + +
  • +
    + +
  • + Numero iscrizione all'Albo: + + + +
  • +
    + +
  • + Data iscrizione all'Albo: + + + + + + +
  • +
    + +
  • + Regime fiscale: + + + + + + + + + + (ordinario) + + + (contribuenti minimi) + + + (nuove iniziative produttive) - Non più valido in quanto abrogato dalla legge di stabilità 2015 + + + (agricoltura e attività connesse e pesca) + + + (vendita sali e tabacchi) + + + (commercio fiammiferi) + + + (editoria) + + + (gestione servizi telefonia pubblica) + + + (rivendita documenti di trasporto pubblico e di sosta) + + + (intrattenimenti, giochi e altre attività di cui alla tariffa allegata al DPR 640/72) + + + (agenzie viaggi e turismo) + + + (agriturismo) + + + (vendite a domicilio) + + + (rivendita beni usati, oggetti d’arte, + d’antiquariato o da collezione) + + + (agenzie di vendite all’asta di oggetti d’arte, + antiquariato o da collezione) + + + (IVA per cassa P.A.) + + + (IVA per cassa - art. 32-bis, D.L. 83/2012) + + + (Regime forfettario) + + + (altro) + + + + + (!!! codice non previsto !!!) + + +
  • +
    +
    +
+
+ + +

Dati della sede

+
    + + +
  • + Indirizzo: + + + +
  • +
    + +
  • + Numero civico: + + + +
  • +
    + +
  • + CAP: + + + +
  • +
    + +
  • + Comune: + + + +
  • +
    + +
  • + Provincia: + + + +
  • +
    + +
  • + Nazione: + + + +
  • +
    +
    +
+
+ + +

Dati della stabile organizzazione

+
    + + +
  • + Indirizzo: + + + +
  • +
    + +
  • + Numero civico: + + + +
  • +
    + +
  • + CAP: + + + +
  • +
    + +
  • + Comune: + + + +
  • +
    + +
  • + Provincia: + + + +
  • +
    + +
  • + Nazione: + + + +
  • +
    +
    +
+
+ + +

Dati di iscrizione nel registro delle imprese

+ +
    + + +
  • + Provincia Ufficio Registro Imprese: + + + +
  • +
    + +
  • + Numero di iscrizione: + + + +
  • +
    + +
  • + Capitale sociale: + + + +
  • +
    + +
  • + Numero soci: + + + + + + + + + + (socio unico) + + + (più soci) + + + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Stato di liquidazione: + + + + + + + + + + (in liquidazione) + + + (non in liquidazione) + + + + + (!!! codice non previsto !!!) + + +
  • +
    +
    +
+
+ + + +

Recapiti

+
    + +
  • + Telefono: + + + +
  • +
    + +
  • + Fax: + + + +
  • +
    + +
  • + E-mail: + + + +
  • +
    +
+
+
+ + +

Riferimento amministrativo

+
    +
  • + Riferimento: + + + +
  • +
+
+
+
+ + + + +
+

Dati del rappresentante fiscale del cedente / prestatore

+ + +

Dati anagrafici

+ +
    + + +
  • + Identificativo fiscale ai fini IVA: + + + + +
  • +
    + +
  • + Codice fiscale: + + + +
  • +
    + +
  • + Denominazione: + + + +
  • +
    + +
  • + Nome: + + + +
  • +
    + +
  • + Cognome: + + + +
  • +
    + +
  • + Titolo onorifico: + + + +
  • +
    + +
  • + Codice EORI: + + + +
  • +
    +
    +
+
+ +
+
+ + + + +
+

Dati del cessionario / committente

+ + +

Dati anagrafici

+ +
    + + +
  • + Identificativo fiscale ai fini IVA: + + + + +
  • +
    + +
  • + Codice Fiscale: + + + +
  • +
    + +
  • + Denominazione: + + + +
  • +
    + +
  • + Nome: + + + +
  • +
    + +
  • + Cognome: + + + +
  • +
    + +
  • + Titolo onorifico: + + + +
  • +
    + +
  • + Codice EORI: + + + +
  • +
    +
    +
+
+ + + +

Dati della sede

+ +
    + + +
  • + Indirizzo: + + + +
  • +
    + +
  • + Numero civico: + + + +
  • +
    + +
  • + CAP: + + + +
  • +
    + +
  • + Comune: + + + +
  • +
    + +
  • + Provincia: + + + +
  • +
    + +
  • + Nazione: + + + +
  • +
    +
    +
+
+ + + +

Stabile organizzazione del cessionario / committente

+ +
    + + +
  • + Indirizzo: + + + +
  • +
    + +
  • + Numero civico: + + + +
  • +
    + +
  • + CAP: + + + +
  • +
    + +
  • + Comune: + + + +
  • +
    + +
  • + Provincia: + + + +
  • +
    + +
  • + Nazione: + + + +
  • +
    +
    +
+
+ + +
+

Dati del rappresentante fiscale del cessionario / committente

+ +
    + + +
  • + Identificativo fiscale ai fini IVA: + + + + +
  • +
    + +
  • + Denominazione: + + + +
  • +
    + +
  • + Nome: + + + +
  • +
    + +
  • + Cognome: + + + +
  • +
    +
    +
+
+
+ + +
+
+ + + + +
+ + +

Dati del terzo intermediario soggetto emittente

+ + +

Dati anagrafici

+ +
    + +
  • + Identificativo fiscale ai fini IVA: + + + + +
  • +
    + +
  • + Codice Fiscale: + + + +
  • +
    + +
  • + Denominazione: + + + +
  • +
    + +
  • + Nome: + + + +
  • +
    + +
  • + Cognome: + + + +
  • +
    + +
  • + Titolo onorifico: + + + +
  • +
    + +
  • + Codice EORI: + + + +
  • +
    +
+
+
+
+
+ + + + +
+

Soggetto emittente la fattura

+
    +
  • + Soggetto emittente: + + + + + + + + + (cessionario/committente) + + + (terzo) + + + + + (!!! codice non previsto !!!) + + +
  • +
+
+
+ + + +
+
+ + + + + + + + + + +

+ Numero documento nel lotto: + +

+
+ +
+
+ Versione +
+ + + +
+ + + + +
+

Dati generali del documento

+ +
    + +
  • + Tipologia documento: + + + + + + + + + + (fattura) + + + (acconto/anticipo su fattura) + + + (acconto/anticipo su parcella) + + + (nota di credito) + + + (nota di debito) + + + (parcella) + + + (integrazione fattura + reverse charge interno) + + + (integrazione/autofattura per + acquisto servizi da estero) + + + (integrazione per acquisto + beni intracomunitari) + + + (integrazione/autofattura per + acquisto beni ex art.17 c.2 DPR 633/72) + + + (autofattura per regolarizzazione e integrazione delle fatture + - ex art.6 c.8 e 9-bis d.lgs. 471/97 o art.46 c.5 D.L. 331/93) + + + (autofattura per splafonamento) + + + (estrazione beni da Deposito IVA) + + + (estrazione beni da Deposito IVA + con versamento IVA) + + + (fattura differita - art.21 c.4 terzo periodo lett. a - DPR 633/72) + + + (fattura differita - art.21 c.4 terzo periodo lett. b - DPR 633/72) + + + (cessione di beni ammortizzabili e per + passaggi interni - art.36 DPR 633/72) + + + (fattura per autoconsumo o per cessioni + gratuite senza rivalsa) + + + (acquisti da San Marino con IVA - Fattura Cartacea) + + + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Valuta importi: + + + +
  • +
    + +
  • + Data documento: + + + + + + +
  • +
    + +
  • + Numero documento: + + + +
  • +
    + +
  • + Importo totale documento: + + + +
  • +
    + +
  • + Arrotondamento su Importo totale documento: + + + +
  • +
    + + +
  • + Causale: + + + +
  • + +
    + +
  • + Art. 73 DPR 633/72: + + + +
  • +
    +
+ + + +
+ +

Ritenuta

+
    + +
  • + Tipologia ritenuta: + + + + + + + + + (ritenuta persone fisiche) + + + (ritenuta persone giuridiche) + + + (contributo INPS) + + + (contributo ENASARCO) + + + (contributo ENPAM) + + + (altro contributo previdenziale) + + + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Importo ritenuta: + + + +
  • +
    + +
  • + Aliquota ritenuta (%): + + + +
  • +
    + +
  • + Causale di pagamento: + + + + + + + + (decodifica come da modello CU) + +
  • +
    +
+
+
+
+ + + + +
+ +

Bollo

+
    + +
  • + Bollo virtuale: + + + +
  • +
    + +
  • + Importo bollo: + + + +
  • +
    +
+
+
+
+ + + + +
+

Cassa previdenziale

+ +
    + +
  • + Tipologia cassa previdenziale: + + + + + + + + + (Cassa Nazionale Previdenza e Assistenza Avvocati + e Procuratori legali) + + + (Cassa Previdenza Dottori Commercialisti) + + + (Cassa Previdenza e Assistenza Geometri) + + + (Cassa Nazionale Previdenza e Assistenza + Ingegneri e Architetti liberi profess.) + + + (Cassa Nazionale del Notariato) + + + (Cassa Nazionale Previdenza e Assistenza + Ragionieri e Periti commerciali) + + + (Ente Nazionale Assistenza Agenti e Rappresentanti + di Commercio-ENASARCO) + + + (Ente Nazionale Previdenza e Assistenza Consulenti + del Lavoro-ENPACL) + + + (Ente Nazionale Previdenza e Assistenza + Medici-ENPAM) + + + (Ente Nazionale Previdenza e Assistenza + Farmacisti-ENPAF) + + + (Ente Nazionale Previdenza e Assistenza + Veterinari-ENPAV) + + + (Ente Nazionale Previdenza e Assistenza Impiegati + dell'Agricoltura-ENPAIA) + + + (Fondo Previdenza Impiegati Imprese di Spedizione + e Agenzie Marittime) + + + (Istituto Nazionale Previdenza Giornalisti + Italiani-INPGI) + + + (Opera Nazionale Assistenza Orfani Sanitari + Italiani-ONAOSI) + + + (Cassa Autonoma Assistenza Integrativa + Giornalisti Italiani-CASAGIT) + + + (Ente Previdenza Periti Industriali e Periti + Industriali Laureati-EPPI) + + + (Ente Previdenza e Assistenza + Pluricategoriale-EPAP) + + + (Ente Nazionale Previdenza e Assistenza + Biologi-ENPAB) + + + (Ente Nazionale Previdenza e Assistenza + Professione Infermieristica-ENPAPI) + + + (Ente Nazionale Previdenza e Assistenza + Psicologi-ENPAP) + + + (INPS) + + + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Aliquota contributo cassa (%): + + + +
  • +
    + +
  • + Importo contributo cassa: + + + +
  • +
    + +
  • + Imponibile previdenziale: + + + +
  • +
    + +
  • + Aliquota IVA applicata: + + + +
  • +
    + +
  • + Contributo cassa soggetto a ritenuta: + + + +
  • +
    + +
  • + Tipologia di non imponibilità del contributo: + + + + + + + + + (escluse ex art. 15) + + + (non soggette) + + + (non soggette ad IVA - artt. da 7 a 7-septies + del DPR 633/72) + + + (non soggette - altri casi) + + + (non imponibili) + + + (non imponibili - esportazioni) + + + (non imponibili - cessioni intracomunitarie) + + + (non imponibili - cessioni verso S.Marino) + + + (non imponibili - operazioni assimilate alle + cessioni all'esportazione) + + + (non imponibili - a seguito di dichiarazioni + d'intento) + + + (non imponibili - altre operazioni che non + concorrono alla formazione del plafond) + + + (esenti) + + + (regime del margine / IVA non esposta in fattura) + + + (inversione contabile per le operazioni in reverse + charge ovvero nei casi di autofatturazione per + acquisti extra UE di servizi ovvero per importazioni + di beni nei soli casi previsti) + + + (inversione contabile - cessione di rottami e + altri materiali di recupero) + + + (inversione contabile - cessione di oro e + argento ai sensi della legge 7/2000 nonché di oreficeria + usata ad OPO) + + + (inversione contabile - subappalto nel settore + edile) + + + (inversione contabile - cessione di fabbricati) + + + (inversione contabile - cessione di telefoni + cellulari) + + + (inversione contabile - cessione di prodotti + elettronici) + + + (inversione contabile - prestazioni comparto + edile e settori connessi) + + + (inversione contabile - operazioni settore + energetico) + + + (inversione contabile - altri casi) + + + (IVA assolta in altro stato UE - prestazione di servizi di + telecomunicazioni, tele-radiodiffusione ed elettronici ex + art. 7-octies, comma 1 lett. a, b, art. 74-sexies DPR 633/72) + + + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Riferimento amministrativo / contabile: + + + +
  • +
    +
+
+
+
+ + + + +

Sconto/maggiorazione

+
+ +
    + +
  • + Tipologia: + + + + + + + + + + (sconto) + + + + (maggiorazione) + + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Percentuale: + + + +
  • +
    + +
  • + Importo: + + + +
  • +
    +
+
+
+
+ + +
+
+ + + + +
+

Dati dell'ordine di acquisto

+ + +
    + +
  • + Numero linea di fattura a cui si riferisce: + + + + , + + + + +
  • +
    + +
  • + Identificativo ordine di acquisto: + + + +
  • +
    + +
  • + Data ordine di acquisto: + + + + + + +
  • +
    + +
  • + Numero linea ordine di acquisto: + + + +
  • +
    + +
  • + Codice commessa/convenzione: + + + +
  • +
    + +
  • + Codice Unitario Progetto (CUP): + + + +
  • +
    + +
  • + Codice Identificativo Gara (CIG): + + + +
  • +
    +
+
+
+
+ + + + +
+

Dati del contratto

+ +
    + +
  • + Numero linea di fattura a cui si riferisce: + + + + , + + + + +
  • +
    + +
  • + Identificativo contratto: + + + +
  • +
    + +
  • + Data contratto: + + + + + + +
  • +
    + +
  • + Numero linea contratto: + + + +
  • +
    + +
  • + Codice commessa/convenzione: + + + +
  • +
    + +
  • + Codice Unitario Progetto (CUP): + + + +
  • +
    + +
  • + Codice Identificativo Gara (CIG): + + + +
  • +
    +
+
+
+
+ + + + +
+

Dati della convenzione

+ +
    + +
  • + Numero linea di fattura a cui si riferisce: + + + + , + + + + + +
  • +
    + +
  • + Identificativo convenzione: + + + +
  • +
    + +
  • + Data convenzione: + + + + + + +
  • +
    + +
  • + Numero linea convenzione: + + + +
  • +
    + +
  • + Codice commessa/convenzione: + + + +
  • +
    + +
  • + Codice Unitario Progetto (CUP): + + + +
  • +
    + +
  • + Codice Identificativo Gara (CIG): + + + +
  • +
    +
+
+
+
+ + + + +
+

Dati della ricezione

+ +
    + +
  • + Numero linea di fattura a cui si riferisce: + + + + , + + + + + +
  • +
    + +
  • + Identificativo ricezione: + + + +
  • +
    + +
  • + Data ricezione: + + + + + + +
  • +
    + +
  • + Numero linea ricezione: + + + +
  • +
    + +
  • + Codice commessa/convenzione: + + + +
  • +
    + +
  • + Codice Unitario Progetto (CUP): + + + +
  • +
    + +
  • + Codice Identificativo Gara (CIG): + + + +
  • +
    +
+
+
+
+ + + + +
+

Dati della fattura collegata

+ +
    + +
  • + Numero linea di fattura a cui si riferisce: + + + + , + + + + + +
  • +
    + +
  • + Identificativo fattura collegata: + + + +
  • +
    + +
  • + Data fattura collegata: + + + + + + +
  • +
    + +
  • + Numero linea fattura collegata: + + + +
  • +
    + +
  • + Codice commessa/convenzione: + + + +
  • +
    + +
  • + Codice Unitario Progetto (CUP): + + + +
  • +
    + +
  • + Codice Identificativo Gara (CIG): + + + +
  • +
    +
+
+
+
+ + + + +
+

Stato avanzamento lavori

+
    + +
  • + Numero fase avanzamento: + + + + , + + + + +
  • +
    +
+
+
+ + + + +
+

Dati del documento di trasporto

+ +
    + +
  • + Numero DDT: + + + +
  • +
    + +
  • + Data DDT: + + + + + + +
  • +
    + +
  • + Numero linea di fattura a cui si riferisce: + + + + , + + + + +
  • +
    +
+
+
+
+ + + + +
+

Dati relativi al trasporto

+ + +

Dati del vettore

+ +
    + + +
  • + Identificativo fiscale ai fini IVA: + + + + +
  • +
    + +
  • + Codice Fiscale: + + + +
  • +
    + +
  • + Denominazione: + + + +
  • +
    + +
  • + Nome: + + + +
  • +
    + +
  • + Cognome: + + + +
  • +
    + +
  • + Titolo onorifico: + + + +
  • +
    + +
  • + Codice EORI: + + + +
  • +
    + +
  • + Numero licenza di guida: + + + +
  • +
    +
    +
+
+ + +

Altri dati

+ +
    + + +
  • + Mezzo di trasporto: + + + +
  • +
    + +
  • + Causale trasporto: + + + +
  • +
    + +
  • + Numero colli trasportati: + + + +
  • +
    + +
  • + Descrizione beni trasportati: + + + +
  • +
    + +
  • + Unità di misura del peso merce: + + + +
  • +
    + +
  • + Peso lordo: + + + +
  • +
    + +
  • + Peso netto: + + + +
  • +
    + +
  • + Data e ora ritiro merce: + + + + + + +
  • +
    + +
  • + Data inizio trasporto: + + + + + + +
  • +
    + +
  • + Tipologia di resa: + + + + + (codifica secondo standard ICC) +
  • +
    + +
  • + Indirizzo di resa: + + + +
  • +
    + +
  • + Numero civico indirizzo di resa: + + + +
  • +
    + +
  • + CAP indirizzo di resa: + + + +
  • +
    + +
  • + Comune di resa: + + + +
  • +
    + +
  • + Provincia di resa: + + + +
  • +
    + +
  • + Nazione di resa: + + + +
  • +
    + +
  • + Data e ora di consegna: + + + + + + +
  • +
    +
    +
+
+ +
+
+ + + + +
+

Dati relativi alla fattura principale

+
    + +
  • + Numero fattura principale: + + + +
  • +
    + +
  • + Data fattura principale: + + + + + + +
  • +
    +
+
+
+ + +
+
+ + + + +
+ + + +
+

Dati relativi alle linee di dettaglio della fornitura

+ + +
+ Nr. linea: + + + +
+ +
    + +
  • + Tipo cessione/prestazione: + + + + + + + + + (sconto) + + + (premio) + + + (abbuono) + + + (spesa accessoria) + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • +
    Codifica articolo
    + +
      + +
    • + Tipo: + + + +
    • +
      + +
    • + Valore: + + + +
    • +
      +
    +
    +
  • +
    + +
  • + Descrizione bene/servizio: + + + +
  • +
    + +
  • + Quantità: + + + +
  • +
    + +
  • + Unità di misura: + + + +
  • +
    + +
  • + Data inizio periodo di riferimento: + + + + + + +
  • +
    + +
  • + Data fine periodo di riferimento: + + + + + + +
  • +
    + +
  • + Valore unitario: + + + +
  • +
    + +
  • +
    Sconto/Maggiorazione
    + + +
      + +
    • + Tipo: + + + + + + + + + + (sconto) + + + + (maggiorazione) + + + + (!!! codice non previsto !!!) + + +
    • +
      + +
    • + Percentuale (%): + + + +
    • +
      + +
    • + Importo: + + + +
    • +
      +
    +
    +
  • +
    + +
  • + Valore totale: + + + +
  • +
    + +
  • + IVA (%): + + + +
  • +
    + +
  • + Soggetta a ritenuta: + + + +
  • +
    + +
  • + Natura operazione: + + + + + + + + + (esclusa ex art.15) + + + (non soggetta) + + + (non soggette ad IVA - artt. da 7 a 7-septies + del DPR 633/72) + + + (non soggette - altri casi) + + + (non imponibili) + + + (non imponibili - esportazioni) + + + (non imponibili - cessioni intracomunitarie) + + + (non imponibili - cessioni verso S.Marino) + + + (non imponibili - operazioni assimilate alle + cessioni all'esportazione) + + + (non imponibili - a seguito di dichiarazioni + d'intento) + + + (non imponibili - altre operazioni che non + concorrono alla formazione del plafond) + + + (esenti) + + + (regime del margine / IVA non esposta in fattura) + + + (inversione contabile per le operazioni in reverse + charge ovvero nei casi di autofatturazione per + acquisti extra UE di servizi ovvero per importazioni + di beni nei soli casi previsti) + + + (inversione contabile - cessione di rottami e + altri materiali di recupero) + + + (inversione contabile - cessione di oro e + argento ai sensi della legge 7/2000 nonché di oreficeria + usata ad OPO) + + + (inversione contabile - subappalto nel settore + edile) + + + (inversione contabile - cessione di fabbricati) + + + (inversione contabile - cessione di telefoni + cellulari) + + + (inversione contabile - cessione di prodotti + elettronici) + + + (inversione contabile - prestazioni comparto + edile e settori connessi) + + + (inversione contabile - operazioni settore + energetico) + + + (inversione contabile - altri casi) + + + (IVA assolta in altro stato UE - prestazione di servizi di + telecomunicazioni, tele-radiodiffusione ed elettronici ex + art. 7-octies, comma 1 lett. a, b, art. 74-sexies DPR 633/72) + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Riferimento amministrativo/contabile: + + + +
  • +
    + +
  • +
    Altri dati gestionali
    +
      + + +
    • + Tipo dato: + + + +
    • +
      + +
    • + Valore testo: + + + +
    • +
      + +
    • + Valore numerico: + + + +
    • +
      + +
    • + Valore data: + + + + + + +
    • +
      +
      +
    +
  • +
    +
+
+
+
+ + + + +
+

Dati di riepilogo per aliquota IVA e natura

+ +
    + +
  • + Aliquota IVA (%): + + + +
  • +
    + +
  • + Natura operazioni: + + + + + + + + + (escluse ex art.15) + + + (non soggette) + + + (non soggette ad IVA - artt. da 7 a 7-septies + del DPR 633/72) + + + (non soggette - altri casi) + + + (non imponibili) + + + (non imponibili - esportazioni) + + + (non imponibili - cessioni intracomunitarie) + + + (non imponibili - cessioni verso S.Marino) + + + (non imponibili - operazioni assimilate alle + cessioni all'esportazione) + + + (non imponibili - a seguito di dichiarazioni + d'intento) + + + (non imponibili - altre operazioni che non + concorrono alla formazione del plafond) + + + (esenti) + + + (regime del margine / IVA non esposta in fattura) + + + (inversione contabile per le operazioni in reverse + charge ovvero nei casi di autofatturazione per + acquisti extra UE di servizi ovvero per importazioni + di beni nei soli casi previsti) + + + (inversione contabile - cessione di rottami e + altri materiali di recupero) + + + (inversione contabile - cessione di oro e + argento ai sensi della legge 7/2000 nonché di oreficeria + usata ad OPO) + + + (inversione contabile - subappalto nel settore + edile) + + + (inversione contabile - cessione di fabbricati) + + + (inversione contabile - cessione di telefoni + cellulari) + + + (inversione contabile - cessione di prodotti + elettronici) + + + (inversione contabile - prestazioni comparto + edile e settori connessi) + + + (inversione contabile - operazioni settore + energetico) + + + (inversione contabile - altri casi) + + + (IVA assolta in altro stato UE - prestazione di servizi di + telecomunicazioni, tele-radiodiffusione ed elettronici ex + art. 7-octies, comma 1 lett. a, b, art. 74-sexies DPR 633/72) + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Spese accessorie: + + + +
  • +
    + +
  • + Arrotondamento: + + + +
  • +
    + +
  • + Totale imponibile/importo: + + + +
  • +
    + +
  • + Totale imposta: + + + +
  • +
    + +
  • + Esigibilità IVA: + + + + + + + + + (esigibilità immediata) + + + (esigibilità differita) + + + (scissione dei pagamenti) + + + (!!! codice non previsto !!!) + + +
  • +
    + +
  • + Riferimento normativo: + + + +
  • +
    +
+
+
+
+ + +
+
+ + + + +
+

Dati Veicoli ex art. 38 dl 331/1993

+
    + + +
  • + Data prima immatricolazione / iscrizione PR: + + + + + + +
  • +
    + +
  • + Totale percorso: + + + +
  • +
    +
    +
+
+
+ + + + +
+

Dati relativi al pagamento

+
    + + +
  • + Condizioni di pagamento: + + + + + + + + + (pagamento a rate) + + + (pagamento completo) + + + (anticipo) + + + + + (!!! codice non previsto !!!) + + +
  • +
    + + +
    Dettaglio pagamento
    + + +
      + +
    • + Beneficiario del pagamento: + + + +
    • +
      + +
    • + Modalità: + + + + + + + + + (contanti) + + + (assegno) + + + (assegno circolare) + + + (contanti presso Tesoreria) + + + (bonifico) + + + (vaglia cambiario) + + + (bollettino bancario) + + + (carta di pagamento) + + + (RID) + + + (RID utenze) + + + (RID veloce) + + + (RIBA) + + + (MAV) + + + (quietanza erario) + + + (giroconto su conti di contabilità speciale) + + + (domiciliazione bancaria) + + + (domiciliazione postale) + + + (bollettino di c/c postale) + + + (SEPA Direct Debit) + + + (SEPA Direct Debit CORE) + + + (SEPA Direct Debit B2B) + + + (Trattenuta su somme già riscosse) + + + (PagoPA) + + + + + (!!! codice non previsto !!!) + + +
    • +
      + +
    • + Decorrenza termini di pagamento: + + + + + + +
    • +
      + +
    • + Termini di pagamento (in giorni): + + + +
    • +
      + +
    • + Data scadenza pagamento: + + + + + + +
    • +
      + +
    • + Importo: + + + +
    • +
      + +
    • + Codice Ufficio Postale: + + + +
    • +
      + +
    • + Cognome del quietanzante: + + + +
    • +
      + +
    • + Nome del quietanzante: + + + +
    • +
      + +
    • + CF del quietanzante: + + + +
    • +
      + +
    • + Titolo del quietanzante: + + + +
    • +
      + +
    • + Istituto finanziario: + + + +
    • +
      + +
    • + Codice IBAN: + + + +
    • +
      + +
    • + Codice ABI: + + + +
    • +
      + +
    • + Codice CAB: + + + +
    • +
      + +
    • + Codice BIC: + + + +
    • +
      + +
    • + Sconto per pagamento anticipato: + + + +
    • +
      + +
    • + Data limite per il pagamento anticipato: + + + + + + +
    • +
      + +
    • + Penale per ritardato pagamento: + + + +
    • +
      + +
    • + Data di decorrenza della penale: + + + + + + +
    • +
      + +
    • + Codice pagamento: + + + +
    • +
      +
    +
    +
    +
    +
+ +
+
+ + + + +
+

Dati relativi agli allegati

+ + +
    + +
  • + Nome dell'allegato: + + + +
  • +
    + +
  • + Algoritmo di compressione: + + + +
  • +
    + +
  • + Formato: + + + +
  • +
    + +
  • + Descrizione: + + + +
  • +
    +
+
+
+
+ + + +
+
+ + +
+
+
+ + +
+
\ No newline at end of file diff --git a/Docs/Templates/Schema_del_file_xml_FatturaPA_v1.2.2.xsd b/Docs/Templates/Schema_del_file_xml_FatturaPA_v1.2.2.xsd new file mode 100644 index 0000000..1509149 --- /dev/null +++ b/Docs/Templates/Schema_del_file_xml_FatturaPA_v1.2.2.xsd @@ -0,0 +1,1454 @@ + + + + + + + + XML schema fatture destinate a PA e privati in forma ordinaria 1.2.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blocco relativo ai dati di trasmissione della Fattura Elettronica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fattura verso PA + + + + + Fattura verso privati + + + + + + + + + + + + + + Blocco relativo ai Dati Generali della Fattura Elettronica + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SC = Sconto + + + + + MG = Maggiorazione + + + + + + + + + + SI = Documento emesso secondo modalità e termini stabiliti con DM ai sensi dell'art. 73 DPR 633/72 + + + + + + + + + + Cassa nazionale previdenza e assistenza avvocati e procuratori legali + + + + + Cassa previdenza dottori commercialisti + + + + + Cassa previdenza e assistenza geometri + + + + + Cassa nazionale previdenza e assistenza ingegneri e architetti liberi professionisti + + + + + Cassa nazionale del notariato + + + + + Cassa nazionale previdenza e assistenza ragionieri e periti commerciali + + + + + Ente nazionale assistenza agenti e rappresentanti di commercio (ENASARCO) + + + + + Ente nazionale previdenza e assistenza consulenti del lavoro (ENPACL) + + + + + Ente nazionale previdenza e assistenza medici (ENPAM) + + + + + Ente nazionale previdenza e assistenza farmacisti (ENPAF) + + + + + Ente nazionale previdenza e assistenza veterinari (ENPAV) + + + + + Ente nazionale previdenza e assistenza impiegati dell'agricoltura (ENPAIA) + + + + + Fondo previdenza impiegati imprese di spedizione e agenzie marittime + + + + + Istituto nazionale previdenza giornalisti italiani (INPGI) + + + + + Opera nazionale assistenza orfani sanitari italiani (ONAOSI) + + + + + Cassa autonoma assistenza integrativa giornalisti italiani (CASAGIT) + + + + + Ente previdenza periti industriali e periti industriali laureati (EPPI) + + + + + Ente previdenza e assistenza pluricategoriale (EPAP) + + + + + Ente nazionale previdenza e assistenza biologi (ENPAB) + + + + + Ente nazionale previdenza e assistenza professione infermieristica (ENPAPI) + + + + + Ente nazionale previdenza e assistenza psicologi (ENPAP) + + + + + INPS + + + + + + + + + + Fattura + + + + + Acconto / anticipo su fattura + + + + + Acconto / anticipo su parcella + + + + + Nota di credito + + + + + Nota di debito + + + + + Parcella + + + + + Integrazione fattura reverse charge interno + + + + + Integrazione/autofattura per acquisto servizi dall'estero + + + + + Integrazione per acquisto di beni intracomunitari + + + + + Integrazione/autofattura per acquisto di beni ex art.17 c.2 DPR 633/72 + + + + + Autofattura per regolarizzazione e integrazione delle fatture (ex art.6 c.8 e 9-bis d.lgs.471/97 o art.46 c.5 D.L. 331/93 + + + + + Autofattura per splafonamento + + + + + Estrazione benida Deposito IVA + + + + + Estrazione beni da Deposito IVA con versamento dell'IVA + + + + + Fattura differita di cui all'art.21, comma 4, terzo periodo lett. a) DPR 633/72 + + + + + Fattura differita di cui all'art.21, comma 4, terzo periodo lett. b) DPR 633/72 + + + + + Cessione di beni ammortizzabili e per passaggi interni (ex art.36 DPR 633/72) + + + + + Fattura per autoconsumo o per cessioni gratuite senza rivalsa + + + + + Acquisti da San Marino con IVA (fattura cartacea) + + + + + + + + + + Ritenuta di acconto persone fisiche + + + + + Ritenuta di acconto persone giuridiche + + + + + Contributo INPS + + + + + Contributo ENASARCO + + + + + Contributo ENPAM + + + + + Altro contributo previdenziale + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Cessionario / Committente + + + + + Terzo + + + + + + + Blocco relativo ai dati del Cedente / Prestatore + + + + + + + + + + + + + + + + + + + + + + + + + + + + Regime ordinario + + + + + Regime dei contribuenti minimi (art. 1,c.96-117, L. 244/2007) + + + + + Agricoltura e attività connesse e pesca (artt. 34 e 34-bis, D.P.R. 633/1972) + + + + + Vendita sali e tabacchi (art. 74, c.1, D.P.R. 633/1972) + + + + + Commercio dei fiammiferi (art. 74, c.1, D.P.R. 633/1972) + + + + + Editoria (art. 74, c.1, D.P.R. 633/1972) + + + + + Gestione di servizi di telefonia pubblica (art. 74, c.1, D.P.R. 633/1972) + + + + + Rivendita di documenti di trasporto pubblico e di sosta (art. 74, c.1, D.P.R. 633/1972) + + + + + Intrattenimenti, giochi e altre attività di cui alla tariffa allegata al D.P.R. 640/72 (art. 74, c.6, D.P.R. 633/1972) + + + + + Agenzie di viaggi e turismo (art. 74-ter, D.P.R. 633/1972) + + + + + Agriturismo (art. 5, c.2, L. 413/1991) + + + + + Vendite a domicilio (art. 25-bis, c.6, D.P.R. 600/1973) + + + + + Rivendita di beni usati, di oggetti d’arte, d’antiquariato o da collezione (art. 36, D.L. 41/1995) + + + + + Agenzie di vendite all’asta di oggetti d’arte, antiquariato o da collezione (art. 40-bis, D.L. 41/1995) + + + + + IVA per cassa P.A. (art. 6, c.5, D.P.R. 633/1972) + + + + + IVA per cassa (art. 32-bis, D.L. 83/2012) + + + + + Regime forfettario + + + + + Altro + + + + + + + Il campo Denominazione è in alternativa ai campi Nome e Cognome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blocco relativo ai dati del Rappresentante Fiscale + + + + + + + + + + + + + + + Blocco relativo ai dati del Cessionario / Committente + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blocco relativo ai dati di Beni Servizi della Fattura Elettronica + + + + + + + + + Blocco relativo ai dati dei Veicoli della Fattura Elettronica (da indicare nei casi di cessioni tra Paesi + membri di mezzi di trasporto nuovi, in base all'art. 38, comma 4 del dl 331 del 1993) + + + + + + + + + Blocco relativo ai dati di Pagamento della Fattura Elettronica + + + + + + + + + + + + + pagamento a rate + + + + + pagamento completo + + + + + anticipo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + contanti + + + + + assegno + + + + + assegno circolare + + + + + contanti presso Tesoreria + + + + + bonifico + + + + + vaglia cambiario + + + + + bollettino bancario + + + + + carta di pagamento + + + + + RID + + + + + RID utenze + + + + + RID veloce + + + + + RIBA + + + + + MAV + + + + + quietanza erario + + + + + giroconto su conti di contabilità speciale + + + + + domiciliazione bancaria + + + + + domiciliazione postale + + + + + bollettino di c/c postale + + + + + SEPA Direct Debit + + + + + SEPA Direct Debit CORE + + + + + SEPA Direct Debit B2B + + + + + Trattenuta su somme già riscosse + + + + + PagoPA + + + + + + + + + + + + + + + + + Blocco relativo ai dati del Terzo Intermediario che emette fattura elettronica per conto del Cedente/Prestatore + + + + + + + + + + + + + + + Blocco relativo ai dati di eventuali allegati + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SI = Cessione / Prestazione soggetta a ritenuta + + + + + + + + + + + + + + + + + + + + + + + esigibilità differita + + + + + esigibilità immediata + + + + + scissione dei pagamenti + + + + + + + + + Escluse ex. art. 15 del D.P.R. 633/1972 + + + + + + Non soggette + + + + + Non soggette ad IVA ai sensi degli artt. da 7 a 7-septies del DPR 633/72 + + + + + Non soggette - altri casi + + + + + + Non imponibili + + + + + Non Imponibili - esportazioni + + + + + Non Imponibili - cessioni intracomunitarie + + + + + Non Imponibili - cessioni verso San Marino + + + + + Non Imponibili - operazioni assimilate alle cessioni all'esportazione + + + + + Non Imponibili - a seguito di dichiarazioni d'intento + + + + + Non Imponibili - altre operazioni che non concorrono alla formazione del plafond + + + + + Esenti + + + + + Regime del margine/IVA non esposta in fattura + + + + + + Inversione contabile (per le operazioni in reverse charge ovvero nei casi di autofatturazione per acquisti extra UE di servizi ovvero per importazioni di beni nei soli casi previsti) + + + + + Inversione contabile - cessione di rottami e altri materiali di recupero + + + + + Inversione contabile - cessione di oro e argento ai sensi della legge 7/2000 nonché di oreficeria usata ad OPO + + + + + Inversione contabile - subappalto nel settore edile + + + + + Inversione contabile - cessione di fabbricati + + + + + Inversione contabile - cessione di telefoni cellulari + + + + + Inversione contabile - cessione di prodotti elettronici + + + + + Inversione contabile - prestazioni comparto edile e settori connessi + + + + + Inversione contabile - operazioni settore energetico + + + + + Inversione contabile - altri casi + + + + + IVA assolta in altro stato UE (prestazione di servizi di telecomunicazioni, tele-radiodiffusione ed elettronici ex art. 7-octies lett. a, b, art. 74-sexies DPR 633/72) + + + + + + + + + + + + + + + + + + + + + + + + + socio unico + + + + + più soci + + + + + + + + + in liquidazione + + + + + non in liquidazione + + + + + + + + + + Sconto + + + + + Premio + + + + + Abbuono + + + + + Spesa accessoria + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Docs/Templates/fatturapa_v1.2.1_de-it.xsl b/Docs/Templates/fatturapa_v1.2.1_de-it.xsl index 13fec86..d2ec65e 100644 --- a/Docs/Templates/fatturapa_v1.2.1_de-it.xsl +++ b/Docs/Templates/fatturapa_v1.2.1_de-it.xsl @@ -27,7 +27,7 @@ http://www.gnu.org/licenses/. -

Stylesheet fatturapa_v1.2.1_de-it.xsl v20201125 ft - http://tinyurl.com/fatturapa-xsl-southtyrol

+

Stylesheet fatturapa_v1.2.1_de-it.xsl v20230608 ft - http://tinyurl.com/fatturapa-xsl-southtyrol

@@ -527,7 +527,7 @@ http://www.gnu.org/licenses/.

Rechnungsersteller - Soggetto emittente la fattura

- + ' ' ' '' ' ' - '' + ' ' ' ' '' ' ' @@ -2752,7 +2722,7 @@ object dmResources: TdmResources '' ' ' + 'DER perch'#195#168' viene visualizzato nella sezione BODY -->' ' ' + 'DER perch'#195#168' viene visualizzato nella sezione BODY -->' ' ' '' ' ' @@ -2783,10 +2753,10 @@ object dmResources: TdmResources ' ' '' '
' - '' + #9' ' ' ' ' ' - '' + #9#9#9 #9#9#9' ' @@ -2800,7 +2770,7 @@ object dmResources: TdmResources #9#9#9#9' ' #9#9#9#9'
1.6Austeller
Soggetto emittente
1.6Aussteller
Soggetto emittente
(Rechnungssteller)(cessionario/committente) diff --git a/Ext/AllPackagesGroup.groupproj b/Ext/AllPackagesGroup.groupproj deleted file mode 100644 index 54fd8ec..0000000 --- a/Ext/AllPackagesGroup.groupproj +++ /dev/null @@ -1,108 +0,0 @@ - - - {04978CC3-C0C6-4510-AEFF-E6BA772FB972} - - - - - - - - - - - - - - - - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Ext/AllPackagesGroup_D11.groupproj b/Ext/AllPackagesGroup_D11.groupproj new file mode 100644 index 0000000..ca75781 --- /dev/null +++ b/Ext/AllPackagesGroup_D11.groupproj @@ -0,0 +1,120 @@ + + + {04978CC3-C0C6-4510-AEFF-E6BA772FB972} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ext/AllPackagesGroup_D12.groupproj b/Ext/AllPackagesGroup_D12.groupproj new file mode 100644 index 0000000..ac5c615 --- /dev/null +++ b/Ext/AllPackagesGroup_D12.groupproj @@ -0,0 +1,120 @@ + + + {1BA49F4A-A03D-4A6C-A756-73FC11E9373C} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Ext/External Projects.md b/Ext/External Projects.md index 56b4e7e..feff341 100644 --- a/Ext/External Projects.md +++ b/Ext/External Projects.md @@ -1,15 +1,18 @@ -# External projects +# External projects ***In questo progetto vengono utilizzati questi progetti esterni*** -- [SVGIconImageList][1] +- [Ethea's SVGIconImageList][1] -- [Synedit][2] +- [Ethea's VCL-StyledComponents][4] -- [VCL-Style-Utils][3] +- [PKCS7Extractor][3] + +- [Synedit][4] ***Per comodità di ricompilazione sono stati aggiunti in questa cartella*** -[1]: https://github.com/EtheaDev/SVGShellExtensions/releases/latest/download/SVGShellExtensionsSetup.exe -[2]: https://github.com/EtheaDev/SVGIconImageList -[3]: https://github.com/SynEdit/SynEdit \ No newline at end of file +[1]: https://github.com/EtheaDev/SVGIconImageList +[2]: https://github.com/EtheaDev/StyledComponents +[3]: https://github.com/DelphiClubItalia/PKCS7Extractor +[4]: https://github.com/SynEdit/SynEdit diff --git a/Ext/HTMLViewer/Source/BegaHtmlPrintPreviewForm.pas b/Ext/HTMLViewer/Source/BegaHtmlPrintPreviewForm.pas index bd89ba5..4e57e8d 100644 --- a/Ext/HTMLViewer/Source/BegaHtmlPrintPreviewForm.pas +++ b/Ext/HTMLViewer/Source/BegaHtmlPrintPreviewForm.pas @@ -1,5 +1,5 @@ {------------------------------------------------------------------------------- -Copyright (C) 2006-2012 by Bernd Gabriel. +Copyright (C) 2006-2023 by Bernd Gabriel. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -47,14 +47,14 @@ TBegaHtmlPrintPreviewForm = class(TBegaCustomPrintPreviewForm) private FFrameViewer: TFVBase; // TFrameViewer or TFrameBrowser FHtmlViewer: THtmlViewer; - function canPrint: Boolean; + function CanPrint: Boolean; function CurrentViewer: THtmlViewer; function PreviewGetSize(Sender: TObject; MFPrinter: TBegaMetaFilePrinter; out Width, Height: Integer): Boolean; procedure PreviewCreatePages(Sender: TObject; MFPrinter: TBegaMetaFilePrinter; var Done: Boolean); procedure PreviewPrintPages(Sender: TObject; MFPrinter: TBegaMetaFilePrinter; FirstPage, LastPage, Copies: Integer); - procedure setFrameViewer(const Value: TFVBase); - procedure setHtmlViewer(const Value: THtmlViewer); - procedure updateEvents; + procedure SetFrameViewer(const Value: TFVBase); + procedure SetHtmlViewer(const Value: THtmlViewer); + procedure UpdateEvents; public property FrameViewer: TFVBase read FFrameViewer write setFrameViewer; property HtmlViewer: THtmlViewer read FHtmlViewer write setHtmlViewer; @@ -158,26 +158,26 @@ procedure TBegaHtmlPrintPreviewForm.PreviewPrintPages(Sender: TObject; end; //- BG ----------------------------------------------------------- 26.03.2007 -- -procedure TBegaHtmlPrintPreviewForm.setFrameViewer(const Value: TFVBase); +procedure TBegaHtmlPrintPreviewForm.SetFrameViewer(const Value: TFVBase); begin FFrameViewer := Value; FHtmlViewer := nil; - updateEvents; + UpdateEvents; Preview.createPages; end; //- BG ----------------------------------------------------------- 26.03.2007 -- -procedure TBegaHtmlPrintPreviewForm.setHtmlViewer( +procedure TBegaHtmlPrintPreviewForm.SetHtmlViewer( const Value: THtmlViewer); begin FFrameViewer := nil; FHtmlViewer := Value; - updateEvents; + UpdateEvents; Preview.createPages; end; //- BG ----------------------------------------------------------- 27.03.2007 -- -procedure TBegaHtmlPrintPreviewForm.updateEvents; +procedure TBegaHtmlPrintPreviewForm.UpdateEvents; begin if CurrentViewer <> nil then begin diff --git a/Ext/HTMLViewer/Source/BegaMetaFilePrinter.pas b/Ext/HTMLViewer/Source/BegaMetaFilePrinter.pas index dfa0ab3..54dd651 100644 --- a/Ext/HTMLViewer/Source/BegaMetaFilePrinter.pas +++ b/Ext/HTMLViewer/Source/BegaMetaFilePrinter.pas @@ -1,5 +1,5 @@ {------------------------------------------------------------------------------- -Copyright (C) 2006-2012 by Bernd Gabriel. +Copyright (C) 2006-2022 by Bernd Gabriel. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -34,7 +34,7 @@ interface {$ifdef LCL} LclIntf, LclType, LMessages, {$endif} - Dialogs, Controls, Forms, Graphics, Math, Printers, Types, + Dialogs, Controls, Forms, Graphics, Math, Printers, Types, Contnrs, // MetaFilePrinter; @@ -58,10 +58,10 @@ TBegaSize = record //------------------------------------------------------------------------------ IBegaPrintable = interface - function getHeight: Integer; - function getWidth: Integer; - procedure beforeFirstPage(PageWidth, PageHeight: Integer; out PrintWidth, PrintHeight: Integer); - procedure print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); + function GetHeight: Integer; + function GetWidth: Integer; + procedure BeforeFirstPage(PageWidth, PageHeight: Integer; out PrintWidth, PrintHeight: Integer); + procedure Print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); property Height: Integer read getHeight; property Width: Integer read getWidth; end; @@ -72,10 +72,10 @@ TBegaSize = record TBegaPrintable = class(TInterfacedObject, IBegaPrintable) protected - function getHeight: Integer; virtual; abstract; - function getWidth: Integer; virtual; abstract; - procedure beforeFirstPage(PageWidth, PageHeight: Integer; out PrintWidth, PrintHeight: Integer); virtual; - procedure print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); virtual; abstract; + function GetHeight: Integer; virtual; abstract; + function GetWidth: Integer; virtual; abstract; + procedure BeforeFirstPage(PageWidth, PageHeight: Integer; out PrintWidth, PrintHeight: Integer); virtual; + procedure Print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); virtual; abstract; public property Height: Integer read getHeight; property Width: Integer read getWidth; @@ -86,10 +86,10 @@ TBegaPrintableControl = class(TBegaPrintable, IBegaPrintable) private FControl: TControl; public - constructor create(ControlToPrint: TControl); - function getHeight: Integer; override; - function getWidth: Integer; override; - procedure print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); override; + constructor Create(ControlToPrint: TControl); + function GetHeight: Integer; override; + function GetWidth: Integer; override; + procedure Print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); override; end; //BG, 05.12.2006 @@ -97,10 +97,10 @@ TBegaPrintableGraphic = class(TBegaPrintable, IBegaPrintable) private FGraphic: TGraphic; public - constructor create(GraphicToPrint: TGraphic); - function getHeight: Integer; override; - function getWidth: Integer; override; - procedure print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); override; + constructor Create(GraphicToPrint: TGraphic); + function GetHeight: Integer; override; + function GetWidth: Integer; override; + procedure Print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); override; end; //------------------------------------------------------------------------------ @@ -112,29 +112,28 @@ TBegaMetaFilePrinter = class(TMetaFilePrinter) private FPrintScale: double; // > 1 enlarges print/preview FPrintMargins: TRect; // in millimeters - FOwnsPages: Boolean; - function getPreviewPrintArea: TBegaRect; - function getPrintArea: TBegaRect; // in pixels - function getPrintMargins: TRect; // FPrintMargins in pixels - procedure doBeforeFirstPage(out PreviewArea: TBegaRect; out WDpi: Integer; out hrgnClip: HRGN); - function getPreviewPaperArea: TBegaRect; - function getPaperArea: TBegaRect; - function printer2preview(Value: TBegaRect): TBegaRect; - function printer2previewX(Value: Integer): Integer; - function printer2previewY(Value: Integer): Integer; - function getPageCount: Integer; + function GetPreviewPrintArea: TBegaRect; + function GetPrintArea: TBegaRect; // in pixels + function GetPrintMargins: TRect; // FPrintMargins in pixels + procedure DoBeforeFirstPage(out PreviewArea: TBegaRect; out WDpi: Integer; out hrgnClip: HRGN); + function GetPreviewPaperArea: TBegaRect; + function GetPaperArea: TBegaRect; + function Printer2Preview(Value: TBegaRect): TBegaRect; + function Printer2PreviewX(Value: Integer): Integer; + function Printer2PreviewY(Value: Integer): Integer; + function GetPageCount: Integer; public constructor Create(AOwner: TComponent); override; - function getPreviewArea(PrintArea: TBegaRect; WDpi: Integer): TBegaRect; - procedure addPage(Page: TMetaFile); - procedure addPages(Source: TBegaMetaFilePrinter; RemovePagesFromSource: Boolean); - procedure clear; - procedure copySettingsFrom(Source: TBegaMetaFilePrinter); - procedure preview(Printable: IBegaPrintable); - procedure print(Printable: IBegaPrintable; FirstPage: Integer = 1; LastPage: Integer = 9999); - procedure printDoc(Printer: TPrinter; FirstPage: Integer = 1; LastPage: Integer = 9999; Copies: Integer = 1); - procedure printTo(Printer: TPrinter; FirstPage: Integer = 1; LastPage: Integer = 9999); - procedure updatePrinterCaps; + function GetPreviewArea(PrintArea: TBegaRect; WDpi: Integer): TBegaRect; + procedure AddPage(Page: TMetaFile); + procedure AddPages(Source: TBegaMetaFilePrinter; RemovePagesFromSource: Boolean); + procedure Clear; + procedure CopySettingsFrom(Source: TBegaMetaFilePrinter); + procedure Preview(Printable: IBegaPrintable); + procedure Print(Printable: IBegaPrintable; FirstPage: Integer = 1; LastPage: Integer = 9999); + procedure PrintDoc(Printer: TPrinter; FirstPage: Integer = 1; LastPage: Integer = 9999; Copies: Integer = 1); + procedure PrintTo(Printer: TPrinter; FirstPage: Integer = 1; LastPage: Integer = 9999); + procedure UpdatePrinterCaps; property PageCount: Integer read getPageCount; property PaperArea: TBegaRect read getPaperArea; // in printer pixels property PrintArea: TBegaRect read getPrintArea; // in printer pixels @@ -150,7 +149,7 @@ implementation { TBegaPrintable } -procedure TBegaPrintable.beforeFirstPage( +procedure TBegaPrintable.BeforeFirstPage( PageWidth, PageHeight: Integer; out PrintWidth, PrintHeight: Integer); begin @@ -161,26 +160,26 @@ procedure TBegaPrintable.beforeFirstPage( { TBegaPrintableControl } //- BG ----------------------------------------------------------- 11.03.2006 -- -constructor TBegaPrintableControl.create(ControlToPrint: TControl); +constructor TBegaPrintableControl.Create(ControlToPrint: TControl); begin inherited create; FControl := ControlToPrint; end; //- BG ----------------------------------------------------------- 05.12.2006 -- -function TBegaPrintableControl.getHeight: Integer; +function TBegaPrintableControl.GetHeight: Integer; begin Result := FControl.Height; end; //- BG ----------------------------------------------------------- 05.12.2006 -- -function TBegaPrintableControl.getWidth: Integer; +function TBegaPrintableControl.GetWidth: Integer; begin Result := FControl.Width; end; //- BG ----------------------------------------------------------- 11.03.2006 -- -procedure TBegaPrintableControl.print(Canvas: TCanvas; +procedure TBegaPrintableControl.Print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); begin IntersectClipRect(Canvas.Handle, 0, 0, FControl.Width, FControl.Height); @@ -194,26 +193,26 @@ TBegaGraphic = class(TGraphic) end; //- BG ----------------------------------------------------------- 04.12.2006 -- -constructor TBegaPrintableGraphic.create(GraphicToPrint: TGraphic); +constructor TBegaPrintableGraphic.Create(GraphicToPrint: TGraphic); begin - inherited create; + inherited Create; FGraphic := GraphicToPrint; end; //- BG ----------------------------------------------------------- 05.12.2006 -- -function TBegaPrintableGraphic.getHeight: Integer; +function TBegaPrintableGraphic.GetHeight: Integer; begin Result := FGraphic.Width; end; //- BG ----------------------------------------------------------- 05.12.2006 -- -function TBegaPrintableGraphic.getWidth: Integer; +function TBegaPrintableGraphic.GetWidth: Integer; begin Result := FGraphic.Height; end; //- BG ----------------------------------------------------------- 04.12.2006 -- -procedure TBegaPrintableGraphic.print(Canvas: TCanvas; var PrintedWidth, +procedure TBegaPrintableGraphic.Print(Canvas: TCanvas; var PrintedWidth, PrintedHeight: Integer); begin IntersectClipRect(Canvas.Handle, 0, 0, FGraphic.Width, FGraphic.Height); @@ -223,60 +222,58 @@ procedure TBegaPrintableGraphic.print(Canvas: TCanvas; var PrintedWidth, { TBegaMetaFilePrinter } //- BG ----------------------------------------------------------- 20.04.2006 -- -procedure TBegaMetaFilePrinter.addPage(Page: TMetaFile); +procedure TBegaMetaFilePrinter.AddPage(Page: TMetaFile); begin - FMFList.add(Page); + FPages.Add(Page); end; //- BG ----------------------------------------------------------- 20.04.2006 -- -procedure TBegaMetaFilePrinter.addPages(Source: TBegaMetaFilePrinter; RemovePagesFromSource: Boolean); +procedure TBegaMetaFilePrinter.AddPages(Source: TBegaMetaFilePrinter; RemovePagesFromSource: Boolean); var NewCount: Integer; Index: Integer; + SourceOwnsObjects: Boolean; begin - NewCount := FMFList.Count + Source.FMFList.Count; - if FMFList.Capacity < NewCount then - FMFList.Capacity := NewCount; - for Index := 0 to Source.FMFList.Count - 1 do - FMFList.add(Source.FMFList[Index]); - FOwnsPages := RemovePagesFromSource; + NewCount := FPages.Count + Source.FPages.Count; + if FPages.Capacity < NewCount then + FPages.Capacity := NewCount; + for Index := 0 to Source.FPages.Count - 1 do + FPages.Add(Source.FPages[Index]); + FPages.OwnsObjects := RemovePagesFromSource; if RemovePagesFromSource then - Source.FMFList.clear; + begin + SourceOwnsObjects := Source.FPages.OwnsObjects; + Source.FPages.OwnsObjects := False; + Source.FPages.Clear; + Source.FPages.OwnsObjects := SourceOwnsObjects; + end; end; //- BG ----------------------------------------------------------- 29.04.2006 -- -procedure TBegaMetaFilePrinter.clear; +procedure TBegaMetaFilePrinter.Clear; begin - if FOwnsPages then - FreeMetaFiles - else - begin - FMFList.clear; - FreeAndNil(FCurCanvas); - end; + FPages.Clear; + FreeAndNil(FCurCanvas); end; //- BG ----------------------------------------------------------- 29.04.2006 -- -procedure TBegaMetaFilePrinter.copySettingsFrom(Source: TBegaMetaFilePrinter); +procedure TBegaMetaFilePrinter.CopySettingsFrom(Source: TBegaMetaFilePrinter); begin FPrintScale := Source.FPrintScale; FPrintMargins := Source.FPrintMargins; // - assign(Source); + Assign(Source); end; //- BG ----------------------------------------------------------- 10.03.2006 -- -constructor TBegaMetaFilePrinter.create(AOwner: TComponent); -const - defaultPrintMargin = 5; //20; +constructor TBegaMetaFilePrinter.Create(AOwner: TComponent); begin - inherited create(AOwner); + inherited Create(AOwner); FPrintScale := 1.0; - FPrintMargins.Left := defaultPrintMargin; - FPrintMargins.Right := defaultPrintMargin; - FPrintMargins.Top := defaultPrintMargin; - FPrintMargins.Bottom := defaultPrintMargin; - FOwnsPages := True; + FPrintMargins.Left := 20; + FPrintMargins.Right := 20; + FPrintMargins.Top := 20; + FPrintMargins.Bottom := 20; try if Printer.Printers.Count > 0 then @@ -292,16 +289,16 @@ constructor TBegaMetaFilePrinter.create(AOwner: TComponent); end; //- BG ----------------------------------------------------------- 12.03.2006 -- -procedure TBegaMetaFilePrinter.doBeforeFirstPage( +procedure TBegaMetaFilePrinter.DoBeforeFirstPage( out PreviewArea: TBegaRect; out WDpi: Integer; out hrgnClip: HRGN); var Area: TBegaRect; begin - Area := getPrintArea; - PreviewArea := printer2preview(Area); - WDpi := ceil(Screen.PixelsPerInch / PrintScale); + Area := GetPrintArea; + PreviewArea := Printer2Preview(Area); + WDpi := Ceil(Screen.PixelsPerInch / PrintScale); hrgnClip := CreateRectRgn( Area.Left, Area.Top, @@ -310,13 +307,13 @@ procedure TBegaMetaFilePrinter.doBeforeFirstPage( end; //- BG ----------------------------------------------------------- 23.03.2007 -- -function TBegaMetaFilePrinter.getPageCount: Integer; +function TBegaMetaFilePrinter.GetPageCount: Integer; begin Result := PageNumber; end; //- BG ----------------------------------------------------------- 24.03.2007 -- -function TBegaMetaFilePrinter.getPaperArea: TBegaRect; +function TBegaMetaFilePrinter.GetPaperArea: TBegaRect; begin Result.Left := 0; Result.Top := 0; @@ -325,7 +322,7 @@ function TBegaMetaFilePrinter.getPaperArea: TBegaRect; end; //- BG ----------------------------------------------------------- 12.03.2006 -- -function TBegaMetaFilePrinter.getPreviewArea(PrintArea: TBegaRect; WDpi: Integer): TBegaRect; +function TBegaMetaFilePrinter.GetPreviewArea(PrintArea: TBegaRect; WDpi: Integer): TBegaRect; begin Result.Left := MulDiv(PrintArea.Left , WDpi, PixelsPerInchX); Result.Top := MulDiv(PrintArea.Top , WDpi, PixelsPerInchY); @@ -334,33 +331,33 @@ function TBegaMetaFilePrinter.getPreviewArea(PrintArea: TBegaRect; WDpi: Integer end; //- BG ----------------------------------------------------------- 23.03.2007 -- -function TBegaMetaFilePrinter.getPreviewPaperArea: TBegaRect; +function TBegaMetaFilePrinter.GetPreviewPaperArea: TBegaRect; begin // converts PrinterMargins given in mm to preview pixels - Result := printer2preview(PaperArea); + Result := Printer2Preview(PaperArea); end; //- BG ----------------------------------------------------------- 23.03.2007 -- -function TBegaMetaFilePrinter.getPreviewPrintArea: TBegaRect; +function TBegaMetaFilePrinter.GetPreviewPrintArea: TBegaRect; begin - Result := printer2preview(PrintArea) + Result := Printer2Preview(PrintArea) end; //- BG ----------------------------------------------------------- 12.03.2006 -- -function TBegaMetaFilePrinter.getPrintArea: TBegaRect; +function TBegaMetaFilePrinter.GetPrintArea: TBegaRect; var Margins: TRect; begin // printer area without margins in printer pixels Margins := getPrintMargins; - Result.Left := max(Margins.Left, OffsetX); - Result.Top := max(Margins.Top, OffsetY); - Result.Width := min(max(PaperWidth - Result.Left - Margins.Right, 0), PageWidth); - Result.Height := min(max(PaperHeight - Result.Top - Margins.Bottom, 0), PageHeight); + Result.Left := Max(Margins.Left, OffsetX); + Result.Top := Max(Margins.Top, OffsetY); + Result.Width := Min(Max(PaperWidth - Result.Left - Margins.Right, 0), PageWidth); + Result.Height := Min(Max(PaperHeight - Result.Top - Margins.Bottom, 0), PageHeight); end; //- BG ----------------------------------------------------------- 11.03.2006 -- -function TBegaMetaFilePrinter.getPrintMargins: TRect; +function TBegaMetaFilePrinter.GetPrintMargins: TRect; begin // converts PrinterMargins given in mm to printer pixels Result.Left := Floor(FPrintMargins.Left / 25.4 * PixelsPerInchX); @@ -370,10 +367,10 @@ function TBegaMetaFilePrinter.getPrintMargins: TRect; end; //- BG ----------------------------------------------------------- 12.03.2006 -- -procedure TBegaMetaFilePrinter.preview(Printable: IBegaPrintable); +procedure TBegaMetaFilePrinter.Preview(Printable: IBegaPrintable); var DC: HDC; - Done: boolean; + Done: Boolean; hrgnClip: HRGN; PreviewArea: TBegaRect; PrintedHeight: Integer; @@ -388,8 +385,8 @@ procedure TBegaMetaFilePrinter.preview(Printable: IBegaPrintable); hrgnClip := 0; BeginDoc; try - doBeforeFirstPage(PreviewArea, WDpi, hrgnClip); - Printable.beforeFirstPage(PreviewArea.Width, PreviewArea.Height, XPixels, YPixels); + DoBeforeFirstPage(PreviewArea, WDpi, hrgnClip); + Printable.BeforeFirstPage(PreviewArea.Width, PreviewArea.Height, XPixels, YPixels); Done := False; YOrigin := 0; @@ -422,17 +419,17 @@ procedure TBegaMetaFilePrinter.preview(Printable: IBegaPrintable); // notify that a page has been printed //Application.ProcessMessages; if Assigned(FOnPageEvent) then - FOnPageEvent(Self, FMFList.Count, Done); + FOnPageEvent(Self, FPages.Count, Done); // proceed to next page if PrintedWidth > 0 then - inc(XOrigin, min(PrintedWidth, PreviewArea.Width)) + Inc(XOrigin, Min(PrintedWidth, PreviewArea.Width)) else XOrigin := XPixels; end; // proceed to next page if PrintedHeight > 0 then - inc(YOrigin, min(PrintedHeight, PreviewArea.Height)) + Inc(YOrigin, Min(PrintedHeight, PreviewArea.Height)) else YOrigin := YPixels; end; @@ -444,12 +441,12 @@ procedure TBegaMetaFilePrinter.preview(Printable: IBegaPrintable); end; //- BG ----------------------------------------------------------- 12.03.2006 -- -procedure TBegaMetaFilePrinter.print(Printable: IBegaPrintable; FirstPage, LastPage: Integer); +procedure TBegaMetaFilePrinter.Print(Printable: IBegaPrintable; FirstPage, LastPage: Integer); var CurrentCanvas: TCanvas; CurrentPage: Integer; DC: HDC; - Done: boolean; + Done: Boolean; hrgnClip: HRGN; NoPrintCanvas: TCanvas; PreviewArea: TBegaRect; @@ -519,13 +516,13 @@ procedure TBegaMetaFilePrinter.print(Printable: IBegaPrintable; FirstPage, LastP if CurrentPage >= LastPage then Done := True else if PrintedWidth > 0 then - inc(XOrigin, min(PrintedWidth, PreviewArea.Width)) + Inc(XOrigin, Min(PrintedWidth, PreviewArea.Width)) else XOrigin := XPixels; end; // proceed to next page if PrintedHeight > 0 then - inc(YOrigin, min(PrintedHeight, PreviewArea.Height)) + Inc(YOrigin, Min(PrintedHeight, PreviewArea.Height)) else YOrigin := YPixels; end; @@ -538,14 +535,14 @@ procedure TBegaMetaFilePrinter.print(Printable: IBegaPrintable; FirstPage, LastP end; //- BG ----------------------------------------------------------- 27.05.2006 -- -procedure TBegaMetaFilePrinter.printDoc(Printer: TPrinter; FirstPage, LastPage, Copies: Integer); +procedure TBegaMetaFilePrinter.PrintDoc(Printer: TPrinter; FirstPage, LastPage, Copies: Integer); var Index: Integer; begin Printer.BeginDoc; try for Index := 1 to Copies do - printTo(Printer, FirstPage, LastPage); + PrintTo(Printer, FirstPage, LastPage); Printer.EndDoc; except Printer.Abort; @@ -554,28 +551,28 @@ procedure TBegaMetaFilePrinter.printDoc(Printer: TPrinter; FirstPage, LastPage, end; //- BG ----------------------------------------------------------- 24.03.2007 -- -function TBegaMetaFilePrinter.printer2preview(Value: TBegaRect): TBegaRect; +function TBegaMetaFilePrinter.Printer2Preview(Value: TBegaRect): TBegaRect; begin - Result.Left := printer2previewX(Value.Left); - Result.Top := printer2previewY(Value.Top); - Result.Width := printer2previewX(Value.Width); - Result.Height := printer2previewY(Value.Height); + Result.Left := Printer2PreviewX(Value.Left); + Result.Top := Printer2PreviewY(Value.Top); + Result.Width := Printer2PreviewX(Value.Width); + Result.Height := Printer2PreviewY(Value.Height); end; //- BG ----------------------------------------------------------- 24.03.2007 -- -function TBegaMetaFilePrinter.printer2previewX(Value: Integer): Integer; +function TBegaMetaFilePrinter.Printer2PreviewX(Value: Integer): Integer; begin Result := Round(Value * Screen.PixelsPerInch / (PrintScale * PixelsPerInchX)); end; //- BG ----------------------------------------------------------- 24.03.2007 -- -function TBegaMetaFilePrinter.printer2previewY(Value: Integer): Integer; +function TBegaMetaFilePrinter.Printer2PreviewY(Value: Integer): Integer; begin Result := Round(Value * Screen.PixelsPerInch / (PrintScale * PixelsPerInchY)); end; //- BG ----------------------------------------------------------- 10.04.2006 -- -procedure TBegaMetaFilePrinter.printTo(Printer: TPrinter; FirstPage, LastPage: Integer); +procedure TBegaMetaFilePrinter.PrintTo(Printer: TPrinter; FirstPage, LastPage: Integer); var CurrentPage: Integer; MetaFile: TMetafile; @@ -583,11 +580,11 @@ procedure TBegaMetaFilePrinter.printTo(Printer: TPrinter; FirstPage, LastPage: I Area: TBegaRect; begin Area := self.PrintArea; - Area.Left := min(OffsetX, Area.Left); - Area.Top := min(OffsetY, Area.Top); + Area.Left := Min(OffsetX, Area.Left); + Area.Top := Min(OffsetY, Area.Top); Done := True; - if LastPage > FMFList.Count then - LastPage := FMFList.Count; + if LastPage > FPages.Count then + LastPage := FPages.Count; for CurrentPage := FirstPage to LastPage do begin MetaFile := MetaFiles[CurrentPage - 1]; @@ -613,9 +610,9 @@ procedure TBegaMetaFilePrinter.printTo(Printer: TPrinter; FirstPage, LastPage: I end; //- BG ----------------------------------------------------------- 15.03.2006 -- -procedure TBegaMetaFilePrinter.updatePrinterCaps; +procedure TBegaMetaFilePrinter.UpdatePrinterCaps; begin - getPrinterCapsOf(Printer); + GetPrinterCapsOf(Printer); end; {$endif NoMetaFile} diff --git a/Ext/HTMLViewer/Source/BegaPreview.pas b/Ext/HTMLViewer/Source/BegaPreview.pas index dbe7b3a..09be08a 100644 --- a/Ext/HTMLViewer/Source/BegaPreview.pas +++ b/Ext/HTMLViewer/Source/BegaPreview.pas @@ -1,5 +1,5 @@ {------------------------------------------------------------------------------- -Copyright (C) 2006-2014 by Bernd Gabriel. +Copyright (C) 2006-2023 by Bernd Gabriel. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -173,47 +173,47 @@ TBegaCustomPreviewFrame = class(TFrame) FOptions: TBegaPreviewOptions; FZoom: double; Moving: Boolean; - function getContentSize(out ContentSize: TBegaSize): Boolean; - function getLastAvailablePage: Integer; - function getPage(Index: Integer): TMetafile; - function getPageCount: Integer; - function getVisiblePageCount: Integer; + function GetContentSize(out ContentSize: TBegaSize): Boolean; + function GetLastAvailablePage: Integer; + function GetPage(Index: Integer): TMetafile; + function GetPageCount: Integer; + function GetVisiblePageCount: Integer; function PixelsPerInch: Integer; - procedure printPages(FirstPage, LastPage, Copies: Integer); - procedure setCurrentPage(Val: integer); - procedure setOptions(const Value: TBegaPreviewOptions); - procedure setContentZoomMode(Zoom: TBegaZoomMode); - procedure setPreviewZoomMode(Zoom: TBegaZoomMode); + procedure PrintPages(FirstPage, LastPage, Copies: Integer); + procedure SetCurrentPage(Val: integer); + procedure SetOptions(const Value: TBegaPreviewOptions); + procedure SetContentZoomMode(Zoom: TBegaZoomMode); + procedure SetPreviewZoomMode(Zoom: TBegaZoomMode); property LastAvailablePage: Integer read getLastAvailablePage; // due to visible page count property VisiblePageCount: Integer read getVisiblePageCount; property Zoom: Double read FZoom write FZoom; - function getContentZoomMode: TBegaZoomMode; - function getPreviewZoomMode: TBegaZoomMode; - function getCurrentPage: Integer; + function GetContentZoomMode: TBegaZoomMode; + function GetPreviewZoomMode: TBegaZoomMode; + function GetCurrentPage: Integer; protected procedure Loaded; override; // - function buttonEnabled(Button: TBegaPreviewOption): Boolean; virtual; - // doGetSize() calculates size of all pages, which enables content zoom. - function canGetContentSize: Boolean; virtual; - procedure doGetContentSize(var Done: Boolean; out Width, Height: Integer); virtual; - // doCreatePageMenu() populates MFPrinter with pages - procedure doCreatePageMenu(var Done: Boolean); virtual; - // doCreatePages() populates MFPrinter with pages - procedure doCreatePages(var Done: Boolean); virtual; - // doPrintPages() prints pages of MFPrinter or do you prefer printing elsehow? - procedure doPrintPages(var Done: Boolean); virtual; - // doPrinterSetup(): override or use OnPrinterSetup to reduce number of printer setup dialogs: - procedure doPrinterSetup(var Done, Changed: Boolean); virtual; + function ButtonEnabled(Button: TBegaPreviewOption): Boolean; virtual; + // DoGetSize() calculates size of all pages, which enables content zoom. + function CanGetContentSize: Boolean; virtual; + procedure DoGetContentSize(var Done: Boolean; out Width, Height: Integer); virtual; + // DoCreatePageMenu() populates MFPrinter with pages + procedure DoCreatePageMenu(var Done: Boolean); virtual; + // DoCreatePages() populates MFPrinter with pages + procedure DoCreatePages(var Done: Boolean); virtual; + // DoPrintPages() prints pages of MFPrinter or do you prefer printing elsehow? + procedure DoPrintPages(var Done: Boolean); virtual; + // DoPrinterSetup(): override or use OnPrinterSetup to reduce number of printer setup dialogs: + procedure DoPrinterSetup(var Done, Changed: Boolean); virtual; // - procedure doAllOnOne(var Done: Boolean); virtual; + procedure DoAllOnOne(var Done: Boolean); virtual; // - procedure doOpenInExcel(var Done: Boolean); virtual; + procedure DoOpenInExcel(var Done: Boolean); virtual; // - procedure updateBox; - procedure updateContentZoom; - procedure updatePage; - procedure updatePageMenu; + procedure UpdateBox; + procedure UpdateContentZoom; + procedure UpdatePage; + procedure UpdatePageMenu; property CurrentPage: Integer read getCurrentPage write SetCurrentPage; // 1..n property MFPrinter: TBegaMetaFilePrinter read FMFPrinter; property OnAllOnOne: TBegaAllOnOneEvent read FOnAllOnOne write FOnAllOnOne; @@ -234,8 +234,8 @@ TBegaCustomPreviewFrame = class(TFrame) public constructor Create(AOwner: TComponent); override; destructor Destroy; override; - procedure createPages; - procedure updateActions; + procedure CreatePages; + procedure UpdateActions; end; //BG, 20.04.2006: split: TBegaPreviewFrame @@ -255,7 +255,7 @@ TBegaPreviewFrame = class(TBegaCustomPreviewFrame) property PreviewZoomMode; end; -procedure loadPreviewCursors; +procedure LoadPreviewCursors; {$endif NoMetaFile} {$endif NoFlatScrollbars} @@ -277,9 +277,16 @@ implementation {$R ZoomAndHandCursor.res} {$endif} +type + //BG, 05.02.2023: don't add virtual methods or fields. It is only used to access protected stuff of TCustomForm. + TBegaCustomForm = class(TCustomForm) + public + property PixelsPerInch; + end; + //- BG ----------------------------------------------------------- 04.11.2006 -- var PreviewCursorsLoaded: Boolean; -procedure loadPreviewCursors; +procedure LoadPreviewCursors; begin if not PreviewCursorsLoaded then begin @@ -292,7 +299,7 @@ procedure loadPreviewCursors; end; //- BG ----------------------------------------------------------- 04.11.2006 -- -function zoom2ZoomMode(Zoom: Double): TBegaZoomMode; +function Zoom2ZoomMode(Zoom: Double): TBegaZoomMode; begin case round(Zoom * 100) of 25: Result := zm25; @@ -310,39 +317,39 @@ function zoom2ZoomMode(Zoom: Double): TBegaZoomMode; end; //- BG ----------------------------------------------------------- 25.05.2006 -- -function TBegaCustomPreviewFrame.buttonEnabled( +function TBegaCustomPreviewFrame.ButtonEnabled( Button: TBegaPreviewOption): Boolean; begin Result := Button in PreviewOptions; end; //- BG ----------------------------------------------------------- 20.04.2006 -- -function TBegaCustomPreviewFrame.canGetContentSize: Boolean; +function TBegaCustomPreviewFrame.CanGetContentSize: Boolean; begin - Result := assigned(FOnGetContentSize); + Result := Assigned(FOnGetContentSize); end; //- BG ----------------------------------------------------------- 15.03.2006 -- procedure TBegaCustomPreviewFrame.ContentFitHeightClick(Sender: TObject); begin ContentZoomBox.ItemIndex := 1; - updateContentZoom; - createPages; + UpdateContentZoom; + CreatePages; end; //- BG ----------------------------------------------------------- 15.03.2006 -- procedure TBegaCustomPreviewFrame.ContentFitWidthClick(Sender: TObject); begin ContentZoomBox.ItemIndex := 2; - updateContentZoom; - createPages; + UpdateContentZoom; + CreatePages; end; //- BG ----------------------------------------------------------- 14.03.2006 -- procedure TBegaCustomPreviewFrame.ContentZoomBoxChange(Sender: TObject); begin - updateContentZoom; - createPages; + UpdateContentZoom; + CreatePages; end; //- BG ----------------------------------------------------------- 21.02.2006 -- @@ -351,56 +358,60 @@ constructor TBegaCustomPreviewFrame.Create(AOwner: TComponent); inherited; FOptions := CBegaPreviewOptionsDefault; FZoom := 1.0; - ZoomBox.ItemIndex := 2; //default fittowidth + ZoomBox.ItemIndex := 0; ContentZoomBox.ItemIndex := 6; - UnitsBox.ItemIndex := 1; //default centimeters - loadPreviewCursors; -// ZoomingClick(Zooming); + UnitsBox.ItemIndex := 0; + LoadPreviewCursors; FMFPrinter := TBegaMetaFilePrinter.Create(Self); - updateActions; + //FMFPrinter.PreviewPixelsPerInch := PixelsPerInch; + //PreviewPanel.MFPrinter := FMFPrinter; + UpdateActions; end; //- BG ----------------------------------------------------------- 21.02.2006 -- -procedure TBegaCustomPreviewFrame.createPages; +procedure TBegaCustomPreviewFrame.CreatePages; var Done: Boolean; begin Done := False; - MFPrinter.updatePrinterCaps; - MFPrinter.clear; - doCreatePages(Done); +{$ifdef LCL} + MFPrinter.PreviewPixelsPerInch := PixelsPerInch; +{$endif} + MFPrinter.UpdatePrinterCaps; + MFPrinter.Clear; + DoCreatePages(Done); if Done then begin - updateBox; - updatePageMenu; + UpdateBox; + UpdatePageMenu; CurrentPage := 1; end; - updatePage; - updateActions; + UpdatePage; + UpdateActions; end; //- BG ----------------------------------------------------------- 06.03.2006 -- destructor TBegaCustomPreviewFrame.Destroy; begin - MFPrinter.free; + MFPrinter.Free; inherited; end; //- BG ----------------------------------------------------------- 22.12.2006 -- -procedure TBegaCustomPreviewFrame.doAllOnOne(var Done: Boolean); +procedure TBegaCustomPreviewFrame.DoAllOnOne(var Done: Boolean); begin - if assigned(FOnAllOnOne) then + if Assigned(FOnAllOnOne) then FOnAllOnOne(self, AllOnOne.Down); // there is no default 'all' action end; //- BG ----------------------------------------------------------- 26.04.2006 -- -procedure TBegaCustomPreviewFrame.doCreatePageMenu(var Done: Boolean); +procedure TBegaCustomPreviewFrame.DoCreatePageMenu(var Done: Boolean); var Index: Integer; begin cboxPage.Clear; - if assigned(FOnGetPageTitle) then + if Assigned(FOnGetPageTitle) then for Index := 1 to PageCount do cboxPage.Items.Add(FOnGetPageTitle(self, Index)) else @@ -411,25 +422,25 @@ procedure TBegaCustomPreviewFrame.doCreatePageMenu(var Done: Boolean); end; //- BG ----------------------------------------------------------- 06.03.2006 -- -procedure TBegaCustomPreviewFrame.doCreatePages(var Done: Boolean); +procedure TBegaCustomPreviewFrame.DoCreatePages(var Done: Boolean); begin - if assigned(FOnCreatePages) then + if Assigned(FOnCreatePages) then FOnCreatePages(self, MFPrinter, Done); // there is no default page generation end; //- BG ----------------------------------------------------------- 14.03.2006 -- -procedure TBegaCustomPreviewFrame.doGetContentSize(var Done: Boolean; out Width, Height: Integer); +procedure TBegaCustomPreviewFrame.DoGetContentSize(var Done: Boolean; out Width, Height: Integer); begin - if assigned(FOnGetContentSize) then + if Assigned(FOnGetContentSize) then Done := FOnGetContentSize(self, MFPrinter, Width, Height) // there is no default content size calculation end; //- BG ----------------------------------------------------------- 22.12.2006 -- -procedure TBegaCustomPreviewFrame.doOpenInExcel(var Done: Boolean); +procedure TBegaCustomPreviewFrame.DoOpenInExcel(var Done: Boolean); begin - if assigned(FOnOpenInExcel) then + if Assigned(FOnOpenInExcel) then begin Done := True; FOnOpenInExcel(self); @@ -438,12 +449,12 @@ procedure TBegaCustomPreviewFrame.doOpenInExcel(var Done: Boolean); end; //- BG ----------------------------------------------------------- 15.03.2006 -- -procedure TBegaCustomPreviewFrame.doPrinterSetup(var Done, Changed: Boolean); +procedure TBegaCustomPreviewFrame.DoPrinterSetup(var Done, Changed: Boolean); begin - if assigned(FOnPrinterSetup) then + if Assigned(FOnPrinterSetup) then begin Done := True; - FOnPrinterSetup(self, Changed); + FOnPrinterSetup(Self, Changed); end; if not Done then begin @@ -453,7 +464,7 @@ procedure TBegaCustomPreviewFrame.doPrinterSetup(var Done, Changed: Boolean); end; //- BG ----------------------------------------------------------- 06.03.2006 -- -procedure TBegaCustomPreviewFrame.doPrintPages(var Done: Boolean); +procedure TBegaCustomPreviewFrame.DoPrintPages(var Done: Boolean); var FirstPage, LastPage, Copies: Integer; begin @@ -489,10 +500,10 @@ procedure TBegaCustomPreviewFrame.doPrintPages(var Done: Boolean); Copies := 1 else Copies := PrintDialog.Copies; - if assigned(FOnPrintPages) then + if Assigned(FOnPrintPages) then FOnPrintPages(self, MFPrinter, FirstPage, LastPage, Copies) else - printPages(FirstPage, LastPage, Copies); + PrintPages(FirstPage, LastPage, Copies); end; end; end; @@ -518,17 +529,18 @@ procedure TBegaCustomPreviewFrame.FitWidthClick(Sender: TObject); end; //- BG ----------------------------------------------------------- 20.04.2006 -- -function TBegaCustomPreviewFrame.getContentSize( +function TBegaCustomPreviewFrame.GetContentSize( out ContentSize: TBegaSize): Boolean; begin Result := False; +// MFPrinter.PreviewPixelsPerInch := PixelsPerInch; ContentSize.Width := 0; ContentSize.Height := 0; - doGetContentSize(Result, ContentSize.Width, ContentSize.Height); + DoGetContentSize(Result, ContentSize.Width, ContentSize.Height); end; //- BG ----------------------------------------------------------- 03.11.2006 -- -function TBegaCustomPreviewFrame.getContentZoomMode: TBegaZoomMode; +function TBegaCustomPreviewFrame.GetContentZoomMode: TBegaZoomMode; var Index: Integer; begin @@ -540,31 +552,31 @@ function TBegaCustomPreviewFrame.getContentZoomMode: TBegaZoomMode; end; //- BG ----------------------------------------------------------- 08.11.2006 -- -function TBegaCustomPreviewFrame.getCurrentPage: Integer; +function TBegaCustomPreviewFrame.GetCurrentPage: Integer; begin Result := PreviewPanel.FirstPage + 1; end; //- BG ----------------------------------------------------------- 28.04.2006 -- -function TBegaCustomPreviewFrame.getLastAvailablePage: Integer; +function TBegaCustomPreviewFrame.GetLastAvailablePage: Integer; begin Result := PageCount - VisiblePageCount + 1; end; //- BG ----------------------------------------------------------- 27.04.2006 -- -function TBegaCustomPreviewFrame.getPage(Index: Integer): TMetafile; +function TBegaCustomPreviewFrame.GetPage(Index: Integer): TMetafile; begin Result := MFPrinter.MetaFiles[Index]; end; //- BG ----------------------------------------------------------- 26.04.2006 -- -function TBegaCustomPreviewFrame.getPageCount: Integer; +function TBegaCustomPreviewFrame.GetPageCount: Integer; begin Result := MFPrinter.LastAvailablePage; end; //- BG ----------------------------------------------------------- 03.11.2006 -- -function TBegaCustomPreviewFrame.getPreviewZoomMode: TBegaZoomMode; +function TBegaCustomPreviewFrame.GetPreviewZoomMode: TBegaZoomMode; var Index: Integer; begin @@ -576,7 +588,7 @@ function TBegaCustomPreviewFrame.getPreviewZoomMode: TBegaZoomMode; end; //- BG ----------------------------------------------------------- 08.04.2006 -- -function TBegaCustomPreviewFrame.getVisiblePageCount: Integer; +function TBegaCustomPreviewFrame.GetVisiblePageCount: Integer; begin Result := PagesPerRow.Value; if RowsPerPreview.Value > 1 then @@ -599,7 +611,7 @@ procedure TBegaCustomPreviewFrame.LastPageClick(Sender: TObject); procedure TBegaCustomPreviewFrame.Loaded; begin inherited; - PreviewPanel.MFPrinter := MFPrinter; +// PreviewPanel.MFPrinter := MFPrinter; end; //- BG ----------------------------------------------------------- 06.03.2006 -- @@ -636,37 +648,33 @@ procedure TBegaCustomPreviewFrame.PanningClick(Sender: TObject); //------------------------------------------------------------------------------ function TBegaCustomPreviewFrame.PixelsPerInch: Integer; +{$if defined(LCL) or not defined(Compiler31_Plus)} var Form: TCustomForm; begin - if csDesigning in ComponentState then - begin - Result := Screen.PixelsPerInch; - exit; - end; - Form := GetParentForm(self); - if Form is TForm then - Result := TForm(Form).PixelsPerInch -{$ifndef LCL} - else if Form is TCustomActiveForm then - Result := TCustomActiveForm(Form).PixelsPerInch -{$endif LCL} + Form := GetParentForm(Self); + if Form <> nil then + Result := {$ifndef LCL}TBegaCustomForm{$endif}(Form).PixelsPerInch else Result := Screen.PixelsPerInch; +{$else} +begin + Result := FCurrentPPI; +{$ifend} end; //- BG ----------------------------------------------------------- 05.11.2006 -- procedure TBegaCustomPreviewFrame.PreviewBoxResize(Sender: TObject); begin - updateBox; + UpdateBox; end; //- BG ----------------------------------------------------------- 05.11.2006 -- procedure TBegaCustomPreviewFrame.PreviewPanelUpdatePreview( Sender: TBegaCustomPreviewPanel; var Width, Height: Integer); begin - Width := max(Width, PreviewBox.ClientWidth); - Height := max(Height, PreviewBox.ClientHeight); + Width := Max(Width, PreviewBox.ClientWidth); + Height := Max(Height, PreviewBox.ClientHeight); {Make sure the scroll bars are hidden if not needed} if (Width <= PreviewBox.ClientWidth) and (Height <= PreviewBox.ClientHeight) then @@ -694,7 +702,7 @@ procedure TBegaCustomPreviewFrame.PrintClick(Sender: TObject); Done: Boolean; begin Done := False; - doPrintPages(Done); + DoPrintPages(Done); end; //- BG ----------------------------------------------------------- 15.03.2006 -- @@ -704,24 +712,24 @@ procedure TBegaCustomPreviewFrame.PrinterSetupClick(Sender: TObject); begin Done := False; Changed := False; - doPrinterSetup(Done, Changed); + DoPrinterSetup(Done, Changed); if Changed then begin MFPrinter.updatePrinterCaps; - updateContentZoom; - createPages; + UpdateContentZoom; + CreatePages; end; end; //- BG ----------------------------------------------------------- 27.05.2006 -- -procedure TBegaCustomPreviewFrame.printPages(FirstPage, LastPage, Copies: Integer); +procedure TBegaCustomPreviewFrame.PrintPages(FirstPage, LastPage, Copies: Integer); var OldCursor: TCursor; begin OldCursor := Screen.Cursor; Screen.Cursor := crHourGlass; try - MFPrinter.printDoc(Printer, FirstPage, LastPage, Copies); + MFPrinter.PrintDoc(Printer, FirstPage, LastPage, Copies); finally Screen.Cursor := OldCursor; end; @@ -733,23 +741,23 @@ procedure TBegaCustomPreviewFrame.ReportPropertiesClick(Sender: TObject); Edited: Boolean; begin Edited := False; - if assigned(FOnEditReportProperties) then + if Assigned(FOnEditReportProperties) then FOnEditReportProperties(self, Edited); if Edited then - updatePage; + UpdatePage; end; //- BG ----------------------------------------------------------- 06.04.2006 -- procedure TBegaCustomPreviewFrame.SaveFileClick(Sender: TObject); begin - if assigned(FOnSaveFile) then + if Assigned(FOnSaveFile) then FOnSaveFile(self); end; //- BG ----------------------------------------------------------- 06.04.2006 -- procedure TBegaCustomPreviewFrame.SendMailClick(Sender: TObject); begin - if assigned(FOnSendMail) then + if Assigned(FOnSendMail) then FOnSendMail(self); end; @@ -760,39 +768,39 @@ procedure TBegaCustomPreviewFrame.SetCurrentPage(Val: integer); begin cboxPage.ItemIndex := Val - 1; PreviewPanel.FirstPage := Val - 1; - updateActions; + UpdateActions; end; end; //- BG ----------------------------------------------------------- 03.11.2006 -- -procedure TBegaCustomPreviewFrame.setContentZoomMode(Zoom: TBegaZoomMode); +procedure TBegaCustomPreviewFrame.SetContentZoomMode(Zoom: TBegaZoomMode); begin ContentZoomBox.ItemIndex := ord(Zoom); ContentZoomBoxChange(ContentZoomBox); end; //- BG ----------------------------------------------------------- 06.04.2006 -- -procedure TBegaCustomPreviewFrame.setOptions(const Value: TBegaPreviewOptions); +procedure TBegaCustomPreviewFrame.SetOptions(const Value: TBegaPreviewOptions); begin if FOptions <> Value then begin FOptions := Value; - updateActions; + UpdateActions; end; end; //- BG ----------------------------------------------------------- 03.11.2006 -- -procedure TBegaCustomPreviewFrame.setPreviewZoomMode(Zoom: TBegaZoomMode); +procedure TBegaCustomPreviewFrame.SetPreviewZoomMode(Zoom: TBegaZoomMode); begin - ZoomBox.ItemIndex := ord(Zoom); + ZoomBox.ItemIndex := Ord(Zoom); ZoomBoxChange(ZoomBox); end; //------------------------------------------------------------------------------ procedure TBegaCustomPreviewFrame.UnitsBoxChange(Sender: TObject); begin - if Grid.down then - updatePage; + if Grid.Down then + UpdatePage; end; //- BG ----------------------------------------------------------- 06.03.2006 -- @@ -814,7 +822,7 @@ procedure TBegaCustomPreviewFrame.updateActions; PreviewZoomLabel.Caption := Format('Preview zoom %1.0n', [Zoom * 100]) + '%'; LastDocPage := PageCount; LastAvlPage := LastAvailablePage; - LastVisPage := min(CurrentPage + VisiblePageCount - 1, LastDocPage); + LastVisPage := Min(CurrentPage + VisiblePageCount - 1, LastDocPage); FirstPage.Enabled := CurrentPage > 1; PrevPage.Enabled := FirstPage.Enabled; if CurrentPage <= 0 then @@ -823,39 +831,42 @@ procedure TBegaCustomPreviewFrame.updateActions; CurrentPageLabel.Caption := Format('Page %d of %d', [CurrentPage, LastDocPage]) else CurrentPageLabel.Caption := Format('Pages %d..%d of %d', [CurrentPage, LastVisPage, LastDocPage]); - NextPage.Enabled := CurrentPage < LastAvlPage; - LastPage.Enabled := NextPage.Enabled; - cboxPage.Enabled := LastAvlPage > 1; -// if CurrentPage <= 0 then -// cboxPage.ItemIndex := 0 -// else -// cboxPage.ItemIndex := CurrentPage - 1; - - SendMail.Visible := assigned(FOnSendMail); - SendMail.Enabled := buttonEnabled(poSendMailEnabled); - SaveFile.Visible := assigned(FOnSaveFile); - SaveFile.Enabled := buttonEnabled(poSaveFileEnabled); - OpenInExcel.Visible := assigned(FOnOpenInExcel); - OpenInExcel.Enabled := buttonEnabled(poOpenInExcelEnabled); - AllOnOne.Visible := assigned(FOnAllOnOne); - AllOnOne.Enabled := buttonEnabled(poAllOnOneEnabled); - ReportProperties.Visible := assigned(FOnEditReportProperties); - ReportProperties.Enabled := buttonEnabled(poEditReportPropertiesEnabled); - PrinterSetup.Enabled := buttonEnabled(poPrinterSetupEnabled); - Print.Enabled := buttonEnabled(poPrintEnabled); - - ContentZoomSeparator.Visible := canZoomContent; - ContentZoomBoxLabel.Visible := canZoomContent; - ContentZoomBox.Visible := canZoomContent; - ContentFitHeight.Visible := canZoomContent; - ContentFitWidth.Visible := canZoomContent; - ContentFitHeight.Enabled := canGetContentSize; - ContentFitWidth.Enabled := canGetContentSize; - ContentFitHeight.Down := ContentZoomBox.ItemIndex = 1; - ContentFitWidth.Down := ContentZoomBox.ItemIndex = 2; + NextPage.Enabled := CurrentPage < LastAvlPage; + LastPage.Enabled := NextPage.Enabled; + cboxPage.Enabled := LastAvlPage > 1; + + SendMail.Visible := Assigned(FOnSendMail); + SendMail.Enabled := ButtonEnabled(poSendMailEnabled); + + SaveFile.Visible := Assigned(FOnSaveFile); + SaveFile.Enabled := ButtonEnabled(poSaveFileEnabled); + + OpenInExcel.Visible := Assigned(FOnOpenInExcel); + OpenInExcel.Enabled := ButtonEnabled(poOpenInExcelEnabled); + + AllOnOne.Visible := Assigned(FOnAllOnOne); + AllOnOne.Enabled := ButtonEnabled(poAllOnOneEnabled); + + ReportProperties.Visible := Assigned(FOnEditReportProperties); + ReportProperties.Enabled := ButtonEnabled(poEditReportPropertiesEnabled); + + PrinterSetup.Enabled := ButtonEnabled(poPrinterSetupEnabled); + Print.Enabled := ButtonEnabled(poPrintEnabled); + + ContentZoomSeparator.Visible := canZoomContent; + ContentZoomBoxLabel.Visible := canZoomContent; + ContentZoomBox.Visible := canZoomContent; + + ContentFitHeight.Visible := canZoomContent; + ContentFitHeight.Enabled := canGetContentSize; + ContentFitHeight.Down := ContentZoomBox.ItemIndex = 1; + + ContentFitWidth.Visible := canZoomContent; + ContentFitWidth.Enabled := canGetContentSize; + ContentFitWidth.Down := ContentZoomBox.ItemIndex = 2; FitHeight.Down := ZoomBox.ItemIndex = 1; - FitWidth.Down := ZoomBox.ItemIndex = 2; + FitWidth.Down := ZoomBox.ItemIndex = 2; Panning.Enabled := PreviewBox.VertScrollBar.Visible or PreviewBox.HorzScrollBar.Visible or (PreviewPanel.Left <> 0) or (PreviewPanel.Top <> 0); if not Panning.Enabled then @@ -866,13 +877,13 @@ procedure TBegaCustomPreviewFrame.updateActions; end; //- BG ----------------------------------------------------------- 06.11.2006 -- -procedure TBegaCustomPreviewFrame.updateBox; +procedure TBegaCustomPreviewFrame.UpdateBox; var - z: double; - WidthInInch: double; - HeightInInch: double; + z: Double; + WidthInInch: Double; + HeightInInch: Double; - function calcZoomFactor( + function CalcZoomFactor( PreviewPixelCount: Integer; PreviewBorderPixelCount: Integer; PreviewPixelsBetweenPages: Integer; @@ -880,13 +891,13 @@ procedure TBegaCustomPreviewFrame.updateBox; PageCount: Integer; PaperSizeInInch: double): double; begin - Result := (PreviewPixelCount - 2 * PreviewBorderPixelCount - (max(0, PageCount - 1)) * PreviewPixelsBetweenPages) + Result := (PreviewPixelCount - 2 * PreviewBorderPixelCount - (Max(0, PageCount - 1)) * PreviewPixelsBetweenPages) / (PreviewPixelsPerInch * PaperSizeInInch * PageCount); end; - function calcZoomFactorX(): double; + function CalcZoomFactorX: Double; begin - Result := calcZoomFactor( + Result := CalcZoomFactor( PreviewBox.ClientWidth, PreviewPanel.BorderWidth, PreviewPanel.InnerWidth, @@ -895,9 +906,9 @@ procedure TBegaCustomPreviewFrame.updateBox; WidthInInch); end; - function calcZoomFactorY(): double; + function CalcZoomFactorY: Double; begin - Result := calcZoomFactor( + Result := CalcZoomFactor( PreviewBox.ClientHeight, PreviewPanel.BorderWidth, PreviewPanel.InnerWidth, @@ -920,9 +931,9 @@ procedure TBegaCustomPreviewFrame.updateBox; if ZoomBox.ItemIndex = -1 then ZoomBox.ItemIndex := 0; case ZoomBox.ItemIndex of - 0: z := min(calcZoomFactorX, calcZoomFactorY); - 1: z := calcZoomFactorY; - 2: z := calcZoomFactorX; + 0: z := Min(CalcZoomFactorX, CalcZoomFactorY); + 1: z := CalcZoomFactorY; + 2: z := CalcZoomFactorX; 3: z := 0.25; 4: z := 0.50; 5: z := 0.75; @@ -936,15 +947,16 @@ procedure TBegaCustomPreviewFrame.updateBox; z := Zoom; end; Zoom := z; + PreviewPanel.MFPrinter := MFPrinter; - PreviewPanel.updatePreview( - trunc(PixelsPerInch * z * WidthInInch), - trunc(PixelsPerInch * z * HeightInInch)); - updateActions; + PreviewPanel.UpdatePreview( + Trunc(PixelsPerInch * z * WidthInInch), + Trunc(PixelsPerInch * z * HeightInInch)); + UpdateActions; end; //- BG ----------------------------------------------------------- 15.03.2006 -- -procedure TBegaCustomPreviewFrame.updateContentZoom; +procedure TBegaCustomPreviewFrame.UpdateContentZoom; var z: Double; PreviewArea: TBegaRect; @@ -954,22 +966,22 @@ procedure TBegaCustomPreviewFrame.updateContentZoom; case ContentZoomBox.ItemIndex of 0: // fit to size begin - PreviewArea := MFPrinter.getPreviewArea(MFPrinter.PrintArea, Screen.PixelsPerInch); - if getContentSize(ContentSize) then - z := min( + PreviewArea := MFPrinter.GetPreviewArea(MFPrinter.PrintArea, Screen.PixelsPerInch); + if GetContentSize(ContentSize) then + z := Min( PreviewArea.Height / ContentSize.Height, PreviewArea.Width / ContentSize.Width); end; 1: // fit to height begin - PreviewArea := MFPrinter.getPreviewArea(MFPrinter.PrintArea, Screen.PixelsPerInch); - if getContentSize(ContentSize) then + PreviewArea := MFPrinter.GetPreviewArea(MFPrinter.PrintArea, Screen.PixelsPerInch); + if GetContentSize(ContentSize) then z := PreviewArea.Height / ContentSize.Height; end; 2: // fit to width begin - PreviewArea := MFPrinter.getPreviewArea(MFPrinter.PrintArea, Screen.PixelsPerInch); - if getContentSize(ContentSize) then + PreviewArea := MFPrinter.GetPreviewArea(MFPrinter.PrintArea, Screen.PixelsPerInch); + if GetContentSize(ContentSize) then z := PreviewArea.Width / ContentSize.Width; end; 3: z := 0.25; @@ -985,28 +997,28 @@ procedure TBegaCustomPreviewFrame.updateContentZoom; end; MFPrinter.PrintScale := z; - updateActions; + UpdateActions; end; //- BG ----------------------------------------------------------- 21.02.2006 -- -procedure TBegaCustomPreviewFrame.updatePage; +procedure TBegaCustomPreviewFrame.UpdatePage; begin - PreviewPanel.invalidate; + PreviewPanel.Invalidate; end; //- BG ----------------------------------------------------------- 26.04.2006 -- -procedure TBegaCustomPreviewFrame.updatePageMenu; +procedure TBegaCustomPreviewFrame.UpdatePageMenu; var Done: Boolean; begin Done := False; - doCreatePageMenu(Done); + DoCreatePageMenu(Done); end; //------------------------------------------------------------------------------ procedure TBegaCustomPreviewFrame.ZoomBoxChange(Sender: TObject); begin - updateBox; + UpdateBox; end; //------------------------------------------------------------------------------ @@ -1034,12 +1046,12 @@ procedure TBegaCustomPreviewFrame.PreviewPanelMouseDown(Sender: TObject; Zoom := Zoom * ZOOMFACTOR; if (ssRight in Shift) and (Zoom > 0.01) then Zoom := Zoom / ZOOMFACTOR; - ZoomBox.ItemIndex := ord(zoom2ZoomMode(Zoom)); + ZoomBox.ItemIndex := Ord(zoom2ZoomMode(Zoom)); - updateBox; + UpdateBox; - PreviewBox.HorzScrollBar.Position := round(sx * PreviewPanel.Width) - PreviewBox.Width div 2; - PreviewBox.VertScrollBar.Position := round(sy * PreviewPanel.Height) - PreviewBox.Height div 2; + PreviewBox.HorzScrollBar.Position := Round(sx * PreviewPanel.Width) - PreviewBox.Width div 2; + PreviewBox.VertScrollBar.Position := Round(sy * PreviewPanel.Height) - PreviewBox.Height div 2; end else if Panning.Down then begin @@ -1115,7 +1127,7 @@ procedure TBegaCustomPreviewFrame.PreviewPanelPaintPage(Sender: TBegaCellPreview procedure TBegaCustomPreviewFrame.RowsPerPreviewChange(Sender: TObject); begin PreviewPanel.RowCount := RowsPerPreview.Value; - updateBox; + UpdateBox; end; //- BG ----------------------------------------------------------- 22.12.2006 -- @@ -1124,9 +1136,9 @@ procedure TBegaCustomPreviewFrame.AllOnOneClick(Sender: TObject); Done: Boolean; begin Done := False; - doAllOnOne(done); + DoAllOnOne(done); if Done then - updatePage; + UpdatePage; end; //- BG ----------------------------------------------------------- 22.12.2006 -- @@ -1135,7 +1147,7 @@ procedure TBegaCustomPreviewFrame.OpenInExcelClick(Sender: TObject); Done: Boolean; begin Done := False; - doOpenInExcel(done); + DoOpenInExcel(done); end; {$endif NoMetaFile} diff --git a/Ext/HTMLViewer/Source/FramBrwz.pas b/Ext/HTMLViewer/Source/FramBrwz.pas index 17bbda6..b32943b 100644 --- a/Ext/HTMLViewer/Source/FramBrwz.pas +++ b/Ext/HTMLViewer/Source/FramBrwz.pas @@ -597,19 +597,26 @@ function ConvDosToHTML(const Name: ThtString): ThtString; procedure TbrFrame.URLExpandName(Sender: TObject; const SRC: ThtString; var Rslt: ThtString); var - S: ThtString; + S, Base: ThtString; Viewer: THtmlViewer; begin S := ConvDosToHTML(SRC); if not IsFullUrl(S) then begin Viewer := Sender as THtmlViewer; - if Pos('//', SRC) = 1 then - Rslt := 'http:' + S - else if Viewer.Base <> '' then - Rslt := CombineURL(ConvDosToHTML(Viewer.Base), S) + if Length(Viewer.Base) <> 0 then + Base := ConvDosToHTML(Viewer.Base) else - Rslt := CombineURL(UrlBase, S); + Base := UrlBase; + + if Pos('//', S) = 1 then + begin + //Rslt := 'http:' + S + SplitScheme(Base); + Rslt := Base + ':' + S; + end + else + Rslt := CombineURL(Base, S); end else Rslt := S; diff --git a/Ext/HTMLViewer/Source/HTMLSubs.pas b/Ext/HTMLViewer/Source/HTMLSubs.pas index 1af4ca3..8f3c491 100644 --- a/Ext/HTMLViewer/Source/HTMLSubs.pas +++ b/Ext/HTMLViewer/Source/HTMLSubs.pas @@ -1,7 +1,7 @@ { -Version 11.9 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin -Copyright (c) 2008-2018 by HtmlViewer Team +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -66,16 +66,22 @@ interface uses - {$ifdef UseInline} - HtmlCaches, - {$endif} +{$ifdef UseInline} + HtmlCaches, +{$endif} {$ifdef VCL} Windows, + {$ifdef Compiler20_Plus} + CommCtrl, + {$endif} {$ifndef Compiler28_Plus} - EncdDecd, + EncdDecd, {$endif} {$endif} Messages, Graphics, Controls, ExtCtrls, Classes, SysUtils, Variants, Forms, Math, Contnrs, ComCtrls, +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} {$ifdef LCL} LclIntf, LclType, Types, HtmlMisc, {$endif} @@ -122,9 +128,7 @@ TFontObj = class(TFontObjBase) {font information} // properties can be applied to :link, :hover, :visited, etc. // private -{$IFNDEF NoTabLink} - FSection: TSection; // only used if NoTabLink is not defined. -{$ENDIF} + FSection: TSection; FVisited, FHover: Boolean; Title: ThtString; FYValue: Integer; @@ -189,6 +193,40 @@ TLinkList = class(TFontList) constructor Create; end; + // BG, 06.02.2022: moved from implementation section + ThtInlineRec = class + private + StartB, EndB, IDB, StartBDoc, EndBDoc: Integer; + MargArray: ThtMarginArray; + end; + +{$ifdef UseGenerics} + TInlineList = class(TObjectList) +{$else} + TInlineList = class(TObjectList) {a list of ThtInlineRec's} +{$endif} + private + NeedsConverting: Boolean; + Owner: ThtDocument; + procedure AdjustValues; +{$ifdef UseGenerics} +{$else} + function Get(Index: Integer): ThtInlineRec; {$ifdef UseInline} inline; {$endif} +{$endif} + function GetStartB(I: Integer): Integer; + function GetEndB(I: Integer): Integer; + public + constructor Create(AnOwner: ThtDocument); +{$ifdef UseGenerics} + procedure Clear; virtual; +{$else} + procedure Clear; override; + property Items[Index: Integer]: ThtInlineRec read Get; default; +{$endif} + property StartB[I: Integer]: Integer read GetStartB; + property EndB[I: Integer]: Integer read GetEndB; + end; + //------------------------------------------------------------------------------ // THtmlNode is base class for all objects in the HTML document tree. //------------------------------------------------------------------------------ @@ -308,14 +346,21 @@ TSectionBase = class(THtmlNode) procedure MinMaxWidth(Canvas: TCanvas; out Min, Max: Integer; AvailableWidth, AvailableHeight: Integer); virtual; end; +{$ifdef UseGenerics} + TSectionBaseList = class(TObjectList) +{$else} TSectionBaseList = class(TObjectList) private function GetItem(Index: Integer): TSectionBase; {$ifdef UseInline} inline; {$endif} +{$endif} public function PtInObject(X, Y: Integer; var Obj: TObject; var IX, IY: Integer): Boolean; function CursorToXY(Canvas: TCanvas; Cursor: Integer; var X, Y: Integer): Boolean; virtual; function FindDocPos(SourcePos: Integer; Prev: Boolean): Integer; virtual; +{$ifdef UseGenerics} +{$else} property Items[Index: Integer]: TSectionBase read GetItem; default; +{$endif} end; //------------------------------------------------------------------------------ @@ -369,10 +414,14 @@ TFloatingObjClass = class of TFloatingObj; TImageObj = class; +{$ifdef UseGenerics} + TFloatingObjList = class(TObjectList) {a list of TFloatingObj's} +{$else} TFloatingObjList = class(TObjectList) {a list of TFloatingObj's} private function GetItem(Index: Integer): TFloatingObj; {$ifdef UseInline} inline; {$endif} procedure SetItem(Index: Integer; const Item: TFloatingObj); {$ifdef UseInline} inline; {$endif} +{$endif} public constructor CreateCopy(Parent: TCellBasic; T: TFloatingObjList); procedure Decrement(N: Integer); {$ifdef UseInline} inline; {$endif} @@ -381,7 +430,10 @@ TFloatingObjList = class(TObjectList) {a list of TFloatingObj's} function GetObjectAt(Posn: Integer; out Obj): Integer; function PtInImage(X, Y: Integer; out IX, IY, Posn: Integer; out AMap, UMap: Boolean; out MapItem: TMapItem; out ImageObj: TImageObj): Boolean; function PtInObject(X, Y: Integer; out Obj: TObject; out IX, IY: Integer): Boolean; +{$ifdef UseGenerics} +{$else} property Items[Index: Integer]: TFloatingObj read GetItem write SetItem; default; +{$endif} end; //------------------------------------------------------------------------------ @@ -539,11 +591,15 @@ TPanelObj = class(TControlObj) procedure DrawInline(Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TFontObj); override; end; +{$ifdef UseGenerics} + TPanelObjList = class(TObjectList) +{$else} TPanelObjList = class(TObjectList) private function Get(Index: Integer): TPanelObj; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: TPanelObj read Get; default; +{$endif} end; // inline frame node @@ -631,7 +687,20 @@ TImageObj = class(TSizeableObj) procedure ReplaceImage(NewImage: TStream); end; + TImageRec = class(TObject) + public + AObj: TImageObj; + ACanvas: TCanvas; + AX, AY: Integer; + AYBaseline: Integer; + AFO: TFontObj; + end; + +{$ifdef UseGenerics} + TDrawList = class(TObjectList) +{$else} TDrawList = class(TObjectList) +{$endif} procedure AddImage(Obj: TImageObj; Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TFontObj); procedure DrawImages; end; @@ -651,16 +720,19 @@ ThtBorderRec = class {record for inline borders} OpenStart, OpenEnd: Boolean; BRect: TRect; MargArray: ThtMarginArray; - procedure DrawTheBorder(Canvas: TCanvas; XOffset, YOffSet: Integer; Printing: Boolean - {$ifdef has_StyleElements}; const AStyleElements : TStyleElements{$endif}); //overload; + procedure DrawTheBorder(Canvas: TCanvas; XOffset, YOffSet: Integer; Printing: Boolean; ThemedColorToRGB: ThtThemedColor ); end; +{$ifdef UseGenerics} + ThtBorderRecList = class(TObjectList); +{$else} ThtBorderRecList = class(TObjectList) private function Get(Index: Integer): ThtBorderRec; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: ThtBorderRec read Get; default; end; +{$endif} ThtLineRec = class {holds info on a line of text} private @@ -685,12 +757,16 @@ ThtLineRec = class {holds info on a line of text} destructor Destroy; override; end; +{$ifdef UseGenerics} + TLineRecList = class(TObjectList); +{$else} TLineRecList = class(TObjectList) private function Get(Index: Integer): ThtLineRec; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: ThtLineRec read Get; default; end; +{$endif} PXArray = array of Integer; @@ -700,12 +776,16 @@ ThtIndexObj = class Index: Integer; end; +{$ifdef UseGenerics} + ThtIndexObjList = class(TObjectList); +{$else} ThtIndexObjList = class(TObjectList) private function Get(Index: Integer): ThtIndexObj; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: ThtIndexObj read Get; default; end; +{$endif} ThtTextWrap = ( twNo, // 'n' @@ -923,12 +1003,16 @@ THtmlForm = class(TObject) procedure AKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); end; +{$ifdef UseGenerics} + THtmlFormList = class(TObjectList); +{$else} THtmlFormList = class(TObjectList) private function Get(Index: Integer): THtmlForm; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: THtmlForm read Get; default; end; +{$endif} TFormControlObj = class(TFloatingObj) private @@ -1173,6 +1257,8 @@ TCellObjBase = class(TObject) FHzSpace: Integer; FVrSpace: Integer; FSpecWd: TSpecWidth; {Width attribute (percentage or absolute)} + FSpecWdMin: TSpecWidth; + FSpecWdMax: TSpecWidth; FSpecHt: TSpecWidth; {Height as specified} // END: this area is copied by move() in AssignTo() function GetCell: TCellObjCell; virtual; abstract; @@ -1191,6 +1277,8 @@ TCellObjBase = class(TObject) // property SpecHtType: TWidthType read FSpecHt.VType write FSpecHt.VType; {Height as specified} // property SpecHtValue: Double read FSpecHt.Value write FSpecHt.Value; {Height as specified} property SpecWd: TSpecWidth read FSpecWd write FSpecWd; {Width as specified} + property SpecWdMin: TSpecWidth read FSpecWdMin write FSpecWdMin; + property SpecWdMax: TSpecWidth read FSpecWdMax write FSpecWdMax; // BG, 12.01.2012: not C++-Builder compatible // property SpecWdType: TWidthType read FSpecWd.VType write FSpecWd.VType; {Height as specified} // property SpecWdValue: Double read FSpecWd.Value write FSpecWd.Value; {Height as specified} @@ -1291,10 +1379,14 @@ TCellObj = class(TCellObjBase) property YIndent: Integer read FYIndent write FYIndent; {Vertical indent} end; +{$ifdef UseGenerics} + TCellList = class(TObjectList) +{$else} TCellList = class(TObjectList) {holds one row of the html table, a list of TCellObj} private function GetCellObj(Index: Integer): TCellObjBase; {$ifdef UseInline} inline; {$endif} +{$endif} public RowHeight: Integer; SpecRowHeight: TSpecWidth; @@ -1315,16 +1407,23 @@ TCellList = class(TObjectList) function Draw(Canvas: TCanvas; Document: ThtDocument; const ARect: TRect; const Widths: TIntArray; X, Y, YOffset, CellSpacingHorz,CellSpacingVert: Integer; Border: Boolean; Light, Dark: TColor; MyRow: Integer): Integer; procedure Add(CellObjBase: TCellObjBase); +{$ifdef UseGenerics} +{$else} property Items[Index: Integer]: TCellObjBase read GetCellObj; default; +{$endif} end; // BG, 26.12.2011: +{$ifdef UseGenerics} + TRowList = class(TObjectList); +{$else} TRowList = class(TObjectList) private function GetItem(Index: Integer): TCellList; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: TCellList read GetItem; default; end; +{$endif} TColSpec = class private @@ -1340,12 +1439,16 @@ TColSpec = class end; // BG, 26.12.2011: +{$ifdef UseGenerics} + TColSpecList = class(TObjectList); +{$else} TColSpecList = class(TObjectList) private function GetItem(Index: Integer): TColSpec; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: TColSpec read GetItem; default; end; +{$endif} THtmlTable = class; @@ -1515,12 +1618,16 @@ THtmlPropStack = class(TPropStack) procedure PushNewProp(Sym: TElemSymb; Properties: TProperties; Attributes: TAttributeList; const APseudo: ThtString = ''); end; +{$ifdef UseGenerics} + TFormData = class(TObjectList); +{$else} TFormData = class(TObjectList) private function Get(Index: Integer): ThtStringList; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: ThtStringList read Get; default; end; +{$endif} ThtDocument = class(TCell) {a list of all the sections -- the html document} private @@ -1528,6 +1635,7 @@ ThtDocument = class(TCell) {a list of all the sections -- the html document} FPropStack: THtmlPropStack; FPageArea: TRect; FPrinted: Boolean; {set if actually printed anything else but background} + FPixelsPerInch: Integer; procedure AdjustFormControls; procedure AddSectionsToPositionList(Sections: TSectionBase); function CopyToBuffer(Buffer: TSelTextCount): Integer; @@ -1614,7 +1722,7 @@ ThtDocument = class(TCell) {a list of all the sections -- the html document} TabOrderList: TStringList; FirstPageItem: Boolean; StopTab: Boolean; - InlineList: TObjectList; {actually TInlineList, a list of ThtInlineRec's} + InlineList: TInlineList; {actually TInlineList, a list of ThtInlineRec's} TableNestLevel: Integer; InLogic2: Boolean; LinkDrawnEvent: TLinkDrawnEvent; @@ -1641,7 +1749,7 @@ ThtDocument = class(TCell) {a list of all the sections -- the html document} function GetURL(Canvas: TCanvas; X, Y: Integer; out UrlTarg: TUrlTarget; out FormControl: TIDObject {TImageFormControlObj}; out ATitle: ThtString): ThtguResultType; override; procedure CancelActives; procedure CheckGIFList(Sender: TObject); - procedure Clear; override; + procedure Clear; virtual; procedure ClearLists; procedure GetBackgroundImage; procedure HideControls; @@ -1656,6 +1764,9 @@ ThtDocument = class(TCell) {a list of all the sections -- the html document} procedure SetFonts(const Name, PreName: ThtString; ASize: Integer; AColor, AHotSpot, AVisitedColor, AActiveColor, ABackground: TColor; LnksActive, LinkUnderLine: Boolean; ACodePage: TBuffCodePage; ACharSet: TFontCharSet; MarginHeight, MarginWidth: Integer); + function ThemedColor(AColor: TColor; AStyleElement: ThtStyleElement): TColor; + function ThemedColorToRGB(AColor: TColor; AStyleElement: ThtStyleElement): TColor; + property UseQuirksMode : Boolean read FUseQuirksMode write FUseQuirksMode; property PropStack : THtmlPropStack read FPropStack write FPropStack; property Printed: Boolean read FPrinted write SetPrinted; @@ -1663,6 +1774,7 @@ ThtDocument = class(TCell) {a list of all the sections -- the html document} property NoBreak : Boolean read FNoBreak write FNoBreak; {set when in } property ViewPort: TRect read GetViewPort; {ViewPort is the APaintPanel's client rect, except while printing} property PageArea: TRect write SetPageArea; {is the ViewPort while printing, set by THtmlViewer.Print} + property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch; {$ifdef has_StyleElements} property StyleElements : TStyleElements read FStyleElements write SetStyleElements; @@ -1734,7 +1846,7 @@ implementation or defined(JPM_DEBUGGING_CREATE) or defined(JPM_DEBUGGING_LOGIC) } - CodeSiteLogging, + CodeSiteLogging, {$ifend} {$IFNDEF NoGDIPlus} GDIPL2A, @@ -1745,7 +1857,6 @@ implementation {$endif} Htmlsbs1; - //-- BG ---------------------------------------------------------- 14.01.2012 -- function Sum(const Arr: TIntArray; StartIndex, EndIndex: Integer): Integer; overload; {$ifdef UseInline} inline; {$endif} @@ -1954,10 +2065,10 @@ constructor THtmlNode.Create(Parent: TCellBasic; Attributes: TAttributeList; Pro FEmSize := FProperties.EmSize; FExSize := FProperties.ExSize; CD := ConvData(100, 100, FEmSize, FExSize, 0); - ConvMargProp(piTop , MargArrayO, CD, MargArray); - ConvMargProp(piLeft , MargArrayO, CD, MargArray); - ConvMargProp(piRight , MargArrayO, CD, MargArray); - ConvMargProp(piBottom, MargArrayO, CD, MargArray); + ConvMargProp(piTop , MargArrayO, CD, MargArray, Document.PixelsPerInch); + ConvMargProp(piLeft , MargArrayO, CD, MargArray, Document.PixelsPerInch); + ConvMargProp(piRight , MargArrayO, CD, MargArray, Document.PixelsPerInch); + ConvMargProp(piBottom, MargArrayO, CD, MargArray, Document.PixelsPerInch); FPositions[reTop ] := MargArray[piTop ]; FPositions[reLeft ] := MargArray[piLeft ]; FPositions[reRight ] := MargArray[piRight ]; @@ -2288,35 +2399,10 @@ function THtmlNode.IsInFlow: Boolean; TSectionClass = class of TSectionBase; EProcessError = class(Exception); -type - ThtInlineRec = class - private - StartB, EndB, IDB, StartBDoc, EndBDoc: Integer; - MargArray: ThtMarginArray; - end; - - TInlineList = class(TObjectList) {a list of ThtInlineRec's} - private - NeedsConverting: Boolean; - Owner: ThtDocument; - procedure AdjustValues; - function Get(Index: Integer): ThtInlineRec; {$ifdef UseInline} inline; {$endif} - function GetStartB(I: Integer): Integer; - function GetEndB(I: Integer): Integer; - public - constructor Create(AnOwner: ThtDocument); - procedure Clear; override; - property Items[Index: Integer]: ThtInlineRec read Get; default; - property StartB[I: Integer]: Integer read GetStartB; - property EndB[I: Integer]: Integer read GetEndB; - end; - constructor TFontObj.Create(ASection: TSection; F: ThtFont; Position: Integer); begin inherited Create; -{$ifndef NoTabLink} FSection := ASection; -{$endif} TheFont := ThtFont.Create; TheFont.Assign(F); Pos := Position; @@ -2405,6 +2491,7 @@ procedure TFontObj.AKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Viewer.LinkAttributes.Text := UrlTarget.Attr; Viewer.LinkText := Viewer.GetTextByIndices(UrlTarget.Start, UrlTarget.Last); Viewer.TriggerUrlAction; {call to UrlAction via message} + Key := 0; {Key has been consumed} end else {send other keys to THtmlViewer} Viewer.KeyDown(Key, Shift); @@ -2460,7 +2547,7 @@ procedure TFontObj.ReplaceFont(F: ThtFont); procedure TFontObj.ConvertFont(const FI: ThtFontInfo); begin - TheFont.Assign(FI); + TheFont.Assign(FI, FSection.Document.PixelsPerInch); FontChanged; end; @@ -2482,11 +2569,14 @@ constructor TFontObj.CreateCopy(ASection: TSection; T: TFontObj); end; destructor TFontObj.Destroy; +{$ifndef NoTabLink} var Index: Integer; +{$endif} begin FIArray.Free; TheFont.Free; UrlTarget.Free; +{$ifndef NoTabLink} if FSection <> nil then if FSection.Document <> nil then if FSection.Document.TabOrderList <> nil then @@ -2496,6 +2586,7 @@ destructor TFontObj.Destroy; if Index >= 0 then Delete(Index); end; +{$endif} TabControl.Free; inherited Destroy; end; @@ -2599,7 +2690,7 @@ constructor TFontList.CreateCopy(ASection: TSection; T: TFontList); var I: Integer; begin - inherited create; + inherited Create; for I := 0 to T.Count - 1 do Add(TFontObj.CreateCopy(ASection, T.Items[I])); end; @@ -2607,7 +2698,7 @@ constructor TFontList.CreateCopy(ASection: TSection; T: TFontList); //-- BG ---------------------------------------------------------- 10.02.2013 -- function TFontList.GetFont(Index: Integer): TFontObj; begin - Result := inherited Get(Index); + Result := TFontObj(inherited Items[Index]); end; function TFontList.GetFontAt(Posn: Integer; out OHang: Integer): ThtFont; @@ -2811,9 +2902,14 @@ constructor TImageObj.CreateCopy(Parent: TCellBasic; Source: THtmlNode); end; destructor TImageObj.Destroy; +var + I: Integer; begin if not IsCopy then begin + I := Document.IDNameList.IndexOfObject(Self); + if I >= 0 then + Document.IDNameList.Delete(I); if (Source <> '') and Assigned(OrigImage) then Document.ImageCache.DecUsage(htUpperCase(htTrim(Source))); if (Image is ThtGifImage) and ThtGifImage(Image).Gif.IsCopy then @@ -3140,8 +3236,7 @@ procedure TImageObj.DoDraw(Canvas: TCanvas; XX, Y: Integer; ddImage: ThtImage); {----------------TImageObj.Draw} //-- BG ---------------------------------------------------------- 12.06.2010 -- -procedure GetRaisedColors(SectionList: ThtDocument; Canvas: TCanvas; out Light, Dark: TColor); {$ifdef UseInline} inline; {$endif} - {$ifdef UseInline} inline; {$endif} +procedure GetRaisedColors(SectionList: ThtDocument; Canvas: TCanvas; out Light, Dark: TColor); var White, BlackBorder: Boolean; begin @@ -3154,12 +3249,12 @@ procedure GetRaisedColors(SectionList: ThtDocument; Canvas: TCanvas; out Light, end else begin - White := SectionList.Printing or (ThemedColor(SectionList.Background{$ifdef has_StyleElements},seFont in SectionList.StyleElements{$endif}) = clWhite); - Dark := ThemedColor(clBtnShadow{$ifdef has_StyleElements},seFont in SectionList.StyleElements{$endif} ); + White := SectionList.Printing or (SectionList.ThemedColorToRGB( SectionList.Background, htseFont) = clWhite); + Dark := SectionList.ThemedColorToRGB(clBtnShadow, htseFont); if White then Light := clSilver else - Light := ThemedColor(clBtnHighLight{$ifdef has_StyleElements},seFont in SectionList.StyleElements{$endif}); + Light := SectionList.ThemedColorToRGB(clBtnHighLight, htseFont); end; end; @@ -3208,11 +3303,13 @@ function htRaisedColors(SectionList: ThtDocument; Canvas: TCanvas; Raised: Boole procedure RaisedRectColor(Canvas: TCanvas; const ORect, IRect: TRect; const Colors: ThtColorArray; - Styles: ThtBorderStyleArray); overload; - {$ifdef UseInline} inline; {$endif} + Styles: ThtBorderStyleArray; + ThemedColorToRGB: ThtThemedColor +); overload; +{$ifdef UseInline} inline; {$endif} {Draws colored raised or lowered rectangles for table borders} begin - DrawBorder(Canvas, ORect, IRect, Colors, Styles, clNone, False{$ifdef has_StyleElements},[seClient,seFont,seBorder]{$endif}); + DrawBorder(Canvas, ORect, IRect, Colors, Styles, clNone, False, ThemedColorToRGB); end; procedure RaisedRect(SectionList: ThtDocument; Canvas: TCanvas; @@ -3226,7 +3323,9 @@ procedure RaisedRect(SectionList: ThtDocument; Canvas: TCanvas; Rect(X1, Y1, X2, Y2), Rect(X1 + W, Y1 + W, X2 - W, Y2 - W), htRaisedColors(SectionList, Canvas, Raised), - htStyles(bssSolid, bssSolid, bssSolid, bssSolid)); + htStyles(bssSolid, bssSolid, bssSolid, bssSolid), + SectionList.ThemedColorToRGB + ); end; procedure TImageObj.DrawInline(Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TFontObj); @@ -3242,16 +3341,16 @@ procedure TImageObj.DrawInline(Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TF // SaveStyle: TPenStyle; YY: Integer; // ORect, IRect: TRect; -{$ifdef has_StyleElements} - LStyle : TStyleElements; -{$endif} +//{$ifdef has_StyleElements} +// LStyle : TStyleElements; +//{$endif} begin ViewImages := Document.ShowImages; Dec(Y, Document.YOff); Dec(YBaseLine, Document.YOff); -{$ifdef has_StyleElements} - LStyle := Document.StyleElements; -{$endif} +//{$ifdef has_StyleElements} +// LStyle := Document.StyleElements; +//{$endif} if ViewImages then TmpImage := Image @@ -3331,7 +3430,7 @@ procedure TImageObj.DrawInline(Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TF SetTextAlign(Canvas.Handle, TA_Top); if SubstImage and (BorderWidth = 0) then begin - Canvas.Font.Color := ThemedColor(FO.TheFont.Color{$ifdef has_StyleElements},seFont in LStyle {$endif}); + Canvas.Font.Color := Document.ThemedColorToRGB(FO.TheFont.Color, htseFont); {calc the offset from the image's base to the alt= text baseline} case VertAlign of ATop, ANone: @@ -3361,7 +3460,7 @@ procedure TImageObj.DrawInline(Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TF // SaveColor := Pen.Color; // SaveWidth := Pen.Width; // SaveStyle := Pen.Style; - Font.Color := ThemedColor(FO.TheFont.Color{$ifdef has_StyleElements},seFont in Document.StyleElements {$endif}); + Font.Color := Document.ThemedColorToRGB(FO.TheFont.Color, htseFont); // Pen.Color := Font.Color; // Pen.Width := BorderSize; // Pen.Style := psInsideFrame; @@ -3503,8 +3602,12 @@ procedure THtmlForm.AKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) begin if B then begin - ControlList[I].TheControl.SetFocus; - break; + with Ctrl as TRadioButtonFormControlObj do + begin + TheControl.SetFocus; + Checked := True; + end; + Break; end; if Ctrl.TheControl = Sender then B := True @@ -3518,13 +3621,18 @@ procedure THtmlForm.AKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState) begin if B then begin - ControlList[I].TheControl.SetFocus; - break; + with Ctrl as TRadioButtonFormControlObj do + begin + TheControl.SetFocus; + Checked := True; + end; + Break; end; if Ctrl.TheControl = Sender then B := True end; end; + Key := 0; {Key has been consumed} end else {send other keys to THtmlViewer} Document.TheOwner.KeyDown(Key, Shift); @@ -3710,7 +3818,7 @@ procedure TFormControlObj.ProcessProperties(Prop: TProperties); EmSize := Prop.EmSize; ExSize := Prop.ExSize; PercentWidth := (VarIsStr(MargArrayO[piWidth])) and (System.Pos('%', MargArrayO[piWidth]) > 0); - ConvInlineMargArray(MargArrayO, 100, 200, EmSize, ExSize, 4, MargArray); + ConvInlineMargArray(MargArrayO, 100, 200, EmSize, ExSize, 4, MargArray, Document.PixelsPerInch); VSpaceT := 1; VSpaceB := 1; @@ -4023,7 +4131,7 @@ constructor TRadioButtonFormControlObj.Create(Parent: TCellBasic; Position: Inte begin FPanel.Left := -4000; {so will be invisible until placed} FControl.Left := 0; - if Screen.PixelsPerInch > 100 then + if FDocument.PixelsPerInch > 100 then begin FPanel.Width := 16; FPanel.Height := 16; @@ -4123,7 +4231,7 @@ procedure TRadioButtonFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: Intege MonoBlack := Document.PrintMonoBlack and (GetDeviceCaps(Handle, BITSPIXEL) = 1) and (GetDeviceCaps(Handle, PLANES) = 1); if Disabled and not MonoBlack then - Brush.Color := ThemedColor(clBtnFace {$ifdef has_StyleElements},seClient in Document.StyleElements{$endif}) + Brush.Color := Document.ThemedColorToRGB(clBtnFace, htseClient) else Brush.Color := clWhite; Pen.Color := clWhite; @@ -4138,11 +4246,11 @@ procedure TRadioButtonFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: Intege else begin Pen.Width := 2; - Pen.Color := ThemedColor(clBtnShadow {$ifdef has_StyleElements},seClient in Document.StyleElements{$endif}); + Pen.Color := Document.ThemedColorToRGB(clBtnShadow, htseClient); end; Arc(X1, Y1, XW, YH, XW, Y1, X1, YH); if not MonoBlack then - Pen.Color := ThemedColor(clBtnHighlight{$ifdef has_StyleElements},seClient in Document.StyleElements{$endif});//clSilver; + Pen.Color := Document.ThemedColorToRGB(clBtnHighlight, htseClient); Arc(X1, Y1, XW, YH, X1, YH, XW, Y1); if Checked then begin @@ -4169,7 +4277,7 @@ procedure TRadioButtonFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: Intege if Active and Document.TheOwner.ShowFocusRect then //MK20091107 begin Canvas.Brush.Color := clWhite; - if Screen.PixelsPerInch > 100 then + if Document.PixelsPerInch > 100 then Canvas.DrawFocusRect(Rect(Left - 2, Top - 2, Left + 18, Top + 18)) else Canvas.DrawFocusRect(Rect(Left - 3, Top - 2, Left + 16, Top + 16)); @@ -4840,7 +4948,7 @@ procedure TBlock.CollapseAdjoiningMargins; CD: ThtConvData; begin CD := ConvData(100, 100 {width and height not known at this point}, EmSize, ExSize, BorderWidth); - ConvVertMargins(MargArrayO, CD, MargArray); + ConvVertMargins(MargArrayO, CD, MargArray, Document.PixelsPerInch); TopAuto := MarginTop in CD.IsAutoParagraph; BottomAuto := MarginBottom in CD.IsAutoParagraph; if (MargArray[PaddingTop] <> 0) or (MargArray[BorderTopWidth] <> 0) then {do nothing} @@ -4994,7 +5102,7 @@ procedure TBlock.ConvMargArray(BaseWidth, BaseHeight: Integer; out AutoCount: In CodeSite.AddSeparator; {$ENDIF} - StyleUn.ConvMargArray(MargArrayO, BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth, AutoCount, MargArray); + StyleUn.ConvMargArray(MargArrayO, BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth, AutoCount, MargArray, Document.PixelsPerInch); {$IFDEF JPM_DEBUGGING_CONV} CodeSite.ExitMethod(Self,'TBlock.ConvMargArray'); @@ -5063,13 +5171,6 @@ procedure TBlock.MinMaxWidth(Canvas: TCanvas; out Min, Max: Integer; AvailableWi ConvMargArray(AvailableWidth, AvailableHeight, AutoCount); //HideOverflow := HideOverflow and (MargArray[piWidth] <> Auto) and (MargArray[piWidth] > 20); - if HideOverflow and (MargArray[piWidth] <> Auto) and (MargArray[piWidth] > 20) then - begin - MinCell := MargArray[piWidth]; - MaxCell := MinCell; - end - else - ContentMinMaxWidth(Canvas, MinCell, MaxCell, AvailableWidth, AvailableHeight); if MargArray[MarginLeft] = Auto then MargArray[MarginLeft] := 0; if MargArray[MarginRight] = Auto then @@ -5078,6 +5179,13 @@ procedure TBlock.MinMaxWidth(Canvas: TCanvas; out Min, Max: Integer; AvailableWi MargArray[piWidth] := 0; LeftSide := MargArray[MarginLeft] + MargArray[BorderLeftWidth] + MargArray[PaddingLeft]; RightSide := MargArray[MarginRight] + MargArray[BorderRightWidth] + MargArray[PaddingRight]; + if HideOverflow and (MargArray[piWidth] <> Auto) and (MargArray[piWidth] > 20) then + begin + MinCell := MargArray[piWidth]; + MaxCell := MinCell; + end + else + ContentMinMaxWidth(Canvas, MinCell, MaxCell, AvailableWidth - LeftSide - RightSide, AvailableHeight); if MargArray[piWidth] > 0 then begin Min := MargArray[piWidth] + LeftSide + RightSide; @@ -5442,15 +5550,24 @@ function TBlock.DrawLogic1(Canvas: TCanvas; X, Y, XRef, YRef, AWidth, AHeight, B function GetClientContentBot(ClientContentBot: Integer): Integer; var H: Integer; + S: Variant; begin - if VarIsIntNull(MargArrayO[piHeight]) then - Result := Max(ContentTop, ClientContentBot) + S := MargArrayO[piHeight]; + if VarIsIntNull(S) or VarIsAuto(S) then + H := Auto else begin - if Pos('%', VarToStr(MargArrayO[piHeight])) > 0 then - H := LengthConv(MargArrayO[piHeight], False, AHeight, EmSize, ExSize, 0) + if Pos('%', VarToStr(S)) > 0 then + H := LengthConv(S, False, AHeight, EmSize, ExSize, 0, Document.PixelsPerInch) else H := MargArray[piHeight]; + end; + + case H of + IntNull, + Auto: + Result := Max(ContentTop, ClientContentBot); + else Result := Max(H + ContentTop, ContentTop); end; end; @@ -6067,7 +6184,7 @@ procedure TBlock.DrawBlock(Canvas: TCanvas; const ARect: TRect; if HasBackgroundColor {and (not Document.Printing or Document.PrintBackground)} then begin {color the Padding Region} Canvas.Brush.Style := bsSolid; - Canvas.Brush.Color := ThemedColor(MargArray[BackgroundColor]{$ifdef has_StyleElements},seClient in Document.StyleElements{$endif}) or PalRelative; + Canvas.Brush.Color := Document.ThemedColorToRGB(MargArray[BackgroundColor], htseClient) or PalRelative; end else Canvas.Brush.Style := bsClear; @@ -6142,7 +6259,7 @@ procedure TBlock.DrawBlockBorder(Canvas: TCanvas; const ORect, IRect: TRect); DrawBorder(Canvas, ORect, IRect, htColors(MargArray[BorderLeftColor], MargArray[BorderTopColor], MargArray[BorderRightColor], MargArray[BorderBottomColor]), htStyles(ThtBorderStyle(MargArray[BorderLeftStyle]), ThtBorderStyle(MargArray[BorderTopStyle]), ThtBorderStyle(MargArray[BorderRightStyle]), ThtBorderStyle(MargArray[BorderBottomStyle])), - MargArray[BackgroundColor], Document.Printing{$ifdef has_StyleElements}, Document.StyleElements {$endif}) + MargArray[BackgroundColor], Document.Printing, Document.ThemedColorToRGB) end; procedure TBlock.DrawTheList(Canvas: TCanvas; const ARect: TRect; ClipWidth, X, XRef, YRef: Integer); @@ -6495,7 +6612,7 @@ constructor TTableBlock.Create(Parent: TCellBasic; Attr: TAttributeList; Prop: T {need to see if width is defined in style} Percent := (VarIsStr(MargArrayO[piWidth])) and (Pos('%', MargArrayO[piWidth]) > 0); - StyleUn.ConvMargArray(MargArrayO, 100, 0, EmSize, ExSize, BorderWidth, AutoCount, MargArray); + StyleUn.ConvMargArray(MargArrayO, 100, 0, EmSize, ExSize, BorderWidth, AutoCount, MargArray, Document.PixelsPerInch); if MargArray[piWidth] > 0 then begin if Percent then @@ -6626,10 +6743,11 @@ function TTableBlock.FindWidth(Canvas: TCanvas; AWidth, AHeight, AutoCount: Inte var LeftSide, RightSide: Integer; Min, Max, M, P: Integer; + LJustify: ThtJustify; begin if not HasCaption then begin - inherited FindWidth(Canvas, AWidth, AHeight, AUtoCount); + inherited FindWidth(Canvas, AWidth, AHeight, AutoCount); // if MargArray[MarginLeft] = Auto then // MargArray[MarginLeft] := 0; // if MargArray[MarginRight] = Auto then @@ -6695,22 +6813,35 @@ function TTableBlock.FindWidth(Canvas: TCanvas; AWidth, AHeight, AutoCount: Inte end; MargArray[piWidth] := Result; - if (MargArray[MarginLeft] = 0) and (MargArray[MarginRight] = 0) and (Result + LeftSide + RightSide < AWidth) then + if Result + LeftSide + RightSide < AWidth then begin - M := AWidth - LeftSide - Result - RightSide; - case Justify of - Centered: - begin - MargArray[MarginLeft] := M div 2; - MargArray[MarginRight] := M - MargArray[MarginLeft]; - end; + if (MargArray[MarginLeft] = 0) and (MargArray[MarginRight] = 0) then + begin + M := AWidth - LeftSide - Result - RightSide; + LJustify := Justify; + if LJustify = NoJustify then + if VarIsAuto(MargArrayO[MarginLeft]) then + if VarIsAuto(MargArrayO[MarginRight]) then + LJustify := Centered + else + LJustify := Right + else + if VarIsAuto(MargArrayO[MarginRight]) then + LJustify := Left; - Right: - MargArray[MarginLeft] := M; + case LJustify of + Centered: + begin + MargArray[MarginLeft] := M div 2; + MargArray[MarginRight] := M - MargArray[MarginLeft]; + end; - Left: - MargArray[MarginRight] := M; + Right: + MargArray[MarginLeft] := M; + Left: + MargArray[MarginRight] := M; + end; end; end; end; @@ -7039,7 +7170,7 @@ function TBlockLI.Draw1(Canvas: TCanvas; const ARect: TRect; IMgr: TIndentManage NStr := IntToStr(ListNumb); end; Canvas.Font := ListFont; - Canvas.Font.Color := ThemedColor(ListFont.Color{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + Canvas.Font.Color := Document.ThemedColorToRGB(ListFont.Color, htseFont); NStr := NStr + '.'; BkMode := SetBkMode(Canvas.Handle, Transparent); TAlign := SetTextAlign(Canvas.Handle, TA_BASELINE); @@ -7052,12 +7183,12 @@ function TBlockLI.Draw1(Canvas: TCanvas; const ARect: TRect; IMgr: TIndentManage begin PenColor := Pen.Color; PenStyle := Pen.Style; - Pen.Color := ThemedColor(ListFont.Color{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + Pen.Color := Document.ThemedColorToRGB(ListFont.Color, htseFont); Pen.Style := psSolid; BrushStyle := Brush.Style; BrushColor := Brush.Color; Brush.Style := bsSolid; - Brush.Color := ThemedColor(ListFont.Color{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + Brush.Color := Document.ThemedColorToRGB(ListFont.Color, htseFont); case ListStyleType of lbCircle: begin @@ -7150,7 +7281,7 @@ function TBodyBlock.DrawLogic1(Canvas: TCanvas; X, Y, XRef, YRef, AWidth, AHeigh {$ENDIF} YDraw := Y; StartCurs := Curs; - StyleUn.ConvMargArray(MargArrayO, AWidth, AHeight, EmSize, ExSize, BorderWidth, AutoCount, MargArray); + StyleUn.ConvMargArray(MargArrayO, AWidth, AHeight, EmSize, ExSize, BorderWidth, AutoCount, MargArray, Document.PixelsPerInch); if IsAuto(MargArray[MarginLeft]) then MargArray[MarginLeft] := 0; if IsAuto(MargArray[MarginRight]) then MargArray[MarginRight] := 0; ApplyBoxSettings(MargArray,Document.UseQuirksMode); @@ -7459,6 +7590,39 @@ procedure ThtDocument.SetYOffset(Y: Integer); HideControls; end; +//-- BG ---------------------------------------------------------- 08.01.2023 -- +function ThtDocument.ThemedColor(AColor: TColor; AStyleElement: ThtStyleElement): TColor; +begin + if TheOwner <> nil then + Result := TheOwner.ThemedColor( AColor, AStyleElement ) + else + begin + Result := AColor; +{$ifdef has_StyleElements} + case AStyleElement of + htseFont: + if (seFont in StyleElements) and TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); + htseClient: + if (seClient in StyleElements) and TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); + htseBorder: + if (seBorder in StyleElements) and TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); + end; +{$endif} + end; +end; + +//-- BG ---------------------------------------------------------- 08.01.2023 -- +function ThtDocument.ThemedColorToRGB(AColor: TColor; AStyleElement: ThtStyleElement): TColor; +begin + if TheOwner <> nil then + Result := TheOwner.ThemedColorToRGB( AColor, AStyleElement ) + else + Result := ColorToRGB( ThemedColor( AColor, AStyleElement )); +end; + procedure ThtDocument.Clear; begin if not IsCopy then @@ -7740,6 +7904,7 @@ procedure ThtDocument.SetFonts(const Name, PreName: ThtString; ASize: Integer; AColor, AHotSpot, AVisitedColor, AActiveColor, ABackground: TColor; LnksActive, LinkUnderLine: Boolean; ACodePage: TBuffCodePage; ACharSet: TFontCharSet; MarginHeight, MarginWidth: Integer); begin + Styles.PixelsPerInch := PixelsPerInch; Styles.Initialize(Name, PreName, ASize, AColor, AHotspot, AVisitedColor, AActiveColor, LinkUnderLine, ACodePage, ACharSet, MarginHeight, MarginWidth); InitializeFontSizes(ASize); @@ -7971,7 +8136,7 @@ function ThtDocument.GetTheImage(const BMName: ThtString; var Transparent: ThtIm Specific := HTMLToRes(Name, ResType); Stream := TResourceStream.Create(HInstance, htStringToString(Specific), PChar({$ifdef LCL}string(ResType){$else}ResType{$endif}) ); end - else if FileExists(Name) then + else if htFileExists(Name) then Stream := TFileStream.Create( htStringToString(Name), fmOpenRead or fmShareDenyWrite) else Stream := nil; @@ -8160,7 +8325,7 @@ procedure ThtDocument.ProcessInlines(SIndex: Integer; Prop: TProperties; Start: Prop.GetVMarginArray(MargArrayO); EmSize := Prop.EmSize; ExSize := Prop.ExSize; - ConvMargArray(MargArrayO, 200, 200, EmSize, ExSize, 0{4}, Dummy1, MargArray); + ConvMargArray(MargArrayO, 200, 200, EmSize, ExSize, 0{4}, Dummy1, MargArray, PixelsPerInch); end; end else {this call has end information} @@ -8220,11 +8385,14 @@ function TInlineList.GetStartB(I: Integer): Integer; Result := 99999999; end; +{$ifdef UseGenerics} +{$else} //-- BG ---------------------------------------------------------- 06.10.2016 -- function TInlineList.Get(Index: Integer): ThtInlineRec; begin Result := inherited Get(Index); end; +{$endif} function TInlineList.GetEndB(I: Integer): Integer; begin @@ -8375,9 +8543,13 @@ constructor TCellObj.Create(Parent: TTableBlock; AVAlign: ThtAlignmentStyle; Att Prop.GetVMarginArray(MargArrayO); EmSize := Prop.EmSize; ExSize := Prop.ExSize; - ConvMargArray(MargArrayO, 100, 0, EmSize, ExSize, 0, AutoCount, MargArray); + ConvMargArray(MargArrayO, 100, 0, EmSize, ExSize, 0, AutoCount, MargArray, Cell.Document.PixelsPerInch); if VarIsStr(MargArrayO[piWidth]) and (MargArray[piWidth] >= 0) then FSpecWd := ToSpecWidth(MargArray[piWidth], MargArrayO[piWidth]); + if VarIsStr(MargArrayO[piMinWidth]) and (MargArray[piMinWidth] >= 0) then + FSpecWdMin := ToSpecWidth(MargArray[piMinWidth], MargArrayO[piMinWidth]); + if VarIsStr(MargArrayO[piMaxWidth]) and (MargArray[piMaxWidth] >= 0) then + FSpecWdMax := ToSpecWidth(MargArray[piMaxWidth], MargArrayO[piMaxWidth]); if VarIsStr(MargArrayO[piHeight]) and (MargArray[piHeight] >= 0) then FSpecHt := ToSpecWidth(MargArray[piHeight], MargArrayO[piHeight]); @@ -8395,7 +8567,7 @@ constructor TCellObj.Create(Parent: TTableBlock; AVAlign: ThtAlignmentStyle; Att end; {In the following, Padding widths in percent aren't accepted} - ConvMargArrayForCellPadding(MargArrayO, EmSize, ExSize, MargArray); + ConvMargArrayForCellPadding(MargArrayO, EmSize, ExSize, MargArray, Cell.Document.PixelsPerInch); FPad.Top := MargArray[PaddingTop]; FPad.Right := MargArray[PaddingRight]; FPad.Bottom := MargArray[PaddingBottom]; @@ -8635,7 +8807,7 @@ procedure TCellObj.Draw(Canvas: TCanvas; const ARect: TRect; X, Y, CellSpacingHo if Cell.BkGnd then begin - Canvas.Brush.Color := ThemedColor(Cell.BkColor {$ifdef has_StyleElements},seClient in Cell.Document.StyleElements{$endif}) or PalRelative; + Canvas.Brush.Color := Cell.Document.ThemedColorToRGB(Cell.BkColor, htseClient) or PalRelative; Canvas.Brush.Style := bsSolid; if not Cell.IsCopy or not ImgOK then begin @@ -8730,7 +8902,7 @@ procedure TCellObj.Draw(Canvas: TCanvas; const ARect: TRect; X, Y, CellSpacingHo DrawBorder(Canvas, Rect(BL, BT, BR, BB), Rect(PL, PT, PR, PB), htColors(MargArray[BorderLeftColor], MargArray[BorderTopColor], MargArray[BorderRightColor], MargArray[BorderBottomColor]), htStyles(ThtBorderStyle(MargArray[BorderLeftStyle]), ThtBorderStyle(MargArray[BorderTopStyle]), ThtBorderStyle(MargArray[BorderRightStyle]), ThtBorderStyle(MargArray[BorderBottomStyle])), - MargArray[BackgroundColor], Cell.Document.Printing{$ifdef has_StyleElements},Cell.Document.StyleElements{$endif}); + MargArray[BackgroundColor], Cell.Document.Printing, Cell.Document.ThemedColorToRGB); except end; end; @@ -8995,11 +9167,14 @@ procedure TCellList.DrawLogicB(Canvas: TCanvas; Y, CellSpacingHorz, CellSpacingV {$ENDIF} end; +{$ifdef UseGenerics} +{$else} //-- BG ---------------------------------------------------------- 12.09.2010 -- function TCellList.GetCellObj(Index: Integer): TCellObjBase; begin Result := inherited Get(Index); end; +{$endif} {----------------TCellList.Draw} @@ -9820,6 +9995,25 @@ procedure THtmlTable.GetMinMaxWidths(Canvas: TCanvas; AvailableWidth, AvailableH CellObj.Cell.MinMaxWidth(Canvas, CellMin, CellMax, 0, 0); CellPercent := 0; CellRel := 0; + + with CellObj.SpecWdMin do + begin + case VType of + wtAbsolute: + if CellMin < Value then + CellMin := Value; + end; + end; + + with CellObj.SpecWdMax do + begin + case VType of + wtAbsolute: + if CellMax > Value then + CellMax := Value; + end; + end; + with CellObj.SpecWd do begin CellSpec := VType; @@ -9833,13 +10027,13 @@ procedure THtmlTable.GetMinMaxWidths(Canvas: TCanvas; AvailableWidth, AvailableH //CellMin := Max(CellMin, Value); // CellMin should be at least the given absolute value //CellMax := Min(CellMax, Value); // CellMax should be at most the given absolute value CellMax := Value; // CellMax should be at most the given absolute value - CellMax := Max(CellMax, CellMin); // CellMax should be at least CellMin end; wtRelative: CellRel := Value; end; end; + CellMax := Max(CellMax, CellMin); // CellMax should be at least CellMin Inc(CellMin, CellSpacingHorz + CellObj.HzSpace); Inc(CellMax, CellSpacingHorz + CellObj.HzSpace); @@ -11145,6 +11339,8 @@ constructor TSection.Create(Parent: TCellBasic; Attr: TAttributeList; Prop: TPro FO := TFontObj.Create(Self, Prop.Font, 0); FO.Title := Prop.PropTitle; + Prop.GetVertAlign(FO.SScript); + if Assigned(AnURL) and (Length(AnURL.Url) > 0) then begin FO.CreateFIArray; @@ -12439,7 +12635,7 @@ function TSection.DrawLogic1(Canvas: TCanvas; X, Y, XRef, YRef, AWidth, AHeight, begin Result := 0; for I := 0 to NN - 2 do {-2 so as not to count end spaces} - if ((PStart + I)^ = ' ') or ((PStart + I)^ = #160) then + if ((PStart + I)^ = SpcChar) or ((PStart + I)^ = NbSpcChar) then Inc(Result); end; @@ -13103,6 +13299,8 @@ function TSection.Draw1(Canvas: TCanvas; const ARect: TRect; Start: PWideChar; Cnt, Descent: Integer; St: ThtString; + Dx: array of Integer; + pDx: PInteger; function AddHyphen(P: PWideChar; N: Integer): ThtString; var @@ -13114,6 +13312,69 @@ function TSection.Draw1(Canvas: TCanvas; const ARect: TRect; Result[N + 1] := ThtChar('-'); end; + function CharacterJustification(P: PWideChar; N: Integer): Integer; + var + Fit: Integer; + Size: TSize; + Ratio: Double; + Width: Integer; + Offset: Integer; + Extra: Integer; + Spaces: Integer; + Inserted: Integer; + PEnd: PWideChar; + begin + if (LR.Spaces = 0) or (LR.Extra = 0) then + begin + pDx := nil; + // TextExtent: + Result := GetTextExtent(Canvas.Handle, P, N).cx; + end + else + begin + SetLength(Dx, N); + pDx := @Dx[0]; + GetTextExtentExPointW(Canvas.Handle, P, N, LR.DrawWidth, @Fit, pDx, Size); + + // pDx, resp Dx contants the width of Fit partial strings. Dx[0] width of P[0], Dx[1] width of P[0] and P[1], ... + // To justify output in ExtTextOut it needs offsets from one character to the next one: Dx[0] is offset from P[0] to P[1], ... + Width := 0; + Spaces := 0; + Inserted := 0; + Ratio := LR.Extra / LR.Spaces; + PEnd := @P[N]; + while P <> PEnd do + begin + Offset := pDx^ - Width; // remove length of previous partial string + + // insert additional pixels at spaces + case P^ of + SpcChar, + NbSpcChar: + begin + Inc(Spaces); + + // add rounded number of pixels: + Extra := Floor(Spaces * Ratio + 1E-6) - Inserted; + Inc(Inserted, Extra); + Inc(Offset, Extra); + end; + end; + + Width := pDx^; + pDx^ := Offset; + Inc(pDx); + Inc(P); + end; + + // Reset pDx for ExtTextOut(). + pDx := @Dx[0]; + + // TextExtent: + Result := Size.cx + Inserted; + end; + end; + function ChkInversion(Start: PWideChar; out Count: Integer): Boolean; var LongCount, C: Integer; @@ -13185,12 +13446,10 @@ function TSection.Draw1(Canvas: TCanvas; const ARect: TRect; ForeColor := Canvas.Font.Color; BackColor := FO.TheFont.bgColor; if ForeColor <> clNone then - ForeColor := ThemedColor(ForeColor{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + ForeColor := Document.ThemedColorToRGB(ForeColor, htseFont); if BackColor <> clNone then - BackColor := ThemedColor(BackColor{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + BackColor := Document.ThemedColorToRGB(BackColor, htseFont); Canvas.Font.Color := ForeColor; - if Document.Printing and (Canvas.Font.Color = ForeColor) then - Canvas.Font.Color := clBlack; if J2 = -1 then begin {it's an image or panel} if FlObj is TImageObj then @@ -13461,12 +13720,12 @@ function TSection.Draw1(Canvas: TCanvas; const ARect: TRect; SetTextAlign(Canvas.Handle, TA_BaseLine); {figure any offset for subscript or superscript} with FO do - if SScript = ANone then - Addon := 0 - else if SScript = ASuper then - Addon := -(FontHeight div 3) + case SScript of + aSuper: Addon := -(FontHeight div 3); + aSub : Addon := Descent div 2 + 1; else - Addon := Descent div 2 + 1; + Addon := 0; + end; NewCP := NewCP or (Addon <> 0); {calc a new CP if required} if NewCP then @@ -13492,31 +13751,28 @@ function TSection.Draw1(Canvas: TCanvas; const ARect: TRect; end else begin - if LR.Spaces = 0 then - SetTextJustification(Canvas.Handle, 0, 0) - else - SetTextJustification(Canvas.Handle, LR.Extra, LR.Spaces); + SetTextJustification(Canvas.Handle, 0, 0); if not IsWin95 then {use TextOutW} begin if (Cnt - I <= 0) and LR.Shy then begin St := AddHyphen(Start, Tmp); - TextOutW(Canvas.Handle, CPx, CPy, PWideChar(St), Length(St)); - CP1x := CPx + GetTextExtent(Canvas.Handle, PWideChar(St), Length(St)).cx; + CP1x := CPx + CharacterJustification(PWideChar(St), Length(St)); + ExtTextOutW(Canvas.Handle, CPx, CPy, 0, nil, PWideChar(St), Length(St), pDx); end else begin - TextOutW(Canvas.Handle, CPx, CPy, Start, Tmp); - CP1x := CPx + GetTextExtent(Canvas.Handle, Start, Tmp).cx; + CP1x := CPx + CharacterJustification(Start, Tmp); + ExtTextOutW(Canvas.Handle, CPx, CPy, 0, nil, Start, Tmp, pDx); end end else begin {Win95} {Win95 has bug which extends text underline for proportional font in TextOutW. Use clipping to clip the extra underline.} - CP1x := CPx + GetTextExtent(Canvas.Handle, Start, Tmp).cx; + CP1x := CPx + CharacterJustification(Start, Tmp); ARect := Rect(CPx, Y - LR.LineHt - LR.SpaceBefore - YOffset, CP1x, Y - YOffset + 1); - ExtTextOutW(Canvas.Handle, CPx, CPy, ETO_CLIPPED, @ARect, Start, Tmp, nil) + ExtTextOutW(Canvas.Handle, CPx, CPy, ETO_CLIPPED, @ARect, Start, Tmp, pDx); end; end; Document.Printed := True; @@ -13603,7 +13859,7 @@ function TSection.Draw1(Canvas: TCanvas; const ARect: TRect; for K := 0 to BorderList.Count - 1 do begin BR := BorderList[K]; - BR.DrawTheBorder(Canvas, XOffset, YOffSet, Document.Printing{$ifdef has_StyleElements}, Document.StyleElements{$endif}); + BR.DrawTheBorder(Canvas, XOffset, YOffSet, Document.Printing, Document.ThemedColorToRGB); end; DrawTheText(I); {draw the text, etc., in this line} Inc(Y, SpaceAfter); @@ -14723,19 +14979,8 @@ function TBlockCell.DoLogicX(Canvas: TCanvas; X, Y, XRef, YRef, Width, AHeight, {$ENDIF} end; - { TDrawList } -type - TImageRec = class(TObject) - public - AObj: TImageObj; - ACanvas: TCanvas; - AX, AY: Integer; - AYBaseline: Integer; - AFO: TFontObj; - end; - procedure TDrawList.AddImage(Obj: TImageObj; Canvas: TCanvas; X, Y, YBaseline: Integer; FO: TFontObj); var Result: TImageRec; @@ -14841,8 +15086,7 @@ destructor ThtLineRec.Destroy; {----------------ThtBorderRec.DrawTheBorder} -procedure ThtBorderRec.DrawTheBorder(Canvas: TCanvas; XOffset, YOffSet: Integer; Printing: Boolean - {$ifdef has_StyleElements}; const AStyleElements : TStyleElements {$endif}); +procedure ThtBorderRec.DrawTheBorder(Canvas: TCanvas; XOffset, YOffSet: Integer; Printing: Boolean; ThemedColorToRGB: ThtThemedColor); var IRect, ORect: TRect; begin @@ -14858,7 +15102,7 @@ procedure ThtBorderRec.DrawTheBorder(Canvas: TCanvas; XOffset, YOffSet: Integer; if MargArray[BackgroundColor] <> clNone then begin - Canvas.Brush.Color := ThemedColor(MargArray[BackgroundColor]{$ifdef has_StyleElements},seClient in AStyleElements{$endif}) or PalRelative; + Canvas.Brush.Color := ThemedColorToRGB(MargArray[BackgroundColor], htseClient) or PalRelative; Canvas.Brush.Style := bsSolid; Canvas.FillRect(IRect); end; @@ -14871,7 +15115,7 @@ procedure ThtBorderRec.DrawTheBorder(Canvas: TCanvas; XOffset, YOffSet: Integer; DrawBorder(Canvas, ORect, IRect, htColors(MargArray[BorderLeftColor], MargArray[BorderTopColor], MargArray[BorderRightColor], MargArray[BorderBottomColor]), htStyles(ThtBorderStyle(MargArray[BorderLeftStyle]), ThtBorderStyle(MargArray[BorderTopStyle]), ThtBorderStyle(MargArray[BorderRightStyle]), ThtBorderStyle(MargArray[BorderBottomStyle])), - MargArray[BackgroundColor], Printing{$ifdef has_StyleElements},AStyleElements{$endif}) + MargArray[BackgroundColor], Printing, ThemedColorToRGB) end; {----------------TPage.Draw1} @@ -15036,7 +15280,7 @@ function THorzLine.Draw1(Canvas: TCanvas; const ARect: TRect; IMgr: TIndentManag begin if Color <> clNone then begin - Brush.Color := ThemedColor(Color {$ifdef has_StyleElements},seClient in Document.StyleElements{$endif}) or $2000000; + Brush.Color := Document.ThemedColorToRGB(Color, htseClient) or $2000000; Brush.Style := bsSolid; FillRect(Rect(X, YT, XR + 1, YT + VSize)); end @@ -15045,7 +15289,7 @@ function THorzLine.Draw1(Canvas: TCanvas; const ARect: TRect; IMgr: TIndentManag if UseDefBorder then begin with Document do begin - White := Printing or (ThemedColor(Background{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}) = clWhite); + White := Printing or (Document.ThemedColorToRGB(Background, htseFont) = clWhite); BlackBorder := NoShade or (Printing and (GetDeviceCaps(Handle, BITSPIXEL) = 1) and (GetDeviceCaps(Handle, PLANES) = 1)); end; if BlackBorder then @@ -15053,14 +15297,14 @@ function THorzLine.Draw1(Canvas: TCanvas; const ARect: TRect; IMgr: TIndentManag else if White then Pen.Color := clSilver else - Pen.Color := ThemedColor(clBtnHighLight {$ifdef has_StyleElements},seClient in Document.StyleElements{$endif}); + Pen.Color := Document.ThemedColorToRGB(clBtnHighLight, htseClient); MoveTo(XR, YT); LineTo(XR, YT + VSize - 1); LineTo(X, YT + VSize - 1); if BlackBorder then Pen.Color := clBlack else - Pen.Color := ThemedColor(clBtnShadow{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + Pen.Color := Document.ThemedColorToRGB(clBtnShadow, htseFont); LineTo(X, YT); LineTo(XR, YT); end; @@ -15079,7 +15323,7 @@ procedure THtmlPropStack.PushNewProp(Sym: TElemSymb; Properties: TProperties; At Tag: ThtString; begin Tag := SymbToStr(Sym); - NewProp := TProperties.Create(Self, Document.UseQuirksMode); + NewProp := TProperties.Create(Self, Document.UseQuirksMode, Document.PixelsPerInch); NewProp.PropSym := Sym; NewProp.Inherit(Tag, Last); Add(NewProp); @@ -15151,7 +15395,7 @@ procedure TFieldsetBlock.ConvMargArray(BaseWidth, BaseHeight: Integer; out AutoC PaddTop, Delta: Integer; begin inherited ConvMargArray(BaseWidth, BaseHeight,AutoCount); - MargArray[MarginTop] := VMargToMarg(MargArrayO[MarginTop], False, BaseHeight, EmSize, ExSize, 10); + MargArray[MarginTop] := VMargToMarg(MargArrayO[MarginTop], False, BaseHeight, EmSize, ExSize, 10, Document.PixelsPerInch); Delta := Legend.CellHeight - (MargArray[MarginTop] + MargArray[BorderTopWidth] + MargArray[PaddingTop]); if Delta > 0 then begin @@ -15261,7 +15505,7 @@ function TFieldsetBlock.DrawLogic1(Canvas: TCanvas; X, Y, XRef, YRef, AWidth, AH end; else - StyleUn.ConvMargArray(MargArrayO, AWidth, AHeight, EmSize, ExSize, self.BorderWidth, AutoCount, MargArray); + StyleUn.ConvMargArray(MargArrayO, AWidth, AHeight, EmSize, ExSize, self.BorderWidth, AutoCount, MargArray, Document.PixelsPerInch); StyleUn.ApplyBoxSettings(MargArray,Document.UseQuirksMode); BorderWidth.Left := MargArray[MarginLeft] + MargArray[BorderLeftWidth] + MargArray[PaddingLeft]; BorderWidth.Right := MargArray[MarginRight] + MargArray[BorderRightWidth] + MargArray[PaddingRight]; @@ -15351,7 +15595,11 @@ procedure TFormControlObjList.DeactivateTabbing; //-- BG ---------------------------------------------------------- 15.01.2011 -- function TFormControlObjList.GetItem(Index: Integer): TFormControlObj; begin +{$ifdef UseGenerics} + Result := inherited Items[Index] as TFormControlObj; +{$else} Result := Get(Index); +{$endif} end; { TSizeableObj } @@ -15385,7 +15633,7 @@ procedure TSizeableObj.CalcSize(AvailableWidth, AvailableHeight, SetWidth, SetHe MargArrayO[piMaxHeight] := IntNull; end; - ConvInlineMargArray(MargArrayO, AvailableWidth, AvailableHeight, EmSize, ExSize, BorderWidth, MargArray); + ConvInlineMargArray(MargArrayO, AvailableWidth, AvailableHeight, EmSize, ExSize, BorderWidth, MargArray, Document.PixelsPerInch); if PercentWidth then begin @@ -15617,7 +15865,7 @@ procedure TSizeableObj.ProcessProperties(Prop: TProperties); Prop.GetVMarginArray(MargArrayO); EmSize := Prop.EmSize; ExSize := Prop.ExSize; - ConvInlineMargArray(MargArrayO, DummyHtWd, DummyHtWd, EmSize, ExSize, BorderWidth, MargArray); + ConvInlineMargArray(MargArrayO, DummyHtWd, DummyHtWd, EmSize, ExSize, BorderWidth, MargArray, Document.PixelsPerInch); if MargArray[MarginLeft] <> IntNull then HSpaceL := MargArray[MarginLeft]; @@ -16002,10 +16250,13 @@ function TSectionBaseList.FindDocPos(SourcePos: Integer; Prev: Boolean): Integer end end; +{$ifdef UseGenerics} +{$else} function TSectionBaseList.GetItem(Index: Integer): TSectionBase; begin Result := inherited Get(Index); end; +{$endif} function TSectionBaseList.PtInObject(X, Y: Integer; var Obj: TObject; var IX, IY: Integer): Boolean; {Y is absolute} @@ -16064,8 +16315,8 @@ procedure TControlObj.DrawInline(Canvas: TCanvas; X, Y, YBaseline: Integer; FO: OldBrushStyle := Canvas.Brush.Style; {save style first} OldBrushColor := Canvas.Brush.Color; OldPenColor := Canvas.Pen.Color; - Canvas.Pen.Color := ThemedColor(FO.TheFont.Color {$ifdef has_StyleElements},seFont in Document.StyleElements{$endif} ); - Canvas.Brush.Color := ThemedColor(BackgroundColor {$ifdef has_StyleElements},seClient in Document.StyleElements{$endif}); + Canvas.Pen.Color := Document.ThemedColorToRGB(FO.TheFont.Color, htseFont); + Canvas.Brush.Color := Document.ThemedColorToRGB(BackgroundColor, htseClient); Canvas.Brush.Style := bsSolid; try // paint a rectangular placeholder @@ -16274,6 +16525,9 @@ procedure TFrameObj.UpdateFrame; end; end; +{$ifdef UseGenerics} +{$else} + { TRowList } //-- BG ---------------------------------------------------------- 26.12.2011 -- @@ -16290,6 +16544,8 @@ function TColSpecList.GetItem(Index: Integer): TColSpec; Result := Get(Index); end; +{$endif} + { TColSpec } //-- BG ---------------------------------------------------------- 12.01.2012 -- @@ -16403,12 +16659,21 @@ function TFloatingObjList.FindObject(Posn: Integer): TFloatingObj; Result := nil; end; +{$ifdef UseGenerics} +{$else} //-- BG ---------------------------------------------------------- 07.08.2013 -- function TFloatingObjList.GetItem(Index: Integer): TFloatingObj; begin Result := Get(Index); end; +//-- BG ---------------------------------------------------------- 07.08.2013 -- +procedure TFloatingObjList.SetItem(Index: Integer; const Item: TFloatingObj); +begin + Put(Index, Item); +end; +{$endif} + //-- BG ---------------------------------------------------------- 05.08.2013 -- function TFloatingObjList.GetObjectAt(Posn: Integer; out Obj): Integer; var @@ -16492,12 +16757,6 @@ function TFloatingObjList.PtInObject(X, Y: Integer; out Obj: TObject; out IX, IY Result := False; end; -//-- BG ---------------------------------------------------------- 07.08.2013 -- -procedure TFloatingObjList.SetItem(Index: Integer; const Item: TFloatingObj); -begin - Put(Index, Item); -end; - { TBlockBase } //-- BG ---------------------------------------------------------- 31.08.2013 -- @@ -16575,6 +16834,9 @@ function TLineBreak.TryGetClear(var Clear: ThtClearStyle): Boolean; end; end; +{$ifdef UseGenerics} +{$else} + { ThtIndexObjList } //-- BG ---------------------------------------------------------- 06.10.2016 -- @@ -16622,6 +16884,7 @@ function TPanelObjList.Get(Index: Integer): TPanelObj; begin Result := inherited Get(Index); end; +{$endif} initialization {$ifdef UNICODE} diff --git a/Ext/HTMLViewer/Source/HTMLUn2.pas b/Ext/HTMLViewer/Source/HTMLUn2.pas index 712af21..95a4372 100644 --- a/Ext/HTMLViewer/Source/HTMLUn2.pas +++ b/Ext/HTMLViewer/Source/HTMLUn2.pas @@ -1,7 +1,7 @@ { -Version 11.9 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin -Copyright (c) 2008-2018 by HtmlViewer Team +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -39,13 +39,17 @@ interface {$else} Windows, {$endif} - SysUtils, Contnrs, Classes, Graphics, ClipBrd, Controls, ExtCtrls, Messages, Variants, Types, ComCtrls, + SysUtils, Contnrs, Classes, Graphics, ClipBrd, Controls, ExtCtrls, Messages, + Variants, Types, ComCtrls, Forms, {$ifdef Compiler20_Plus} CommCtrl, {$endif} {$ifndef NoGDIPlus} GDIPL2A, {$endif} +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} {$ifdef METAFILEMISSING} MetaFilePrinter, {$endif} @@ -57,7 +61,7 @@ interface HtmlSymb; const - VersionNo = '11.9'; + VersionNo = '11.10'; MaxHScroll = 100000; {max horizontal display in pixels} Tokenleng = 300; TopLim = -200; {drawing limits} @@ -107,24 +111,38 @@ TAttribute = class {holds a tag attribute} property AsDouble: Double read DblValue; end; +{$ifdef UseGenerics} + TAttributeList = class(TObjectList) {a list of tag attributes} +{$else} TAttributeList = class(TObjectList) {a list of tag attributes,(TAttributes)} +{$endif} private SaveID: ThtString; function GetClass: ThtString; function GetID: ThtString; function GetTitle: ThtString; +{$ifdef UseGenerics} +{$else} function GetAttribute(Index: Integer): TAttribute; {$ifdef UseInline} inline; {$endif} +{$endif} public constructor CreateCopy(ASource: TAttributeList); function Clone: TAttributeList; virtual; +{$ifdef UseGenerics} + procedure Clear; virtual; +{$else} procedure Clear; override; +{$endif} function Find(const Name: ThtString; var T: TAttribute): Boolean; overload; {$ifdef UseInline} inline; {$endif} function Find(Sy: TAttrSymb; var T: TAttribute): Boolean; overload; {$ifdef UseInline} inline; {$endif} function CreateStringList: ThtStringList; property TheClass: ThtString read GetClass; property TheID: ThtString read GetID; property TheTitle: ThtString read GetTitle; +{$ifdef UseGenerics} +{$else} property Items[Index: Integer]: TAttribute read GetAttribute; default; +{$endif} end; //------------------------------------------------------------------------------ @@ -195,12 +213,16 @@ TMapArea = class end; // BG, 31.12.2011: +{$ifdef UseGenerics} + TMapAreaList = class(TObjectList); +{$else} TMapAreaList = class(TObjectList) private function GetArea(Index: Integer): TMapArea; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: TMapArea read GetArea; default; end; +{$endif} TMapItem = class {holds a client map info} private @@ -213,24 +235,32 @@ TMapItem = class {holds a client map info} procedure AddArea(Attrib: TAttributeList); end; +{$ifdef UseGenerics} + ThtMap = class(TObjectList); +{$else} ThtMap = class(TObjectList) private function Get(Index: Integer): TMapItem; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: TMapItem read Get; default; end; +{$endif} TFontObjBase = class {font information} public UrlTarget: TUrlTarget; end; +{$ifdef UseGenerics} + TFontObjBaseList = class(TObjectList); +{$else} TFontObjBaseList = class(TObjectList) private function GetBase(Index: Integer): TFontObjBase; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: TFontObjBase read GetBase; default; end; +{$endif} //------------------------------------------------------------------------------ // indentation manager @@ -559,7 +589,26 @@ TViewerBase = class(ThtControlBase) FQuirksMode : THtQuirksMode; function StoreFontName: Boolean; function StorePreFontName: Boolean; + function GetPPI: Integer; +{$ifndef Compiler31_Plus} + function FormPixelsPerInch: Integer; +{$endif} + procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED; + procedure CMParentFontChanged(var Message: TMessage); message CM_PARENTFONTCHANGED; protected + FInCMParentColorChanged: Integer; +{$ifndef Compiler31_Plus} + FCurrentPPI: Integer; + procedure SetPPI(Value: Integer); virtual; + procedure SetParent(NewParent: TWinControl); override; +{$endif} + procedure StyleChanged; virtual; abstract; + procedure ScaleChanged; virtual; abstract; + procedure ChangeScale(M, D: Integer{$ifdef Compiler31_Plus}; isDpiChange: Boolean{$endif}); override; +{$ifdef LCL} + procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy; + const AXProportion, AYProportion: Double); override; +{$endif} {$ifdef has_StyleElements} procedure UpdateStyleElements; override; {$endif} @@ -631,12 +680,18 @@ TViewerBase = class(ThtControlBase) procedure Load(const Url: ThtString); virtual; abstract; // HtmlExpandFilename(Filename, CurrentFilename): Try to get the absolute pathname of the given filename in the local filesystem function HtmlExpandFilename(const Filename: ThtString; const CurrentFilename: ThtString = ''): ThtString; virtual; abstract; +{$ifndef Compiler31_Plus} + function ParentForm: TCustomForm; +{$endif} + function ThemedColor(AColor: TColor; AStyleElement: ThtStyleElement): TColor; + function ThemedColorToRGB(AColor: TColor; AStyleElement: ThtStyleElement): TColor; + property QuirksMode : THtQuirksMode read FQuirksMode write SetQuirksMode default qmStandards; // set to determine if child objects should be in "quirks" mode property UseQuirksMode: Boolean read GetUseQuirksMode; property CodePage: Integer read FCodePage write SetCodePage default 0; property CharSet: TFontCharset read FCharSet write SetCharset default DEFAULT_CHARSET; - property DefBackground: TColor read FBackground write SetDefBackground default clBtnFace; + property DefBackground: TColor read FBackGround write SetDefBackground default clBtnFace; property DefFontColor: TColor read FFontColor write SetFontColor default clBtnText; property DefFontName: TFontName read FFontName write SetFontName stored StoreFontName; property DefFontSize: Integer read FFontSize write SetFontSize default 12; @@ -650,6 +705,7 @@ TViewerBase = class(ThtControlBase) property MarginHeight: Integer read FMarginHeight write SetMarginHeight default 5; property MarginWidth: Integer read FMarginWidth write SetMarginWidth default 10; property NoSelect: Boolean read FNoSelect write SetNoSelect; + property PixelsPerInch: Integer read GetPPI; property PrintMarginBottom: Double read FPrintMarginBottom write SetPrintMarginBottom; property PrintMarginLeft: Double read FPrintMarginLeft write SetPrintMarginLeft; property PrintMarginRight: Double read FPrintMarginRight write SetPrintMarginRight; @@ -763,12 +819,12 @@ function ToSpecWidth(AsInteger: Integer; AsString: ThtString): TSpecWidth; function CalcClipRect(Canvas: TCanvas; const Rect: TRect; Printing: boolean): TRect; procedure GetClippingRgn(Canvas: TCanvas; const ARect: TRect; Printing: boolean; var Rgn, SaveRgn: HRgn); -procedure FillRectWhite(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor {$ifdef has_StyleElements};const AStyleElements : TStyleElements{$endif}); -procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Raised, PrintMonoBlack, Disabled: boolean; Color: TColor - {$ifdef has_StyleElements};const AStyleElements : TStyleElements{$endif}); -procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArray; - const S: ThtBorderStyleArray; BGround: TColor; Print: boolean - {$ifdef has_StyleElements};const AStyleElements : TStyleElements{$endif}); +procedure FillRectWhite(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor); +procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; + Raised, PrintMonoBlack, Disabled: Boolean; Color: TColor; ThemedColor: ThtThemedColor); +procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; + const C: ThtColorArray; const S: ThtBorderStyleArray; + BGround: TColor; Print: Boolean; ThemedColor: ThtThemedColor); type THtBorderPointArray = array[0..3] of TPoint; @@ -776,7 +832,7 @@ procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArra implementation uses - Forms, {$ifndef UseInline} Math, {$endif} + {$ifndef UseInline} Math, {$endif} {$ifdef UseVCLStyles} Vcl.Themes, {$endif} @@ -996,12 +1052,20 @@ function FitText(DC: HDC; S: PWideChar; Max, Width: Integer; out Extent: TSize): if not IsWin32Platform then begin + if Width < Max then + begin + // speed up calculating long S, which obviously cannot fit into Width as + // characters usually are wider than 1 pixel. + SetLength(Ints, Width); + if GetTextExtentExPointW(DC, S, Width, Width, @Result, @Ints[0], Extent) then + if Result < Width then + Exit; + + // Oh, Result = Width. Better continue and try the complete string: + end; + SetLength(Ints, Max); - if GetTextExtentExPointW(DC, S, Max, Width, @Result, @Ints[0], Extent) then - if Result > 0 then - Extent.cx := Ints[Result - 1] - else - Extent.cx := 0; + GetTextExtentExPointW(DC, S, Max, Width, @Result, @Ints[0], Extent); end else {GetTextExtentExPointW not available in win98, 95} begin {optimize this by looking for Max to fit first -- it usually does} @@ -1211,17 +1275,11 @@ procedure WrapTextW(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; S: UnicodeString); function GetTextExtent(DC: HDC; P: PWideChar; N: Integer): TSize; {$ifdef UseInline} inline; {$endif} -var - Dummy: Integer; begin - if not IsWin32Platform then - GetTextExtentExPointW(DC, P, N, 0, @Dummy, nil, Result) - else GetTextExtentPoint32W(DC, P, N, Result); {win95, 98 ME} end; -procedure FillRectWhite(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor - {$ifdef has_StyleElements};const AStyleElements : TStyleElements{$endif}); +procedure FillRectWhite(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor); {$ifdef UseInline} inline; {$endif} var OldBrushStyle: TBrushStyle; @@ -1231,8 +1289,7 @@ procedure FillRectWhite(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor begin OldBrushStyle := Brush.Style; {save style first} OldBrushColor := Brush.Color; - Brush.Color := ThemedColor(Color - {$ifdef has_StyleElements},seClient in AStyleElements{$endif}); + Brush.Color := Color; Brush.Style := bsSolid; FillRect(Rect(X1, Y1, X2, Y2)); Brush.Color := OldBrushColor; @@ -1240,13 +1297,7 @@ procedure FillRectWhite(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Color: TColor end; end; -{$ifdef has_StyleElements} -procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Raised, PrintMonoBlack, Disabled: boolean; Color: TColor; - const AStyleElements : TStyleElements); -{$else} -procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Raised, PrintMonoBlack, Disabled: boolean; Color: TColor); -{$endif} - {$ifdef UseInline} inline; {$endif} +procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Raised, PrintMonoBlack, Disabled: Boolean; Color: TColor; ThemedColor: ThtThemedColor); {Draws lowered rectangles for form control printing} var OldStyle: TPenStyle; @@ -1264,13 +1315,13 @@ procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Raised, OldStyle := Pen.Style; OldBrushStyle := Brush.Style; {save style first} OldBrushColor := Brush.Color; - if not MonoBlack then + if not MonoBlack then begin if Disabled then - Brush.Color := ThemedColor(clBtnFace{$ifdef has_StyleElements},seClient in AStyleElements{$endif}) + Brush.Color := ThemedColor(clBtnFace, htseClient) else - Brush.Color := ThemedColor(color{$ifdef has_StyleElements},seClient in AStyleElements{$endif}); - end + Brush.Color := ThemedColor(Color, htseClient); + end else Brush.Color := clBlack;//color; Brush.Style := bsSolid; @@ -1288,19 +1339,19 @@ procedure DrawFormControlRect(Canvas: TCanvas; X1, Y1, X2, Y2: Integer; Raised, begin Pen.Width := 2; if Raised then - Pen.Color := ThemedColor(clBtnHighlight{$ifdef has_StyleElements},seClient in AStyleElements{$endif})//clSilver + Pen.Color := ThemedColor(clBtnHighlight, htseClient) else - Pen.Color := ThemedColor(clBtnShadow{$ifdef has_StyleElements},seClient in AStyleElements{$endif}); + Pen.Color := ThemedColor(clBtnShadow, htseClient); end; MoveTo(X1, Y2); LineTo(X1, Y1); LineTo(X2, Y1); - if not MonoBlack then + if not MonoBlack then begin if Raised then - Pen.Color := ThemedColor(clBtnShadow{$ifdef has_StyleElements},seClient in AStyleElements{$endif}) + Pen.Color := ThemedColor(clBtnShadow, htseClient) else - Pen.Color := ThemedColor(clBtnHighlight{$ifdef has_StyleElements},seClient in AStyleElements{$endif});//clSilver; + Pen.Color := ThemedColor(clBtnHighlight, htseClient); end else Pen.Color := clSilver; @@ -1438,10 +1489,13 @@ function TAttributeList.Find(Sy: TAttrSymb; var T: TAttribute): Boolean; Result := False; end; +{$ifdef UseGenerics} +{$else} function TAttributeList.GetAttribute(Index: Integer): TAttribute; begin Result := Get(Index); end; +{$endif} function TAttributeList.GetClass: ThtString; var @@ -1643,6 +1697,9 @@ function TMapArea.PtInArea(X, Y: Integer): Boolean; Result := PtInRegion(FRegion, X, Y); end; +{$ifdef UseGenerics} +{$else} + { TMapAreaList } //-- BG ---------------------------------------------------------- 31.12.2011 -- @@ -1651,6 +1708,8 @@ function TMapAreaList.GetArea(Index: Integer): TMapArea; Result := Get(Index); end; +{$endif} + { TMapItem } constructor TMapItem.Create; @@ -2661,17 +2720,9 @@ procedure DrawOnePolygon(Canvas: TCanvas; P: THtBorderPointArray; Color: TColor; end; {----------------DrawBorder} - {$ifdef has_StyleElements} - -procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArray; - const S: ThtBorderStyleArray; BGround: TColor; Print: boolean; - const AStyleElements : TStyleElements); - - {$else} -procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArray; - const S: ThtBorderStyleArray; BGround: TColor; Print: boolean); - {$endif} - {$ifdef UseInline} inline; {$endif} +procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; + const C: ThtColorArray; const S: ThtBorderStyleArray; + BGround: TColor; Print: Boolean; ThemedColor: ThtThemedColor); {Draw the 4 sides of a border. The sides may be of different styles or colors. The side indices, 0,1,2,3, represent left, top, right, bottom. ORect is the outside rectangle of the border, IRect the inside Rectangle. @@ -2786,7 +2837,7 @@ procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArra CombineRgn(OuterRegion, OuterRegion, InnerRegion, RGN_DIFF); Brush := TBrush.Create; try - Brush.Color := ThemedColor(BGround{$ifdef has_StyleElements},seClient in AStyleElements{$endif}) or PalRelative; + Brush.Color := ThemedColor(BGround, htseClient) or PalRelative; Brush.Style := bsSolid; FillRgn(Canvas.Handle, OuterRegion, Brush.Handle); finally @@ -2804,7 +2855,7 @@ procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArra try for I := 0 to 3 do begin - Color := ThemedColor(C[I]{$ifdef has_StyleElements},seClient in AStyleElements{$endif}); + Color := ThemedColor(C[I], htseClient); case S[I] of bssSolid, bssInset, bssOutset: begin @@ -2934,14 +2985,15 @@ procedure DrawBorder(Canvas: TCanvas; ORect, IRect: TRect; const C: ThtColorArra //-- BG ---------------------------------------------------------- 24.11.2011 -- constructor TViewerBase.Create(AOwner: TComponent); -const - defaultPrintMargin = 0.8;//2.0; begin inherited; - PrintMarginLeft := defaultPrintMargin; - PrintMarginRight := defaultPrintMargin; - PrintMarginTop := defaultPrintMargin; - PrintMarginBottom := defaultPrintMargin; +{$ifndef Compiler31_Plus} + FCurrentPPI := FormPixelsPerInch; +{$endif} + PrintMarginLeft := 2.0; + PrintMarginRight := 2.0; + PrintMarginTop := 2.0; + PrintMarginBottom := 2.0; PrintMaxHPages := 2; PrintScale := 1.0; Charset := DEFAULT_CHARSET; @@ -2983,6 +3035,8 @@ constructor TViewerBase.CreateCopy(Owner: TComponent; Source: TViewerBase); LoadCursor := Source.LoadCursor; NoSelect := Source.NoSelect; ServerRoot := Source.ServerRoot; + ParentColor := Source.ParentColor; + ParentFont := Source.ParentFont; MarginHeight := Source.MarginHeight; MarginWidth := Source.MarginWidth; @@ -3031,13 +3085,16 @@ constructor TViewerBase.CreateCopy(Owner: TComponent; Source: TViewerBase); OnScript := Source.OnScript; OnSoundRequest := Source.OnSoundRequest; - Cursor := Cursor; - OnKeyDown := OnKeyDown; - OnKeyPress := OnKeyPress; - OnKeyUp := OnKeyUp; - OnMouseDown := OnMouseDown; - OnMouseMove := OnMouseMove; - OnMouseUp := OnMouseUp; + Cursor := Source.Cursor; + ParentColor := Source.ParentColor; + ParentFont := Source.ParentFont; + ParentShowHint := Source.ParentShowHint; + OnKeyDown := Source.OnKeyDown; + OnKeyPress := Source.OnKeyPress; + OnKeyUp := Source.OnKeyUp; + OnMouseDown := Source.OnMouseDown; + OnMouseMove := Source.OnMouseMove; + OnMouseUp := Source.OnMouseUp; {$ifdef HasGestures} Touch := Source.Touch; @@ -3045,6 +3102,136 @@ constructor TViewerBase.CreateCopy(Owner: TComponent; Source: TViewerBase); {$endif} end; +//-- BG ---------------------------------------------------------- 08.01.2023 -- +function TViewerBase.ThemedColor(AColor: TColor; AStyleElement: ThtStyleElement): TColor; +begin + Result := AColor; +{$ifdef LCL} + if Result = clDefault then + case AStyleElement of + htseClient: Result := GetDefaultColor(dctBrush); + htseFont : Result := GetDefaultColor(dctFont); + end; +{$endif} + +{$ifdef UseVCLStyles} +{$ifdef has_StyleElements} + case AStyleElement of + htseFont: + if (seFont in StyleElements) and TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); + htseClient: + if (seClient in StyleElements) and TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); + htseBorder: + if (seBorder in StyleElements) and TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); + end; +{$else} + if TStyleManager.IsCustomStyleActive then + Result := StyleServices.GetSystemColor(Result); +{$endif} +{$endif} +end; + +//-- BG ---------------------------------------------------------- 08.01.2023 -- +function TViewerBase.ThemedColorToRGB(AColor: TColor; AStyleElement: ThtStyleElement): TColor; +begin + Result := ColorToRGB( ThemedColor( AColor, AStyleElement )); +end; + +//-- BG ---------------------------------------------------------- 06.12.2022 -- +procedure TViewerBase.CMParentColorChanged(var Message: TMessage); +var + OldColor: TColor; + LName: string; + LClassName: string; +begin + if csLoading in ComponentState then Exit; + LName := Name; + lClassName := ClassName; + + OldColor := ThemedColorToRGB(Color, htseClient); + Inc(FInCMParentColorChanged); // in FPC inherited produces recursive calls to CMParentColorChanged when ParentColor changed to tr + if FInCMParentColorChanged = 1 then + begin + inherited; + if not ParentColor then + Color := FBackGround; + if OldColor <> ThemedColorToRGB(Color, htseClient) then + StyleChanged; + end; + Dec(FInCMParentColorChanged); +end; + +procedure TViewerBase.CMParentFontChanged(var Message: TMessage); +begin + if csLoading in ComponentState then Exit; + inherited; + StyleChanged; +end; + +//-- BG ------------------------------------------------------- 24.07.2022 -- +procedure TViewerBase.ChangeScale(M, D: Integer{$ifdef Compiler31_Plus}; isDpiChange: Boolean{$endif}); +begin + inherited; + if M <> D then + ScaleChanged; +end; + +{$ifndef Compiler31_Plus} + +//-- BG ------------------------------------------------------- 03.10.2022 -- +function TViewerBase.ParentForm: TCustomForm; +begin + Result := GetParentForm(Self); +end; + +//-- BG ------------------------------------------------------- 29.09.2022 -- +function TViewerBase.FormPixelsPerInch: Integer; +var + P: TCustomForm; +begin + P := ParentForm; + + if P <> nil then + Result := {$ifndef LCL}ThtCustomForm{$endif}(P).PixelsPerInch + else + Result := Screen.PixelsPerInch; +end; + +//-- BG ------------------------------------------------------- 03.10.2022 -- +procedure TViewerBase.SetPPI(Value: Integer); +begin + FCurrentPPI := Value; +end; + +//-- BG ------------------------------------------------------- 29.09.2022 -- +procedure TViewerBase.SetParent(NewParent: TWinControl); +begin + inherited SetParent(NewParent); + if not (csDestroying in ComponentState) then + SetPPI( FormPixelsPerInch ); +end; +{$endif} + +{$ifdef LCL} +//-- BG ------------------------------------------------------- 29.09.2022 -- +procedure TViewerBase.DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy; + const AXProportion, AYProportion: Double); +var + NewPPI: Integer; +begin + inherited DoAutoAdjustLayout(AMode, AXProportion, AYProportion); + NewPPI := Round(FCurrentPPI * AYProportion); + if FCurrentPPI <> NewPPI then + begin + FCurrentPPI := NewPPI; + ScaleChanged; + end; +end; +{$endif} + procedure TViewerBase.SetActiveColor(const Value: TColor); begin FOverColor := Value; @@ -3062,7 +3249,15 @@ procedure TViewerBase.SetCodePage(const Value: Integer); procedure TViewerBase.SetDefBackground(const Value: TColor); begin - FBackground := Value; + if FBackGround <> Value then + begin + FBackGround := Value; + if not ParentColor then + begin + Color := FBackGround; + StyleChanged; + end; + end; end; procedure TViewerBase.SetOnBitmapRequest(const Value: TGetBitmapEvent); @@ -3344,6 +3539,12 @@ function TViewerBase.StoreFontName: Boolean; Result := FFontName <> htDefFontName; end; +//-- BG ---------------------------------------------------------- 29.09.2022 -- +function TViewerBase.GetPPI: Integer; +begin + Result := FCurrentPPI; +end; + function TViewerBase.StorePreFontName: Boolean; begin Result := FPreFontName <> htDefPreFontName; @@ -3583,6 +3784,9 @@ function TIndentRecList.Get(Index: Integer): TIndentRec; Result := inherited Get(Index); end; +{$ifdef UseGenerics} +{$else} + { ThtMap } //-- BG ---------------------------------------------------------- 06.10.2016 -- @@ -3599,6 +3803,8 @@ function TFontObjBaseList.GetBase(Index: Integer): TFontObjBase; Result := inherited Get(Index); end; +{$endif} + initialization {$ifdef UseGlobalObjectId} GlobalObjectIdPrefix := 'GOID-'; diff --git a/Ext/HTMLViewer/Source/HtmlBuffer.pas b/Ext/HTMLViewer/Source/HtmlBuffer.pas index e3117a8..27de58f 100644 --- a/Ext/HTMLViewer/Source/HtmlBuffer.pas +++ b/Ext/HTMLViewer/Source/HtmlBuffer.pas @@ -1,6 +1,6 @@ { -HtmlViewer Version 11.7 -Copyright (c) 2010-2016 by Bernd Gabriel +HtmlViewer Version 11.10 +Copyright (c) 2010-2023 by Bernd Gabriel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -99,7 +99,7 @@ TBuffConverterClass = class of TBuffConverter; // Although loading files via ThtStringList.LoadFromFile(FileName) produces WideChars, // these WideChars may not be coded correctly, if the file is not a unicode file. // For those cases you can apply a CodePage to the TBuffString versions of Convert()/Create(). - // Or you can used the PByte versions with the InitialCodePage parameters and set InitialCodePage to CP_UTF16LE. + // Or you can use the PByte versions with the InitialCodePage parameters and set InitialCodePage to CP_UTF16LE. // // Avoid passing such raw ThtStringList.Text to HtmlViewer. // HtmlViewer assumes correct unicode in ThtString. @@ -1244,7 +1244,8 @@ function TBuffConverter.AsString: TBuffString; if (FCodePage = CP_UTF16LE) and (FInitalCodePage = CP_UTF16LE) then begin SetLength(Result, Bytes div 2); - System.Move(FPos.BytePtr^, Result[1], Bytes); + if Length(Result) > 0 then + System.Move(FPos.BytePtr^, Result[1], Bytes); end else begin @@ -1613,7 +1614,8 @@ procedure TBuffer.DetectCodePage; CodePage := CP_UTF8 else {$endif} - CodePage := CP_ACP; + //By Default use UTF8 encoding + CodePage := CP_UTF8; end; //-- BG ---------------------------------------------------------- 26.09.2012 -- diff --git a/Ext/HTMLViewer/Source/HtmlFonts.pas b/Ext/HTMLViewer/Source/HtmlFonts.pas index d9d8ba1..f69dd4e 100644 --- a/Ext/HTMLViewer/Source/HtmlFonts.pas +++ b/Ext/HTMLViewer/Source/HtmlFonts.pas @@ -1,7 +1,7 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin -Copyright (c) 2008-2016 by HtmlViewer Team +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -45,6 +45,9 @@ interface {$endif} SysUtils, Graphics, Classes, Forms, Contnrs, Variants, +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} // HtmlGlobals, StyleTypes; @@ -88,20 +91,27 @@ ThtFont = class(TFont) EmSize: Integer; ExSize: Integer; constructor Create; {$ifdef LCL} override; {$endif} - procedure Assign(const Info: ThtFontInfo); reintroduce; overload; + procedure Assign(const Info: ThtFontInfo; APixelsPerInch: Integer); reintroduce; overload; procedure Assign(Source: TPersistent); overload; override; procedure AssignToCanvas(Canvas: TCanvas); end; +{$ifdef UseGenerics} + ThtFontList = class(TObjectList); +{$else} + ThtFontList = class(TObjectList); +{$endif} + ThtFontCache = class private FFontsByName: ThtStringList; procedure Add(Font: ThtFont); - function Find(const FontInfo: ThtFontInfo): ThtFont; + function Find(const FontInfo: ThtFontInfo; PixelsPerInch: Integer): ThtFont; public constructor Create; destructor Destroy; override; - function GetFontLike(var Font: ThtFontInfo): ThtFont; + procedure Clear; + function GetFontLike(var Font: ThtFontInfo; PixelsPerInch: Integer): ThtFont; end; function AllMyFonts: ThtFontCache; @@ -133,28 +143,34 @@ procedure TFontInfoArray.Assign(Source: TFontInfoArray); {----------------TMyFont.Assign} procedure ThtFont.Assign(Source: TPersistent); +var + SourceFont: ThtFont absolute Source; begin if Source is ThtFont then begin - bgColor := ThtFont(Source).bgColor; - tmHeight := ThtFont(Source).tmHeight; - tmDescent := ThtFont(Source).tmDescent; - tmExternalLeading := ThtFont(Source).tmExternalLeading; - tmAveCharWidth := ThtFont(Source).tmAveCharWidth; - tmMaxCharWidth := ThtFont(Source).tmMaxCharWidth; - tmCharset := ThtFont(Source).tmCharset; - CharExtra := ThtFont(Source).CharExtra; - EmSize := ThtFont(Source).EmSize; - ExSize := ThtFont(Source).ExSize; + PixelsPerInch := SourceFont.PixelsPerInch; + bgColor := SourceFont.bgColor; + tmHeight := SourceFont.tmHeight; + tmDescent := SourceFont.tmDescent; + tmExternalLeading := SourceFont.tmExternalLeading; + tmAveCharWidth := SourceFont.tmAveCharWidth; + tmMaxCharWidth := SourceFont.tmMaxCharWidth; + tmCharset := SourceFont.tmCharset; + CharExtra := SourceFont.CharExtra; + EmSize := SourceFont.EmSize; + ExSize := SourceFont.ExSize; end; inherited Assign(Source); end; //-- BG ---------------------------------------------------------- 12.03.2011 -- -procedure ThtFont.Assign(const Info: ThtFontInfo); +procedure ThtFont.Assign(const Info: ThtFontInfo; APixelsPerInch: Integer); begin Name := htStringToString(Info.iName); - Height := -Round(Info.iSize * Screen.PixelsPerInch / 72); + {$ifdef LCL} + PixelsPerInch := APixelsPerInch; + {$endif} + Height := -Round(Info.iSize * (APixelsPerInch / 72.0)); Style := Info.iStyle; bgColor := Info.ibgColor; Color := Info.iColor; @@ -188,9 +204,9 @@ procedure ThtFontCache.Add(Font: ThtFont); if not FFontsByName.Find(FontName, I) then begin I := FFontsByName.Add(FontName); - FFontsByName.Objects[I] := TObjectList.Create(True); + FFontsByName.Objects[I] := ThtFontList.Create(True); end; - TObjectList(FFontsByName.Objects[I]).Add(Font); + ThtFontList(FFontsByName.Objects[I]).Add(Font); end; //-- BG ---------------------------------------------------------- 30.01.2011 -- @@ -203,17 +219,24 @@ constructor ThtFontCache.Create; //-- BG ---------------------------------------------------------- 30.01.2011 -- destructor ThtFontCache.Destroy; +begin + Clear; + FFontsByName.Free; + inherited; +end; + +//-- BG ---------------------------------------------------------- 19.09.2022 -- +procedure ThtFontCache.Clear; var I: Integer; begin for I := 0 to FFontsByName.Count - 1 do FFontsByName.Objects[I].Free; - FFontsByName.Free; - inherited; + FFontsByName.Clear; end; //-- BG ---------------------------------------------------------- 30.01.2011 -- -function ThtFontCache.Find(const FontInfo: ThtFontInfo): ThtFont; +function ThtFontCache.Find(const FontInfo: ThtFontInfo; PixelsPerInch: Integer): ThtFont; var iHeight: Integer; @@ -231,13 +254,13 @@ function ThtFontCache.Find(const FontInfo: ThtFontInfo): ThtFont; var I: Integer; - Fonts: TObjectList; + Fonts: ThtFontList; begin I := -1; if FFontsByName.Find(htLowerCase(FontInfo.iName), I) then begin - iHeight := -Round(FontInfo.iSize * Screen.PixelsPerInch / 72.0); - Fonts := TObjectList(FFontsByName.Objects[I]); + iHeight := -Round(FontInfo.iSize * PixelsPerInch / 72.0); + Fonts := ThtFontList(FFontsByName.Objects[I]); for I := 0 to Fonts.Count - 1 do begin Result := ThtFont(Fonts[I]); @@ -249,7 +272,7 @@ function ThtFontCache.Find(const FontInfo: ThtFontInfo): ThtFont; end; //-- BG ---------------------------------------------------------- 30.01.2011 -- -function ThtFontCache.GetFontLike(var Font: ThtFontInfo): ThtFont; +function ThtFontCache.GetFontLike(var Font: ThtFontInfo; PixelsPerInch: Integer): ThtFont; var SameFont: ThtFont; Save: HFONT; @@ -259,14 +282,11 @@ function ThtFontCache.GetFontLike(var Font: ThtFontInfo): ThtFont; V: Variant; GotTextMetrics: Boolean; begin - SameFont := Find(Font); + SameFont := Find(Font, PixelsPerInch); if SameFont = nil then begin SameFont := ThtFont.Create; - SameFont.Name := htStringToString(Font.iName); - SameFont.Height := -Round(Font.iSize * Screen.PixelsPerInch / 72); - SameFont.Style := Font.iStyle; - SameFont.Charset := Font.iCharSet; + SameFont.Assign(Font, PixelsPerInch); Add(SameFont); GotTextMetrics := False; @@ -324,7 +344,7 @@ function ThtFontCache.GetFontLike(var Font: ThtFontInfo): ThtFont; else if VarIsStr(V) then if V <> 'normal' then begin - Result.CharExtra := Round(StrToLength(V, False, Result.EmSize, Result.EmSize, 0)); + Result.CharExtra := Round(StrToLength(V, False, Result.EmSize, Result.EmSize, 0, PixelsPerInch)); Font.iCharExtra := Result.CharExtra; end; end; diff --git a/Ext/HTMLViewer/Source/HtmlGlobals.pas b/Ext/HTMLViewer/Source/HtmlGlobals.pas index 545348b..372cd5e 100644 --- a/Ext/HTMLViewer/Source/HtmlGlobals.pas +++ b/Ext/HTMLViewer/Source/HtmlGlobals.pas @@ -1,6 +1,6 @@ { -Version 11.9 -Copyright (c) 2008-2018 by HtmlViewer Team +Version 11.10 +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -42,7 +42,7 @@ interface Classes, SysUtils, Graphics, Controls, {$ifdef LCL} LclIntf, LclType, LCLVersion, Types, Messages, - StdCtrls, Buttons, Forms, Base64, Dialogs, Process, + StdCtrls, Buttons, Base64, Dialogs, Process, HtmlMisc, {$ifdef DebugIt} {$message 'HtmlViewer uses LCL standard controls.'} @@ -76,6 +76,7 @@ interface {$endif} {$endif UseTNT} {$endif} + Forms, Clipbrd, Math; @@ -246,6 +247,20 @@ ThtMemo = class({$ifdef UseTNT} TTntMemo {$else} TMemo {$endif}) ThtScrollStyle = TScrollStyle; {$endif} + ThtStyleElement = ( + htseFont, + htseClient, + htseBorder + ); + + ThtThemedColor = function (AColor: TColor; AStyleElement: ThtStyleElement): TColor of object; + + //BG, 05.02.2023: don't add virtual methods or fields. It is only used to access protected stuff of TCustomForm. + ThtCustomForm = class(TCustomForm) + public + property PixelsPerInch; + end; + //BG, 10.12.2010: don't add virtual methods or fields. It is only used to access protected stuff of TCanvas. ThtCanvas = class(TCanvas) public @@ -271,12 +286,12 @@ ThtBitmap = class(TBitmap) procedure SetTransparentMask(AValue: Boolean); protected FMask: TBitmap; - FTransparent: boolean; + FTransparent: Boolean; public constructor Create(WithTransparentMask: Boolean = False); reintroduce; overload; destructor Destroy; override; procedure Assign(Source: TPersistent); override; - procedure Draw(ACanvas: TCanvas; const Rect: TRect); override; + procedure Draw(ACanvas: TCanvas; const DestRect: TRect); override; procedure StretchDraw(ACanvas: TCanvas; const DestRect, SrcRect: TRect); property BitmapMask: TBitmap read GetMask write SetMask; property WithTransparentMask: Boolean read FTransparent write SetTransparentMask; @@ -289,6 +304,7 @@ ThtBitmap = class(TBitmap) FfChar = ThtChar(#12); CrChar = ThtChar(#13); SpcChar = ThtChar(' '); + NbSpcChar = ThtChar(#160); // Unbreakable Space, Unicode value for Html entity   DotChar = ThtChar('.'); LessChar = ThtChar('<'); MinusChar = ThtChar('-'); @@ -500,6 +516,8 @@ function htStringArrayToStr(const StrArray: ThtStringArray; Separator: ThtChar): function htSameStringArray(const A1, A2: ThtStringArray): Boolean; procedure htSortStringArray(A: ThtStringArray); +function htFileExists(const FName: ThtString): Boolean; + //{$ifdef UnitConstsMissing} //const // SOutOfResources = 'Out of system resources'; @@ -525,9 +543,9 @@ function CanPrintAlpha(ADC : HDC) : Boolean; {$ifdef UseInline} inline; {$endif} procedure GetTSize(DC: HDC; P : PWideChar; N : Integer; out VSize : TSize); {$ifdef UseInline} inline; {$endif} -function ThemedColor(const AColor : TColor - {$ifdef has_StyleElements};const AUseThemes : Boolean{$endif} - ): TColor; {$ifdef UseInline} inline; {$endif} //overload; +//function ThemedColor_(const AColor : TColor +// {$ifdef has_StyleElements};const AUseThemes : Boolean{$endif} +// ): TColor; {$ifdef UseInline} inline; {$endif} function TextEndsWith(const SubStr, S : ThtString) : Boolean; {$ifdef UseInline} inline; {$endif} function TextStartsWith(const SubStr, S : ThtString) : Boolean; {$ifdef UseInline} inline; {$endif} @@ -642,33 +660,32 @@ procedure THtMemo.SetMaxLength(const AValue : Integer); end; end; -{$ifdef has_StyleElements} -function ThemedColor(const AColor : TColor; const AUseThemes : Boolean): TColor; {$ifdef UseInline} inline; {$endif} overload; -begin - if AUseThemes and TStyleManager.IsCustomStyleActive then begin - Result := StyleServices.GetSystemColor(AColor); - end else begin - Result := AColor; - end; - Result := ColorToRGB(Result); -end; -{$else} - -function ThemedColor(const AColor : TColor): TColor; - {$ifdef UseInline} inline; {$endif} -begin -{$ifdef UseVCLStyles} - if TStyleManager.IsCustomStyleActive then begin - Result := StyleServices.GetSystemColor(AColor); - end else begin - Result := AColor; - end; - Result := ColorToRGB(Result); -{$else} - Result := ColorToRGB(AColor); -{$endif} -end; -{$endif} +//{$ifdef has_StyleElements} +//function ThemedColor(const AColor : TColor; const AUseThemes : Boolean): TColor; {$ifdef UseInline} inline; {$endif} overload; +//begin +// if AUseThemes and TStyleManager.IsCustomStyleActive then begin +// Result := StyleServices.GetSystemColor(AColor); +// end else begin +// Result := AColor; +// end; +// Result := ColorToRGB(Result); +//end; +//{$else} +//function ThemedColor(const AColor : TColor): TColor; +// {$ifdef UseInline} inline; {$endif} +//begin +//{$ifdef UseVCLStyles} +// if TStyleManager.IsCustomStyleActive then begin +// Result := StyleServices.GetSystemColor(AColor); +// end else begin +// Result := AColor; +// end; +// Result := ColorToRGB(Result); +//{$else} +// Result := ColorToRGB(AColor); +//{$endif} +//end; +//{$endif} procedure GetTSize(DC: HDC; P : PWideChar; N : Integer; out VSize : TSize); {$ifdef UseInline} inline; {$endif} @@ -693,7 +710,7 @@ function Darker(Color : TColor): TColor; {$ifdef UseInline} inline; {$endif} var Red, Green, Blue: Byte; begin - Result := ColorToRGB(Color); //ThemedColor(Color{$ifdef has_StyleElements},AUseThemes{$endif}); + Result := ColorToRGB(Color); Red := DarkerColors[Byte(Result )]; Green := DarkerColors[Byte(Result shr 8)]; Blue := DarkerColors[Byte(Result shr 16)]; @@ -705,7 +722,7 @@ function Lighter(Color : TColor) : TColor; {$ifdef UseInline} inline; {$endif} var Red, Green, Blue: Byte; begin - Result := ColorToRGB(Color); // ThemedColor(Color{$ifdef has_StyleElements},AUseThemes{$endif}); + Result := ColorToRGB(Color); Red := LighterColors[Byte(Result )]; Green := LighterColors[Byte(Result shr 8)]; Blue := LighterColors[Byte(Result shr 16)]; @@ -719,7 +736,7 @@ function FindSpaces(PStart : PWideChar; const ACount : Integer) : Integer; begin Result := 0; for I := 0 to ACount - 2 do {-2 so as not to count end spaces} - if ((PStart + I)^ = ' ') or ((PStart + I)^ = #160) then + if ((PStart + I)^ = SpcChar) or ((PStart + I)^ = NbSpcChar) then Inc(Result); end; @@ -1152,6 +1169,22 @@ function htUpperCase(const Str: ThtString): ThtString; {$endif} end; +//-- BG ---------------------------------------------------------- 26.02.2023 -- +function htFileExists(const FName: ThtString): Boolean; +var + Name: string; +begin + Name := htStringToString(FName); + Result := FileExists(Name); + {$if defined(FPC) and (fpc_fullversion < 3020000)} + // Fix to disable LoadFromFile with folder path #290 (Alexey-T) + // DirectoryExists needed in Laz, because FPC 3.0.4 gets FileExists(s)=True + // for folder. It's changed in FPC 3.2. + if Result then + Result := not DirectoryExists(Name); + {$ifend} +end; + //-- BG ---------------------------------------------------------- 21.08.2011 -- function IsAlpha(Ch: ThtChar): Boolean; {$ifdef UseInline} inline; {$endif} begin @@ -1540,7 +1573,7 @@ procedure ThtBitmap.SetMask(AValue: TBitmap); end; end; -procedure ThtBitmap.Draw(ACanvas: TCanvas; const Rect: TRect); +procedure ThtBitmap.Draw(ACanvas: TCanvas; const DestRect: TRect); {$ifdef LCL} var UseMaskHandle: HBitmap; @@ -1562,7 +1595,7 @@ procedure ThtBitmap.Draw(ACanvas: TCanvas; const Rect: TRect); ACanvas.Changing; DestDC := ACanvas.GetUpdatedHandle([csHandleValid]); StretchMaskBlt( - DestDC, Rect.Left, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, + DestDC, DestRect.Left, DestRect.Top, DestRect.Right - DestRect.Left, DestRect.Bottom - DestRect.Top, SrcDC, 0, 0, Width, Height, UseMaskHandle, 0, 0, ACanvas.CopyMode); ACanvas.Changed; @@ -1575,7 +1608,7 @@ procedure ThtBitmap.Draw(ACanvas: TCanvas; const Rect: TRect); Pt: TPoint; BPP: Integer; begin - with Rect do + with DestRect do begin PaletteNeeded; OldPalette := 0; @@ -1600,14 +1633,25 @@ procedure ThtBitmap.Draw(ACanvas: TCanvas; const Rect: TRect); SetStretchBltMode(ACanvas.Handle, STRETCH_DELETESCANS); try if FTransparent then - TransparentStretchBlt( - ACanvas.Handle, Left, Top, Right - Left, Bottom - Top, - Canvas.Handle, 0, 0, Width, Height, - FMask.Canvas.Handle, 0, 0) {LDB} + begin +{$ifdef Compiler23_Plus} + if TransparentMode = tmFixed then + DrawTransparent( ACanvas, Rect(Left, Top, Right, Bottom), 255 ) + else +{$endif} + TransparentStretchBlt( + ACanvas.Handle, Left, Top, Right - Left, Bottom - Top, + Canvas.Handle, 0, 0, Self.Width, Self.Height, + FMask.Canvas.Handle, 0, 0) {LDB} + end + else if AlphaFormat = afDefined then + begin + inherited; + end else StretchBlt( ACanvas.Handle, Left, Top, Right - Left, Bottom - Top, - Canvas.Handle, 0, 0, Width, Height, + Canvas.Handle, 0, 0, Self.Width, Self.Height, ACanvas.CopyMode); finally if RestorePalette then @@ -1682,6 +1726,10 @@ procedure ThtBitmap.StretchDraw(ACanvas: TCanvas; const DestRect, SrcRect: TRect ACanvas.Handle, Left, Top, Right - Left, Bottom - Top, Canvas.Handle, SrcRect.Left, SrcRect.Top, SrcRect.Right - SrcRect.Left, SrcRect.Bottom - SrcRect.Top, FMask.Canvas.Handle, SrcRect.Left, SrcRect.Top) {LDB} + else if AlphaFormat = afDefined then + begin + inherited; + end else StretchBlt( ACanvas.Handle, Left, Top, Right - Left, Bottom - Top, diff --git a/Ext/HTMLViewer/Source/HtmlImages.pas b/Ext/HTMLViewer/Source/HtmlImages.pas index 10c1ebe..f56fc75 100644 --- a/Ext/HTMLViewer/Source/HtmlImages.pas +++ b/Ext/HTMLViewer/Source/HtmlImages.pas @@ -1,7 +1,7 @@ { -Version 11.9 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin, -Copyright (c) 2008-2018 by HtmlViewer Team +Copyright (c) 2008-2022 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -38,6 +38,9 @@ interface Windows, Jpeg, {$endif} Contnrs, Graphics, Forms, Controls, +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} //Messages, //Variants, Types, @@ -123,12 +126,16 @@ ThtImage = class(ThtCachable) property Animate: Boolean read GetAnimate write SetAnimate; end; +{$ifdef UseGenerics} + ThtImageList = class(TObjectList); +{$else} ThtImageList = class(TObjectList) private function Get(Index: Integer): ThtImage; {$ifdef UseInline} inline; {$endif} public property Items[Index: Integer]: ThtImage read Get; default; end; +{$endif} TGetImageEvent = function(Sender: TObject; const Url: ThtString): ThtImage of object; @@ -845,10 +852,16 @@ function ThtImageLoader.LoadImageFromStream(Stream: TStream; Transparent: ThtIma PngImage := TPngImage.Create; try PngImage.LoadFromStream(Stream); - Result := ThtGraphicImage.Create(PngImage); - except + // As TPngImage cannot paint transparently on MetaFileCanvas in + // TransparencyMode = ptmBit we convert it to a Bitmap. + Bitmap := ThtBitmap.Create(PngImage.TransparencyMode = ptmBit); + Bitmap.Assign(PngImage); + // avoid ConvertImage: + Result := ThtGraphicImage.Create(Bitmap); + Result.Transp := itrIntrinsic; + Bitmap := nil; + finally PngImage.Free; - raise; end; {$else} begin @@ -2604,11 +2617,14 @@ constructor ThtBitmapToInsert.Create(AImage: TBitmap; ATransp: ThtImageTranspare { ThtImageList } +{$ifdef UseGenerics} +{$else} //-- BG ---------------------------------------------------------- 06.10.2016 -- function ThtImageList.Get(Index: Integer): ThtImage; begin Result := inherited Get(Index); end; +{$endif} initialization DefBitMap := TBitmap.Create; @@ -2619,7 +2635,9 @@ initialization DefBitMap.LoadFromLazarusResource('DefaultBitmap'); ErrorBitMap.LoadFromLazarusResource('ErrBitmap'); ErrorBitMapMask.LoadFromLazarusResource('ErrBitmapMask'); +{$ifdef UseHandCursor} Screen.Cursors[HandCursor] := LoadCursorFromLazarusResource('Hand_Cursor'); +{$endif} Screen.Cursors[UpDownCursor] := LoadCursorFromLazarusResource('UPDOWNCURSOR'); Screen.Cursors[UpOnlyCursor] := LoadCursorFromLazarusResource('UPONLYCURSOR'); Screen.Cursors[DownOnlyCursor] := LoadCursorFromLazarusResource('DOWNONLYCURSOR'); @@ -2628,7 +2646,9 @@ initialization DefBitMap.Handle := LoadBitmap(HInstance, MakeIntResource(DefaultBitmap)); ErrorBitMap.Handle := LoadBitmap(HInstance, MakeIntResource(ErrBitmap)); ErrorBitMapMask.Handle := LoadBitmap(HInstance, MakeIntResource(ErrBitmapMask)); +{$ifdef UseHandCursor} Screen.Cursors[HandCursor] := LoadCursor(HInstance, MakeIntResource(Hand_Cursor)); +{$endif} Screen.Cursors[UpDownCursor] := LoadCursor(HInstance, 'UPDOWNCURSOR'); Screen.Cursors[UpOnlyCursor] := LoadCursor(HInstance, 'UPONLYCURSOR'); Screen.Cursors[DownOnlyCursor] := LoadCursor(HInstance, 'DOWNONLYCURSOR'); diff --git a/Ext/HTMLViewer/Source/HtmlPrinter.pas b/Ext/HTMLViewer/Source/HtmlPrinter.pas new file mode 100644 index 0000000..13dae2a --- /dev/null +++ b/Ext/HTMLViewer/Source/HtmlPrinter.pas @@ -0,0 +1,338 @@ +{------------------------------------------------------------------------------- +Version 11.10 +Copyright (C) 2022-2023 by Bernd Gabriel. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +-------------------------------------------------------------------------------} + +{$I htmlcons.inc} + +unit HtmlPrinter; + +interface + +uses +{$ifdef FPC} + RtlConsts, +{$else} + Consts, +{$endif} +{$ifdef MSWINDOWS} + Windows, +{$endif} +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} + SysUtils, Forms, + Classes, Contnrs, Graphics, Printers, + HtmlGlobals; + +type + // BG, 19.02.2022: moved from vwPrint.pas + ThtPrinter = class(TComponent) + private + FOffsetX: Integer; // Physical Printable Area x margin + FOffsetY: Integer; // Physical Printable Area y margin + FPaperHeight: Integer; // Physical Height in device units + FPaperWidth: Integer; // Physical Width in device units + FPgHeight: Integer; // Vertical height in pixels + FPgWidth: Integer; // Horizontal width in pixels + FPPIX: Integer; // Logical pixels per inch in X + FPPIY: Integer; // Logical pixels per inch in Y + FPrinting: Boolean; + FTitle: ThtString; // Printed Document's Title + FAborted: Boolean; + protected + function GetCanvas: TCanvas; virtual; abstract; + function GetPageNum: Integer; virtual; abstract; + procedure CheckPrinting(Value: Boolean); + procedure GetPrinterCapsOf(Printer: TPrinter); + procedure SetPrinting(Value: Boolean); + procedure SetAborted(Value: Boolean); + public + procedure BeginDoc; virtual; abstract; + procedure NewPage; virtual; abstract; + procedure EndDoc; virtual; abstract; + procedure Abort; virtual; abstract; + procedure Assign(Source: TPersistent); override; + property Aborted: Boolean read FAborted; + property Canvas: TCanvas read GetCanvas; + property OffsetX: Integer read FOffsetX; + property OffsetY: Integer read FOffsetY; + property PageNumber: Integer read GetPageNum; + property PageHeight: Integer read FPgHeight; + property PageWidth: Integer read FPgWidth; + property PaperHeight: Integer read FPaperHeight; + property PaperWidth: Integer read FPaperWidth; + property PixelsPerInchX: Integer read FPPIX; + property PixelsPerInchY: Integer read FPPIY; + property Printing: Boolean read FPrinting; // becomes True in BeginDoc and back to False in EndDoc. + property Title: ThtString read FTitle write FTitle; + end; + + TUnits = (unInches, unCentimeters); + TPageEvent = procedure(Sender: TObject; NumPage: Integer; + var StopPrinting: Boolean) of object; + + // BG, 19.02.2022 extracted from TMetafilePrinter + ThtPagePrinter = class(ThtPrinter) + private + FPreviewPixelsPerInch: Integer; + protected +{$ifdef UseGenerics} + FPages: TObjectList; +{$else} + FPages: TObjectList; +{$endif} + FCurCanvas: TCanvas; + FUnits: TUnits; + FConvFac: Double; + FUsedPage: Boolean; + FOnPageEvent: TPageEvent; + + procedure FreePages; + function GetPage(I: integer): TObject; + procedure SetUnits(Val: TUnits); + function GetLastAvailPage: Integer; + + function GetCanvas: TCanvas; override; + function GetPageNum: integer; override; + procedure CreatePage(var NextPage: TObject; var NextCanvas: TCanvas); virtual; abstract; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + // Printer Methods + procedure BeginDoc; override; + procedure NewPage; override; + procedure EndDoc; override; + procedure Abort; override; + + property Pages[I: Integer]: TObject read GetPage; + //property Printing: boolean read FPrinting; + property LastAvailablePage: Integer read GetLastAvailPage; + property PreviewPixelsPerInch: Integer read FPreviewPixelsPerInch write FPreviewPixelsPerInch; + published + property Units: TUnits read FUnits write SetUnits; + property OnPageEvent: TPageEvent read FOnPageEvent write FOnPageEvent; + end; + + +implementation + +const + INCH_TO_CM = 2.54; + +resourcestring + SPrnNotAvail = 'Printer not available'; + +{ ThtPrinter } + +//-- BG ---------------------------------------------------------- 29.01.2012 -- +procedure ThtPrinter.Assign(Source: TPersistent); +var + Src: ThtPrinter absolute Source; +begin + inherited; + if Source is ThtPrinter then + begin + FPPIX := Src.FPPIX; + FPPIY := Src.FPPIY; + FPaperWidth := Src.FPaperWidth; + FPaperHeight := Src.FPaperHeight; + FOffsetX := Src.FOffsetX; + FOffsetY := Src.FOffsetY; + FPgHeight := Src.FPgHeight; + FPgWidth := Src.FPgWidth; + end; +end; + +procedure ThtPrinter.CheckPrinting(Value: Boolean); +begin + if Printing <> Value then + if Value then + EPrinter.Create(SNotPrinting) + else + EPrinter.Create(SPrinting); +end; + +//-- BG ---------------------------------------------------------- 29.01.2012 -- +procedure ThtPrinter.GetPrinterCapsOf(Printer: TPrinter); +begin + if Printer.Printers.Count = 0 then + raise EPrinter.Create(SPrnNotAvail); + +{$ifdef LCL} + FPPIX := Printer.XDPI; + FPPIY := Printer.YDPI; + FPaperWidth := Printer.PaperSize.PaperRect.PhysicalRect.Right; + FPaperHeight := Printer.PaperSize.PaperRect.PhysicalRect.Bottom; + FOffsetX := Printer.PaperSize.PaperRect.WorkRect.Left; + FOffsetY := Printer.PaperSize.PaperRect.WorkRect.Top; + FPgHeight := Printer.PageHeight; + FPgWidth := Printer.PageWidth; +{$else} + FPPIX := GetDeviceCaps(Printer.Handle, LOGPIXELSX); + FPPIY := GetDeviceCaps(Printer.Handle, LOGPIXELSY); + FPaperWidth := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH); + FPaperHeight := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT); + FOffsetX := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX); + FOffsetY := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY); + FPgHeight := Printer.PageHeight; + FPgWidth := Printer.PageWidth; +{$endif} +end; + +procedure ThtPrinter.SetAborted(Value: Boolean); +begin + FAborted := Value; +end; + +procedure ThtPrinter.SetPrinting(Value: Boolean); +begin + FPrinting := Value; +end; + +{ ThtPagePrinter } + +constructor ThtPagePrinter.Create(AOwner: TComponent); +begin + inherited; +{$ifdef UseGenerics} + FPages := TObjectList.Create; +{$else} + FPages := TObjectList.Create; +{$endif} + FUnits := unInches; + FPreviewPixelsPerInch := Screen.PixelsPerInch; +end; + +destructor ThtPagePrinter.Destroy; +begin + FreePages; + FPages.Free; + inherited; +end; + + +procedure ThtPagePrinter.FreePages; +begin + FPages.Clear; + FreeAndNil(FCurCanvas); +end; + +function ThtPagePrinter.GetPage(I: integer): TObject; +begin + Result := FPages[I]; +end; + +procedure ThtPagePrinter.SetUnits(Val: TUnits); +begin + FUnits := Val; + case FUnits of + unInches: FConvFac := 1; + unCentimeters: FConvFac := INCH_TO_CM; + end; +end; + +procedure ThtPagePrinter.BeginDoc; +begin + SetPrinting(True); + FreePages; + + GetPrinterCapsOf(Printer); + + NewPage; +end; + +procedure ThtPagePrinter.EndDoc; +begin + SetPrinting(False); + FreeAndNil(FCurCanvas); + + // in case NewPage was called but nothing drawn on it + if not FUsedPage then + FPages.Delete(FPages.Count - 1); +end; + +procedure ThtPagePrinter.Abort; +begin + SetPrinting(False); + FreeAndNil(FCurCanvas); + FreePages; +end; + +procedure ThtPagePrinter.NewPage; +var + NextPage: TObject; + NextCanvas: TCanvas; + Done: Boolean; +begin + NextPage := nil; + NextCanvas := FCurCanvas; + CreatePage(NextPage, NextCanvas); + + { fill the page with "whiteness" } + + NextCanvas.Brush.Color := clWhite; + NextCanvas.Pen.Color := clWhite; + NextCanvas.Brush.Style := bsSolid; + NextCanvas.Rectangle(0, 0, PaperWidth, PaperHeight); + + NextCanvas.Brush.Style := bsClear; + if FCurCanvas = nil then + begin + NextCanvas.Font.PixelsPerInch := PreviewPixelsPerInch; + NextCanvas.Font.Name := FontSans; + NextCanvas.Font.Size := 10; + FCurCanvas := NextCanvas; + end + else if NextCanvas <> FCurCanvas then + begin + NextCanvas.Font.Assign(FCurCanvas.Font); + FCurCanvas.Free; + FCurCanvas := NextCanvas; + end; + + FPages.Add(NextPage); + FUsedPage := False; + + if Assigned(FOnPageEvent) then + begin + Done := False; + FOnPageEvent(Self, FPages.Count, Done); + end; +end; + +function ThtPagePrinter.GetPageNum: Integer; +begin + Result := FPages.Count; +end; + +function ThtPagePrinter.GetLastAvailPage: Integer; +begin + Result := GetPageNum; +end; + +function ThtPagePrinter.GetCanvas: TCanvas; +begin + Result := FCurCanvas; + FUsedPage := True; +end; + +end. diff --git a/Ext/HTMLViewer/Source/Htmlsbs1.pas b/Ext/HTMLViewer/Source/Htmlsbs1.pas index c9d2ef5..6a0b396 100644 --- a/Ext/HTMLViewer/Source/Htmlsbs1.pas +++ b/Ext/HTMLViewer/Source/Htmlsbs1.pas @@ -1,7 +1,7 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin, -Copyright (c) 2008-2016 by HtmlViewer Team +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -302,6 +302,9 @@ implementation {$ifdef HasSystemUITypes} System.UITypes, {$endif} + {$ifdef UseGenerics} + System.Generics.Collections, + {$endif} SysUtils, Variants, Forms, StdCtrls, Math; destructor TOptionObj.Destroy; @@ -482,18 +485,18 @@ procedure TListBoxFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: integer); ARect := Rect(X1, Y1, X1 + FControl.Width, Y1 + FControl.Height); if FControl.BorderStyle <> bsNone then begin - DrawFormControlRect(Canvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, False, Document.PrintMonoBlack, False, FControl.Color {$ifdef has_StyleElements}, Document.StyleElements{$endif}); + DrawFormControlRect(Canvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, False, Document.PrintMonoBlack, False, FControl.Color, Document.ThemedColorToRGB); Addon := 4; end else begin - FillRectWhite(Canvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, FControl.Color {$ifdef has_StyleElements}, Document.StyleElements{$endif}); + FillRectWhite(Canvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, Document.ThemedColorToRGB(FControl.Color, htseClient)); Addon := 2; end; Canvas.Brush.Style := bsClear; Canvas.Font := FControl.Font; - Canvas.Font.Color := ThemedColor( FControl.Font.Color{$ifdef has_StyleElements}, seFont in Document.StyleElements{$endif}); + Canvas.Font.Color := Document.ThemedColorToRGB( FControl.Font.Color, htseFont); H2 := Abs(Canvas.Font.Height); SetTextAlign(Canvas.Handle, TA_Left + TA_Top); InflateRect(ARect, -Addon, -Addon); @@ -532,7 +535,7 @@ procedure TListBoxFormControlObj.SetHeightWidth(Canvas: TCanvas); with FControl do begin Canvas.Font := Font; - Canvas.Font.Color := ThemedColor( Canvas.Font.Color{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); + Canvas.Font.Color := Document.ThemedColorToRGB( Canvas.Font.Color, htseFont); if LBSize = -1 then LBSize := Max(1, Min(8, TheOptions.Count)); @@ -721,10 +724,10 @@ procedure TComboFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: integer); if IsCopy then begin ARect := Rect(X1, Y1, X1 + FControl.Width, Y1 + FControl.Height); - DrawFormControlRect(Canvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, False, Document.PrintMonoBlack, False, FControl.Color{$ifdef has_StyleElements}, Document.StyleElements{$endif}); + DrawFormControlRect(Canvas, ARect.Left, ARect.Top, ARect.Right, ARect.Bottom, False, Document.PrintMonoBlack, False, FControl.Color, Document.ThemedColorToRGB); Canvas.Brush.Style := bsClear; Canvas.Font := FControl.Font; - Canvas.Font.Color := ThemedColor(FControl.Font.Color{$ifdef has_StyleElements}, seFont in Document.StyleElements{$endif}); + Canvas.Font.Color := Document.ThemedColorToRGB(FControl.Font.Color, htseFont); SetTextAlign(Canvas.Handle, TA_Left + TA_Top); InflateRect(ARect, -4, -4); Inc(ARect.Bottom, 5); @@ -931,12 +934,12 @@ procedure TTextAreaFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: integer); begin if BorderStyle <> bsNone then begin - DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, False, Document.PrintMonoBlack, False, FControl.Color{$ifdef has_StyleElements}, Document.StyleElements{$endif}); + DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, False, Document.PrintMonoBlack, False, FControl.Color, Document.ThemedColorToRGB); Addon := 4; end else begin - FillRectWhite(Canvas, X1, Y1, X1 + Width, Y1 + Height, FControl.Color {$ifdef has_StyleElements}, Document.StyleElements{$endif}); + FillRectWhite(Canvas, X1, Y1, X1 + Width, Y1 + Height, Document.ThemedColorToRGB(FControl.Color, htseClient)); Addon := 2; end; Canvas.Brush.Style := bsClear; @@ -1319,9 +1322,9 @@ procedure TEditFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: Integer); Canvas.Font := Font; H2 := Abs(Font.Height); if BorderStyle <> bsNone then - DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, False, Document.PrintMonoBlack, False, Color{$ifdef has_StyleElements},Document.StyleElements{$endif}) + DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, False, Document.PrintMonoBlack, False, Color, Document.ThemedColorToRGB) else - FillRectWhite(Canvas, X1, Y1, X1 + Width, Y1 + Height, Color {$ifdef has_StyleElements}, Document.StyleElements{$endif}); + FillRectWhite(Canvas, X1, Y1, X1 + Width, Y1 + Height, Document.ThemedColorToRGB( Color, htseClient )); SetTextAlign(Canvas.handle, TA_Left); SetBkMode(Canvas.Handle, {$ifdef FPC}Lcltype.{$endif}Transparent); Canvas.Brush.Style := bsClear; @@ -1523,8 +1526,8 @@ procedure TButtonFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: Integer); begin Canvas.Brush.Style := bsClear; Canvas.Font := Font; - Canvas.Font.Color := ThemedColor(Font.Color{$ifdef has_StyleElements},seFont in Document.StyleElements{$endif}); - DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, True, Document.PrintMonoBlack, False, clWhite{$ifdef has_StyleElements},Document.StyleElements{$endif}); + Canvas.Font.Color := Document.ThemedColorToRGB(Font.Color, htseFont); + DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, True, Document.PrintMonoBlack, False, clWhite, Document.ThemedColorToRGB); H2 := Canvas.TextHeight('A'); SetTextAlign(Canvas.handle, TA_Center + TA_Top); ThtCanvas(Canvas).htTextRect(Rect(X1, Y1, X1 + Width, Y1 + Height), X1 + (Width div 2), Y1 + (Height - H2) div 2, Value); @@ -1633,7 +1636,7 @@ procedure TCheckBoxFormControlObj.DrawInline1(Canvas: TCanvas; X1, Y1: Integer); if IsCopy then with FControl do begin - DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, False, Document.PrintMonoBlack, Disabled, clWhite{$ifdef has_StyleElements},Document.StyleElements{$endif}); + DrawFormControlRect(Canvas, X1, Y1, X1 + Width, Y1 + Height, False, Document.PrintMonoBlack, Disabled, clWhite, Document.ThemedColorToRGB); if Checked then with Canvas do begin diff --git a/Ext/HTMLViewer/Source/MetaFilePrinter.pas b/Ext/HTMLViewer/Source/MetaFilePrinter.pas index 83b908f..669ba68 100644 --- a/Ext/HTMLViewer/Source/MetaFilePrinter.pas +++ b/Ext/HTMLViewer/Source/MetaFilePrinter.pas @@ -1,7 +1,8 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin Copyright (c) 2008-2016 by HtmlViewer Team +Copyright (c) 2016-2022 by Bernd Gabriel *************************************************************** * * @@ -49,7 +50,7 @@ interface {$endif} Classes, Graphics, Printers, SysUtils, Forms, HtmlGlobals, - vwPrint; + HtmlPrinter; type @@ -120,45 +121,15 @@ TMetafileCanvas = class(TCanvas) end; {$endif} - - TUnits = (unInches, unCentimeters); - TPageEvent = procedure(Sender: TObject; NumPage: Integer; - var StopPrinting: Boolean) of object; - - TMetaFilePrinter = class(ThtPrinter) - protected - FPrinting: boolean; - FMFList: TList; - FCurCanvas: TCanvas; - FUnits: TUnits; - FConvFac: double; - FUsedPage: boolean; - FOnPageEvent: TPageEvent; - - procedure FreeMetaFiles; + TMetaFilePrinter = class(ThtPagePrinter) + private function GetMetaFile(I: integer): TMetaFile; - procedure SetUnits(Val: TUnits); - function GetLastAvailPage: integer; - - function GetCanvas: TCanvas; override; - function GetPageNum: integer; override; + protected + procedure CreatePage(var NextPage: TObject; var NextCanvas: TCanvas); override; public - constructor Create(AOwner: TComponent); override; - destructor Destroy; override; - - // Printer Methods - procedure BeginDoc; override; - procedure NewPage; override; - procedure EndDoc; override; - procedure Abort; override; - property MetaFiles[I: integer]: TMetaFile read GetMetaFile; - property Printing: boolean read FPrinting; - property LastAvailablePage: integer read GetLastAvailPage; - published - property Units: TUnits read FUnits write SetUnits; - property OnPageEvent: TPageEvent read FOnPageEvent write FOnPageEvent; end; + {$endif NoMetaFile} implementation @@ -460,136 +431,27 @@ destructor TMetafileCanvas.Destroy; // TMetaFilePrinter -constructor TMetaFilePrinter.Create(AOwner: TComponent); -begin - inherited; - FMFList := TList.Create; - FUnits := unInches; -end; - -destructor TMetaFilePrinter.Destroy; -begin - FreeMetaFiles; - FMFList.Free; - inherited; -end; - - -procedure TMetaFilePrinter.FreeMetaFiles; -var - I: integer; -begin - for I := 0 to FMFList.Count - 1 do - MetaFiles[I].Free; - FMFList.Clear; - FreeAndNil(FCurCanvas); -end; - -function TMetaFilePrinter.GetMetaFile(I: integer): TMetaFile; -begin - Result := FMFList[I]; -end; - -procedure TMetaFilePrinter.SetUnits(Val: TUnits); -begin - FUnits := Val; - case FUnits of - unInches: FConvFac := 1; - unCentimeters: FConvFac := INCH_TO_CM; - end; -end; - -procedure TMetaFilePrinter.BeginDoc; -begin - FPrinting := True; - FreeMetaFiles; - - getPrinterCapsOf(Printer); - - NewPage; -end; - -procedure TMetaFilePrinter.EndDoc; -var - I: integer; -begin - FPrinting := False; - FCurCanvas.Free; - FCurCanvas := nil; - - // in case NewPage was called but nothing drawn on it - if not FUsedPage then - begin - I := FMFList.Count - 1; - MetaFiles[FMFList.Count - 1].Free; - FMFList.Delete(I); - end; - -end; - -procedure TMetaFilePrinter.Abort; -begin - FPrinting := False; - FreeAndNil(FCurCanvas); - FreeMetaFiles; -end; - -procedure TMetaFilePrinter.NewPage; +procedure TMetaFilePrinter.CreatePage(var NextPage: TObject; var NextCanvas: TCanvas); var MetaFile: TMetaFile; - NewCanvas: TCanvas; - Done: boolean; begin + inherited; MetaFile := TMetaFile.Create; - FMFList.Add(MetaFile); + NextPage := MetaFile; {$IFNDEF NoGDIPlus} {$ifndef LCL} - if GDIPlusActive then - NewCanvas := TMetaFileCanvas.Create(MetaFile, Printer.Handle) + if GDIPlusActive then + NextCanvas := TMetaFileCanvas.Create(MetaFile, Printer.Handle) else {$endif LCL} {$ENDIF NoGDIPlus} - NewCanvas := TMetaFileCanvas.Create(MetaFile, 0); - { fill the page with "whiteness" } - NewCanvas.Brush.Color := clWhite; - NewCanvas.Pen.Color := clWhite; - NewCanvas.Brush.Style := bsSolid; - NewCanvas.Rectangle(0, 0, PaperWidth, PaperHeight); - - if FCurCanvas = nil then - begin - NewCanvas.Font.PixelsPerInch := Screen.PixelsPerInch; - NewCanvas.Font.Name := FontSans; - NewCanvas.Font.Size := 10; - NewCanvas.Brush.Style := bsClear; - end; - - FCurCanvas.Free; - FCurCanvas := NewCanvas; - FUsedPage := False; - - if Assigned(FOnPageEvent) then - begin - Done := False; - FOnPageEvent(Self, FMFList.Count, Done); - end; + NextCanvas := TMetaFileCanvas.Create(MetaFile, 0); end; -function TMetaFilePrinter.GetPageNum: integer; -begin - Result := FMFList.Count; -end; - -function TMetaFilePrinter.GetLastAvailPage: integer; -begin - Result := GetPageNum; -end; - -function TMetaFilePrinter.GetCanvas: TCanvas; +function TMetaFilePrinter.GetMetaFile(I: integer): TMetaFile; begin - Result := FCurCanvas; - FUsedPage := True; + Result := Pages[I] as TMetaFile; end; {$endif NoMetaFile} diff --git a/Ext/HTMLViewer/Source/ReadHTML.pas b/Ext/HTMLViewer/Source/ReadHTML.pas index 1bfd415..ff107a7 100644 --- a/Ext/HTMLViewer/Source/ReadHTML.pas +++ b/Ext/HTMLViewer/Source/ReadHTML.pas @@ -1,7 +1,7 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin, -Copyright (c) 2008-2016 by HtmlViewer Team +Copyright (c) 2008-2022 by HtmlViewer Team ********************************************************* * * @@ -148,6 +148,7 @@ THtmlParser = class LinkEvent: TLinkType; MatchMediaQuery: ThtMediaQueryEvent; + FPixelsPerInch: Integer; FUseQuirksMode : Boolean; FPropStack: THtmlPropStack; FNoBreak : Boolean; @@ -210,6 +211,7 @@ THtmlParser = class property BaseTarget: ThtString read FBaseTarget; property Title: ThtString read GetTitle; property UseQuirksMode : Boolean read FUseQuirksMode; + property PixelsPerInch: Integer read FPixelsPerInch; property PropStack: THtmlPropStack read FPropStack; property NoBreak : Boolean read FNoBreak write SetNoBreak; property IsXHTML : Boolean read FIsXHTML write FIsXHTML; @@ -223,6 +225,9 @@ implementation uses {$ifdef Compiler24_Plus} System.Types, +{$endif} +{$ifdef UseGenerics} + System.Generics.Collections, {$endif} HtmlView, FramView, StylePars, URLSubs; @@ -4415,11 +4420,12 @@ procedure THtmlParser.ParseInit(ASectionList: ThtDocument; AIncludeEvent: TInclu begin SectionList := ASectionList; FUseQuirksMode := ASectionList.UseQuirksMode; + FPixelsPerInch := ASectionList.PixelsPerInch; FPropStack.Document := ASectionList; CallingObject := ASectionList.TheOwner; IncludeEvent := AIncludeEvent; FPropStack.Clear; - FPropStack.Add(TProperties.Create(FPropStack,FUseQuirksMode)); + FPropStack.Add(TProperties.Create(FPropStack, FUseQuirksMode, FPixelsPerInch)); FPropStack[0].CopyDefault(FPropStack.Document.Styles.DefProp); FPropStack.SIndex := -1; @@ -4647,7 +4653,7 @@ procedure THtmlParser.ParseFrame(FrameViewer: TFrameViewerBase; FrameSet: TObjec begin SetExit := False; PropStack.Clear; - PropStack.Add(TProperties.Create(FPropStack,FUseQuirksMode)); + PropStack.Add(TProperties.Create(FPropStack, FUseQuirksMode, FPixelsPerInch)); GetCh; {get the reading started} Next; repeat @@ -4737,7 +4743,7 @@ function THtmlParser.IsFrame(FrameViewer: TFrameViewerBase): Boolean; begin Result := False; PropStack.Clear; - PropStack.Add(TProperties.Create(FPropStack, FUseQuirksMode )); + PropStack.Add(TProperties.Create(FPropStack, FUseQuirksMode, FPixelsPerInch)); SetExit := False; GetCh; {get the reading started} Next; @@ -4815,9 +4821,12 @@ function TryShorterEntity(Entity: ThtString; out I: Integer; var Collect: ThtStr if Entities.Find(Entity, I) then begin I := PEntity(Entities.Objects[I]).Value; - Collect := Copy(Collect, J + 1, MaxInt); - Result := True; - Exit; + if I <= 255 then // only these entities may be found without trailing ';' + begin + Collect := Copy(Collect, J + 1, MaxInt); + Result := True; + Exit; + end; end; Dec(J); end; diff --git a/Ext/HTMLViewer/Source/StylePars.pas b/Ext/HTMLViewer/Source/StylePars.pas index 5e5fe5d..d3007e9 100644 --- a/Ext/HTMLViewer/Source/StylePars.pas +++ b/Ext/HTMLViewer/Source/StylePars.pas @@ -538,6 +538,8 @@ procedure THtmlStyleParser.SkipWhiteSpace(WantLfChar: Boolean); function THtmlStyleParser.AddPath(const S: ThtString): ThtString; {for styles, the path is relative to that of the stylesheet directory and must be added now} +var + I: integer; begin Result := ReadUrl(S); {extract the info from url(....) } if (Pos('://', LinkPath) > 0) then {it's TFrameBrowser and URL} @@ -547,9 +549,13 @@ function THtmlStyleParser.AddPath(const S: ThtString): ThtString; end else begin - Result := HTMLToDos(Result); - if not IsAbsolutePath(Result) then - Result := CombineDos(LinkPath, Result); + I := 1; + if not FindSchemeSep(Result, I) or (htLowerCase(Copy(Result, 1, I)) = 'file:') then + begin + Result := HTMLToDos(Result); + if not IsAbsolutePath(Result) then + Result := CombineDos(LinkPath, Result); + end; end; { IMPORTANT!!! @@ -1260,6 +1266,17 @@ procedure GetMediaQueries(const MediaQuery: ThtString; out Queries: ThtMediaQuer GetCh; end; end; + +// '\': +// begin +// if PeekCh <> EofChar then +// begin +// GetCh; +// SetLength(Identifier, Length(Identifier) + 1); +// Identifier[Length(Identifier)] := LCh; +// GetCh; +// end; +// end; end; // loop through all allowed charaters: @@ -1267,6 +1284,14 @@ procedure GetMediaQueries(const MediaQuery: ThtString; out Queries: ThtMediaQuer begin case LCh of 'A'..'Z', 'a'..'z', '0'..'9', '-', '_': ; + +// '\': +// begin +// if PeekCh = EofChar then +// break; +// GetCh; +// end; + else if LCh < #$A0 then break; @@ -1360,7 +1385,6 @@ procedure GetMediaQueries(const MediaQuery: ThtString; out Queries: ThtMediaQuer if not Result then break; NeedsAnd := False; - IsIdentifier := False; SkipWhiteSpace; end; @@ -1424,10 +1448,12 @@ procedure GetMediaQueries(const MediaQuery: ThtString; out Queries: ThtMediaQuer IdentLow := htLowerCase(Identifier); end; - ',', - '{', - '<', - EofChar: +// breaking on any unexpected char avoids endless loop: +// ',', +// '{', +// '<', +// EofChar: + else break; end; until False; @@ -1582,7 +1608,7 @@ procedure THtmlStyleTagParser.DoStyle(Styles: TStyleList; var C: ThtChar; Doc: T 'u': if GetIdentifier(URL) then - if LowerCase(URL) = 'url' then + if htLowerCase(URL) = 'url' then if LCh = '(' then begin GetCh; @@ -1636,7 +1662,7 @@ procedure THtmlStyleTagParser.DoStyle(Styles: TStyleList; var C: ThtChar; Doc: T GetCh; // skip the '@'; if GetIdentifier(AtRule) then begin - AtRule := LowerCase(AtRule); + AtRule := htLowerCase(AtRule); if AtRule = 'media' then DoMedia else if AtRule = 'import' then @@ -1915,7 +1941,7 @@ procedure THtmlStyleTagParser.GetSelectors; until false; if not Ignore then begin - S := FormatContextualSelector(Lowercase(Trim(S)), Sort); + S := FormatContextualSelector(htLowercase(Trim(S)), Sort); Selectors.Add(S); end; if LCh <> ',' then diff --git a/Ext/HTMLViewer/Source/StyleTypes.pas b/Ext/HTMLViewer/Source/StyleTypes.pas index 246a38d..b523f59 100644 --- a/Ext/HTMLViewer/Source/StyleTypes.pas +++ b/Ext/HTMLViewer/Source/StyleTypes.pas @@ -1,8 +1,8 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin Copyright (c) 2008-2010 by HtmlViewer Team -Copyright (c) 2011-2016 by Bernd Gabriel +Copyright (c) 2011-2022 by Bernd Gabriel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -418,9 +418,9 @@ function TryStrToMediaType(const Str: ThtString; out MediaType: ThtMediaType): B function TryStrToMediaFeature(const Str: ThtString; out Feature: ThtMediaFeature; out Oper: ThtMediaOperator): Boolean; function StrToFontName(const Str: ThtString): ThtString; -function StrToFontSize(const Str: ThtString; const FontConvBase: ThtFontConvBase; DefaultFontSize, Base, Default: Double): Double; overload; -function StrToFontSize(const Str: ThtString; const FontConv: ThtFontConv; Base, Default: Double): Double; overload; -function StrToLength(const Str: ThtString; Relative: Boolean; Base, EmBase, Default: Double): Double; +function StrToFontSize(const Str: ThtString; const FontConvBase: ThtFontConvBase; DefaultFontSize, Base, Default: Double; PixelsPerInch: Integer): Double; overload; +function StrToFontSize(const Str: ThtString; const FontConv: ThtFontConv; Base, Default: Double; PixelsPerInch: Integer): Double; overload; +function StrToLength(const Str: ThtString; Relative: Boolean; Base, EmBase, Default: Double; PixelsPerInch: Integer): Double; function TryStrToAlignmentStyle(const Str: ThtString; out AlignmentStyle: ThtAlignmentStyle): Boolean; function TryStrToBoxSizing(const Str: ThtString; out ABoxSizing: ThtBoxSizing): Boolean; @@ -473,14 +473,14 @@ procedure CalcBackgroundLocationAndTiling(const PRec: PtPositionRec; ARect: TRec const // CSS 2.1 defines a fixed ratio between pt and px at 96 dpi: 1px = 0.75pt. // (see http://www.w3.org/TR/2010/WD-CSS2-20101207/syndata.html#value-def-length for details). - HTMLViewerPixelsPerInch = 96.0; // fixed assumption in CSS 2.1 as lots of designs rely on it. +// HTMLViewerPixelsPerInch = 96.0; // fixed assumption in CSS 2.1 as lots of designs rely on it. HTMLViewerPointsPerInch = 72.0; //BG, 16.06.2015: Issue 399: StyleTypes.pas: Code improvement for C++Builder // HTMLViewerPointsPerPixel = HTMLViewerPointsPerInch / HTMLViewerPixelsPerInch; // produces idiotic "static const System::Extended HTMLViewerPointsPerPixel = 7.500000E-01;" // in StyleTypes.hpp which then produces "unused" warnings. // The following declaration produces just another #define: - HTMLViewerPointsPerPixel = 0.75; // HTMLViewerPointsPerInch / HTMLViewerPixelsPerInch; +// HTMLViewerPointsPerPixel = 0.75; // HTMLViewerPointsPerInch / HTMLViewerPixelsPerInch; type ThtLengthUnitInfo = record @@ -499,17 +499,18 @@ ThtLengthUnitInfo = record const CUnitInfo: array [ThtUnit] of ThtLengthUnitInfo = ( - // length units - (Name: ''; Factor: 1.00; Index: 0; IsAbsolute: True), - (Name: 'em'; Factor: 1.00; Index: 0; IsAbsolute: False), - (Name: 'ex'; Factor: 0.50; Index: 0; IsAbsolute: False), - (Name: '%' ; Factor: 0.01; Index: 0; IsAbsolute: False), - (Name: 'pt'; Factor: 0.75; Index: 0; IsAbsolute: True), - (Name: 'px'; Factor: 1.00; Index: 0; IsAbsolute: True), - (Name: 'pc'; Factor: 9.00; Index: 0; IsAbsolute: True), - (Name: 'in'; Factor: HTMLViewerPixelsPerInch ; Index: 0; IsAbsolute: True), - (Name: 'cm'; Factor: HTMLViewerPixelsPerInch / 2.54; Index: 0; IsAbsolute: True), - (Name: 'mm'; Factor: HTMLViewerPixelsPerInch / 25.4; Index: 0; IsAbsolute: True), + // length units. Index = 0: constant Factor, Index = 1: Factor * PixelsPerInch. + (Name: ''; Factor: 1.00 ; Index: 0; IsAbsolute: True), + (Name: 'em'; Factor: 1.00 ; Index: 0; IsAbsolute: False), + (Name: 'ex'; Factor: 0.50 ; Index: 0; IsAbsolute: False), + (Name: '%' ; Factor: 0.01 ; Index: 0; IsAbsolute: False), + (Name: 'pt'; Factor: 1.00 / 72.0; Index: 1; IsAbsolute: True), + (Name: 'px'; Factor: 1.00 ; Index: 0; IsAbsolute: True), + (Name: 'pc'; Factor: 9.00 ; Index: 0; IsAbsolute: True), + (Name: 'in'; Factor: 1.00 ; Index: 1; IsAbsolute: True), + (Name: 'cm'; Factor: 1.00 / 2.54; Index: 1; IsAbsolute: True), + (Name: 'mm'; Factor: 1.00 / 25.4; Index: 1; IsAbsolute: True), + // css font sizes (Name: ''; Factor: 1.00; Index: 3; IsAbsolute: True), (Name: 'smaller'; Factor: 1.00; Index: -1; IsAbsolute: False), @@ -985,7 +986,7 @@ function TryStrToFontSize(const Str: ThtString; out FontSize: ThtFontSize): Bool end; //------------------------------------------------------------------------------ -function StrToLength(const Str: ThtString; Relative: Boolean; Base, EmBase, Default: Double): Double; +function StrToLength(const Str: ThtString; Relative: Boolean; Base, EmBase, Default: Double; PixelsPerInch: Integer): Double; {$ifdef UseInline} inline; {$endif} { Given a length string, return the appropriate pixel value. @@ -1009,18 +1010,22 @@ function StrToLength(const Str: ThtString; Relative: Boolean; Base, EmBase, Defa end else if TryStrToLenthUnit(U, LU) then with CUnitInfo[LU] do + begin + if Index = 1 then + V := V * PixelsPerInch; if IsAbsolute then Result := V * Factor else if LU = luPercent then Result := V * Factor * Base else - Result := V * Factor * EmBase + Result := V * Factor * EmBase; + end else end; end; //------------------------------------------------------------------------------ -function StrToFontSize(const Str: ThtString; const FontConv: ThtFontConv; Base, Default: Double): Double; +function StrToFontSize(const Str: ThtString; const FontConv: ThtFontConv; Base, Default: Double; PixelsPerInch: Integer): Double; {given a font-size ThtString, return the point size} function IncFontSize(Increment: ThtFontSizeIncrement): Double; @@ -1093,10 +1098,14 @@ function StrToFontSize(const Str: ThtString; const FontConv: ThtFontConv; Base, begin if TryStrToLenthUnit(U, LU) then with CUnitInfo[LU] do + begin + if Index = 1 then + V := V * PixelsPerInch; if IsAbsolute then - Result := V * Factor * HTMLViewerPointsPerPixel + Result := V * Factor * HTMLViewerPointsPerInch / PixelsPerInch else Result := V * Factor * Base; + end end else begin @@ -1110,7 +1119,7 @@ function StrToFontSize(const Str: ThtString; const FontConv: ThtFontConv; Base, end; //------------------------------------------------------------------------------ -function StrToFontSize(const Str: ThtString; const FontConvBase: ThtFontConvBase; DefaultFontSize, Base, Default: Double): Double; +function StrToFontSize(const Str: ThtString; const FontConvBase: ThtFontConvBase; DefaultFontSize, Base, Default: Double; PixelsPerInch: Integer): Double; {given a font-size ThtString, return the point size} function IncFontSize(Increment: ThtFontSizeIncrement): Double; @@ -1183,10 +1192,14 @@ function StrToFontSize(const Str: ThtString; const FontConvBase: ThtFontConvBase begin if TryStrToLenthUnit(U, LU) then with CUnitInfo[LU] do + begin + if Index = 1 then + V := V * PixelsPerInch; if IsAbsolute then - Result := V * Factor * HTMLViewerPointsPerPixel + Result := V * Factor * HTMLViewerPointsPerInch / PixelsPerInch else Result := V * Factor * Base; + end; end else begin diff --git a/Ext/HTMLViewer/Source/StyleUn.pas b/Ext/HTMLViewer/Source/StyleUn.pas index 35dbdb5..1276f61 100644 --- a/Ext/HTMLViewer/Source/StyleUn.pas +++ b/Ext/HTMLViewer/Source/StyleUn.pas @@ -1,7 +1,7 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin, -Copyright (c) 2008-2016 by HtmlViewer Team +Copyright (c) 2008-2022 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -37,6 +37,9 @@ interface Windows, {$endif} Classes, Graphics, SysUtils, Math, Forms, Contnrs, Variants, +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} // HtmlBuffer, HtmlFonts, @@ -89,12 +92,13 @@ interface // the below properties are in MarginArrays BackgroundColor, BackgroundImage, BackgroundPosition, BackgroundRepeat, BackgroundAttachment, - piMinHeight, piMinWidth, piMaxHeight, piMaxWidth, BoxSizing, + BoxSizing, MarginTop, MarginRight, MarginBottom, MarginLeft, PaddingTop, PaddingRight, PaddingBottom, PaddingLeft, BorderTopWidth, BorderRightWidth, BorderBottomWidth, BorderLeftWidth, BorderTopColor, BorderRightColor, BorderBottomColor, BorderLeftColor, BorderTopStyle, BorderRightStyle, BorderBottomStyle, BorderLeftStyle, + piMinHeight, piMinWidth, piMaxHeight, piMaxWidth, piWidth, piHeight, piTop, piRight, piBottom, piLeft, BorderSpacingHorz, BorderSpacingVert, //These two are internal // the above properties are in MarginArrays @@ -134,12 +138,13 @@ interface // these properties are in MarginArrays 'background-color', 'background-image', 'background-position', 'background-repeat', 'background-attachment', - 'min-height', 'min-width', 'max-height', 'max-width', 'box-sizing', + 'box-sizing', 'margin-top', 'margin-right', 'margin-bottom', 'margin-left', 'padding-top', 'padding-right', 'padding-bottom', 'padding-left', 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width', 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color', 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style', + 'min-height', 'min-width', 'max-height', 'max-width', 'width', 'height', 'top', 'right', 'bottom', 'left', 'thv-border-spacing-horz', 'thv-border-spacing-vert', //These two are for internal use only @@ -164,7 +169,8 @@ TPropStack = class; TProperties = class private - FDefPointSize : Double; + FDefFontSizeInPt: Double; + FPixelsPerInch: Integer; PropStack: TPropStack; // owner TheFont: ThtFont; InLink: Boolean; @@ -190,8 +196,8 @@ TProperties = class ID: Integer; constructor Create; overload; // for use in style list only - constructor Create(const AUseQuirksMode : Boolean); overload; // for use in style list only - constructor Create(APropStack: TPropStack; const AUseQuirksMode : Boolean); overload; // for use in property stack + constructor Create(const AUseQuirksMode : Boolean; APixelsPerInch: Integer); overload; // for use in style list only + constructor Create(APropStack: TPropStack; const AUseQuirksMode : Boolean; APixelsPerInch: Integer); overload; // for use in property stack constructor CreateCopy(ASource: TProperties); destructor Destroy; override; function Clone: TProperties; virtual; @@ -245,10 +251,11 @@ TProperties = class property Display: ThtDisplayStyle read GetDisplay; property CharSet: TFontCharset read FCharSet write FCharSet; property CodePage: Integer read FCodePage write AssignCodePage; - property DefPointSize : Double read FDefPointSize write FDefPointSize; + property DefPointSize : Double read FDefFontSizeInPt write FDefFontSizeInPt; property EmSize: Integer read GetEmSize; property ExSize: Integer read GetExSize; property Font: ThtFont read GetFont; + property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch; property UseQuirksMode : Boolean read FUseQuirksMode; end; @@ -257,7 +264,8 @@ TStyleList = class(ThtStringList) SeqNo: Integer; FDefProp: TProperties; protected - FDefPointSize : Double; + FDefFontSizeInPt : Double; + FPixelsPerInch: Integer; //this must be protected so that the property can be changed in //a descendant while being read only. FUseQuirksMode : Boolean; @@ -279,15 +287,23 @@ TStyleList = class(ThtStringList) procedure ModifyLinkColor(Pseudo: ThtString; AColor: TColor); property UseQuirksMode : Boolean read FUseQuirksMode write FUseQuirksMode; property DefProp: TProperties read FDefProp; - property DefPointSize : Double read FDefPointSize write FDefPointSize; + property DefPointSize : Double read FDefFontSizeInPt write FDefFontSizeInPt; + property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch; end; +{$ifdef UseGenerics} + TPropStack = class(TObjectList) +{$else} TPropStack = class(TObjectList) private function GetProp(Index: Integer): TProperties; {$ifdef UseInline} inline; {$endif} +{$endif} public function Last: TProperties; {$ifdef UseInline} inline; {$endif} +{$ifdef UseGenerics} +{$else} property Items[Index: Integer]: TProperties read GetProp; default; +{$endif} end; type @@ -319,15 +335,15 @@ function IsAuto(const Value: Variant): Boolean; {$ifdef UseInline} inline; {$end function VarIsIntNull(const Value: Variant): Boolean; {$ifdef UseInline} inline; {$endif} function VarIsAuto(const Value: Variant): Boolean; {$ifdef UseInline} inline; {$endif} -function VMargToMarg(const Value: Variant; Relative: Boolean; Base, EmSize, ExSize, Default: Integer): Integer; +function VMargToMarg(const Value: Variant; Relative: Boolean; Base, EmSize, ExSize, Default, PixelsPerInch: Integer): Integer; function ConvData(BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth: Integer; AutoCount: Integer = 0): ThtConvData; -procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvData: ThtConvData; var M: ThtMarginArray); +procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvData: ThtConvData; var M: ThtMarginArray; PixelsPerInch: Integer); -procedure ConvInlineMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth: Integer; {BStyle: ThtBorderStyle;} out M: ThtMarginArray); -procedure ConvMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth: Integer; out AutoCount: Integer; var M: ThtMarginArray); -procedure ConvMargArrayForCellPadding(const VM: ThtVMarginArray; EmSize, ExSize: Integer; var M: ThtMarginArray); -procedure ConvVertMargins(const VM: ThtVMarginArray; var CD: ThtConvData; var M: ThtMarginArray); +procedure ConvInlineMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth: Integer; {BStyle: ThtBorderStyle;} out M: ThtMarginArray; PixelsPerInch: Integer); +procedure ConvMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth: Integer; out AutoCount: Integer; var M: ThtMarginArray; PixelsPerInch: Integer); +procedure ConvMargArrayForCellPadding(const VM: ThtVMarginArray; EmSize, ExSize: Integer; var M: ThtMarginArray; PixelsPerInch: Integer); +procedure ConvVertMargins(const VM: ThtVMarginArray; var CD: ThtConvData; var M: ThtMarginArray; PixelsPerInch: Integer); function OpacityFromStr(S : ThtString) : Byte; @@ -355,8 +371,8 @@ procedure ApplyBoxSettings(var AMarg : ThtMarginArray; const AUseQuirksMode : Bo //here for inlining function SkipWhiteSpace(const S: ThtString; I, L: Integer): Integer; -function FontSizeConv(const Str: ThtString; OldSize, DefPointSize: Double; const AUseQuirksMode : Boolean): Double; -function LengthConv(const Str: ThtString; Relative: Boolean; Base, EmSize, ExSize, Default: Integer): Integer; +function FontSizeConv(const Str: ThtString; OldSize, DefFontSizeInPt: Double; PixelsPerInch: Integer; const AUseQuirksMode : Boolean): Double; +function LengthConv(const Str: ThtString; Relative: Boolean; Base, EmSize, ExSize, Default, PixelsPerInch: Integer): Integer; procedure CalcAutoMinMaxConstraints(W, H, MinW, MaxW, MinH, MaxH: Integer; out ResW, ResH: Integer); @@ -790,17 +806,19 @@ constructor TProperties.Create; end; //-- BG ---------------------------------------------------------- 12.09.2010 -- -constructor TProperties.Create(APropStack: TPropStack; const AUseQuirksMode : Boolean); +constructor TProperties.Create(APropStack: TPropStack; const AUseQuirksMode : Boolean; APixelsPerInch: Integer); begin Create; Self.PropStack := APropStack; FUseQuirksMode := AUseQuirksMode; + FPixelsPerInch := APixelsPerInch; end; -constructor TProperties.Create(const AUseQuirksMode : Boolean); +constructor TProperties.Create(const AUseQuirksMode : Boolean; APixelsPerInch: Integer); begin Create; FUseQuirksMode := AUseQuirksMode; + FPixelsPerInch := APixelsPerInch; end; //-- BG ---------------------------------------------------------- 21.10.2016 -- @@ -816,23 +834,24 @@ function TProperties.Clone: TProperties; //-- BG ---------------------------------------------------------- 20.01.2013 -- constructor TProperties.CreateCopy(ASource: TProperties); begin - FDefPointSize := ASource.DefPointSize; - PropStack := ASource.PropStack ; - InLink := ASource.InLink ; - DefFontname := ASource.DefFontname ; - FUseQuirksMode := ASource.FUseQuirksMode; - PropTag := ASource.PropTag ; - PropClass := ASource.PropClass ; - PropID := ASource.PropID ; - PropPseudo := ASource.PropPseudo ; - PropTitle := ASource.PropTitle ; - PropStyle := ASource.PropStyle ; - FontBG := ASource.FontBG ; - FCharSet := ASource.FCharSet ; - FCodePage := ASource.FCodePage ; - Props := ASource.Props ; - Originals := ASource.Originals ; - ID := ASource.ID ; + FDefFontSizeInPt := ASource.FDefFontSizeInPt; + FPixelsPerInch := ASource.FPixelsPerInch ; + PropStack := ASource.PropStack ; + InLink := ASource.InLink ; + DefFontname := ASource.DefFontname ; + FUseQuirksMode := ASource.FUseQuirksMode ; + PropTag := ASource.PropTag ; + PropClass := ASource.PropClass ; + PropID := ASource.PropID ; + PropPseudo := ASource.PropPseudo ; + PropTitle := ASource.PropTitle ; + PropStyle := ASource.PropStyle ; + FontBG := ASource.FontBG ; + FCharSet := ASource.FCharSet ; + FCodePage := ASource.FCodePage ; + Props := ASource.Props ; + Originals := ASource.Originals ; + ID := ASource.ID ; if ASource.FIArray <> nil then begin FIArray := TFontInfoArray.Create; @@ -863,7 +882,7 @@ procedure TProperties.Copy(Source: TProperties); CodeSiteLogging.CodeSite.AddSeparator; StyleUn.LogProperties(Source,'Source'); {$ENDIF} - FDefPointSize := Source.DefPointSize; + FDefFontSizeInPt := Source.FDefFontSizeInPt; for I := Low(I) to High(I) do Props[I] := Source.Props[I]; {$IFDEF JPM_DEBUGGING_STYLES} @@ -888,7 +907,7 @@ procedure TProperties.CopyDefault(Source: TProperties); Props[I] := Source.Props[I]; CodePage := Source.CodePage; DefFontname := Source.DefFontname; - FDefPointSize := Source.DefPointSize; + FDefFontSizeInPt := Source.FDefFontSizeInPt; PropTag := 'default'; {$IFDEF JPM_DEBUGGING_STYLES} CodeSiteLogging.CodeSite.AddSeparator; @@ -1193,7 +1212,7 @@ procedure TProperties.GetBackgroundPos(EmSize, ExSize: Integer; out P: PtPositio end; if PXY.PosType in [bpDim, bpPercent] then begin - PXY.Value := LengthConv(S[I], False, 100, EmSize, ExSize, 0); + PXY.Value := LengthConv(S[I], False, 100, EmSize, ExSize, 0, PixelsPerInch); end; Inc(I); Inc(XY); @@ -1386,7 +1405,7 @@ function TProperties.GetLineHeight(NewHeight: Integer): Integer; Result := Round(V * NewHeight) else {note: 'normal' yields -1 in the next statement} - Result := LengthConv(Props[LineHeight], True, EmSize, EmSize, ExSize, -1); + Result := LengthConv(Props[LineHeight], True, EmSize, EmSize, ExSize, -1, PixelsPerInch); end else Result := -1; @@ -1403,10 +1422,10 @@ function TProperties.GetTextIndent(out PC: Boolean): Integer; if I > 0 then begin PC := True; {return value in percent} - Result := LengthConv(Props[TextIndent], True, 100, 0, 0, 0); + Result := LengthConv(Props[TextIndent], True, 100, 0, 0, 0, PixelsPerInch); end else - Result := LengthConv(Props[TextIndent], False, 0, EmSize, EmSize, 0); + Result := LengthConv(Props[TextIndent], False, 0, EmSize, EmSize, 0, PixelsPerInch); end else Result := 0; @@ -1533,7 +1552,7 @@ function TProperties.GetBorderSpacingHorz: Integer; Result := Round(V) else {note: 'normal' yields -1 in the next statement} - Result := LengthConv(Props[BorderSpacingHorz], True, EmSize, EmSize, ExSize, -1); + Result := LengthConv(Props[BorderSpacingHorz], True, EmSize, EmSize, ExSize, -1, PixelsPerInch); end else Result := -1; @@ -1552,7 +1571,7 @@ function TProperties.GetBorderSpacingVert: Integer; Result := Round(V) else {note: 'normal' yields -1 in the next statement} - Result := LengthConv(Props[BorderSpacingVert], True, EmSize, EmSize, ExSize, -1); + Result := LengthConv(Props[BorderSpacingVert], True, EmSize, EmSize, ExSize, -1, PixelsPerInch); end else Result := -1; @@ -1597,7 +1616,7 @@ function TProperties.ShowEmptyCells: Boolean; {$endif} end; -procedure ConvVertMargins(const VM: ThtVMarginArray; var CD: ThtConvData; var M: ThtMarginArray); +procedure ConvVertMargins(const VM: ThtVMarginArray; var CD: ThtConvData; var M: ThtMarginArray; PixelsPerInch: Integer); begin {$IFDEF JPM_DEBUGGING_STYLES} CodeSiteLogging.CodeSite.EnterMethod('ConvVertMargins'); @@ -1607,15 +1626,15 @@ procedure ConvVertMargins(const VM: ThtVMarginArray; var CD: ThtConvData; var M: StyleUn.LogTVMarginArray(VM,'VM'); {$ENDIF} - ConvMargProp(PaddingTop, VM, CD, M); - ConvMargProp(BorderTopWidth, VM, CD, M); - ConvMargProp(MarginTop, VM, CD, M); - ConvMargProp(piHeight, VM, CD, M); - ConvMargProp(piMinHeight, VM, CD, M); - ConvMargProp(piMaxHeight, VM, CD, M); - ConvMargProp(MarginBottom, VM, CD, M); - ConvMargProp(BorderBottomWidth, VM, CD, M); - ConvMargProp(PaddingBottom, VM, CD, M); + ConvMargProp( PaddingTop , VM, CD, M, PixelsPerInch); + ConvMargProp( BorderTopWidth , VM, CD, M, PixelsPerInch); + ConvMargProp( MarginTop , VM, CD, M, PixelsPerInch); + ConvMargProp( piHeight , VM, CD, M, PixelsPerInch); + ConvMargProp( piMinHeight , VM, CD, M, PixelsPerInch); + ConvMargProp( piMaxHeight , VM, CD, M, PixelsPerInch); + ConvMargProp( MarginBottom , VM, CD, M, PixelsPerInch); + ConvMargProp( BorderBottomWidth , VM, CD, M, PixelsPerInch); + ConvMargProp( PaddingBottom , VM, CD, M, PixelsPerInch); {$IFDEF JPM_DEBUGGING_STYLES} CodeSiteLogging.CodeSite.AddSeparator; @@ -1643,15 +1662,20 @@ function VarIsIntNull(const Value: Variant): Boolean; function VarIsAuto(const Value: Variant): Boolean; {$ifdef UseInline} inline; {$endif} begin - Result := (VarType(Value) in varInt) and (Value = Auto); + if VarType(Value) in varInt then + Result := Value = Auto + else if VarIsStr(Value) then + Result := Value = 'auto' + else + Result := False; end; //-- BG ---------------------------------------------------------- 05.10.2010 -- -function VMargToMarg(const Value: Variant; Relative: Boolean; Base, EmSize, ExSize, Default: Integer): Integer; +function VMargToMarg(const Value: Variant; Relative: Boolean; Base, EmSize, ExSize, Default: Integer; PixelsPerInch: Integer): Integer; {$ifdef UseInline} inline; {$endif} begin if VarIsStr(Value) then - Result := LengthConv(Value, Relative, Base, EmSize, ExSize, Default) + Result := LengthConv(Value, Relative, Base, EmSize, ExSize, Default, PixelsPerInch) else if (VarType(Value) in varInt) and (Value <> IntNull) then Result := Value else @@ -1747,7 +1771,7 @@ function ConvData( end; //-- BG ---------------------------------------------------------- 16.05.2014 -- -procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvData: ThtConvData; var M: ThtMarginArray); +procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvData: ThtConvData; var M: ThtMarginArray; PixelsPerInch: Integer); function Base(I: ThtPropIndices): Integer; begin @@ -1799,7 +1823,7 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat else if VM[I] = 'thick' then M[I] := 6 else - M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, BorderWidth); {Auto will be 4} + M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, BorderWidth, PixelsPerInch); {Auto will be 4} end else if (VarType(VM[I]) in varInt) then begin @@ -1811,12 +1835,11 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat end; end; - piMinHeight, piMaxHeight, - piHeight: + piMinHeight, piMaxHeight: begin if VarIsStr(VM[I]) then begin - M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, 0); {Auto will be 0} + M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, 0, PixelsPerInch); {Auto will be 0} if Pos('%', VM[I]) > 0 then {include border in % heights} M[I] := M[I] - M[BorderTopWidth] - M[BorderBottomWidth] - M[PaddingTop] - M[PaddingBottom]; end @@ -1831,11 +1854,30 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat M[I] := 0; end; + piHeight: + begin + if VarIsStr(VM[I]) then + begin + M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, Auto, PixelsPerInch); {Auto will be Auto} + if Pos('%', VM[I]) > 0 then {include border in % heights} + M[I] := M[I] - M[BorderTopWidth] - M[BorderBottomWidth] - M[PaddingTop] - M[PaddingBottom]; + end + else if VarType(VM[I]) in varInt then + begin + if VM[I] = IntNull then + M[I] := 0 + else + M[I] := VM[I]; + end + else + M[I] := Auto; + end; + PaddingTop..PaddingLeft,BorderSpacingHorz,BorderSpacingVert: begin if VarIsStr(VM[I]) then begin - M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, 0); {Auto will be 0} + M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, 0, PixelsPerInch); {Auto will be 0} end else if VarType(VM[I]) in varInt then begin @@ -1851,7 +1893,7 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat piTop..piLeft: begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, Auto) {Auto will be Auto} + M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, Auto, PixelsPerInch) {Auto will be Auto} else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -1881,7 +1923,7 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat Inc(AutoCount); end else - M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, 0); + M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, 0, PixelsPerInch); end else if VarType(VM[I]) in varInt then begin @@ -1897,7 +1939,7 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat MarginTop, MarginBottom: begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, BaseHeight, EmSize, ExSize, 0) {Auto will be 0} + M[I] := LengthConv(VM[I], False, BaseHeight, EmSize, ExSize, 0, PixelsPerInch) {Auto will be 0} else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -1918,7 +1960,11 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat piMaxWidth: begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, Auto) + begin + M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, Auto, PixelsPerInch); + if Pos('%', VM[I]) > 0 then {include border in % heights} + M[I] := M[I] - M[BorderLeftWidth] - M[BorderRightWidth] - M[PaddingLeft] - M[PaddingRight]; + end else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -1933,7 +1979,16 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat piWidth: begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, Auto) + begin + if VM[I] = 'auto' then + M[I] := Auto + else + begin + M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, Auto, PixelsPerInch); + if Pos('%', VM[I]) > 0 then {include border in % heights} + M[I] := M[I] - M[BorderLeftWidth] - M[BorderRightWidth] - M[PaddingLeft] - M[PaddingRight]; + end; + end else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -1949,7 +2004,7 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat else begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, 0) + M[I] := LengthConv(VM[I], False, Base(I), EmSize, ExSize, 0, PixelsPerInch) else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -1965,7 +2020,7 @@ procedure ConvMargProp(I: ThtPropIndices; const VM: ThtVMarginArray; var ConvDat end; procedure ConvMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize, ExSize: Integer; - BorderWidth: Integer; out AutoCount: Integer; var M: ThtMarginArray); + BorderWidth: Integer; out AutoCount: Integer; var M: ThtMarginArray; PixelsPerInch: Integer); {This routine does not do MarginTop and MarginBottom as they are done by ConvVertMargins} var I: ThtPropIndices; @@ -1990,7 +2045,7 @@ procedure ConvMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize CD := ConvData(BaseWidth, BaseHeight, EmSize, ExSize, BorderWidth); for I := Low(VM) to High(VM) do if not (I in [MarginTop, MarginBottom]) then - ConvMargProp(I, VM, CD, M); + ConvMargProp(I, VM, CD, M, PixelsPerInch); AutoCount := CD.AutoCount; {count of 'auto's in width items} {$IFDEF JPM_DEBUGGING_CONV} @@ -2003,7 +2058,7 @@ procedure ConvMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize end; procedure ConvMargArrayForCellPadding(const VM: ThtVMarginArray; EmSize, - ExSize: Integer; var M: ThtMarginArray); + ExSize: Integer; var M: ThtMarginArray; PixelsPerInch: Integer); {Return negative for no entry or percent entry} var I: ThtPropIndices; @@ -2017,7 +2072,7 @@ procedure ConvMargArrayForCellPadding(const VM: ThtVMarginArray; EmSize, {$ENDIF} for I := PaddingTop to PaddingLeft do if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, -100, EmSize, ExSize, 0) {Auto will be 0} + M[I] := LengthConv(VM[I], False, -100, EmSize, ExSize, 0, PixelsPerInch) {Auto will be 0} else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -2037,7 +2092,7 @@ procedure ConvMargArrayForCellPadding(const VM: ThtVMarginArray; EmSize, {----------------ConvInlineMargArray} procedure ConvInlineMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, EmSize, - ExSize, BorderWidth: Integer; {BStyle: ThtBorderStyle;} out M: ThtMarginArray); + ExSize, BorderWidth: Integer; {BStyle: ThtBorderStyle;} out M: ThtMarginArray; PixelsPerInch: Integer); {$ifdef UseInline} inline; {$endif} {currently for images, form controls. BaseWidth/Height and BStyle currently not supported} var @@ -2058,7 +2113,7 @@ procedure ConvInlineMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, piHeight, piWidth: begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, Auto) {Auto will be Auto} + M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, Auto, PixelsPerInch) {Auto will be Auto} else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -2074,7 +2129,7 @@ procedure ConvInlineMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, MarginLeft, MarginRight, MarginTop, MarginBottom: begin if VarIsStr(VM[I]) then - M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, 0) {auto is 0} + M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, 0, PixelsPerInch) {auto is 0} else if VarType(VM[I]) in varInt then begin if VM[I] = IntNull then @@ -2101,7 +2156,7 @@ procedure ConvInlineMargArray(const VM: ThtVMarginArray; BaseWidth, BaseHeight, else if VM[I] = 'thick' then M[I] := 6 else - M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, BorderWidth); {Auto will be BorderWidth} + M[I] := LengthConv(VM[I], False, BaseWidth, EmSize, ExSize, BorderWidth, PixelsPerInch); {Auto will be BorderWidth} end else if (VarType(VM[I]) in varInt) then begin @@ -2318,7 +2373,7 @@ procedure TProperties.Combine(Styles: TStyleList; Sym: TElemSymb; end; FontSize: - iSize := FontSizeConv(Props[Index], iSize, DefPointSize, FUseQuirksMode); + iSize := FontSizeConv(Props[Index], iSize, DefPointSize, PixelsPerInch, FUseQuirksMode); Color: iColor := Props[Index]; @@ -2684,7 +2739,7 @@ procedure TProperties.Combine(Styles: TStyleList; Sym: TElemSymb; MergeItems('::' + Pseudo, True); {default Pseudo definition} if not (VarType(Props[FontSize]) in varNum) then {if still a ThtString, hasn't been converted} - Props[FontSize] := FontSizeConv(Props[FontSize], OldSize, FDefPointSize, FUseQuirksMode); + Props[FontSize] := FontSizeConv(Props[FontSize], OldSize, FDefFontSizeInPt, PixelsPerInch, FUseQuirksMode); end; var @@ -2731,7 +2786,7 @@ function TProperties.GetFont: ThtFont; if TheFont = nil then begin GetSingleFontInfo(Font); - TheFont := AllMyFonts.GetFontLike(Font); + TheFont := AllMyFonts.GetFontLike(Font, PixelsPerInch); end; Result := TheFont; end; @@ -2919,7 +2974,7 @@ procedure TProperties.CalcLinkFontInfo(Styles: TStyleList; I: Integer); procedure InsertNewProp(N: Integer; const Pseudo: ThtString); begin - PropStack.Insert(N, TProperties.Create(PropStack,FUseQuirksMode)); + PropStack.Insert(N, TProperties.Create(PropStack, FUseQuirksMode, FPixelsPerInch)); PropStack[N].Inherit('', PropStack[N - 1]); PropStack[N].Combine(Styles, PropSym, PropTag, PropClass, PropID, Pseudo, PropTitle, PropStyle, nil {PropAttr}, N - 1); end; @@ -3212,8 +3267,8 @@ procedure TStyleList.AddModifyProp(const Selector, Prop, Value: ThtString; IsImp if not Find(Selector, I) then begin NewProp := True; - Propty := TProperties.Create(); {newly created property} - Propty.DefPointSize := FDefPointSize; + Propty := TProperties.Create(UseQuirksMode, PixelsPerInch); {newly created property} + Propty.DefPointSize := FDefFontSizeInPt; end else begin @@ -3260,12 +3315,12 @@ function TStyleList.AddObject(const S: ThtString; AObject: TObject): Integer; begin Result := inherited AddObject(S, AObject); TProperties(AObject).PropTag := S; - TProperties(AObject).FDefPointSize := DefPointSize; + TProperties(AObject).FDefFontSizeInPt := DefPointSize; end; function TStyleList.AddDuplicate(const Tag: ThtString; Prop: TProperties): TProperties; begin - Result := TProperties.Create(Prop.PropStack,FUseQuirksMode); + Result := TProperties.Create(Prop.PropStack, FUseQuirksMode, FPixelsPerInch); Result.Copy(Prop); AddObject(Tag, Result); end; @@ -3292,13 +3347,12 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz HIndex: Integer; Properties: TProperties; J: ListTypes; - //F: Double; begin Clear; DefPointSize := PointSize; - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.DefFontname := FontName; Properties.Props[FontFamily] := FontName; Properties.Props[FontSize] := PointSize; @@ -3324,7 +3378,7 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz FDefProp := Properties; if UseQuirksMode then begin - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontSize] := PointSize * 1.0; Properties.Props[FontStyle] := 'none'; Properties.Props[FontWeight] := 'normal'; @@ -3336,7 +3390,7 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz Properties.Props[FontWeight] := 'bold'; end; - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[Color] := AHotSpot or PalRelative; if LinkUnderline then Properties.Props[TextDecoration] := 'underline' @@ -3344,18 +3398,18 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz Properties.Props[TextDecoration] := 'none'; AddObject('::link', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[Color] := AVisitedColor or PalRelative; AddObject('::visited', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[Color] := AActiveColor or PalRelative; AddObject('::hover', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); AddObject('null', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontFamily] := PreFontName; Properties.Props[FontSize] := PointSize * 10.0 / 12.0; Properties.Props[FontStyle] := 'none'; @@ -3364,18 +3418,18 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz Properties.Props[piWhiteSpace] := 'pre'; AddObject('pre', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[MarginTop] := AutoParagraph; Properties.Props[MarginBottom] := AutoParagraph; AddObject('p', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[MarginTop] := 0; AddObject('p 11pre', Properties); for J := Low(ListTypes) to High(ListTypes) do begin - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); case J of ol, ul, menu, dir: begin @@ -3412,7 +3466,7 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz AddObject(ListStr[J], Properties); end; - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontFamily] := PrefontName; Properties.Props[FontSize] := '0.83em'; {10.0 / 12.0;} AddObject('code', Properties); @@ -3420,36 +3474,36 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz AddDuplicate('kbd', Properties); AddDuplicate('samp', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontWeight] := 'bold'; AddObject('b', Properties); AddDuplicate('strong', Properties); if UseQuirksMode = False then begin AddDuplicate('th', Properties); - Properties := TProperties.Create; + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[TextAlign] := 'none'; AddObject('table', Properties); end; - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontSize] := '0.83em'; Properties.Props[VerticalAlign] := 'super'; AddObject('sup', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontSize] := '0.83em'; Properties.Props[VerticalAlign] := 'sub'; AddObject('sub', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontSize] := '1.17em'; AddObject('big', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontSize] := '0.83em'; AddObject('small', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontStyle] := 'italic'; AddObject('i', Properties); AddDuplicate('em', Properties); @@ -3459,23 +3513,23 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz AddDuplicate('address', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[TextDecoration] := 'underline'; AddObject('u', Properties); AddDuplicate('ins',Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[TextDecoration] := 'line-through'; AddObject('s', Properties); AddDuplicate('strike', Properties); AddDuplicate('del',Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[TextAlign] := 'center'; AddObject('center', Properties); AddDuplicate('caption', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontFamily] := 'Arial Unicode MS, Arial'; Properties.Props[FontSize] := '10pt'; Properties.Props[FontStyle] := 'none'; @@ -3492,7 +3546,7 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz else Properties.Props[FontFamily] := PreFontName; - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[MarginLeft] := 0; Properties.Props[MarginRight] := 0; Properties.Props[MarginTop] := 10; @@ -3501,34 +3555,35 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz for HIndex := 1 to 6 do begin - Properties := TProperties.Create(UseQuirksMode); - //F := PointSize / 12.0; + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); case HIndex of 1: Properties.Props[FontSize] := '2em'; 2: Properties.Props[FontSize] := '1.5em'; 3: Properties.Props[FontSize] := '1.17em'; - else - Properties.Props[FontSize] := '1em'; + 4: Properties.Props[FontSize] := '1em'; + 5: Properties.Props[FontSize] := '0.83em'; + 6: Properties.Props[FontSize] := '0.75em'; end; case HIndex of - 4: Properties.Props[MarginTop] := '1.67em'; + 1: Properties.Props[MarginTop] := '0.67em'; + 2: Properties.Props[MarginTop] := '0.75em'; + 3: Properties.Props[MarginTop] := '0.83em'; + 4: Properties.Props[MarginTop] := '1.12em'; 5: Properties.Props[MarginTop] := '1.5em'; - 6: Properties.Props[MarginTop] := '1.12em'; - else - Properties.Props[MarginTop] := 19; + 6: Properties.Props[MarginTop] := '1.67em'; end; Properties.Props[MarginBottom] := Properties.Props[MarginTop]; Properties.Props[FontWeight] := 'bolder'; AddObject( htString('h' + IntToStr(HIndex)), Properties); end; - Properties := TProperties.Create; + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[FontStyle] := 'none'; Properties.Props[BackgroundColor] := $00FFFF; Properties.Props[Color] := $000000; AddObject('mark', Properties); - Properties := TProperties.Create(UseQuirksMode); + Properties := TProperties.Create(UseQuirksMode, PixelsPerInch); Properties.Props[ StyleUn.BorderBottomStyle ] := 'dotted'; Properties.Props[ StyleUn.BorderBottomWidth ] := '1px'; AddObject('abbr', Properties); @@ -3537,14 +3592,17 @@ procedure TStyleList.Initialize(const FontName, PreFontName: ThtString; PointSiz { TPropStack } +{$ifdef UseGenerics} +{$else} function TPropStack.GetProp(Index: Integer): TProperties; begin Result := Get(Index); //TProperties(inherited Items[Index]); end; +{$endif} function TPropStack.Last: TProperties; begin - Result := Get(Count - 1); + Result := TProperties(inherited Items[Count - 1]); end; const @@ -3970,8 +4028,7 @@ function IncFontSize(OldSize: Double; Increment: ThtFontSizeIncrement): Double; Result := OldSize * FontConv[NewIndex] / FontConv[OldIndex]; end; -function FontSizeConv(const Str: ThtString; OldSize, DefPointSize : Double; const AUseQuirksMode : Boolean): Double; - {$ifdef UseInline} inline; {$endif} +function FontSizeConv(const Str: ThtString; OldSize, DefFontSizeInPt: Double; PixelsPerInch: Integer; const AUseQuirksMode : Boolean): Double; {given a font-size ThtString, return the point size} var V: extended; @@ -3989,7 +4046,7 @@ function FontSizeConv(const Str: ThtString; OldSize, DefPointSize : Double; cons else if U = 'pt' then Result := V else if U = 'px' then - Result := V * 72.0 / Screen.PixelsPerInch + Result := V * 72.0 / PixelsPerInch else if U = 'pc' then Result := V * 12.0 else if U = 'em' then @@ -3999,18 +4056,19 @@ function FontSizeConv(const Str: ThtString; OldSize, DefPointSize : Double; cons else if U = '%' then Result := V * OldSize * f_pc else if U = '' then - Result := V * 72.0 / Screen.PixelsPerInch {pixels by default} + Result := V * 72.0 / PixelsPerInch {pixels by default} else - Result := DefPointSize; {error, return 12pt} + Result := DefFontSizeInPt; {error, return 12pt} end else begin U := Str; - if AUseQuirksMode then begin - i := 1; - end else begin + + if AUseQuirksMode then + i := 1 + else i := 0; - end; + if U = 'smaller' then Result := IncFontSize(OldSize, -1) // CSS1: 0.75 * OldSize else if U = 'larger' then @@ -4030,13 +4088,13 @@ function FontSizeConv(const Str: ThtString; OldSize, DefPointSize : Double; cons else if U = 'xx-large' then Result := FontConv[6] else - Result := DefPointSize; + Result := DefFontSizeInPt; end; end; {----------------LengthConv} -function LengthConv(const Str: ThtString; Relative: Boolean; Base, EmSize, ExSize, Default: Integer): Integer; +function LengthConv(const Str: ThtString; Relative: Boolean; Base, EmSize, ExSize, Default, PixelsPerInch: Integer): Integer; {$ifdef UseInline} inline; {$endif} {given a length ThtString, return the appropriate pixel value. Base is the base value for percentage. EmSize, ExSize for units relative to the font. @@ -4059,16 +4117,16 @@ function LengthConv(const Str: ThtString; Relative: Boolean; Base, EmSize, ExSiz else if U = '%' then V := V * Base * f_pc else if U = 'in' then - V := V * Screen.PixelsPerInch + V := V * PixelsPerInch else if U = 'cm' then - V := V * Screen.PixelsPerInch * f_cm + V := V * PixelsPerInch * f_cm else if U = 'mm' then - V := V * Screen.PixelsPerInch * f_mm + V := V * PixelsPerInch * f_mm else if U = 'pt' then - V := V * Screen.PixelsPerInch * f_pt + V := V * PixelsPerInch * f_pt else if U = 'px' then else if U = 'pc' then - V := V * Screen.PixelsPerInch * f_px + V := V * PixelsPerInch * f_px else if U = 'em' then V := V * EmSize else if U = 'ex' then diff --git a/Ext/HTMLViewer/Source/URLSubs.pas b/Ext/HTMLViewer/Source/URLSubs.pas index ca4a950..29f197a 100644 --- a/Ext/HTMLViewer/Source/URLSubs.pas +++ b/Ext/HTMLViewer/Source/URLSubs.pas @@ -38,7 +38,7 @@ interface HtmlGlobals; type - ThtDocType = (HTMLType, TextType, ImgType, XHtmlType, OtherType); + ThtDocType = (HTMLType, TextType, ImgType, XHtmlType, OtherType, AudioType, VideoType, PdfType); {*************************************************************************************************** * URL processing methods diff --git a/Ext/HTMLViewer/Source/framview.pas b/Ext/HTMLViewer/Source/framview.pas index 8a129b7..9969ccc 100644 --- a/Ext/HTMLViewer/Source/framview.pas +++ b/Ext/HTMLViewer/Source/framview.pas @@ -1,7 +1,7 @@ { -Version 11.8 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin -Copyright (c) 2008-2017 by HtmlViewer Team +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -32,17 +32,20 @@ interface uses {$ifdef LCL} - LclIntf, LclType, HtmlMisc, + LclIntf, LclType, HtmlMisc, Forms, {$else} Windows, {$endif} SysUtils, Messages, Classes, Graphics, Controls, StdCtrls, ExtCtrls, Math, Contnrs, +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} UrlConn, URLSubs, HtmlGlobals, HtmlBuffer, HtmlImages, - Htmlsubs, + HTMLSubs, Htmlview, HtmlSymb, HTMLUn2, @@ -85,6 +88,7 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} FProcessing, FViewerProcessing: Boolean; FViewerList: ThtStringList; FViewImages: Boolean; + FText: ThtString; // FOnBlankWindowRequest: TWindowRequestEvent; FOnFileBrowse: TFileBrowseEvent; @@ -108,6 +112,9 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} procedure SetSelLength(Value: Integer); procedure SetSelStart(Value: Integer); procedure SetViewImages(Value: Boolean); + procedure SetText(const Value: ThtString); + procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED; + procedure CMParentFontChanged(var Message: TMessage); message CM_PARENTFONTCHANGED; protected FBaseEx: ThtString; FURL: ThtString; @@ -154,6 +161,7 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} procedure EndProcessing; virtual; procedure HotSpotClick(Sender: TObject; const AnURL: ThtString;var Handled: Boolean); virtual; abstract; procedure HotSpotCovered(Sender: TObject; const SRC: ThtString); virtual; abstract; + procedure Loaded; override; procedure LoadFromStringInternal(const Text, Name, Dest: ThtString); procedure SetActiveColor(const Value: TColor); override; procedure SetCharset(const Value: TFontCharset); override; @@ -201,6 +209,11 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} procedure SetQuirksMode(const AValue: THtQuirksMode); override; procedure SetVisitedColor(const Value: TColor); override; procedure SetVisitedMaxCount(const Value: Integer); override; + procedure ScaleChanged; override; + procedure StyleChanged; override; +{$ifdef DEBUG} + procedure SetName(const NewName: TComponentName); override; +{$endif} {$ifdef has_StyleElements} procedure UpdateStyleElements; override; {$endif} @@ -233,6 +246,7 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} procedure GoFwd; procedure LoadFromFile(const Name: ThtString); virtual; abstract; procedure LoadFromString(const Text: ThtString; const Name: ThtString = ''; const Dest: ThtString = ''); + procedure Retext; procedure Reload; procedure Repaint; override; procedure SelectAll; @@ -283,6 +297,7 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} property PrintMaxHPages; property PrintScale; property QuirksMode; + property Text: ThtString read FText write SetText; property ViewImages: Boolean read FViewImages write SetViewImages default True; property VisitedMaxCount; // @@ -328,6 +343,9 @@ TFVBase = class(TFrameViewerBase) {TFrameViewerBase is in HtmlUn2.pas} property Anchors; property Enabled; property Height default 150; + property ParentColor default False; + property ParentFont default False; + property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; @@ -355,11 +373,12 @@ TFrameBase = class(THtmlFrameBase) {base class for other classes} private FMasterSet: TFrameSetBase; {Points to top (master) TFrameSetBase} FOwner: TSubFrameSetBase; - FQuirksMode : THtQuirksMode; + FQuirksMode: THtQuirksMode; protected UnLoaded: Boolean; LocalCharSet: TFontCharset; LocalCodePage: TBuffCodePage; + function GetPixelsPerInch: Integer; override; procedure SetQuirksMode(const AValue: THtQuirksMode); virtual; procedure FVMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; abstract; procedure FVMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); virtual; abstract; @@ -377,7 +396,28 @@ TFrameBase = class(THtmlFrameBase) {base class for other classes} procedure InitializeDimensions(X, Y, Wid, Ht: Integer); virtual; abstract; property LOwner: TSubFrameSetBase read FOwner; property MasterSet: TFrameSetBase read FMasterSet; {Points to top (master) TFrameSetBase} - property QuirksMode : THtQuirksMode read FQuirksMode write SetQuirksMode; + property QuirksMode: THtQuirksMode read FQuirksMode write SetQuirksMode; + property PixelsPerInch: Integer read GetPixelsPerInch; + end; + + + TPositionObj = class + public + Pos: Integer; + Seq: Integer; + FormData: TFormData; + destructor Destroy; override; + end; + +{$ifdef UseGenerics} + TPositionObjList = class(TObjectList); + TFrameBaseList = class(TObjectList); +{$else} + TPositionObjList = class(TObjectList) + private + function Get(Index: Integer): TPositionObj; {$ifdef UseInline} inline; {$endif} + public + property Items[Index: Integer]: TPositionObj read Get; default; end; TFrameBaseList = class(TObjectList) @@ -386,6 +426,7 @@ TFrameBaseList = class(TObjectList) public property Items[Index: Integer]: TFrameBase read Get; default; end; +{$endif} TViewerFrameBase = class(TFrameBase) {TViewerFrameBase holds a THtmlViewer or TSubFrameSetBase} protected @@ -394,7 +435,7 @@ TViewerFrameBase = class(TFrameBase) {TViewerFrameBase holds a THtmlViewer or NoScroll: Boolean; frMarginHeight, frMarginWidth: Integer; frHistory: ThtStringList; - frPositionHistory: TObjectList; + frPositionHistory: TPositionObjList; frHistoryIndex: Integer; RefreshTimer: TTimer; NextFile: ThtString; @@ -616,22 +657,6 @@ implementation const Sequence: Integer = 10; -type - TPositionObj = class - public - Pos: Integer; - Seq: Integer; - FormData: TFormData; - destructor Destroy; override; - end; - - TPositionObjList = class(TObjectList) - private - function Get(Index: Integer): TPositionObj; {$ifdef UseInline} inline; {$endif} - public - property Items[Index: Integer]: TPositionObj read Get; default; - end; - {----------------FileToString} function FileToString(const Name: ThtString): AnsiString; @@ -786,7 +811,7 @@ procedure TfvFrame.RefreshEvent(Sender: TObject; Delay: Integer; const URL: ThtS NextFile := Source else NextFile := MasterSet.FrameViewer.HTMLExpandFilename(URL); - if not MasterSet.RequestEvent and not FileExists(NextFile) then + if not MasterSet.RequestEvent and not htFileExists(NextFile) then Exit; if not Assigned(RefreshTimer) then RefreshTimer := TTimer.Create(Self); @@ -946,10 +971,10 @@ procedure TfvFrame.LoadFiles(PEV: PEventRec); begin EV := PEV^; end - else if copy(Source, 1, 9) = 'source://' then + else if Copy(Source, 1, 9) = 'source://' then begin EV.NewName := Source; - Src := copy(Source, 10, MaxInt); + Src := Copy(Source, 10, MaxInt); EV.Doc := TBuffer.Create(Src, EV.NewName); end else @@ -957,7 +982,7 @@ procedure TfvFrame.LoadFiles(PEV: PEventRec); if not MasterSet.TriggerEvent(Source, EV.NewName, EV.Doc) then begin EV.NewName := MasterSet.FrameViewer.HTMLExpandFilename(Source); - if FileExists(Ev.NewName) then + if htFileExists(Ev.NewName) then begin Stream := TFileStream.Create( htStringToString(EV.NewName), fmOpenRead or fmShareDenyWrite); try @@ -1007,8 +1032,10 @@ procedure TfvFrame.LoadFiles(PEV: PEventRec); Ext := htLowerCase(ExtractFileExt(Source)); if Length(Ext) > 0 then Delete(Ext, 1, 1); - if copy(Ev.NewName, 1, 9) <> 'source://' then - ft := FileExt2DocType(Ext); + if Copy(Ev.NewName, 1, 9) <> 'source://' then + ft := FileExt2DocType(Ext) + else if ft = OtherType then + ft := HTMLType; Viewer.LoadFromDocument(EV.Doc, Source, ft); Viewer.PositionTo(Destination); end @@ -1049,6 +1076,7 @@ procedure TfvFrame.ReloadFiles(APosition: Integer); Upper, Lower: Boolean; EV: EventRec; ft: THtmlFileType; + Src: ThtString; procedure DoError; begin @@ -1069,6 +1097,18 @@ procedure TfvFrame.ReloadFiles(APosition: Integer); else if Assigned(Viewer) then begin Viewer.Base := MasterSet.FBase; +{$ifdef Compiler31_Plus} + // If compiled with Delphi and we started on a monitor <> 96 DPI and we move + // to a 96 DPI monitor for the first time the viewer is not automatically + // scaled to 96 DPI: + if Viewer.PixelsPerInch <> PixelsPerInch then + Viewer.ScaleForPPI(PixelsPerInch); +{$endif} +{$ifdef LCL} + if Application.Scaled and Viewer.ParentForm.Scaled then + if Viewer.PixelsPerInch <> PixelsPerInch then + Viewer.AutoAdjustLayout(lapAutoAdjustForDPI, Viewer.PixelsPerInch, PixelsPerInch, 0, 0); +{$endif} ft := GetFileType(Source); case ft of ImgType, @@ -1085,8 +1125,16 @@ procedure TfvFrame.ReloadFiles(APosition: Integer); Viewer.LoadFromDocument(EV.Doc, '') else Viewer.LoadFromFile(EV.NewName, ft) + else if Copy(Source, 1, 9) = 'source://' then + begin + EV.NewName := Source; + Src := Copy(Source, 10, MaxInt); + EV.Doc := TBuffer.Create(Src, EV.NewName); + Viewer.LoadFromDocument(EV.Doc, ''); + end else Viewer.LoadFromFile(Source, ft); + if APosition < 0 then Viewer.Position := ViewerPosition else @@ -1168,7 +1216,7 @@ procedure TfvFrame.frLoadFromFile(const FName, Dest: ThtString; Bump, Reload: Bo if not MasterSet.TriggerEvent(Source, EV.NewName, EV.Doc) then begin EV.NewName := MasterSet.FrameViewer.HTMLExpandFilename(Source); - if FileExists(Ev.NewName) then + if htFileExists(Ev.NewName) then begin Stream := TFileStream.Create( htStringToString(EV.NewName), fmOpenRead or fmShareDenyWrite); try @@ -1513,13 +1561,15 @@ procedure TViewerFrameBase.UpdateFrameList; constructor TSubFrameSetBase.CreateIt(AOwner: TComponent; Master: TFrameSetBase); begin inherited Create(AOwner); - QuirksMode := Master.QuirksMode; FMasterSet := Master; if AOwner is TFrameBase then LocalCodePage := TFrameBase(AOwner).LocalCodePage; - OuterBorder := 0; {no border for subframesets} if Self <> Master then + begin BorderSize := Master.BorderSize; + QuirksMode := Master.QuirksMode; + end; + OuterBorder := 0; {no border for subframesets} First := True; List := TFrameBaseList.Create; OnResize := CalcSizes; @@ -1605,10 +1655,16 @@ procedure TSubFrameSetBase.DoAttributes(L: TAttributeList); end; begin +{$ifdef DEBUG} + // For debugging we name our internal components. + // So we cannot use the name to control reading. + S := T.Name; +{$else} if Name = '' then S := T.Name else Exit; +{$endif} I := 1; DimCount := 0; repeat Inc(DimCount); @@ -2163,7 +2219,7 @@ procedure TSubFrameSetBase.HandleMeta(Sender: TObject; const HttpEq, Name, Conte procedure TSubFrameSetBase.SetRefreshTimer; begin NextFile := HTMLToDos(FRefreshURL); - if not FileExists(NextFile) then + if not htFileExists(NextFile) then Exit; if not Assigned(RefreshTimer) then RefreshTimer := TTimer.Create(Self); @@ -2194,6 +2250,13 @@ constructor TFrameSetBase.Create(AOwner: TComponent); begin inherited CreateIt(AOwner, Self); FFrameViewer := AOwner as TFvBase; +{$ifdef DEBUG} + {$if defined(LCL) or defined(Compiler22_Plus)} + Name := FFrameViewer.Name + '_FrameSetBase' + IntToHex(Integer(Self)); + {$else} + Name := FFrameViewer.Name + '_FrameSetBase' + IntToHex(Integer(Self), 8); + {$ifend} +{$endif} LocalCodePage := FrameViewer.CodePage; if fvNoBorder in FrameViewer.fvOptions then BorderSize := 0 @@ -2417,6 +2480,9 @@ procedure TFrameSet.LoadFromFile(const FName, Dest: ThtString); begin Clear; NestLevel := 0; + if not htFileExists(FName) then + Exit; + ft := HTMLType; if not MasterSet.RequestEvent then ft := GetFileType(FName); @@ -2602,6 +2668,8 @@ constructor TFVBase.Create(AOwner: TComponent); inherited Create(AOwner); Height := 150; Width := 150; + ParentColor := False; + ParentFont := False; ProcessList := TList.Create; FLinkAttributes := ThtStringList.Create; FViewImages := True; @@ -2732,24 +2800,14 @@ procedure TFVBase.Clear; procedure TFrameViewer.LoadFromFile(const FileName: ThtString); var Name, Dest: ThtString; -{$ifdef FPC} - ShortName: ThtString; -{$endif} begin if Processing then - exit; + Exit; + SplitDest(FileName, Name, Dest); - if not FileExists(Name) then - begin -{$ifdef FPC} - // BG, 24.04.2014: workaround for non ansi file names: - ShortName := ExtractShortPathName(UTF8Decode(Name)); - if FileExists(ShortName) then - Name := ShortName - else -{$endif} + if not htFileExists(Name) then raise(EhtLoadError.Create('Can''t locate file: ' + htStringToString(Name) )); - end; + LoadFromFileInternal(Name, Dest); end; @@ -2838,7 +2896,7 @@ procedure TFrameViewer.LoadTargetFromFile(const Target, FileName: ThtString); begin FrameTarget := (CurFrameSet.FrameNames.Objects[I] as TViewerFrameBase); - if not FileExists(Name) and not Assigned(OnStreamRequest) then + if not htFileExists(Name) and not Assigned(OnStreamRequest) then raise EhtLoadError.CreateFmt('Can''t locate ''%s''.', [Name]); BeginProcessing; @@ -2881,8 +2939,27 @@ procedure TFVBase.Reload; BeginProcessing; try ProcessList.Clear; - CurFrameSet.UnloadFiles; - CurFrameSet.ReloadFiles(-1); + if CurFrameSet.List.Count = 0 then + LoadFromStringInternal( FText, '', '' ) + else + begin + CurFrameSet.UnloadFiles; + CurFrameSet.ReloadFiles(-1); + end; + CheckVisitedLinks; + finally + EndProcessing; + end; +end; + +procedure TFVBase.Retext; +begin + BeginProcessing; + try +// ProcessList.Clear; +// CurFrameSet.UnloadFiles; +// CurFrameSet.ReloadFiles(-1); + Text := Text; CheckVisitedLinks; finally EndProcessing; @@ -3444,6 +3521,29 @@ procedure TFVBase.ClearHistory; OnHistoryChange(Self); end; +//-- BG ------------------------------------------------------- 10.12.2022 -- +procedure TFVBase.CMParentColorChanged(var Message: TMessage); +var + I: Integer; +begin + if FInCMParentColorChanged = 0 then // in FPC inherited produces recursive calls to CMParentColorChanged when ParentColor changed to true + for I := 0 to GetCurViewerCount - 1 do + CurViewer[I].ParentColor := ParentColor; + + inherited; +end; + +//-- BG ------------------------------------------------------- 10.12.2022 -- +procedure TFVBase.CMParentFontChanged(var Message: TMessage); +var + I: Integer; +begin + for I := 0 to GetCurViewerCount - 1 do + CurViewer[I].ParentFont := ParentFont; + + inherited; +end; + procedure TFVBase.SetOnProgress(const Handler: ThtProgressEvent); var I: Integer; @@ -3663,6 +3763,13 @@ constructor TFrameViewer.CreateCopy(Owner: TComponent; Source: TViewerBase); function TFVBase.CreateViewer(Owner: THtmlFrameBase): THtmlViewer; begin Result := GetViewerClass.CreateCopy(Owner, Self); {the Viewer for the frame} +{$ifdef DEBUG} + {$if defined(LCL) or defined(Compiler22_Plus)} + Result.Name := Name + '_Viewer' + IntToHex(Integer(Result)); + {$else} + Result.Name := Name + '_Viewer' + IntToHex(Integer(Result), 8); + {$ifend} +{$endif} Result.ViewImages := ViewImages; Result.SetImageCache(FImageCache); Result.HtOptions := FvOptionsToHtOptions(FOptions, Result.HtOptions); @@ -3865,6 +3972,18 @@ procedure TFVBase.SetLoadCursor(const Value: TCursor); end; end; +{$ifdef DEBUG} +procedure TFVBase.SetName(const NewName: TComponentName); +begin + inherited; + {$if defined(LCL) or defined(Compiler22_Plus)} + FCurFrameSet.Name := NewName + '_CurFrameSet' + IntToHex(Integer(FCurFrameSet)); + {$else} + FCurFrameSet.Name := NewName + '_CurFrameSet' + IntToHex(Integer(FCurFrameSet), 8); + {$ifend} +end; +{$endif} + {----------------TFVBase.SetNoSelect} procedure TFVBase.SetNoSelect(const Value: Boolean); @@ -4159,6 +4278,12 @@ procedure TFVBase.SetVisitedMaxCount(const Value: Integer); end; end; +procedure TFVBase.StyleChanged; +begin + inherited; + // abstract method and we have nothing to here. +end; + procedure TFVBase.SetDefBackground(const Value: TColor); var I: Integer; @@ -4168,7 +4293,9 @@ procedure TFVBase.SetDefBackground(const Value: TColor); inherited; for I := 0 to GetCurViewerCount - 1 do CurViewer[I].DefBackground := Value; - Color := Value; + + if not ParentColor then + Color := Value; end; end; @@ -4387,6 +4514,14 @@ procedure TFVBase.SetSelStart(Value: Integer); AViewer.SelStart := Value; end; +procedure TFVBase.SetText(const Value: ThtString); +begin + if csLoading in ComponentState then + FText := Value + else + LoadFromString(Value); +end; + procedure TFVBase.SetCharset(const Value: TFontCharset); var I: Integer; @@ -4514,14 +4649,15 @@ procedure TFVBase.SetFocus; AViewer: THtmlViewer; begin AViewer := GetActiveViewer; - if Assigned(AViewer) and AViewer.CanFocus then - try - AViewer.SetFocus; - except {just in case} - inherited SetFocus; - end - else - inherited SetFocus; + if Showing then + if Assigned(AViewer) and AViewer.Showing and AViewer.CanFocus then + try + AViewer.SetFocus; + except {just in case} + inherited SetFocus; + end + else + inherited SetFocus; end; {----------------TFVBase.SetProcessing} @@ -4632,6 +4768,16 @@ procedure TFVBase.CopyToClipboard; AViewer.CopyToClipboard; end; +//-- BG ------------------------------------------------------- 03.10.2022 -- +procedure TFVBase.ScaleChanged; +begin + inherited; + + // while loading we will set the Text in Loaded; + if not(csLoading in ComponentState) then + Reload; +end; + procedure TFVBase.SelectAll; var AViewer: THtmlViewer; @@ -4661,6 +4807,13 @@ function TFVBase.FindEx(const S: UnicodeString; MatchCase, Reverse: Boolean): Bo Result := False; end; +procedure TFVBase.Loaded; +begin + inherited; + + if Length(FText) <> 0 then + LoadFromString(FText); +end; //-- BG ---------------------------------------------------------- 23.09.2010 -- procedure TFVBase.LoadFromString(const Text, Name, Dest: ThtString); @@ -4724,6 +4877,7 @@ procedure TFVBase.LoadFromStringInternal(const Text, Name, Dest: ThtString); AddVisitedLink(S + Dest); CheckVisitedLinks; finally + FText := Text; EndProcessing; end; end; @@ -4755,11 +4909,20 @@ procedure TFrameBase.Reload; FMasterSet.FFrameViewer.Reload; end; +//-- BG ---------------------------------------------------------- 03.10.2022 -- +function TFrameBase.GetPixelsPerInch: Integer; +begin + Result := FMasterSet.FrameViewer.PixelsPerInch; +end; + procedure TFrameBase.SetQuirksMode(const AValue: THtQuirksMode); begin - Self.FQuirksMode := AValue; + FQuirksMode := AValue; end; +{$ifdef UseGenerics} +{$else} + { TFrameBaseList } //-- BG ---------------------------------------------------------- 06.10.2016 -- @@ -4776,4 +4939,6 @@ function TPositionObjList.Get(Index: Integer): TPositionObj; Result := inherited Get(Index); end; +{$endif} + end. diff --git a/Ext/HTMLViewer/Source/htmlcons.inc b/Ext/HTMLViewer/Source/htmlcons.inc index ca32a48..34e10ce 100644 --- a/Ext/HTMLViewer/Source/htmlcons.inc +++ b/Ext/HTMLViewer/Source/htmlcons.inc @@ -1,7 +1,7 @@ { -Version 11.9 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin -Copyright (c) 2008-2018 by Bernd Gabriel +Copyright (c) 2008-2023 by Bernd Gabriel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -24,17 +24,13 @@ Note that the source modules HTMLGIF1.PAS, DITHERUNIT.PAS are covered by separate copyright notices located in those modules. } -//{$IFDEF CONDITIONALEXPRESSIONS} -// -// -// // Must be at the top... -// {$IF CompilerVersion >= 24.0} -// {$LEGACYIFEND ON} -// {$IFEND} -//{$ENDIF} {$ifdef FPC} -{ Identify FreePascal/Lazarus Compiler Version } +{ Identify FreePascal/Lazarus Compiler Version: + + const lcl_fullversion = ((lcl_major * 100 + lcl_minor) * 100 + lcl_release) * 100 + lcl_patch; + +} {$define LCL} {$mode delphi} @@ -46,61 +42,71 @@ are covered by separate copyright notices located in those modules. {$define HasStrictDelimiter} - {$define ver100_plus} - {$define ver120_plus} + {.$define ver100_plus} + {.$define ver120_plus} {$define TSearchRecHasNoTimestamp} + + { Compiler Features } + + {$ifdef LCLQt5} + {$define OwnPaintPanelDoubleBuffering} + {$endif} + {$else} { Identify Delphi Compiler Version: - # Compiler Version Compiler Defined Symbol - D26 Delphi 10.3 Rio 33 VER330 - D25 Delphi 10.2 Tokyo 32 VER320 - D24 Delphi 10.1 Berlin 31 VER310 - D23 Delphi 10 Seattle 30 VER300 - D22 Delphi XE8 29 VER290 - D21 Delphi XE7 28 VER280 - D20 Delphi XE6 27 VER270 - D19 Delphi XE5 26 VER260 - D18 Delphi XE4 25 VER250 - D17 Delphi XE3 24 VER240 - D16 Delphi XE2 23 VER230 - D15 Delphi XE 22 VER220 - D14 Delphi 2010 21 VER210 - D12 Delphi 2009 20 VER200 - D11 Delphi 2007 18.5 VER185 - D10 Delphi 2006 18 VER180 - D9 Delphi 2005 17 VER170 - D8 Delphi 8 16 VER160 - D7 Delphi 7 15 VER150 - D6 Delphi 6 14 VER140 - C++Builder 5 VER130 BCB - D5 Delphi 5 VER130 - C++Builder 4 VER125 - D4 Delphi 4 VER120 - C++Builder 3 VER110 - D3 Delphi 3 VER100 - C++Builder 1 VER93 - D2 Delphi 2 VER90 - D1 Delphi 1 VER80 + # Compiler Version Compiler Defined Symbol Codename + D28 Delphi 11 35 VER350 Alexandria + D27 Delphi 10.4 34 VER340 Sydney + D26 Delphi 10.3 33 VER330 Rio + D25 Delphi 10.2 32 VER320 Tokyo + D24 Delphi 10.1 31 VER310 Berlin + D23 Delphi 10 30 VER300 Seattle + D22 Delphi XE8 29 VER290 + D21 Delphi XE7 28 VER280 + D20 Delphi XE6 27 VER270 + D19 Delphi XE5 26 VER260 + D18 Delphi XE4 25 VER250 + D17 Delphi XE3 24 VER240 + D16 Delphi XE2 23 VER230 + D15 Delphi XE 22 VER220 + D14 Delphi 2010 21 VER210 + D12 Delphi 2009 20 VER200 + + unsupported Versions: + + D11 Delphi 2007 18.5 VER185 + D10 Delphi 2006 18 VER180 + D9 Delphi 2005 17 VER170 + D8 Delphi 8 16 VER160 + D7 Delphi 7 15 VER150 + D6 Delphi 6 14 VER140 + C++Builder 5 VER130 BCB + D5 Delphi 5 VER130 + C++Builder 4 VER125 + D4 Delphi 4 VER120 + C++Builder 3 VER110 + D3 Delphi 3 VER100 + C++Builder 1 VER93 + D2 Delphi 2 VER90 + D1 Delphi 1 VER80 Since Delphi 6 the version number can be found in the system constant System.CompilerVersion - NOTICE: HtmlViewer no longer supports versions before Delphi 6 - BG, 20.11.2010: HtmlViewer sources use neither ver100_plus nor ver120_plus any more. - We keep the defines alive for custom code which might still use them. + NOTICE: HtmlViewer 11.10 no longer supports versions before Delphi 2009 A complete list of version numbers can be found at: - http://docwiki.embarcadero.com/RADStudio/XE8/de/Compiler-Versionen + https://docwiki.embarcadero.com/RADStudio/Alexandria/en/Compiler_Versions } {$define VCL} {$define Windows} {$ifdef CONDITIONALEXPRESSIONS} {Delphi 6 and up} - {$define ver100_plus} - {$define ver120_plus} + {.$define ver100_plus} + {.$define ver120_plus} {$ifdef ver140} {$else} {$define Delphi7_Plus} @@ -141,33 +147,41 @@ are covered by separate copyright notices located in those modules. {$ifdef ver260} {$else} {$define Compiler27_Plus} - {$ifdef ver270} - {$else} - {$define Compiler28_Plus} - {$ifdef ver280} - {$else} - {$define Compiler29_Plus} - {$ifdef ver290} - {$else} - {$define Compiler30_Plus} - {$ifdef ver300} - {$else} - {$define Compiler31_Plus} - {$ifdef ver310} - {$else} - {$define Compiler32_Plus} - {$ifdef ver320} - {$else} - {$define Compiler33_Plus} - {$ifdef ver330} - {$else} - {$endif} - {$endif} - {$endif} - {$endif} - {$endif} - {$endif} - {$endif} + {$ifdef ver270} + {$else} + {$define Compiler28_Plus} + {$ifdef ver280} + {$else} + {$define Compiler29_Plus} + {$ifdef ver290} + {$else} + {$define Compiler30_Plus} + {$ifdef ver300} + {$else} + {$define Compiler31_Plus} + {$ifdef ver310} + {$else} + {$define Compiler32_Plus} + {$ifdef ver320} + {$else} + {$define Compiler33_Plus} + {$ifdef ver330} + {$else} + {$define Compiler34_Plus} + {$ifdef ver340} + {$else} + {$define Compiler35_Plus} + {$ifdef ver350} + {$else} + {$endif} + {$endif} + {$endif} + {$endif} + {$endif} + {$endif} + {$endif} + {$endif} + {$endif} {$endif} {$endif} {$endif} @@ -182,6 +196,10 @@ are covered by separate copyright notices located in those modules. {$endif} {$endif} {$endif} + {$ifndef Compiler20_Plus} + // Might still work or not. Oldest tested version is 2009. + {$message 'Delphi versions before 2009 are no longer supported.'} + {$endif} {$else} {$message 'Sorry, but Delphi versions before 6 are not supported.'} {$endif} @@ -202,6 +220,7 @@ are covered by separate copyright notices located in those modules. {$ifdef Compiler20_Plus} {$define TEditHasTextHint} {$define TComboBoxHasTextHint} + {.$define UseGenerics} // you may use generics {$endif} {$ifdef Compiler21_Plus} @@ -219,6 +238,10 @@ are covered by separate copyright notices located in those modules. {$define UseASMx86} {$endif} + {$ifdef Compiler34_Plus} + {$define UseGenerics} // you must use generics + {$endif} + { Set Delphi Compiler Switches } {$ifdef ver150} {Delphi 7} @@ -269,11 +292,10 @@ are covered by separate copyright notices located in those modules. { Define Aspects Of HtmlViewer } {$ifdef MSWindows} -{.$define NoGDIPlus} {The gdiplus.dll provides Alpha transparency support for +{$define NoGDIPlus} {The gdiplus.dll provides Alpha transparency support for PNG images and provides support for TIFF images. If, for some reason the use of the gdiplus.dll is - undesirable, define "NoGDIPlus" by removing the '.'. - Defining NoGDIPlus will remove support for PNG images entirely.} + undesirable, define "NoGDIPlus" by removing the '.'.} {.$define NoMetaFile} {Metafiles may be displayed by undefining this constant. NoMetaFile is defined by default to emphasize the fact that Metafile @@ -313,6 +335,7 @@ are covered by separate copyright notices located in those modules. simulates the way IExplorer does it, issuing the OnChange event immediately when a change is made.} +{$ifndef OwnPaintPanelDoubleBuffering} // required for some compiler versions {.$define OwnPaintPanelDoubleBuffering} {Issue 57: Delphi 7? or Russian? Locale? + XP-Manifest produce misplaced button captions, which I (BG) cannot reproduce with D6, D2007 or D2009. @@ -320,6 +343,7 @@ are covered by separate copyright notices located in those modules. This switch reactivates the manual double buffering in TPaintPanel.Paint(), which was removed with r118. Due to several redraw errors with Delphi, OwnPaintPanelDoubleBuffering now is always set for Delphi.} +{$endif} {$define HalfToneStretching} {This makes use of a better stretching methode provided by Windows: HALFTONE. @@ -344,6 +368,9 @@ are covered by separate copyright notices located in those modules. {Brings back deprecated LoadStrings(), LoadImage(), LoadText*()..., ... methods. Prefer using the suggested replacement methods over defining this switch.} +{.$define UseHandCursor} + {This uses the HtmlViewers Link Pointer instead of the System's crHandPoint} + {$ifdef Compiler20_Plus} {$else} {TNT Unicode controls are mandatory for Delphi 6-2007} @@ -364,7 +391,7 @@ versions of RAD Studio since XE2. This should never be used for release softwar {$ifdef win32} {.$define JPM_DEBUGGING} {$endif} - {$define has_StyleElements} + {$define has_StyleElements} {$endif} { diff --git a/Ext/HTMLViewer/Source/htmlmisc.pas b/Ext/HTMLViewer/Source/htmlmisc.pas index b3a2fdd..01138e7 100644 --- a/Ext/HTMLViewer/Source/htmlmisc.pas +++ b/Ext/HTMLViewer/Source/htmlmisc.pas @@ -1285,7 +1285,7 @@ procedure InitFlatSB; {$ENDIF} initialization - htExpectsUTF8 := WidgetSet.LCLPlatform in [lpCarbon, lpQt, lpGTK2, lpWin32]; + htExpectsUTF8 := WidgetSet.LCLPlatform in [lpCarbon, lpQt, lpQt5, lpGTK2, lpWin32]; {$IFNDEF NoFlatScrollbars} InitFlatSB; {$ENDIF} diff --git a/Ext/HTMLViewer/Source/htmlview.pas b/Ext/HTMLViewer/Source/htmlview.pas index 41533dc..2fd870e 100644 --- a/Ext/HTMLViewer/Source/htmlview.pas +++ b/Ext/HTMLViewer/Source/htmlview.pas @@ -1,7 +1,7 @@ { -Version 11.9 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin -Copyright (c) 2008-2018 by HtmlViewer Team +Copyright (c) 2008-2023 by HtmlViewer Team Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -35,19 +35,25 @@ interface uses {$ifdef LCL} - LclIntf, LclType, LMessages, types, FPimage, HtmlMisc, + LclIntf, LclType, LclVersion, LMessages, types, FPimage, HtmlMisc, {$else} Windows, {$endif} Messages, Classes, Graphics, Controls, StdCtrls, ExtCtrls, Contnrs, SysUtils, +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} {$ifndef NoMetafile} - MetaFilePrinter, vwPrint, + MetaFilePrinter, {$endif} UrlConn, URLSubs, + HtmlFonts, HtmlGlobals, HtmlBuffer, HtmlImages, + HtmlPrinter, + vwPrint, HTMLUn2, ReadHTML, HTMLSubs, @@ -55,9 +61,10 @@ interface StyleUn; const - wm_FormSubmit = wm_User + 100; - wm_MouseScroll = wm_User + 102; - wm_UrlAction = wm_User + 103; + wm_FormSubmit = WM_USER + 100; + wm_Retext = WM_USER + 101; + wm_MouseScroll = WM_USER + 102; + wm_UrlAction = WM_USER + 103; type EhtException = class(Exception); @@ -150,7 +157,11 @@ THistoryItem = class(TObject) THistory = class(TObject) private +{$ifdef UseGenerics} + FHistory: TObjectList; +{$else} FHistory: TObjectList; +{$endif} FIndex: Integer; function GetItem(Index: Integer): THistoryItem; function GetCount: Integer; @@ -196,6 +207,8 @@ THtmlFrameBase = class(ThtControlBase) TLoadHistoryItem = procedure(Sender: TObject; HI: ThvHistoryItem; var Handled: Boolean) of object; + ThtRetextMode = (rtmNone, rtmRetext, rtmNewText); + //TODO -oBG, 16.08.2015: split THtmlViewer into ThtBase and THtmlViewer. // // ThtBase (or a derivate of it) will be the control that TFVBase will create @@ -229,12 +242,17 @@ THtmlViewer = class(ThtBase) // constructed stuff FFrameOwner: THtmlFrameBase; {the TViewerFrameBase that holds this THtmlViewer} FVisited: ThtStringList; {visited URLs} +{$ifdef UseGenerics} + FObjects: TObjectList; // objects I must free (e.g. streams created in htStreamRequest) +{$else} FObjects: TObjectList; // objects I must free (e.g. streams created in htStreamRequest) +{$endif} // stuff copied in CreateCopy FBase: ThtString; FBaseEx: ThtString; FBaseTarget: ThtString; + FText: ThtString; FBorderStyle: THTMLBorderStyle; FScrollBars: ThtScrollStyle; FOptions: THtmlViewerOptions; @@ -259,6 +277,7 @@ THtmlViewer = class(ThtBase) // status info FViewerState: THtmlViewerState; FHistory: ThvHistory; + FMustRetext: ThtRetextMode; // document related stuff FSectionList: ThtDocument; @@ -306,7 +325,7 @@ THtmlViewer = class(ThtBase) {$ifndef NoMetafile} FPage: Integer; FWidthRatio: Double; - vwP: TvwPrinter; + vwP: ThtPrinter; function CreateHeaderFooter: THtmlViewer; {$endif} function GetCursor: TCursor; @@ -373,6 +392,7 @@ THtmlViewer = class(ThtBase) procedure WMFormSubmit(var Message: TMessage); message WM_FormSubmit; procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE; procedure WMMouseScroll(var Message: TMessage); message WM_MouseScroll; + procedure WMRetext(var Message: TMessage); message wm_Retext; procedure WMSize(var Message: TWMSize); message WM_SIZE; procedure WMUrlAction(var Message: TMessage); message WM_UrlAction; function GetHistoryIndex: Integer; @@ -388,7 +408,13 @@ THtmlViewer = class(ThtBase) property HTMLTimer: TTimer read FHTMLTimer; property BorderPanel: TPanel read FBorderPanel; property PaintPanel: TPaintPanel read FPaintPanel; + procedure InitSectionList; protected + procedure ScaleChanged; override; + procedure StyleChanged; override; +{$ifdef LCL} + procedure SetPPI(Value: Integer); override; +{$endif} {$ifdef has_StyleElements} procedure UpdateStyleElements; override; {$endif} @@ -442,6 +468,9 @@ THtmlViewer = class(ThtBase) procedure SetVisitedMaxCount(const Value: Integer); override; procedure Loaded; override; function CanAutoSize(var NewWidth: Integer; var NewHeight: Integer): Boolean; override; +{$ifdef DEBUG} + procedure SetName(const NewName: TComponentName); override; +{$endif} property ScrollWidth: Integer read FScrollWidth; public constructor Create(Owner: TComponent); override; @@ -451,7 +480,7 @@ THtmlViewer = class(ThtBase) function DisplayPosToXy(DisplayPos: Integer; var X, Y: Integer): Boolean; function Find(const S: UnicodeString; MatchCase: Boolean): Boolean; function FindDisplayPos(SourcePos: Integer; Prev: Boolean): Integer; - function FindEx(const S: UnicodeString; MatchCase, Reverse: Boolean): Boolean; + function FindEx(const S: UnicodeString; MatchCase, AReverse: Boolean): Boolean; function FindSourcePos(DisplayPos: Integer): Integer; function FullDisplaySize(FormatWidth: Integer): TSize; function GetCharAtPos(Pos: Integer; var Ch: WideChar; var Font: TFont): Boolean; @@ -469,7 +498,7 @@ THtmlViewer = class(ThtBase) procedure OpenPrint; procedure ClosePrint; procedure AbortPrint; - procedure Print(FromPage: Integer = 1; ToPage: Integer = MaxInt; Prn: TvwPrinter = nil); overload; + procedure Print(FromPage: Integer = 1; ToPage: Integer = MaxInt; Prn: ThtPrinter = nil); overload; function PrintPreview(Prn: TMetaFilePrinter; NoOutput: Boolean = False; FromPage: Integer = 1; ToPage: Integer = MaxInt): Integer; virtual; // print or preview: function Print(Prn: ThtPrinter; FromPage: Integer; ToPage: Integer; Mode: ThtPrintPreviewMode = ppAuto): Integer; overload; @@ -517,9 +546,12 @@ THtmlViewer = class(ThtBase) procedure LoadTextFromString(const S: ThtString); deprecated; // use LoadFromString() instead. procedure LoadTextStrings(Strings: ThtStrings); deprecated; // use LoadFromString() instead. {$endif} - // - procedure Reformat; - procedure Reload; + // update current content: + procedure Reformat; // reformat current text (e.g. after width changed). Calls Layout again. + procedure Retext(Value: ThtRetextMode); overload; // send a message to reload current text soon (e.g. after scale, default font or background color changed) + procedure Retext; overload; // reload current text according to FMustRetext (e.g set by Retext(Value: ThtRetextMode); + procedure Reload; // reload current file (e.g. after file content changed) + procedure Repaint; override; procedure ReplaceImage(const NameID: ThtString; NewImage: TStream); procedure ScrollXY(const Delta: TSize); @@ -530,6 +562,7 @@ THtmlViewer = class(ThtBase) procedure ToggleIDExpand(const URL: ThtString; var Handled: Boolean); procedure UpdateSize; procedure UrlAction; + property Base: ThtString read FBase write SetBase; property BaseTarget: ThtString read FBaseTarget; property CaretPos: Integer read FCaretPos write SetCaretPos; @@ -666,6 +699,9 @@ THtmlViewer = class(ThtBase) property Enabled; property Height default 150; property Name; + property ParentColor default False; + property ParentFont default False; + property ParentShowHint; property PopupMenu; property ShowHint; property TabOrder; @@ -731,7 +767,7 @@ TFileTypeRec = record //-- BG ---------------------------------------------------------- 12.05.2013 -- procedure InitFileTypes; const - FileTypeDefinitions: array [1..23] of TFileTypeRec = ( + FileTypeDefinitions: array [1..34] of TFileTypeRec = ( (FileExt: '.htm'; FileType: HTMLType), (FileExt: '.html'; FileType: HTMLType), @@ -743,6 +779,8 @@ procedure InitFileTypes; (FileExt: '.xhtml'; FileType: XHtmlType), (FileExt: '.xht'; FileType: XHtmlType), + (FileExt: '.txt'; FileType: TextType), + (FileExt: '.gif'; FileType: ImgType), (FileExt: '.jpg'; FileType: ImgType), (FileExt: '.jpeg'; FileType: ImgType), @@ -760,7 +798,19 @@ procedure InitFileTypes; (FileExt: '.tiff'; FileType: ImgType), (FileExt: '.tif'; FileType: ImgType), - (FileExt: '.txt'; FileType: TextType) + (FileExt: '.mp3'; FileType: AudioType), + (FileExt: '.ogg'; FileType: AudioType), + + (FileExt: '.mp4'; FileType: VideoType), + (FileExt: '.webm'; FileType: VideoType), + (FileExt: '.mkv'; FileType: VideoType), + (FileExt: '.mpg'; FileType: VideoType), + (FileExt: '.mpeg'; FileType: VideoType), + (FileExt: '.wmv'; FileType: VideoType), + (FileExt: '.flv'; FileType: VideoType), + (FileExt: '.avi'; FileType: VideoType), + + (FileExt: '.pdf'; FileType: PdfType) ); var I: Integer; @@ -844,6 +894,8 @@ constructor THtmlViewer.Create(Owner: TComponent); Include(FViewerState, vsCreating); Height := 150; Width := 150; + ParentColor := False; + ParentFont := False; SetCursor(crIBeam); FBorderPanel := TPanel.Create(Self); @@ -865,8 +917,11 @@ constructor THtmlViewer.Create(Owner: TComponent); FPaintPanel.Parent := FBorderPanel; //Self; FPaintPanel.BevelOuter := bvNone; FPaintPanel.BevelInner := bvNone; + FPaintPanel.Align := alClient; // MV, 20.12.2020: issue 139. paint panel should fill available htmlviewer area {$ifndef LCL} FPaintPanel.Ctl3D := False; +{$else} + FPaintPanel.Canvas.Font.PixelsPerInch := PixelsPerInch; {$endif} //FPaintPanel.OnPaint := HTMLPaint; FPaintPanel.OnMouseDown := HTMLMouseDown; @@ -902,13 +957,18 @@ constructor THtmlViewer.Create(Owner: TComponent); FSectionList.OnBackgroundChange := BackgroundChange; FSectionList.ShowImages := True; FSectionList.GetImage := DoGetImage; + FSectionList.PixelsPerInch := PixelsPerInch; FNameList := FSectionList.IDNameList; SetOptions([htPrintTableBackground, htPrintMonochromeBlack]); FHistory := ThvHistory.Create; FVisited := ThtStringList.Create; +{$ifdef UseGenerics} + FObjects := TObjectList.Create; +{$else} FObjects := TObjectList.Create; +{$endif} FHTMLTimer := TTimer.Create(Self); FHTMLTimer.Enabled := False; @@ -945,6 +1005,7 @@ constructor THtmlViewer.CreateCopy(Owner: TComponent; Source: TViewerBase); if Owner is THtmlFrameBase then FFrameOwner := THtmlFrameBase(Owner); + if Source is THtmlViewer then begin Self.QuirksMode := Viewer.QuirksMode; @@ -1084,26 +1145,14 @@ procedure THtmlViewer.LoadFile(const FileName: ThtString; ft: ThtmlFileType); var Dest, Name: ThtString; Stream: TStream; -{$ifdef FPC} - ShortName: ThtString; -{$endif} begin IOResult; {eat up any pending errors} SplitDest(FileName, Name, Dest); if Name <> '' then Name := ExpandFileName(Name); - //FCurrentFile := Name; //BG, 03.04.2011: issue 83: Failure to set FCurrentFile - if not FileExists(Name) then - begin -{$ifdef FPC} - //BG, 24.04.2014: workaround for non ansi file names: - ShortName := ExtractShortPathName(UTF8Decode(Name)); - if FileExists(ShortName) then - Name := ShortName - else -{$endif} + + if not htFileExists(Name) then raise EhtLoadError.CreateFmt('Can''t locate file ''%s''.', [Name]); - end; Stream := TFileStream.Create( htStringToString(Name), fmOpenRead or fmShareDenyWrite); try @@ -1113,7 +1162,7 @@ procedure THtmlViewer.LoadFile(const FileName: ThtString; ft: ThtmlFileType); end; end; -procedure THtmlViewer.LoadFromFile(const FileName: ThtString; DocType: ThtmlFileType); +procedure THtmlViewer.LoadFromFile(const FileName: ThtString; DocType: THtmlFileType); var OldFile, OldTitle: ThtString; OldPos: Integer; @@ -1123,9 +1172,11 @@ procedure THtmlViewer.LoadFromFile(const FileName: ThtString; DocType: ThtmlFile if IsProcessing then Exit; {$ifdef FPC} - // in lazarus 1.4.0 with fpc 2.6.4 - // htmlviewer will not draw properly if focused - RemoveFocus(false); + {$if lcl_fullversion < 1050000} + // in lazarus 1.4.0 with fpc 2.6.4 + // htmlviewer will not draw properly if focused + RemoveFocus(false); + {$ifend} {$endif} if Filename <> '' then begin @@ -1205,6 +1256,13 @@ procedure THtmlViewer.LoadFromDocument(Document: TBuffer; const Reference: ThtSt {----------------THtmlViewer.LoadFromString} procedure THtmlViewer.LoadFromString(const S: ThtString; const Reference: ThtString; DocType: THtmlFileType); begin +{$ifdef FPC} + {$if lcl_fullversion < 1050000} + // in lazarus 1.4.0 with fpc 2.6.4 + // htmlviewer will not draw properly if focused + RemoveFocus(false); + {$ifend} +{$endif} LoadString(S, Reference, DocType); end; @@ -1221,9 +1279,22 @@ procedure THtmlViewer.Load(const Url: ThtString); procedure THtmlViewer.LoadFromUrl(const Url: ThtString; DocType: THtmlFileType); var Scheme, Specific, ResType: ThtString; + I, L: Integer; begin SplitScheme(Url, Scheme, Specific); - if Scheme = 'res' then + if Scheme = 'source' then // 'source://' + begin + I := 1; + L := Length(Specific); + while (I <= L) and (Specific[I] = '/') do + Inc(I); + if I > 1 then + Specific := Copy(Specific, I, L); + if DocType = OtherType then + DocType := HTMLType; + LoadFromString( Specific, '', DocType ); + end + else if Scheme = 'res' then // 'res:///' begin Specific := HTMLToRes(Url, ResType); LoadFromResource(HInstance, Specific, DocType); @@ -1241,9 +1312,11 @@ procedure THtmlViewer.LoadDocument(Document: TBuffer; const DocName: ThtString; if IsProcessing then Exit; {$ifdef FPC} - // in lazarus 1.4.0 with fpc 2.6.4 - // htmlviewer will not draw properly if focused - RemoveFocus(false); + {$if lcl_fullversion < 1050000} + // in lazarus 1.4.0 with fpc 2.6.4 + // htmlviewer will not draw properly if focused + RemoveFocus(false); + {$ifend} {$endif} SplitDest(DocName, Name, Dest); case DocType of @@ -1267,6 +1340,8 @@ procedure THtmlViewer.LoadDocument(Document: TBuffer; const DocName: ThtString; Include(FViewerState, vsDontDraw); try FRefreshDelay := 0; + AllMyFonts.Clear; + FSectionList.PixelsPerInch := PixelsPerInch; FSectionList.ProgressStart := 75; htProgressInit; try @@ -1332,7 +1407,7 @@ procedure THtmlViewer.LoadDocument(Document: TBuffer; const DocName: ThtString; end; finally Exclude(FViewerState, vsDontDraw); - if LoadCursor <> crNone then + if LoadCursor <> crDefault then Screen.Cursor := OldCursor; end; finally @@ -1348,6 +1423,8 @@ procedure THtmlViewer.LoadDocument(Document: TBuffer; const DocName: ThtString; procedure THtmlViewer.Loaded; begin inherited; + FPaintPanel.Color := Color; // MV, 20.12.2020: issue 139. paint panel should accept default background color + {$ifdef HasGestures} FPaintPanel.Touch := Touch; if Assigned(OnGesture) then @@ -1355,6 +1432,7 @@ procedure THtmlViewer.Loaded; else FPaintPanel.OnGesture := HtmlGesture; {$endif} + LoadFromString(FText); end; {----------------THtmlViewer.LoadString} @@ -1368,7 +1446,7 @@ procedure THtmlViewer.LoadString(const Source, Reference: ThtString; ft: ThtmlFi {----------------THtmlViewer.LoadFromStream} -procedure THtmlViewer.LoadFromStream(const AStream: TStream; const Reference: ThtString; DocType: ThtmlFileType); +procedure THtmlViewer.LoadFromStream(const AStream: TStream; const Reference: ThtString; DocType: THtmlFileType); begin LoadStream(Reference, AStream, DocType); end; @@ -1407,9 +1485,11 @@ procedure THtmlViewer.LoadFromResource(HInstance: THandle; const ResourceName: T if IsProcessing then Exit; {$ifdef FPC} - // in lazarus 1.4.0 with fpc 2.6.4 - // htmlviewer will not draw properly if focused - RemoveFocus(false); + {$if lcl_fullversion < 1050000} + // in lazarus 1.4.0 with fpc 2.6.4 + // htmlviewer will not draw properly if focused + RemoveFocus(false); + {$ifend} {$endif} if ResourceName <> '' then begin @@ -1473,13 +1553,13 @@ function THtmlViewer.GetScrollInfo(DocWidth, DocHeight: Integer): ThtScrollInfo; BWidth2 := BorderPanel.Width - BorderPanel.ClientWidth; BWidth := BWidth2 div 2; end; - HWidth := Width - BWidth2; - VHeight := Height - BWidth2; + HWidth := Max(Width - BWidth2, 0); + VHeight := Max(Height - BWidth2, 0); case FScrollBars of ssVertical: begin - VBar := (htShowVScroll in htOptions) or (DocHeight > VHeight); + VBar := (HWidth > sbWidth) and ((htShowVScroll in htOptions) or (DocHeight > VHeight)); if VBar then Dec(HWidth, sbWidth); HBar := False; @@ -1488,21 +1568,21 @@ function THtmlViewer.GetScrollInfo(DocWidth, DocHeight: Integer): ThtScrollInfo; ssHorizontal: begin VBar := False; - HBar := DocWidth > HWidth; + HBar := (VHeight > sbWidth) and (DocWidth > HWidth); if HBar then Dec(VHeight, sbWidth); end; ssBoth: begin - VBar := (htShowVScroll in htOptions) or (DocHeight > VHeight); + VBar := (HWidth > sbWidth) and ((htShowVScroll in htOptions) or (DocHeight > VHeight)); if VBar then Dec(HWidth, sbWidth); - HBar := DocWidth > HWidth; + HBar := (VHeight > sbWidth) and (DocWidth > HWidth); if HBar then begin Dec(VHeight, sbWidth); - if not VBar and (DocHeight > VHeight) then + if not VBar and (HWidth > sbWidth) and (DocHeight > VHeight) then begin VBar := True; Dec(HWidth, sbWidth); @@ -1547,11 +1627,12 @@ procedure THtmlViewer.DoScrollBars; begin FScrollWidth := Min(ScrollWidth, MaxHScroll); ScrollInfo := GetScrollInfo(ScrollWidth, FMaxVertical); + PaintPanel.Align := alNone; with ScrollInfo do begin // BorderPanel.Visible := BWidth > 0; PaintPanelRect := Rect(BWidth, BWidth, HWidth, VHeight); - PaintPanel.SetBounds(BWidth, BWidth, HWidth, VHeight); + FPaintPanel.SetBounds(BWidth, BWidth, HWidth, VHeight); end; if not SameRect(PaintPanelRect, PaintPanel.BoundsRect) then begin @@ -1561,7 +1642,7 @@ procedure THtmlViewer.DoScrollBars; begin // BorderPanel.Visible := BWidth > 0; PaintPanelRect := Rect(BWidth, BWidth, HWidth, VHeight); - PaintPanel.SetBounds(BWidth, BWidth, HWidth, VHeight); + FPaintPanel.SetBounds(BWidth, BWidth, HWidth, VHeight); end; end; @@ -1883,7 +1964,7 @@ procedure THtmlViewer.WMUrlAction(var Message: TMessage); UrlAction; end; -procedure THtmlViewer.URLAction; +procedure THtmlViewer.UrlAction; var S, Dest: ThtString; OldPos: Integer; @@ -1930,6 +2011,49 @@ procedure THtmlViewer.URLAction; end; end; +//-- BG ------------------------------------------------------- 06.12.2022 -- +// Extracted from THtmlViewer.InitLoad and THtmlViewer.Clear +procedure THtmlViewer.InitSectionList; +var + LDefFontName: string; + LDefFontSize: Integer; + LDefFontColor: Integer; + LDefBackgroundColor: Integer; +begin + if ParentFont then + begin + LDefFontName := Font.Name; + LDefFontSize := Font.Size; + LDefFontColor := Font.Color; + end + else + begin + LDefFontName := DefFontName; + LDefFontSize := DefFontSize; + LDefFontColor := DefFontColor; + end; + + if ParentColor then + begin + LDefBackgroundColor := Color; + FPaintPanel.ParentColor := True; + end + else + begin + LDefBackgroundColor := DefBackground; + FPaintPanel.Color := DefBackground; + end; + + FSectionList.SetFonts( + htString(LDefFontName), htString(DefPreFontName), + LDefFontSize, LDefFontColor, + DefHotSpotColor, DefVisitedLinkColor, DefOverLinkColor, + LDefBackgroundColor, + htOverLinksActive in FOptions, + not (htNoLinkUnderline in FOptions), + CodePage, CharSet, MarginHeight, MarginWidth); +end; + {----------------THtmlViewer.AddVisitedLink} procedure THtmlViewer.AddVisitedLink(const S: ThtString); @@ -1975,6 +2099,15 @@ function THtmlViewer.IsProcessing: Boolean; // assert(False, 'Viewer processing. Data may get lost!'); end; +{$ifdef LCL} +//-- BG ------------------------------------------------------- 03.10.2022 -- +procedure THtmlViewer.SetPPI(Value: Integer); +begin + inherited SetPPI(Value); + FPaintPanel.Canvas.Font.PixelsPerInch := Value; +end; +{$endif} + {----------------THtmlViewer.CheckVisitedLinks} procedure THtmlViewer.CheckVisitedLinks; @@ -2660,9 +2793,14 @@ procedure THtmlViewer.SetViewImages(Value: Boolean); Exit; if Value <> FSectionList.ShowImages then begin - OldCursor := Screen.Cursor; + if LoadCursor <> crDefault then + begin + OldCursor := Screen.Cursor; + Screen.Cursor := LoadCursor; + end + else + OldCursor := crDefault; // valium for the compiler try - Screen.Cursor := crHourGlass; SetProcessing(True); FSectionList.ShowImages := Value; if FSectionList.Count > 0 then @@ -2674,7 +2812,8 @@ procedure THtmlViewer.SetViewImages(Value: Boolean); Invalidate; end; finally - Screen.Cursor := OldCursor; + if LoadCursor <> crDefault then + Screen.Cursor := OldCursor; SetProcessing(False); end; end; @@ -2833,7 +2972,23 @@ procedure THtmlViewer.SetDefBackground(const Value: TColor); //-- BG ---------------------------------------------------------- 19.07.2017 -- procedure THtmlViewer.SetText(const Value: ThtString); begin - LoadFromString(Value); +// if csLoading in ComponentState then +// FText := Value +// else +// begin +//{$ifdef LCL} +// FText := Value; +// FPaintPanel.Color := Color; +// LoadFromString(Value); +//{$else} +// LoadFromString(Value); +//{$endif} +// end; + if FText <> Value then + begin + FText := Value; + Retext(rtmNewText); + end; end; procedure THtmlViewer.SetBorderStyle(Value: THTMLBorderStyle); @@ -2973,6 +3128,21 @@ function THtmlViewer.GetPosition: Integer; HiWord = 0 is top of display} end; +//-- BG ---------------------------------------------------------- 29.09.2022 -- +procedure THtmlViewer.ScaleChanged; +begin + inherited; + try + Retext(rtmRetext); + finally + {$ifdef Linux} + PaintPanel.Update; + {$else} + PaintPanel.Invalidate; + {$endif} + end; +end; + procedure THtmlViewer.SetPosition(Value: Integer); var TopPos: Integer; @@ -3039,7 +3209,7 @@ function THtmlViewer.GetPalette: HPALETTE; Invalidate; end; -function THtmlViewer.HTMLExpandFilename(const Filename, CurrentFilename: ThtString): ThtString; +function THtmlViewer.HtmlExpandFilename(const Filename, CurrentFilename: ThtString): ThtString; var FileScheme: ThtString; FileSpecific: ThtString; @@ -3288,6 +3458,21 @@ procedure THtmlViewer.StopTimers; FImagesInserted.Enabled := False; end; +//-- BG ---------------------------------------------------------- 10.12.2022 -- +procedure THtmlViewer.StyleChanged; +begin + inherited; + try + Retext(rtmRetext); + finally + {$ifdef Linux} + PaintPanel.Update; + {$else} + PaintPanel.Invalidate; + {$endif} + end; +end; + function THtmlViewer.GetCursor: TCursor; begin Result := inherited Cursor; @@ -3315,7 +3500,7 @@ function THtmlViewer.GetDocumentSource: ThtString; FDocument.Position := Pos; end else - Result := ''; + Result := FText; end; procedure THtmlViewer.SetCursor(Value: TCursor); @@ -3383,11 +3568,11 @@ procedure THtmlViewer.DoBackground1(ACanvas: TCanvas; ATop, AWidth, AHeight, Ful {Calculate where the tiled background images go} CalcBackgroundLocationAndTiling(PRec, ARect, XOff, YOff, IW, IH, BW, BH, X, Y, X2, Y2); - DrawBackground(ACanvas, ARect, X, Y, X2, Y2, Image, BW, BH, PaintPanel.Color); + DrawBackground(ACanvas, ARect, X, Y, X2, Y2, Image, BW, BH, ThemedColorToRGB( PaintPanel.Color, htseClient )); end else begin {no background image, show color only} - DrawBackground(ACanvas, ARect, 0, 0, 0, 0, nil, 0, 0, PaintPanel.Color); + DrawBackground(ACanvas, ARect, 0, 0, 0, 0, nil, 0, 0, ThemedColorToRGB( PaintPanel.Color, htseClient )); end; end; @@ -3413,7 +3598,7 @@ procedure THtmlViewer.DoBackground2(ACanvas: TCanvas; ALeft, ATop, AWidth, AHeig OldPal := SelectPalette(DC, ThePalette, False); RealizePalette(DC); // ACanvas.Brush.Color := BGColor or PalRelative; - ACanvas.Brush.Color := ThemedColor(BGColor {$ifdef has_StyleElements},seClient in StyleElements {$endif}) or PalRelative; + ACanvas.Brush.Color := ThemedColorToRGB(BGColor, htseClient) or PalRelative; OldBrush := SelectObject(DC, ACanvas.Brush.Handle); OldBack := SetBkColor(DC, clWhite); OldFore := SetTextColor(DC, clBlack); @@ -3642,7 +3827,7 @@ function THtmlViewer.MakePagedMetaFiles(Width, Height: Integer): TList; procedure PaintBackground(Canvas: TCanvas; Top, Bot: Integer); begin - Canvas.Brush.Color := ThemedColor(CopyList.Background{$ifdef has_StyleElements},seClient in StyleElements {$endif}); + Canvas.Brush.Color := ThemedColorToRGB(CopyList.Background, htseClient); Canvas.Brush.Style := bsSolid; Canvas.FillRect(Rect(0, Top, Width + 1, Bot)); end; @@ -3838,7 +4023,7 @@ procedure THtmlViewer.MatchMediaQuery(Sender: TObject; const MediaQuery: ThtMedi else begin Len := Abs(Font.Size); - Len := LengthConv(Expression.Expression, False, Base, Len, Len div 2, -1); + Len := LengthConv(Expression.Expression, False, Base, Len, Len div 2, -1, PixelsPerInch); Result := (Len >= 0) and Compared(Value, Len); end; end; @@ -3884,6 +4069,7 @@ procedure THtmlViewer.MatchMediaQuery(Sender: TObject; const MediaQuery: ThtMedi OK := False; if (MediaQuery.MediaType in [mtAll, mtScreen]) xor MediaQuery.Negated then begin + OK := True; // even there are no expressions, we force to re-init OK-value valid, because it matches for I := Low(MediaQuery.Expressions) to High(MediaQuery.Expressions) do begin OK := EvaluateExpression(MediaQuery.Expressions[I]); @@ -3907,7 +4093,7 @@ function THtmlViewer.CreateIFrameControl: TViewerBase; {$ifndef NoMetafile} -procedure THtmlViewer.Print(FromPage, ToPage: Integer; Prn: TvwPrinter); +procedure THtmlViewer.Print(FromPage, ToPage: Integer; Prn: ThtPrinter); var Done: Boolean; begin @@ -3924,7 +4110,7 @@ procedure THtmlViewer.Print(FromPage, ToPage: Integer; Prn: TvwPrinter); Print(vwP, FromPage, ToPage, ppMultiPrint) else begin - Prn := TvwPrinter.Create; + Prn := TvwPrinter.Create(Self); try Print(Prn, FromPage, ToPage, ppSinglePrint); finally @@ -3938,7 +4124,7 @@ procedure THtmlViewer.Print(FromPage, ToPage: Integer; Prn: TvwPrinter); procedure THtmlViewer.OpenPrint; begin if vwP = nil then - vwP := TvwPrinter.Create; + vwP := TMetaFilePrinter.Create(Self); end; procedure THtmlViewer.ClosePrint; @@ -4213,7 +4399,7 @@ function THtmlViewer.Print(Prn: ThtPrinter; FromPage: Integer; ToPage: Integer; YDpi := Prn.PixelsPerInchY; XDpi := Prn.PixelsPerInchX; - WDpi := Round(Screen.PixelsPerInch * PrintScale); + WDpi := Round(PixelsPerInch * PrintScale); ScaleX := 100.0 / YDpi; ScaleY := 100.0 / XDpi; PrintList.ScaleX := ScaleX; @@ -4239,8 +4425,7 @@ function THtmlViewer.Print(Prn: ThtPrinter; FromPage: Integer; ToPage: Integer; if Margins.Bottom < 0 then Margins.Bottom := 0; { assume no bottom printing offset } - { which results in LowerRightPoint containing the BOTTOM and RIGHT unprintable area offset; - using these we modify the (logical, true) borders...} + { using these Margins we modify the (logical, true) borders...} Wx := WDpi / XDpi; MLeftPrn := Trunc(PrintMarginLeft / 2.54 * XDpi) - Margins.Left; @@ -4625,7 +4810,7 @@ function THtmlViewer.Find(const S: UnicodeString; MatchCase: Boolean): Boolean; Result := FindEx(S, MatchCase, False); end; -function THtmlViewer.FindEx(const S: UnicodeString; MatchCase, Reverse: Boolean): Boolean; +function THtmlViewer.FindEx(const S: UnicodeString; MatchCase, AReverse: Boolean): Boolean; var Curs: Integer; X: Integer; @@ -4641,7 +4826,7 @@ function THtmlViewer.FindEx(const S: UnicodeString; MatchCase, Reverse: Boolean) S1 := S else S1 := htLowerCase(S); - if Reverse then + if AReverse then Curs := FindStringR(CaretPos, S1, MatchCase) else Curs := FindString(CaretPos, S1, MatchCase); @@ -4650,7 +4835,7 @@ function THtmlViewer.FindEx(const S: UnicodeString; MatchCase, Reverse: Boolean) Result := True; SelB := Curs; SelE := Curs + Length(S); - if Reverse then + if AReverse then CaretPos := SelB else CaretPos := SelE; @@ -4725,11 +4910,8 @@ procedure THtmlViewer.InitLoad; FSectionList.StyleElements := Self.StyleElements; {$endif} UpdateImageCache; - FSectionList.SetFonts( - htString(DefFontName), htString(DefPreFontName), DefFontSize, DefFontColor, - DefHotSpotColor, DefVisitedLinkColor, DefOverLinkColor, DefBackground, - htOverLinksActive in FOptions, not (htNoLinkUnderline in FOptions), - CodePage, CharSet, MarginHeight, MarginWidth); + + InitSectionList; end; {----------------THtmlViewer.Clear} @@ -4751,11 +4933,10 @@ procedure THtmlViewer.Clear; FCurrentFile := ''; FCurrentFileType := HTMLType; - FSectionList.SetFonts( - htString(DefFontName), htString(DefPreFontName), DefFontSize, DefFontColor, - DefHotSpotColor, DefVisitedLinkColor, DefOverLinkColor, DefBackground, - htOverLinksActive in FOptions, not (htNoLinkUnderline in FOptions), - CodePage, CharSet, MarginHeight, MarginWidth); + FObjects.Clear; + + InitSectionList; + FBase := ''; FBaseEx := ''; FBaseTarget := ''; @@ -5086,6 +5267,17 @@ procedure THtmlViewer.SetSelStart(Value: Integer); end; end; +{$ifdef DEBUG} +procedure THtmlViewer.SetName(const NewName: TComponentName); +begin + inherited; + FBorderPanel.Name := NewName + '_BorderPanel'; + FPaintPanel.Name := NewName + '_PaintPanel'; + FHScrollBar.Name := NewName + '_HScrollBar'; + FVScrollBar.Name := NewName + '_VScrollBar'; +end; +{$endif} + procedure THtmlViewer.SetNoSelect(const Value: Boolean); begin if Value <> NoSelect then @@ -5197,7 +5389,7 @@ procedure THtmlViewer.SetScrollBars(Value: ThtScrollStyle); {----------------THtmlViewer.Reload} -procedure THtmlViewer.Reload; {reload the last file} +procedure THtmlViewer.Reload; {reload the current file} var Pos: Integer; begin @@ -5209,7 +5401,45 @@ procedure THtmlViewer.Reload; {reload the last file} end; end; -{----------------THtmlViewer.GetOurPalette:} +{----------------THtmlViewer.Retext} + +//-- BG ------------------------------------------------------- 01.01.2023 -- +procedure THtmlViewer.Retext(Value: ThtRetextMode); +begin + if FMustRetext < Value then + FMustRetext := Value; + if HandleAllocated then + PostMessage(Handle, wm_Retext, 0, 0) +end; + +//-- BG ------------------------------------------------------- 01.01.2023 -- +procedure THtmlViewer.WMRetext(var Message: TMessage); +begin + Retext; +end; + +//-- BG ------------------------------------------------------- 10.12.2022 -- +procedure THtmlViewer.Retext; {reload the current text} +var + Pos, Sel, Len: Integer; +begin + if FMustRetext <> rtmNone then + begin + Pos := Position; + Sel := SelStart; + Len := SelLength; + case FMustRetext of + rtmRetext: LoadFromString(Text); + rtmNewText: LoadFromString(FText); + end; + FMustRetext := rtmNone; + Position := Pos; + SelStart := Sel; + SelLength := Len; + end; +end; + +{----------------THtmlViewer.GetOurPalette} function THtmlViewer.GetOurPalette: HPalette; begin @@ -5310,7 +5540,7 @@ procedure THtmlViewer.HistoryForward; HistoryIndex := HistoryIndex - 1; end; -procedure THtmlViewer.SetOptions(Value: ThtmlViewerOptions); +procedure THtmlViewer.SetOptions(Value: THtmlViewerOptions); begin if Value <> FOptions then begin @@ -5534,7 +5764,7 @@ procedure THtmlViewer.htStreamRequest(var Url: ThtString; var Stream: TStream; o else begin PathOfUrl := ExtractFilePath(Url); - if FileExists(Url) then + if htFileExists(Url) then Stream := TFileStream.Create( htStringToString(Url), fmOpenRead or fmShareDenyWrite); end; @@ -5627,9 +5857,9 @@ procedure TPaintPanel.Paint; SelectObject(MemDC, Bm); SetWindowOrgEx(MemDC, X, Y, nil); Canvas2.Font := Font; - Canvas2.Font.Color := ThemedColor(Font.Color{$ifdef has_StyleElements},seFont in StyleElements {$endif}); + Canvas2.Font.Color := FViewer.ThemedColorToRGB(Font.Color, htseFont); Canvas2.Handle := MemDC; - Canvas2.Brush.Color := ThemedColor(Color{$ifdef has_StyleElements},seClient in StyleElements {$endif}); + Canvas2.Brush.Color := FViewer.ThemedColorToRGB(Color, htseClient); Canvas2.Brush.Style := bsSolid; FViewer.DrawBorder; FViewer.HTMLPaint(Canvas2, Rect); @@ -5652,7 +5882,7 @@ procedure TPaintPanel.Paint; // of frameviewer, if some images have to be shown // (Happened in FrameDemo on page 'samples' with images pengbrew and pyramids). Canvas.Font := Font; - Canvas.Brush.Color := ThemedColor(Color{$ifdef has_StyleElements},seClient in StyleElements {$endif}); + Canvas.Brush.Color := FViewer.ThemedColorToRGB(Color, htseClient); Canvas.Brush.Style := bsSolid; FViewer.DrawBorder; FViewer.HTMLPaint(Canvas, Canvas.ClipRect); @@ -5702,7 +5932,11 @@ procedure THistory.Clear; constructor THistory.Create; begin inherited Create; +{$ifdef UseGenerics} + FHistory := TObjectList.Create; +{$else} FHistory := TObjectList.Create; +{$endif} end; //-- BG ---------------------------------------------------------- 02.01.2012 -- diff --git a/Ext/HTMLViewer/Source/vwPrint.pas b/Ext/HTMLViewer/Source/vwPrint.pas index a6806ac..45e9032 100644 --- a/Ext/HTMLViewer/Source/vwPrint.pas +++ b/Ext/HTMLViewer/Source/vwPrint.pas @@ -1,8 +1,8 @@ { -Version 11.7 +Version 11.10 Copyright (c) 1995-2008 by L. David Baldwin Copyright (c) 2008-2010 by HtmlViewer Team -Copyright (c) 2011-2016 by Bernd Gabriel +Copyright (c) 2011-2022 by Bernd Gabriel Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -40,78 +40,41 @@ interface uses - {$ifdef FPC} - RtlConsts, +{$ifdef FPC} + RtlConsts, LclType, HtmlMisc, - {$IFDEF MSWindows} - WinUtilPrn, - {$else} - {$endif} - LCLVersion, + {$IFDEF MSWindows} + WinUtilPrn, {$else} - Consts, - {$endif} - {$ifdef MSWINDOWS} - Windows, {$endif} + LCLVersion, +{$else} + Consts, +{$endif} +{$ifdef MSWINDOWS} + Windows, +{$endif} +{$ifdef UseGenerics} + System.Generics.Collections, +{$endif} SysUtils, Forms, Contnrs, Classes, Graphics, Printers, - HtmlGlobals; + HtmlGlobals, + HtmlPrinter; type - - // BG, 30.01.2012: base class for TvwPrinter and TMetaFilePrinter - // Allows merging the lengthy duplicate methods THtmlViewer.Print() - // and THtmlViewer.PrintPreview() at last. - ThtPrinter = class(TComponent) - private - FOffsetX: Integer; // Physical Printable Area x margin - FOffsetY: Integer; // Physical Printable Area y margin - FPaperHeight: Integer; // Physical Height in device units - FPaperWidth: Integer; // Physical Width in device units - FPgHeight: Integer; // Vertical height in pixels - FPgWidth: Integer; // Horizontal width in pixels - FPPIX: Integer; // Logical pixels per inch in X - FPPIY: Integer; // Logical pixels per inch in Y - FPrinting: Boolean; - FTitle: ThtString; // Printed Document's Title - protected - function GetCanvas: TCanvas; virtual; abstract; - function GetPageNum: Integer; virtual; abstract; - procedure CheckPrinting(Value: Boolean); - procedure GetPrinterCapsOf(Printer: TPrinter); - procedure SetPrinting(Value: Boolean); - public - procedure BeginDoc; virtual; abstract; - procedure NewPage; virtual; abstract; - procedure EndDoc; virtual; abstract; - procedure Abort; virtual; abstract; - procedure Assign(Source: TPersistent); override; - property Canvas: TCanvas read GetCanvas; - property OffsetX: Integer read FOffsetX; - property OffsetY: Integer read FOffsetY; - property PageNumber: Integer read GetPageNum; - property PageHeight: Integer read FPgHeight; - property PageWidth: Integer read FPgWidth; - property PaperHeight: Integer read FPaperHeight; - property PaperWidth: Integer read FPaperWidth; - property PixelsPerInchX: Integer read FPPIX; - property PixelsPerInchY: Integer read FPPIY; - property Printing: Boolean read FPrinting; // becomes True in BeginDoc and back to False in EndDoc. - property Title: ThtString read FTitle write FTitle; - end; - TvwPrinterState = (psNoHandle, psHandleIC, psHandleDC); TvwPrinter = class(ThtPrinter) private FCanvas: TCanvas; FPageNumber: Integer; - FAborted: Boolean; State: TvwPrinterState; DC: HDC; +{$ifdef MSWINDOWS} DevMode: {$if lcl_fullversion >= 1080000} PDeviceModeW {$else} PDeviceMode {$ifend}; +{$endif} DeviceMode: HGLOBAL; procedure SetState(Value: TvwPrinterState); function GetHandle: HDC; @@ -125,7 +88,6 @@ TvwPrinter = class(ThtPrinter) procedure BeginDoc; override; procedure EndDoc; override; procedure NewPage; override; - property Aborted: Boolean read FAborted; property Handle: HDC read GetHandle; end; @@ -144,7 +106,11 @@ TMapItem = class(TObject) // BG, 29.01.2012: allow multiple prints of several THtmlViewer components at a time. TMap = class(TObject) private +{$ifdef UseGenerics} + FItems: TObjectList; +{$else} FItems: TObjectList; +{$endif} function GetItem(Index: HDC): TMapItem; property Items[Index: HDC]: TMapItem read GetItem; public @@ -165,7 +131,7 @@ procedure RaiseError(const Msg: string); function AbortProc(Prn: HDC; Error: Integer): Bool; stdcall; var - Printer: TvwPrinter; + Printer: ThtPrinter; begin Application.ProcessMessages; if FPrinters <> nil then @@ -193,7 +159,11 @@ constructor TMapItem.Create(Key: HDC; Value: Pointer); constructor TMap.Create; begin inherited Create; +{$ifdef UseGenerics} + FItems := TObjectList.Create; +{$else} FItems := TObjectList.Create; +{$endif} end; //-- BG ---------------------------------------------------------- 29.01.2012 -- @@ -255,68 +225,6 @@ function TMap.Remove(Key: HDC): Pointer; Result := nil; end; -{ ThtPrinter } - -//-- BG ---------------------------------------------------------- 29.01.2012 -- -procedure ThtPrinter.Assign(Source: TPersistent); -var - Src: ThtPrinter absolute Source; -begin - inherited; - if Source is ThtPrinter then - begin - FPPIX := Src.FPPIX; - FPPIY := Src.FPPIY; - FPaperWidth := Src.FPaperWidth; - FPaperHeight := Src.FPaperHeight; - FOffsetX := Src.FOffsetX; - FOffsetY := Src.FOffsetY; - FPgHeight := Src.FPgHeight; - FPgWidth := Src.FPgWidth; - end; -end; - -procedure ThtPrinter.CheckPrinting(Value: Boolean); -begin - if Printing <> Value then - if Value then - RaiseError(SNotPrinting) - else - RaiseError(SPrinting); -end; - -//-- BG ---------------------------------------------------------- 29.01.2012 -- -procedure ThtPrinter.GetPrinterCapsOf(Printer: TPrinter); -begin - if Printer.Printers.Count = 0 then - raise Exception.Create('Printer not available'); - -{$ifdef LCL} - FPPIX := Printer.XDPI; - FPPIY := Printer.YDPI; - FPaperWidth := Printer.PaperSize.PaperRect.PhysicalRect.Right; - FPaperHeight := Printer.PaperSize.PaperRect.PhysicalRect.Bottom; - FOffsetX := Printer.PaperSize.PaperRect.WorkRect.Left; - FOffsetY := Printer.PaperSize.PaperRect.WorkRect.Top; - FPgHeight := Printer.PageHeight; - FPgWidth := Printer.PageWidth; -{$else} - FPPIX := GetDeviceCaps(Printer.Handle, LOGPIXELSX); - FPPIY := GetDeviceCaps(Printer.Handle, LOGPIXELSY); - FPaperWidth := GetDeviceCaps(Printer.Handle, PHYSICALWIDTH); - FPaperHeight := GetDeviceCaps(Printer.Handle, PHYSICALHEIGHT); - FOffsetX := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX); - FOffsetY := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY); - FPgHeight := Printer.PageHeight; - FPgWidth := Printer.PageWidth; -{$endif} -end; - -procedure ThtPrinter.SetPrinting(Value: Boolean); -begin - FPrinting := Value; -end; - { TPrinterCanvas } type @@ -418,7 +326,9 @@ procedure TvwPrinter.SetState(Value: TvwPrinterState); TmpDeviceMode: HGLOBAL; Driver, Device, Port: array[0..200] of {$ifdef UNICODE} WideChar {$else} char {$endif}; begin + {$warn SYMBOL_DEPRECATED off} Printers.Printer.GetPrinter(Device, Driver, Port, TmpDeviceMode); + {$warn SYMBOL_DEPRECATED on} if DeviceMode <> 0 then begin GlobalUnlock(DeviceMode); @@ -492,7 +402,7 @@ procedure TvwPrinter.Abort; {$ifdef MsWindows} AbortDoc(Canvas.Handle); {$endif} - FAborted := True; + SetAborted(True); EndDoc; end; @@ -506,7 +416,7 @@ procedure TvwPrinter.BeginDoc; SetState(psHandleDC); GetPrinterCapsOf(Printer); Canvas.Refresh; - FAborted := False; + SetAborted(False); FPageNumber := 1; {$ifdef MsWindows} @@ -540,7 +450,7 @@ procedure TvwPrinter.EndDoc; Windows.EndDoc(DC); {$endif} SetPrinting(False); - FAborted := False; + SetAborted(False); FPageNumber := 0; if DeviceMode <> 0 then begin diff --git a/Ext/HTMLViewer/package/FrameViewer11.dpk b/Ext/HTMLViewer/package/FrameViewer11.dpk index a4b7851..c2df383 100644 --- a/Ext/HTMLViewer/package/FrameViewer11.dpk +++ b/Ext/HTMLViewer/package/FrameViewer11.dpk @@ -33,6 +33,7 @@ requires rtl, vcl, vclimg, + soaprtl, VclSmp; contains @@ -60,7 +61,7 @@ contains Htmlsbs1 in '..\source\Htmlsbs1.pas', HTMLSubs in '..\source\HTMLSubs.pas', HtmlSymb in '..\source\HtmlSymb.pas', - htmlun2 in '..\source\htmlun2.pas', + HTMLUn2 in '..\source\HTMLUn2.pas', htmlview in '..\source\htmlview.pas', MetaFilePrinter in '..\source\MetaFilePrinter.pas', ReadHTML in '..\source\ReadHTML.pas', @@ -69,6 +70,8 @@ contains StyleUn in '..\source\StyleUn.pas', URLSubs in '..\source\URLSubs.pas', UrlConn in '..\Source\UrlConn.pas', + HtmlPrinter in '..\source\HtmlPrinter.pas', vwPrint in '..\source\vwPrint.pas'; end. + diff --git a/Ext/HTMLViewer/package/FrameViewer11.dproj b/Ext/HTMLViewer/package/FrameViewer11.dproj index 8ed606c..fcb97f3 100644 --- a/Ext/HTMLViewer/package/FrameViewer11.dproj +++ b/Ext/HTMLViewer/package/FrameViewer11.dproj @@ -104,6 +104,7 @@ + @@ -131,7 +132,7 @@ - + @@ -140,11 +141,8 @@ + - - Cfg_2 - Base - Base @@ -152,6 +150,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 diff --git a/Ext/HTMLViewer/package/FrameViewer12.dpk b/Ext/HTMLViewer/package/FrameViewer12.dpk index 96ff827..e976a64 100644 --- a/Ext/HTMLViewer/package/FrameViewer12.dpk +++ b/Ext/HTMLViewer/package/FrameViewer12.dpk @@ -33,6 +33,7 @@ requires rtl, vcl, vclimg, + soaprtl, VclSmp; contains @@ -60,7 +61,7 @@ contains Htmlsbs1 in '..\source\Htmlsbs1.pas', HTMLSubs in '..\source\HTMLSubs.pas', HtmlSymb in '..\source\HtmlSymb.pas', - htmlun2 in '..\source\htmlun2.pas', + HTMLUn2 in '..\source\HTMLUn2.pas', htmlview in '..\source\htmlview.pas', MetaFilePrinter in '..\source\MetaFilePrinter.pas', ReadHTML in '..\source\ReadHTML.pas', @@ -69,6 +70,8 @@ contains StyleUn in '..\source\StyleUn.pas', URLSubs in '..\source\URLSubs.pas', UrlConn in '..\Source\UrlConn.pas', + HtmlPrinter in '..\source\HtmlPrinter.pas', vwPrint in '..\source\vwPrint.pas'; end. + diff --git a/Ext/HTMLViewer/package/FrameViewer12.dproj b/Ext/HTMLViewer/package/FrameViewer12.dproj index dd979b4..b8d5870 100644 --- a/Ext/HTMLViewer/package/FrameViewer12.dproj +++ b/Ext/HTMLViewer/package/FrameViewer12.dproj @@ -1,4 +1,4 @@ - + {5479EE3F-B70C-4EF4-8566-8730F47A2D2E} FrameViewer12.dpk @@ -7,8 +7,9 @@ 3 Package VCL - 20.0 + 20.1 Win32 + FrameViewer12 true @@ -23,6 +24,11 @@ Base true + + true + Base + true + true Base @@ -76,6 +82,13 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + 0 0 @@ -104,6 +117,7 @@ + @@ -131,7 +145,7 @@ - + @@ -140,11 +154,8 @@ + - - Cfg_2 - Base - Base @@ -152,6 +163,10 @@ Cfg_1 Base + + Cfg_2 + Base + Delphi.Personality.12 @@ -216,6 +231,7 @@ True True + False 12 diff --git a/Ext/HTMLViewer/package/FrameViewer12.res b/Ext/HTMLViewer/package/FrameViewer12.res index 27efe49b5f5b31b0c6298daa89904be58dbfef3a..3828b93bf69d4622d7b2a5afbc4c1dade66ea8e6 100644 GIT binary patch delta 13 UcmX@We1LgF10y5LdclFrameViewer12.dpk Release DCC32 - 20.0 + 20.1 VCL True Win32 1 Package + dclFrameViewer12 true @@ -24,6 +25,11 @@ Base true + + true + Base + true + true Base @@ -66,6 +72,12 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + false RELEASE;$(DCC_Define) @@ -144,6 +156,7 @@ True False + False 12 diff --git a/Ext/HTMLViewer/package/dclFrameViewer12.res b/Ext/HTMLViewer/package/dclFrameViewer12.res index a64cea33b7bbf9c30d10d7750693ab849f870abc..0bfc3cd3870a4e301d5a20d4f8d7749bcbf036e3 100644 GIT binary patch delta 13 UcmX@We1LgF10y5L -Layers201 video
+Layers201 video
![Layers301](https://user-images.githubusercontent.com/5280692/170441846-6a7d6817-f1c0-4b71-a424-d696f0cd7299.png)
-Layers301 video
+Layers301 video
![svg1](https://user-images.githubusercontent.com/5280692/170443316-f5c88659-c0cd-4e68-8933-ddcfd2aa4b8a.png)
-SVG101 video
+SVG101 video
![Vectorize](https://user-images.githubusercontent.com/5280692/180627317-5a10f862-6070-4753-ac3d-c714dfa4dc8f.png)
-Vectorize video
+Vectorize video
diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.Core.pas b/Ext/SVGIconImageList/Image32/source/Clipper.Core.pas index 09a696c..84b7a14 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.Core.pas +++ b/Ext/SVGIconImageList/Image32/source/Clipper.Core.pas @@ -2,9 +2,9 @@ (******************************************************************************* * Author : Angus Johnson * -* Date : 19 February 2023 * +* Date : 3 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2023 * +* Copyright : Angus Johnson 2010-2024 * * Purpose : Core Clipper Library module * * Contains structures and functions used throughout the library * * License : http://www.boost.org/LICENSE_1_0.txt * @@ -64,6 +64,7 @@ TPointD = record function GetWidth: Int64; {$IFDEF INLINING} inline; {$ENDIF} function GetHeight: Int64; {$IFDEF INLINING} inline; {$ENDIF} function GetIsEmpty: Boolean; {$IFDEF INLINING} inline; {$ENDIF} + function GetIsValid: Boolean; {$IFDEF INLINING} inline; {$ENDIF} function GetMidPoint: TPoint64; {$IFDEF INLINING} inline; {$ENDIF} public Left : Int64; @@ -78,6 +79,7 @@ TPointD = record property Width: Int64 read GetWidth; property Height: Int64 read GetHeight; property IsEmpty: Boolean read GetIsEmpty; + property IsValid: Boolean read GetIsValid; property MidPoint: TPoint64 read GetMidPoint; end; @@ -86,6 +88,7 @@ TPointD = record function GetWidth: double; {$IFDEF INLINING} inline; {$ENDIF} function GetHeight: double; {$IFDEF INLINING} inline; {$ENDIF} function GetIsEmpty: Boolean; {$IFDEF INLINING} inline; {$ENDIF} + function GetIsValid: Boolean; {$IFDEF INLINING} inline; {$ENDIF} function GetMidPoint: TPointD; {$IFDEF INLINING} inline; {$ENDIF} public Left : double; @@ -99,6 +102,7 @@ TPointD = record property Width: double read GetWidth; property Height: double read GetHeight; property IsEmpty: Boolean read GetIsEmpty; + property IsValid: Boolean read GetIsValid; property MidPoint: TPointD read GetMidPoint; end; @@ -120,6 +124,7 @@ TListEx = class protected function UnsafeGet(idx: integer): Pointer; // no range checking procedure UnsafeSet(idx: integer; val: Pointer); + procedure UnsafeDelete(index: integer); virtual; public constructor Create(capacity: integer = 0); virtual; destructor Destroy; override; @@ -149,7 +154,8 @@ function IsPositive(const path: TPath64): Boolean; overload; function IsPositive(const path: TPathD): Boolean; overload; {$IFDEF INLINING} inline; {$ENDIF} -function __Trunc(val: double): Int64; {$IFDEF INLINE} inline; {$ENDIF} +function IsCollinear(const pt1, pt2, pt3: TPoint64): Boolean; + {$IFDEF INLINING} inline; {$ENDIF} function CrossProduct(const pt1, pt2, pt3: TPoint64): double; overload; {$IFDEF INLINING} inline; {$ENDIF} @@ -167,8 +173,8 @@ function DistanceSqr(const pt1, pt2: TPoint64): double; overload; {$IFDEF INLINING} inline; {$ENDIF} function DistanceSqr(const pt1, pt2: TPointD): double; overload; {$IFDEF INLINING} inline; {$ENDIF} -function DistanceFromLineSqrd(const pt, linePt1, linePt2: TPoint64): double; overload; -function DistanceFromLineSqrd(const pt, linePt1, linePt2: TPointD): double; overload; +function PerpendicDistFromLineSqrd(const pt, linePt1, linePt2: TPoint64): double; overload; +function PerpendicDistFromLineSqrd(const pt, linePt1, linePt2: TPointD): double; overload; function SegmentsIntersect(const s1a, s1b, s2a, s2b: TPoint64; inclusive: Boolean = false): boolean; {$IFDEF INLINING} inline; {$ENDIF} @@ -310,7 +316,7 @@ procedure AppendPaths(var paths: TPathsD; const extra: TPathsD); overload; function ArrayOfPathsToPaths(const ap: TArrayOfPaths): TPaths64; -function GetIntersectPoint(const ln1a, ln1b, ln2a, ln2b: TPoint64; +function GetSegmentIntersectPt(const ln1a, ln1b, ln2a, ln2b: TPoint64; out ip: TPoint64): Boolean; function PointInPolygon(const pt: TPoint64; const polygon: TPath64): TPointInPolygonResult; @@ -332,8 +338,14 @@ procedure QuickSort(SortList: TPointerList; procedure CheckPrecisionRange(var precision: integer); +function Iif(eval: Boolean; trueVal, falseVal: Boolean): Boolean; overload; +function Iif(eval: Boolean; trueVal, falseVal: integer): integer; overload; +function Iif(eval: Boolean; trueVal, falseVal: Int64): Int64; overload; +function Iif(eval: Boolean; trueVal, falseVal: double): double; overload; + const MaxInt64 = 9223372036854775807; + MinInt64 = -MaxInt64; MaxCoord = MaxInt64 div 4; MinCoord = - MaxCoord; invalid64 = MaxInt64; @@ -345,8 +357,16 @@ procedure CheckPrecisionRange(var precision: integer); InvalidPtD : TPointD = (X: invalidD; Y: invalidD); NullRectD : TRectD = (left: 0; top: 0; right: 0; Bottom: 0); + InvalidRect64 : TRect64 = + (left: invalid64; top: invalid64; right: invalid64; bottom: invalid64); + InvalidRectD : TRectD = + (left: invalidD; top: invalidD; right: invalidD; bottom: invalidD); + Tolerance : Double = 1.0E-12; + //https://github.com/AngusJohnson/Clipper2/discussions/564 + MaxDecimalPrecision = 8; + implementation resourcestring @@ -374,6 +394,12 @@ function TRect64.GetIsEmpty: Boolean; end; //------------------------------------------------------------------------------ +function TRect64.GetIsValid: Boolean; +begin + result := left <> invalid64; +end; +//------------------------------------------------------------------------------ + function TRect64.GetMidPoint: TPoint64; begin result := Point64((Left + Right) div 2, (Top + Bottom) div 2); @@ -446,6 +472,12 @@ function TRectD.GetIsEmpty: Boolean; end; //------------------------------------------------------------------------------ +function TRectD.GetIsValid: Boolean; +begin + result := left <> invalidD; +end; +//------------------------------------------------------------------------------ + function TRectD.GetMidPoint: TPointD; begin result := PointD((Left + Right) *0.5, (Top + Bottom) *0.5); @@ -608,6 +640,14 @@ procedure TListEx.UnsafeSet(idx: integer; val: Pointer); end; //------------------------------------------------------------------------------ +procedure TListEx.UnsafeDelete(index: integer); +begin + dec(fCount); + if index < fCount then + Move(fList[index +1], fList[index], (fCount - index) * SizeOf(Pointer)); +end; +//------------------------------------------------------------------------------ + procedure TListEx.Swap(idx1, idx2: integer); var p: Pointer; @@ -621,9 +661,37 @@ procedure TListEx.Swap(idx1, idx2: integer); // Miscellaneous Functions ... //------------------------------------------------------------------------------ +function Iif(eval: Boolean; trueVal, falseVal: Boolean): Boolean; + {$IFDEF INLINING} inline; {$ENDIF} +begin + if eval then Result := trueVal else Result := falseVal; +end; +//------------------------------------------------------------------------------ + +function Iif(eval: Boolean; trueVal, falseVal: integer): integer; + {$IFDEF INLINING} inline; {$ENDIF} +begin + if eval then Result := trueVal else Result := falseVal; +end; +//------------------------------------------------------------------------------ + +function Iif(eval: Boolean; trueVal, falseVal: Int64): Int64; + {$IFDEF INLINING} inline; {$ENDIF} +begin + if eval then Result := trueVal else Result := falseVal; +end; +//------------------------------------------------------------------------------ + +function Iif(eval: Boolean; trueVal, falseVal: double): double; + {$IFDEF INLINING} inline; {$ENDIF} +begin + if eval then Result := trueVal else Result := falseVal; +end; +//------------------------------------------------------------------------------ + procedure CheckPrecisionRange(var precision: integer); begin - if (precision < -8) or (precision > 8) then + if (precision < -MaxDecimalPrecision) or (precision > MaxDecimalPrecision) then Raise EClipper2LibException(rsClipper_PrecisonErr); end; //------------------------------------------------------------------------------ @@ -762,6 +830,9 @@ function ScalePath(const path: TPath64; sx, sy: double): TPath64; begin result[i].X := Round(path[i].X * sx); result[i].Y := Round(path[i].Y * sy); +{$IFDEF USINGZ} + result[i].Z := path[i].Z; +{$ENDIF} end; end; //------------------------------------------------------------------------------ @@ -778,10 +849,16 @@ function ScalePath(const path: TPathD; sx, sy: double): TPath64; j := 1; result[0].X := Round(path[0].X * sx); result[0].Y := Round(path[0].Y * sy); +{$IFDEF USINGZ} + result[0].Z := path[0].Z; +{$ENDIF} for i := 1 to len -1 do begin result[j].X := Round(path[i].X * sx); result[j].Y := Round(path[i].Y * sy); +{$IFDEF USINGZ} + result[j].Z := path[i].Z; +{$ENDIF} if (result[j].X <> result[j-1].X) or (result[j].Y <> result[j-1].Y) then inc(j); end; @@ -799,10 +876,16 @@ function ScalePath(const path: TPath64; scale: double): TPath64; j := 1; result[0].X := Round(path[0].X * scale); result[0].Y := Round(path[0].Y * scale); +{$IFDEF USINGZ} + result[0].Z := path[0].Z; +{$ENDIF} for i := 1 to len -1 do begin result[j].X := Round(path[i].X * scale); result[j].Y := Round(path[i].Y * scale); +{$IFDEF USINGZ} + result[j].Z := path[i].Z; +{$ENDIF} if (result[j].X <> result[j-1].X) or (result[j].Y <> result[j-1].Y) then inc(j); end; @@ -820,6 +903,9 @@ function ScalePath(const path: TPathD; scale: double): TPath64; begin result[i].X := Round(path[i].X * scale); result[i].Y := Round(path[i].Y * scale); +{$IFDEF USINGZ} + result[i].Z := path[i].Z; +{$ENDIF} end; end; //------------------------------------------------------------------------------ @@ -859,6 +945,9 @@ function ScalePathD(const path: TPath64; sx, sy: double): TPathD; begin result[i].X := path[i].X * sx; result[i].Y := path[i].Y * sy; +{$IFDEF USINGZ} + result[i].Z := path[i].Z; +{$ENDIF} end; end; //------------------------------------------------------------------------------ @@ -872,6 +961,9 @@ function ScalePathD(const path: TPathD; sx, sy: double): TPathD; begin result[i].X := path[i].X * sx; result[i].Y := path[i].Y * sy; +{$IFDEF USINGZ} + result[i].Z := path[i].Z; +{$ENDIF} end; end; //------------------------------------------------------------------------------ @@ -922,6 +1014,9 @@ function ScalePathsD(const paths: TPaths64; sx, sy: double): TPathsD; begin result[i][j].X := (paths[i][j].X * sx); result[i][j].Y := (paths[i][j].Y * sy); +{$IFDEF USINGZ} + result[i][j].Z := paths[i][j].Z; +{$ENDIF} end; end; end; @@ -941,6 +1036,9 @@ function ScalePathsD(const paths: TPathsD; sx, sy: double): TPathsD; begin result[i][j].X := paths[i][j].X * sx; result[i][j].Y := paths[i][j].Y * sy; +{$IFDEF USINGZ} + result[i][j].Z := paths[i][j].Z; +{$ENDIF} end; end; end; @@ -1036,6 +1134,9 @@ function Path64(const pathD: TPathD): TPath64; begin Result[i].X := Round(pathD[i].X); Result[i].Y := Round(pathD[i].Y); +{$IFDEF USINGZ} + Result[i].Z := pathD[i].Z; +{$ENDIF} end; end; //------------------------------------------------------------------------------ @@ -1050,6 +1151,9 @@ function PathD(const path: TPath64): TPathD; begin Result[i].X := path[i].X; Result[i].Y := path[i].Y; +{$IFDEF USINGZ} + Result[i].Z := path[i].Z; +{$ENDIF} end; end; //------------------------------------------------------------------------------ @@ -1760,6 +1864,18 @@ function IsPositive(const path: TPathD): Boolean; end; //------------------------------------------------------------------------------ +{$OVERFLOWCHECKS OFF} +function IsCollinear(const pt1, pt2, pt3: TPoint64): Boolean; +var + a,b: Int64; +begin + a := (pt2.X - pt1.X) * (pt3.Y - pt2.Y); + b := (pt2.Y - pt1.Y) * (pt3.X - pt2.X); + result := a = b; +end; +{$OVERFLOWCHECKS ON} +//------------------------------------------------------------------------------ + function CrossProduct(const pt1, pt2, pt3: TPoint64): double; begin result := CrossProduct( @@ -1819,7 +1935,7 @@ function DistanceSqr(const pt1, pt2: TPointD): double; end; //------------------------------------------------------------------------------ -function DistanceFromLineSqrd(const pt, linePt1, linePt2: TPoint64): double; +function PerpendicDistFromLineSqrd(const pt, linePt1, linePt2: TPoint64): double; var a,b,c: double; begin @@ -1830,11 +1946,13 @@ function DistanceFromLineSqrd(const pt, linePt1, linePt2: TPoint64): double; b := (linePt2.X - linePt1.X); c := a * linePt1.X + b * linePt1.Y; c := a * pt.x + b * pt.y - c; - Result := (c * c) / (a * a + b * b); + if (a = 0) and (b = 0) then + Result := 0 else + Result := (c * c) / (a * a + b * b); end; //--------------------------------------------------------------------------- -function DistanceFromLineSqrd(const pt, linePt1, linePt2: TPointD): double; +function PerpendicDistFromLineSqrd(const pt, linePt1, linePt2: TPointD): double; var a,b,c: double; begin @@ -1842,7 +1960,9 @@ function DistanceFromLineSqrd(const pt, linePt1, linePt2: TPointD): double; b := (linePt2.X - linePt1.X); c := a * linePt1.X + b * linePt1.Y; c := a * pt.x + b * pt.y - c; - Result := (c * c) / (a * a + b * b); + if (a = 0) and (b = 0) then + Result := 0 else + Result := (c * c) / (a * a + b * b); end; //--------------------------------------------------------------------------- @@ -1854,14 +1974,14 @@ function CleanPath(const path: TPath64): TPath64; Result := nil; len := Length(path); while (len > 2) and - (CrossProduct(path[len-2], path[len-1], path[0]) = 0) do dec(len); + (IsCollinear(path[len-2], path[len-1], path[0])) do dec(len); SetLength(Result, len); if (len < 2) then Exit; prev := path[len -1]; j := 0; for i := 0 to len -2 do begin - if CrossProduct(prev, path[i], path[i+1]) = 0 then Continue; + if IsCollinear(prev, path[i], path[i+1]) then Continue; Result[j] := path[i]; inc(j); prev := path[i]; @@ -1871,6 +1991,14 @@ function CleanPath(const path: TPath64): TPath64; end; //------------------------------------------------------------------------------ +function GetSign(const val: double): integer; {$IFDEF INLINING} inline; {$ENDIF} +begin + if val = 0 then Result := 0 + else if val < 0 then Result := -1 + else Result := 1; +end; +//------------------------------------------------------------------------------ + function SegmentsIntersect(const s1a, s1b, s2a, s2b: TPoint64; inclusive: Boolean): boolean; var @@ -1890,51 +2018,18 @@ function SegmentsIntersect(const s1a, s1b, s2a, s2b: TPoint64; (res3 <> 0) or (res4 <> 0); // ensures not collinear end else begin - result := (CrossProduct(s1a, s2a, s2b) * CrossProduct(s1b, s2a, s2b) < 0) and - (CrossProduct(s2a, s1a, s1b) * CrossProduct(s2b, s1a, s1b) < 0); + result := (GetSign(CrossProduct(s1a, s2a, s2b)) * + GetSign(CrossProduct(s1b, s2a, s2b)) < 0) and + (GetSign(CrossProduct(s2a, s1a, s1b)) * + GetSign(CrossProduct(s2b, s1a, s1b)) < 0); end; end; //------------------------------------------------------------------------------ -function __Trunc(val: double): Int64; {$IFDEF INLINE} inline; {$ENDIF} -var - exp: integer; - i64: UInt64 absolute val; -const - shl51: UInt64 = UInt64(1) shl 51; -begin - Result := 0; - if i64 = 0 then Exit; - exp := Integer(Cardinal(i64 shr 52) and $7FF) - 1023; - //nb: when exp == 1024 then val == INF or NAN. - if exp < 0 then - Exit - else if exp > 52 then - begin - Result := ((i64 and $1FFFFFFFFFFFFF) shl (exp - 52)) or (UInt64(1) shl exp) - end else - begin - Result := ((i64 and $1FFFFFFFFFFFFF) shr (52 - exp)) or (UInt64(1) shl exp); - //the following line will round - //if (i64 and (shl51 shr (exp)) <> 0) then inc(Result); - end; - if val < 0 then Result := -Result; -end; -//------------------------------------------------------------------------------ - -function CheckCastInt64(val: double): Int64; {$IFDEF INLINE} inline; {$ENDIF} -begin - if (val >= MaxCoord) or (val <= MinCoord) then - Raise EClipper2LibException.Create('overflow error.'); - Result := Trunc(val); - //Result := __Trunc(val); -end; -//------------------------------------------------------------------------------ - -function GetIntersectPoint(const ln1a, ln1b, ln2a, ln2b: TPoint64; +function GetSegmentIntersectPt(const ln1a, ln1b, ln2a, ln2b: TPoint64; out ip: TPoint64): Boolean; var - dx1,dy1, dx2,dy2, qx,qy, cp: double; + dx1,dy1, dx2,dy2, t, cp: double; begin // https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection dy1 := (ln1b.y - ln1a.y); @@ -1942,16 +2037,16 @@ function GetIntersectPoint(const ln1a, ln1b, ln2a, ln2b: TPoint64; dy2 := (ln2b.y - ln2a.y); dx2 := (ln2b.x - ln2a.x); cp := dy1 * dx2 - dy2 * dx1; - if (cp = 0.0) then - begin - Result := false; - Exit; - end; - qx := dx1 * ln1a.y - dy1 * ln1a.x; - qy := dx2 * ln2a.y - dy2 * ln2a.x; - ip.X := CheckCastInt64((dx1 * qy - dx2 * qx) / cp); - ip.Y := CheckCastInt64((dy1 * qy - dy2 * qx) / cp); - Result := (ip.x <> invalid64) and (ip.y <> invalid64); + Result := (cp <> 0.0); + if not Result then Exit; + t := ((ln1a.x-ln2a.x) * dy2 - (ln1a.y-ln2a.y) * dx2) / cp; + if t <= 0.0 then ip := ln1a + else if t >= 1.0 then ip := ln1b; + ip.X := Trunc(ln1a.X + t * dx1); + ip.Y := Trunc(ln1a.Y + t * dy1); +{$IFDEF USINGZ} + ip.Z := 0; +{$ENDIF} end; //------------------------------------------------------------------------------ @@ -2119,20 +2214,6 @@ function GetClosestPointOnSegment(const pt, seg1, seg2: TPoint64): TPoint64; end; //------------------------------------------------------------------------------ -function PerpendicDistFromLineSqrd(const pt, line1, line2: TPoint64): double; overload; -var - a,b,c,d: double; -begin - a := pt.X - line1.X; - b := pt.Y - line1.Y; - c := line2.X - line1.X; - d := line2.Y - line1.Y; - if (c = 0) and (d = 0) then - result := 0 else - result := Sqr(a * d - c * b) / (c * c + d * d); -end; -//------------------------------------------------------------------------------ - procedure RDP(const path: TPath64; startIdx, endIdx: integer; epsilonSqrd: double; var boolArray: TArrayOfBoolean); overload; var @@ -2162,20 +2243,6 @@ procedure RDP(const path: TPath64; startIdx, endIdx: integer; end; //------------------------------------------------------------------------------ -function PerpendicDistFromLineSqrd(const pt, line1, line2: TPointD): double; overload; -var - a,b,c,d: double; -begin - a := pt.X - line1.X; - b := pt.Y - line1.Y; - c := line2.X - line1.X; - d := line2.Y - line1.Y; - if (c = 0) and (d = 0) then - result := 0 else - result := Sqr(a * d - c * b) / (c * c + d * d); -end; -//------------------------------------------------------------------------------ - procedure RDP(const path: TPathD; startIdx, endIdx: integer; epsilonSqrd: double; var boolArray: TArrayOfBoolean); overload; var diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.Engine.pas b/Ext/SVGIconImageList/Image32/source/Clipper.Engine.pas index aecc78e..950e847 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.Engine.pas +++ b/Ext/SVGIconImageList/Image32/source/Clipper.Engine.pas @@ -2,9 +2,9 @@ (******************************************************************************* * Author : Angus Johnson * -* Date : 23 April 2023 * +* Date : 27 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2023 * +* Copyright : Angus Johnson 2010-2024 * * Purpose : This is the main polygon clipping module * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -53,6 +53,18 @@ TLocMinList = class(TListEx) procedure Clear; override; end; + TReuseableDataContainer64 = class + private + FLocMinList : TLocMinList; + FVertexArrayList : TList; + public + constructor Create; + destructor Destroy; override; + procedure Clear; + procedure AddPaths(const paths: TPaths64; + pathType: TPathType; isOpen: Boolean); + end; + // forward declarations POutRec = ^TOutRec; PHorzSegment = ^THorzSegment; @@ -84,6 +96,7 @@ TOutRec = record pts : POutPt; polypath : TPolyPathBase; splits : TOutRecArray; + recursiveCheck : POutRec; bounds : TRect64; path : TPath64; isOpen : Boolean; @@ -226,7 +239,7 @@ TClipperBase = class function PopHorz(out e: PActive): Boolean; {$IFDEF INLINING} inline; {$ENDIF} function StartOpenPath(e: PActive; const pt: TPoint64): POutPt; procedure UpdateEdgeIntoAEL(var e: PActive); - function IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; + procedure IntersectEdges(e1, e2: PActive; pt: TPoint64); procedure DeleteEdges(var e: PActive); procedure DeleteFromAEL(e: PActive); procedure AdjustCurrXAndCopyToSEL(topY: Int64); @@ -239,7 +252,7 @@ TClipperBase = class procedure ProcessIntersectList; procedure SwapPositionsInAEL(e1, e2: PActive); function AddOutPt(e: PActive; const pt: TPoint64): POutPt; - procedure Split(e: PActive; const currPt: TPoint64); + procedure UndoJoin(e: PActive; const currPt: TPoint64); procedure CheckJoinLeft(e: PActive; const pt: TPoint64; checkCurrX: Boolean = false); {$IFDEF INLINING} inline; {$ENDIF} @@ -257,7 +270,7 @@ TClipperBase = class procedure DoSplitOp(outrec: POutRec; splitOp: POutPt); procedure FixSelfIntersects(outrec: POutRec); function CheckBounds(outrec: POutRec): Boolean; - function CheckSplitOwner(outrec: POutRec): Boolean; + function CheckSplitOwner(outrec: POutRec; const splits: TOutRecArray): Boolean; procedure RecursiveCheckOwners(outrec: POutRec; polytree: TPolyPathBase); protected FUsingPolytree : Boolean; @@ -265,15 +278,16 @@ TClipperBase = class pathType: TPathType; isOpen: Boolean); procedure AddPaths(const paths: TPaths64; pathType: TPathType; isOpen: Boolean); + procedure AddReuseableData(const reuseableData: TReuseableDataContainer64); function ClearSolutionOnly: Boolean; procedure ExecuteInternal(clipType: TClipType; fillRule: TFillRule; usingPolytree: Boolean); - function BuildPaths(out closedPaths, openPaths: TPaths64): Boolean; + function BuildPaths(var closedPaths, openPaths: TPaths64): Boolean; function BuildTree(polytree: TPolyPathBase; out openPaths: TPaths64): Boolean; {$IFDEF USINGZ} procedure SetZ( e1, e2: PActive; var intersectPt: TPoint64); property ZCallback : TZCallback64 read fZCallback write fZCallback; - property DefaultZ : Int64 READ fDefaultZ write fDefaultZ; + property DefaultZ : Int64 read fDefaultZ write fDefaultZ; {$ENDIF} property Succeeded : Boolean read FSucceeded; public @@ -289,6 +303,7 @@ TClipperBase = class TClipper64 = class(TClipperBase) // for integer coordinates public + procedure AddReuseableData(const reuseableData: TReuseableDataContainer64); procedure AddSubject(const subject: TPath64); overload; procedure AddSubject(const subjects: TPaths64); overload; procedure AddOpenSubject(const subject: TPath64); overload; @@ -332,10 +347,9 @@ TPolyPathBase = class TPolyPath64 = class(TPolyPathBase) {$IFDEF STRICT}strict{$ENDIF} private FPath : TPath64; - function GetChild64(index: Integer): TPolyPath64; - protected - function AddChild(const path: TPath64): TPolyPathBase; override; + function GetChild64(index: Integer): TPolyPath64; public + function AddChild(const path: TPath64): TPolyPathBase; override; property Child[index: Integer]: TPolyPath64 read GetChild64; default; property Polygon: TPath64 read FPath; end; @@ -388,8 +402,9 @@ TPolyPathD = class(TPolyPathBase) function GetChildD(index: Integer): TPolyPathD; protected FScale : double; - function AddChild(const path: TPath64): TPolyPathBase; override; public + function AddChild(const path: TPath64): TPolyPathBase; overload; override; + function AddChild(const path: TPathD): TPolyPathBase; reintroduce; overload; property Polygon: TPathD read FPath; property Child[index: Integer]: TPolyPathD read GetChildD; default; end; @@ -536,13 +551,6 @@ function IsOpen(e: PActive): Boolean; overload; {$IFDEF INLINING} inline; {$ENDI end; //------------------------------------------------------------------------------ -//function IsOpenEnd(e: PActive): Boolean; overload; {$IFDEF INLINING} inline; {$ENDIF} -//begin -// Result := e.locMin.isOpen and -// (e.vertTop.flags * [vfOpenStart, vfOpenEnd] <> []); -//end; -//------------------------------------------------------------------------------ - function IsOpenEnd(v: PVertex): Boolean; overload; {$IFDEF INLINING} inline; {$ENDIF} begin Result := (v.flags * [vfOpenStart, vfOpenEnd] <> []); @@ -626,6 +634,15 @@ function GetRealOutRec(outRec: POutRec): POutRec; end; //------------------------------------------------------------------------------ +function IsValidOwner(outRec, TestOwner: POutRec): Boolean; + {$IFDEF INLINING} inline; {$ENDIF} +begin + while Assigned(TestOwner) and (outrec <> TestOwner) do + TestOwner := TestOwner.owner; + Result := not Assigned(TestOwner); +end; +//------------------------------------------------------------------------------ + function PtsReallyClose(const pt1, pt2: TPoint64): Boolean; {$IFDEF INLINING} inline; {$ENDIF} begin @@ -823,6 +840,138 @@ function PointCount(pts: POutPt): Integer; {$IFDEF INLINING} inline; {$ENDIF} end; //------------------------------------------------------------------------------ +function GetCleanPath(op: POutPt): TPath64; +var + cnt: integer; + op2, prevOp: POutPt; +begin + cnt := 0; + SetLength(Result, PointCount(op)); + op2 := op; + while ((op2.next <> op) and + (((op2.pt.X = op2.next.pt.X) and (op2.pt.X = op2.prev.pt.X)) or + ((op2.pt.Y = op2.next.pt.Y) and (op2.pt.Y = op2.prev.pt.Y)))) do + op2 := op2.next; + result[cnt] := op2.pt; + inc(cnt); + prevOp := op2; + op2 := op2.next; + while (op2 <> op) do + begin + if (((op2.pt.X <> op2.next.pt.X) or (op2.pt.X <> prevOp.pt.X)) and + ((op2.pt.Y <> op2.next.pt.Y) or (op2.pt.Y <> prevOp.pt.Y))) then + begin + result[cnt] := op2.pt; + inc(cnt); + prevOp := op2; + end; + op2 := op2.next; + end; + SetLength(Result, cnt); +end; + +function PointInOpPolygon(const pt: TPoint64; op: POutPt): TPointInPolygonResult; +var + val: Integer; + op2: POutPt; + isAbove, startingAbove: Boolean; + d: double; // avoids integer overflow +begin + result := pipOutside; + if (op = op.next) or (op.prev = op.next) then Exit; + + op2 := op; + repeat + if (op.pt.Y <> pt.Y) then break; + op := op.next; + until op = op2; + if (op.pt.Y = pt.Y) then Exit; // not a proper polygon + + isAbove := op.pt.Y < pt.Y; + startingAbove := isAbove; + Result := pipOn; + val := 0; + op2 := op.next; + while (op2 <> op) do + begin + if isAbove then + while (op2 <> op) and (op2.pt.Y < pt.Y) do op2 := op2.next + else + while (op2 <> op) and (op2.pt.Y > pt.Y) do op2 := op2.next; + if (op2 = op) then break; + + // must have touched or crossed the pt.Y horizonal + // and this must happen an even number of times + + if (op2.pt.Y = pt.Y) then // touching the horizontal + begin + if (op2.pt.X = pt.X) or ((op2.pt.Y = op2.prev.pt.Y) and + ((pt.X < op2.prev.pt.X) <> (pt.X < op2.pt.X))) then Exit; + op2 := op2.next; + if (op2 = op) then break; + Continue; + end; + + if (pt.X < op2.pt.X) and (pt.X < op2.prev.pt.X) then + // do nothing because + // we're only interested in edges crossing on the left + else if((pt.X > op2.prev.pt.X) and (pt.X > op2.pt.X)) then + val := 1 - val // toggle val + else + begin + d := CrossProduct(op2.prev.pt, op2.pt, pt); + if d = 0 then Exit; // ie point on path + if (d < 0) = isAbove then val := 1 - val; + end; + isAbove := not isAbove; + op2 := op2.next; + end; + + if (isAbove <> startingAbove) then + begin + d := CrossProduct(op2.prev.pt, op2.pt, pt); + if d = 0 then Exit; // ie point on path + if (d < 0) = isAbove then val := 1 - val; + end; + + if val = 0 then + result := pipOutside else + result := pipInside; +end; +//------------------------------------------------------------------------------ + +function Path1InsidePath2(const op1, op2: POutPt): Boolean; +var + op: POutPt; + mp: TPoint64; + path: TPath64; + pipResult: TPointInPolygonResult; + outsideCnt: integer; +begin + // precondition - the twi paths or1 & pr2 don't intersect + // we need to make some accommodation for rounding errors + // so we won't jump if the first vertex is found outside + outsideCnt := 0; + op := op1; + repeat + pipResult := PointInOpPolygon(op.pt, op2); + if pipResult = pipOutside then inc(outsideCnt) + else if pipResult = pipInside then dec(outsideCnt); + op := op.next; + until (op = op1) or (Abs(outsideCnt) = 2); + if (Abs(outsideCnt) < 2) then + begin + // if path1's location is still equivocal then check its midpoint + path := GetCleanPath(op1); + mp := Clipper.Core.GetBounds(path).MidPoint; + path := GetCleanPath(op2); + Result := PointInPolygon(mp, path) <> pipOutside; + end + else + Result := (outsideCnt < 0); +end; +//------------------------------------------------------------------------------ + procedure UncoupleOutRec(e: PActive); var outRec: POutRec; @@ -976,7 +1125,7 @@ function BuildPath(op: POutPt; reverse, isOpen: Boolean; Exit; end; - if (cnt = 3) and IsVerySmallTriangle(op) then + if (cnt = 3) and not IsOpen and IsVerySmallTriangle(op) then begin Result := false; Exit; @@ -1187,6 +1336,44 @@ procedure SetOwner(outrec, newOwner: POutRec); outrec.owner := newOwner; end; +//------------------------------------------------------------------------------ +// TReuseableDataContainer64 methods ... +//------------------------------------------------------------------------------ + +constructor TReuseableDataContainer64.Create; +begin + FLocMinList := TLocMinList.Create; + FVertexArrayList := TList.Create; +end; +//------------------------------------------------------------------------------ + +destructor TReuseableDataContainer64.Destroy; +begin + Clear; + FLocMinList.Free; + FVertexArrayList.Free; + inherited; +end; +//------------------------------------------------------------------------------ + +procedure TReuseableDataContainer64.Clear; +var + i: integer; +begin + FLocMinList.Clear; + for i := 0 to FVertexArrayList.Count -1 do + FreeMem(UnsafeGet(FVertexArrayList, i)); + FVertexArrayList.Clear; +end; +//------------------------------------------------------------------------------ + +procedure TReuseableDataContainer64.AddPaths(const paths: TPaths64; + pathType: TPathType; isOpen: Boolean); +begin + AddPathsToVertexList(paths, pathType, isOpen, + FVertexArrayList, FLocMinList); +end; + //------------------------------------------------------------------------------ // TClipperBase methods ... //------------------------------------------------------------------------------ @@ -1275,7 +1462,11 @@ function XYCoordsEqual(const pt1, pt2: TPoint64): Boolean; procedure TClipperBase.SetZ(e1, e2: PActive; var intersectPt: TPoint64); begin - if not Assigned(fZCallback) then Exit; + if not Assigned(fZCallback) then + begin + intersectPt.Z := 0; + Exit; + end; // prioritize subject vertices over clip vertices // and pass the subject vertices before clip vertices in the callback @@ -1408,6 +1599,29 @@ procedure TClipperBase.AddPaths(const paths: TPaths64; end; //------------------------------------------------------------------------------ +procedure TClipperBase.AddReuseableData(const reuseableData: TReuseableDataContainer64); +var + i: integer; + lm: PLocalMinima; +begin + if reuseableData.FLocMinList.Count = 0 then Exit; + // nb: reuseableData will continue to own the vertices + // and will remain responsible for their clean up. + // Consequently, it's important that the reuseableData object isn't + // destroyed before the Clipper object that's using the data. + FLocMinListSorted := false; + for i := 0 to reuseableData.FLocMinList.Count -1 do + with PLocalMinima(reuseableData.FLocMinList[i])^ do + begin + lm := self.FLocMinList.Add; + lm.vertex := vertex; + lm.polytype := polytype; + lm.isOpen := isOpen; + if isOpen then FHasOpenPaths := true; + end; +end; +//------------------------------------------------------------------------------ + function TClipperBase.IsContributingClosed(e: PActive): Boolean; begin Result := false; @@ -1511,23 +1725,18 @@ procedure TClipperBase.SetWindCountForClosedPathEdge(e: PActive); if (Abs(e2.windCnt) > 1) then begin // outside prev poly but still inside another. - if (e2.windDx * e.windDx < 0) then - // reversing direction so use the same WC - e.windCnt := e2.windCnt else - // otherwise keep 'reducing' the WC by 1 (ie towards 0) ... - e.windCnt := e2.windCnt + e.windDx; + e.windCnt := Iif(e2.windDx * e.windDx < 0, + e2.windCnt, // reversing direction so use the same WC + e2.windCnt + e.windDx); end // now outside all polys of same polytype so set own WC ... else e.windCnt := e.windDx; end else begin //'e' must be inside 'e2' - if (e2.windDx * e.windDx < 0) then - // reversing direction so use the same WC - e.windCnt := e2.windCnt - else - // otherwise keep 'increasing' the WC by 1 (ie away from 0) ... - e.windCnt := e2.windCnt + e.windDx; + e.windCnt := Iif(e2.windDx * e.windDx < 0, + e2.windCnt, // reversing direction so use the same WC + e2.windCnt + e.windDx); // else keep 'increasing' the WC end; e.windCnt2 := e2.windCnt2; e2 := e2.nextInAEL; @@ -1568,8 +1777,8 @@ procedure TClipperBase.SetWindCountForOpenPathEdge(e: PActive); else if not IsOpen(e2) then inc(cnt1); e2 := e2.nextInAEL; end; - if Odd(cnt1) then e.windCnt := 1 else e.windCnt := 0; - if Odd(cnt2) then e.windCnt2 := 1 else e.windCnt2 := 0; + e.windCnt := Iif(Odd(cnt1), 1, 0); + e.windCnt2 := Iif(Odd(cnt2), 1, 0); end else begin // if FClipType in [ctUnion, ctDifference] then e.WindCnt := e.WindDx; @@ -1629,8 +1838,8 @@ function IsValidAelOrder(resident, newcomer: PActive): Boolean; // resident must also have just been inserted else if IsLeftBound(resident) <> newcomerIsLeft then Result := newcomerIsLeft - else if (CrossProduct(PrevPrevVertex(resident).pt, - resident.bot, resident.top) = 0) then + else if IsCollinear(PrevPrevVertex(resident).pt, + resident.bot, resident.top) then Result := true else // otherwise compare turning direction of the alternate bound @@ -1900,7 +2109,7 @@ procedure TClipperBase.CleanCollinear(outRec: POutRec); // a duplicate point OR // not preserving collinear points OR // is a 180 degree 'spike' - if (CrossProduct(op2.prev.pt, op2.pt, op2.next.pt) = 0) and + if IsCollinear(op2.prev.pt, op2.pt, op2.next.pt) and (PointsEqual(op2.pt,op2.prev.pt) or PointsEqual(op2.pt,op2.next.pt) or not FPreserveCollinear or @@ -1945,7 +2154,7 @@ procedure TClipperBase.DoSplitOp(outrec: POutRec; splitOp: POutPt); prevOp := splitOp.prev; nextNextOp := splitOp.next.next; outrec.pts := prevOp; - GetIntersectPoint( + GetSegmentIntersectPt( prevOp.pt, splitOp.pt, splitOp.next.pt, nextNextOp.pt, ip); {$IFDEF USINGZ} if Assigned(fZCallback) then @@ -1960,11 +2169,6 @@ procedure TClipperBase.DoSplitOp(outrec: POutRec; splitOp: POutPt); Exit; end; - // nb: area1 is the path's area *before* splitting, whereas area2 is - // the area of the triangle containing splitOp & splitOp.next. - // So the only way for these areas to have the same sign is if - // the split triangle is larger than the path containing prevOp or - // if there's more than one self-intersection. area2 := AreaTriangle(ip, splitOp.pt, splitOp.next.pt); absArea2 := abs(area2); @@ -1982,6 +2186,11 @@ procedure TClipperBase.DoSplitOp(outrec: POutRec; splitOp: POutPt); prevOp.next := newOp2; end; + // nb: area1 is the path's area *before* splitting, whereas area2 is + // the area of the triangle containing splitOp & splitOp.next. + // So the only way for these areas to have the same sign is if + // the split triangle is larger than the path containing prevOp or + // if there's more than one self-intersection. if (absArea2 > 1) and ((absArea2 > absArea1) or ((area2 > 0) = (area1 > 0))) then @@ -1989,15 +2198,20 @@ procedure TClipperBase.DoSplitOp(outrec: POutRec; splitOp: POutPt); newOutRec := FOutRecList.Add; newOutRec.owner := outrec.owner; - if FUsingPolytree then - AddSplit(outrec, newOutRec); - splitOp.outrec := newOutRec; splitOp.next.outrec := newOutRec; newOp := NewOutPt(ip, newOutRec, splitOp.next, splitOp); splitOp.prev := newOp; splitOp.next.next := newOp; newOutRec.pts := newOp; + + if FUsingPolytree then + begin + if (Path1InsidePath2(prevOp, newOp)) then + AddSplit(newOutRec, outrec) else + AddSplit(outrec, newOutRec); + end; + end else begin Dispose(splitOp.next); @@ -2036,8 +2250,8 @@ function TClipperBase.AddLocalMaxPoly(e1, e2: PActive; const pt: TPoint64): POut outRec: POutRec; begin - if IsJoined(e1) then Split(e1, pt); - if IsJoined(e2) then Split(e2, pt); + if IsJoined(e1) then UndoJoin(e1, pt); + if IsJoined(e2) then UndoJoin(e2, pt); if (IsFront(e1) = IsFront(e2)) then begin @@ -2122,13 +2336,14 @@ procedure TClipperBase.JoinOutrecPaths(e1, e2: PActive); e2.outrec.frontE := nil; e2.outrec.backE := nil; e2.outrec.pts := nil; - SetOwner(e2.outrec, e1.outrec); if IsOpenEnd(e1.vertTop) then begin e2.outrec.pts := e1.outrec.pts; e1.outrec.pts := nil; - end; + end + else + SetOwner(e2.outrec, e1.outrec); // and e1 and e2 are maxima and are about to be dropped from the Actives list. e1.outrec := nil; @@ -2136,7 +2351,7 @@ procedure TClipperBase.JoinOutrecPaths(e1, e2: PActive); end; //------------------------------------------------------------------------------ -procedure TClipperBase.Split(e: PActive; const currPt: TPoint64); +procedure TClipperBase.UndoJoin(e: PActive; const currPt: TPoint64); begin if e.joinedWith = jwRight then begin @@ -2158,17 +2373,19 @@ procedure TClipperBase.CheckJoinLeft(e: PActive; prev: PActive; begin prev := e.prevInAEL; - if IsOpen(e) or not IsHotEdge(e) or not Assigned(prev) or - IsOpen(prev) or not IsHotEdge(prev) then Exit; + if not Assigned(prev) or + not IsHotEdge(e) or not IsHotEdge(prev) or + IsHorizontal(e) or IsHorizontal(prev) or + IsOpen(e) or IsOpen(prev) then Exit; if ((pt.Y < e.top.Y +2) or (pt.Y < prev.top.Y +2)) and ((e.bot.Y > pt.Y) or (prev.bot.Y > pt.Y)) then Exit; // (#490) if checkCurrX then begin - if DistanceFromLineSqrd(pt, prev.bot, prev.top) > 0.25 then Exit + if PerpendicDistFromLineSqrd(pt, prev.bot, prev.top) > 0.25 then Exit end else if (e.currX <> prev.currX) then Exit; - if (CrossProduct(e.top, pt, prev.top) <> 0) then Exit; + if not IsCollinear(e.top, pt, prev.top) then Exit; if (e.outrec.idx = prev.outrec.idx) then AddLocalMaxPoly(prev, e, pt) @@ -2187,18 +2404,20 @@ procedure TClipperBase.CheckJoinRight(e: PActive; next: PActive; begin next := e.nextInAEL; - if IsOpen(e) or not IsHotEdge(e) or not Assigned(next) or - not IsHotEdge(next) or IsOpen(next) then Exit; + if not Assigned(next) or + not IsHotEdge(e) or not IsHotEdge(next) or + IsHorizontal(e) or IsHorizontal(next) or + IsOpen(e) or IsOpen(next) then Exit; if ((pt.Y < e.top.Y +2) or (pt.Y < next.top.Y +2)) and ((e.bot.Y > pt.Y) or (next.bot.Y > pt.Y)) then Exit; // (#490) if (checkCurrX) then begin - if DistanceFromLineSqrd(pt, next.bot, next.top) > 0.25 then Exit + if PerpendicDistFromLineSqrd(pt, next.bot, next.top) > 0.25 then Exit end else if (e.currX <> next.currX) then Exit; - if (CrossProduct(e.top, pt, next.top) <> 0) then Exit; + if not IsCollinear(e.top, pt, next.top) then Exit; if e.outrec.idx = next.outrec.idx then AddLocalMaxPoly(e, next, pt) else if e.outrec.idx < next.outrec.idx then @@ -2264,6 +2483,31 @@ function TClipperBase.StartOpenPath(e: PActive; const pt: TPoint64): POutPt; end; //------------------------------------------------------------------------------ +procedure TrimHorz(horzEdge: PActive; preserveCollinear: Boolean); +var + pt: TPoint64; + wasTrimmed: Boolean; +begin + wasTrimmed := false; + pt := NextVertex(horzEdge).pt; + while (pt.Y = horzEdge.top.Y) do + begin + // always trim 180 deg. spikes (in closed paths) + // but otherwise break if preserveCollinear = true + if preserveCollinear and + ((pt.X < horzEdge.top.X) <> (horzEdge.bot.X < horzEdge.top.X)) then + break; + + horzEdge.vertTop := NextVertex(horzEdge); + horzEdge.top := pt; + wasTrimmed := true; + if IsMaxima(horzEdge) then Break; + pt := NextVertex(horzEdge).pt; + end; + if wasTrimmed then SetDx(horzEdge); // +/-infinity +end; +//------------------------------------------------------------------------------ + procedure TClipperBase.UpdateEdgeIntoAEL(var e: PActive); begin e.bot := e.top; @@ -2272,9 +2516,13 @@ procedure TClipperBase.UpdateEdgeIntoAEL(var e: PActive); e.currX := e.bot.X; SetDx(e); - if IsJoined(e) then Split(e, e.bot); + if IsJoined(e) then UndoJoin(e, e.bot); - if IsHorizontal(e) then Exit; + if IsHorizontal(e) then + begin + if not IsOpen(e) then TrimHorz(e, PreserveCollinear); + Exit; + end; InsertScanLine(e.top.Y); CheckJoinLeft(e, e.bot); @@ -2307,14 +2555,13 @@ function FindEdgeWithMatchingLocMin(e: PActive): PActive; {$IFNDEF USINGZ} {$HINTS OFF} {$ENDIF} -function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; +procedure TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64); var e1WindCnt, e2WindCnt, e1WindCnt2, e2WindCnt2: Integer; e3: PActive; - op2: POutPt; + resultOp, op2: POutPt; begin - Result := nil; - + resultOp := nil; // MANAGE OPEN PATH INTERSECTIONS SEPARATELY ... if FHasOpenPaths and (IsOpen(e1) or IsOpen(e2)) then begin @@ -2324,7 +2571,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; // e1 is open and e2 is closed - if IsJoined(e2) then Split(e2, pt); // needed for safety + if IsJoined(e2) then UndoJoin(e2, pt); // needed for safety case FClipType of ctUnion: if not IsHotEdge(e2) then Exit; @@ -2339,7 +2586,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; // toggle contribution ... if IsHotEdge(e1) then begin - Result := AddOutPt(e1, pt); + resultOp := AddOutPt(e1, pt); if IsFront(e1) then e1.outrec.frontE := nil else e1.outrec.backE := nil; @@ -2361,24 +2608,21 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; if e1.windDx > 0 then SetSides(e3.outrec, e1, e3) else SetSides(e3.outrec, e3, e1); - Result := e3.outrec.pts; Exit; - end - else - Result := StartOpenPath(e1, pt); - end - else - Result := StartOpenPath(e1, pt); + end else + resultOp := StartOpenPath(e1, pt); + end else + resultOp := StartOpenPath(e1, pt); {$IFDEF USINGZ} - SetZ(e1, e2, Result.pt); + SetZ(e1, e2, resultOp.pt); {$ENDIF} Exit; end; // MANAGING CLOSED PATHS FROM HERE ON - if IsJoined(e1) then Split(e1, pt); - if IsJoined(e2) then Split(e2, pt); + if IsJoined(e1) then UndoJoin(e1, pt); + if IsJoined(e2) then UndoJoin(e2, pt); // FIRST, UPDATE WINDING COUNTS if IsSamePolyType(e1, e2) then @@ -2390,12 +2634,10 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; e2.windCnt := e1WindCnt; end else begin - if e1.windCnt + e2.windDx = 0 then - e1.windCnt := -e1.windCnt else - Inc(e1.windCnt, e2.windDx); - if e2.windCnt - e1.windDx = 0 then - e2.windCnt := -e2.windCnt else - Dec(e2.windCnt, e1.windDx); + e1.windCnt := Iif(e1.windCnt + e2.windDx = 0, + -e1.windCnt, e1.windCnt + e2.windDx); + e2.windCnt := Iif(e2.windCnt - e1.windDx = 0, + -e2.windCnt, e2.windCnt - e1.windDx); end; end else begin @@ -2437,7 +2679,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; if not (e1WindCnt in [0,1]) or not (e2WindCnt in [0,1]) or (not IsSamePolyType(e1, e2) and (fClipType <> ctXor)) then begin - Result := AddLocalMaxPoly(e1, e2, pt); + resultOp := AddLocalMaxPoly(e1, e2, pt); {$IFDEF USINGZ} if Assigned(Result) then SetZ(e1, e2, Result.pt); {$ENDIF} @@ -2447,7 +2689,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; // this 'else if' condition isn't strictly needed but // it's sensible to split polygons that ony touch at // a common vertex (not at common edges). - Result := AddLocalMaxPoly(e1, e2, pt); + resultOp := AddLocalMaxPoly(e1, e2, pt); {$IFDEF USINGZ} op2 := AddLocalMinPoly(e1, e2, pt); if Assigned(Result) then SetZ(e1, e2, Result.pt); @@ -2458,7 +2700,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; end else begin // can't treat as maxima & minima - Result := AddOutPt(e1, pt); + resultOp := AddOutPt(e1, pt); {$IFDEF USINGZ} op2 := AddOutPt(e2, pt); SetZ(e1, e2, Result.pt); @@ -2473,7 +2715,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; // if one or other edge is 'hot' ... else if IsHotEdge(e1) then begin - Result := AddOutPt(e1, pt); + resultOp := AddOutPt(e1, pt); {$IFDEF USINGZ} SetZ(e1, e2, Result.pt); {$ENDIF} @@ -2481,7 +2723,7 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; end else if IsHotEdge(e2) then begin - Result := AddOutPt(e2, pt); + resultOp := AddOutPt(e2, pt); {$IFDEF USINGZ} SetZ(e1, e2, Result.pt); {$ENDIF} @@ -2511,29 +2753,29 @@ function TClipperBase.IntersectEdges(e1, e2: PActive; pt: TPoint64): POutPt; if not IsSamePolyType(e1, e2) then begin - Result := AddLocalMinPoly(e1, e2, pt, false); + resultOp := AddLocalMinPoly(e1, e2, pt, false); {$IFDEF USINGZ} SetZ(e1, e2, Result.pt); {$ENDIF} end else if (e1WindCnt = 1) and (e2WindCnt = 1) then begin - Result := nil; + resultOp := nil; case FClipType of ctIntersection: if (e1WindCnt2 <= 0) or (e2WindCnt2 <= 0) then Exit - else Result := AddLocalMinPoly(e1, e2, pt, false); + else resultOp := AddLocalMinPoly(e1, e2, pt, false); ctUnion: if (e1WindCnt2 <= 0) and (e2WindCnt2 <= 0) then - Result := AddLocalMinPoly(e1, e2, pt, false); + resultOp := AddLocalMinPoly(e1, e2, pt, false); ctDifference: if ((GetPolyType(e1) = ptClip) and (e1WindCnt2 > 0) and (e2WindCnt2 > 0)) or ((GetPolyType(e1) = ptSubject) and (e1WindCnt2 <= 0) and (e2WindCnt2 <= 0)) then - Result := AddLocalMinPoly(e1, e2, pt, false); + resultOp := AddLocalMinPoly(e1, e2, pt, false); else // xOr - Result := AddLocalMinPoly(e1, e2, pt, false); + resultOp := AddLocalMinPoly(e1, e2, pt, false); end; {$IFDEF USINGZ} if assigned(Result) then SetZ(e1, e2, Result.pt); @@ -2617,7 +2859,7 @@ procedure TClipperBase.ExecuteInternal(clipType: TClipType; FBotY := Y; // FBotY == bottom of current scanbeam if not PopScanLine(Y) then Break; // Y == top of current scanbeam DoIntersections(Y); - DoTopOfScanbeam(Y); + DoTopOfScanbeam(Y); while PopHorz(e) do DoHorizontal(e); end; if Succeeded then ProcessHorzJoins; @@ -2650,120 +2892,6 @@ procedure SetOutRecPts(op: POutPt; newOR: POutrec); overload; end; //------------------------------------------------------------------------------ -function GetBounds(op: POutPt): TRect64; -var - op2: POutPt; -begin - result.Left := op.pt.X; - result.Right := op.pt.X; - result.Top := op.pt.Y; - result.Bottom := op.pt.Y; - op2 := op.next; - while op2 <> op do - begin - if op2.pt.X < result.Left then result.Left := op2.pt.X - else if op2.pt.X > result.Right then result.Right := op2.pt.X; - if op2.pt.Y < result.Top then result.Top := op2.pt.Y - else if op2.pt.Y > result.Bottom then result.Bottom := op2.pt.Y; - op2 := op2.next; - end; -end; -//------------------------------------------------------------------------------ - -function PointInOpPolygon(const pt: TPoint64; op: POutPt): TPointInPolygonResult; -var - val: Integer; - op2: POutPt; - isAbove, startingAbove: Boolean; - d: double; // avoids integer overflow -begin - result := pipOutside; - if (op = op.next) or (op.prev = op.next) then Exit; - - op2 := op; - repeat - if (op.pt.Y <> pt.Y) then break; - op := op.next; - until op = op2; - if (op.pt.Y = pt.Y) then Exit; // not a proper polygon - - isAbove := op.pt.Y < pt.Y; - startingAbove := isAbove; - Result := pipOn; - val := 0; - op2 := op.next; - while (op2 <> op) do - begin - if isAbove then - while (op2 <> op) and (op2.pt.Y < pt.Y) do op2 := op2.next - else - while (op2 <> op) and (op2.pt.Y > pt.Y) do op2 := op2.next; - if (op2 = op) then break; - - // must have touched or crossed the pt.Y horizonal - // and this must happen an even number of times - - if (op2.pt.Y = pt.Y) then // touching the horizontal - begin - if (op2.pt.X = pt.X) or ((op2.pt.Y = op2.prev.pt.Y) and - ((pt.X < op2.prev.pt.X) <> (pt.X < op2.pt.X))) then Exit; - op2 := op2.next; - if (op2 = op) then break; - Continue; - end; - - if (pt.X < op2.pt.X) and (pt.X < op2.prev.pt.X) then - // do nothing because - // we're only interested in edges crossing on the left - else if((pt.X > op2.prev.pt.X) and (pt.X > op2.pt.X)) then - val := 1 - val // toggle val - else - begin - d := CrossProduct(op2.prev.pt, op2.pt, pt); - if d = 0 then Exit; // ie point on path - if (d < 0) = isAbove then val := 1 - val; - end; - isAbove := not isAbove; - op2 := op2.next; - end; - - if (isAbove <> startingAbove) then - begin - d := CrossProduct(op2.prev.pt, op2.pt, pt); - if d = 0 then Exit; // ie point on path - if (d < 0) = isAbove then val := 1 - val; - end; - - if val = 0 then - result := pipOutside else - result := pipInside; -end; -//------------------------------------------------------------------------------ - -function Path1InsidePath2(const op1, op2: POutPt): Boolean; -var - op: POutPt; - pipResult: TPointInPolygonResult; - outsideCnt: integer; -begin - // precondition - the twi paths or1 & pr2 don't intersect - // we need to make some accommodation for rounding errors - // so we won't jump if the first vertex is found outside - outsideCnt := 0; - op := op1; - repeat - pipResult := PointInOpPolygon(op.pt, op2); - if pipResult = pipOutside then inc(outsideCnt) - else if pipResult = pipInside then dec(outsideCnt); - op := op.next; - until (op = op1) or (Abs(outsideCnt) = 2); - // if path1's location is still equivocal then check its midpoint - if Abs(outsideCnt) > 1 then - Result := outsideCnt < 0 else - Result := PointInOpPolygon(GetBounds(op).MidPoint, op2) = pipInside; -end; -//------------------------------------------------------------------------------ - function HorzOverlapWithLRSet(const left1, right1, left2, right2: TPoint64): boolean; {$IFDEF INLINING} inline; {$ENDIF} begin @@ -2776,14 +2904,14 @@ function HorzontalsOverlap(const horz1a, horz1b, horz2a, horz2b: TPoint64): bool begin if horz1a.X < horz1b.X then begin - if horz2a.X < horz2b.X then - Result := HorzOverlapWithLRSet(horz1a, horz1b, horz2a, horz2b) else - Result := HorzOverlapWithLRSet(horz1a, horz1b, horz2b, horz2a); + Result := Iif(horz2a.X < horz2b.X, + HorzOverlapWithLRSet(horz1a, horz1b, horz2a, horz2b), + HorzOverlapWithLRSet(horz1a, horz1b, horz2b, horz2a)); end else begin - if horz2a.X < horz2b.X then - Result := HorzOverlapWithLRSet(horz1b, horz1a, horz2a, horz2b) else - Result := HorzOverlapWithLRSet(horz1b, horz1a, horz2b, horz2a); + Result := Iif(horz2a.X < horz2b.X, + HorzOverlapWithLRSet(horz1b, horz1a, horz2a, horz2b), + HorzOverlapWithLRSet(horz1b, horz1a, horz2b, horz2a)); end; end; //------------------------------------------------------------------------------ @@ -2879,8 +3007,8 @@ procedure TClipperBase.ConvertHorzSegsToJoins; begin hs2 := FHorzSegList.UnsafeGet(j); - if hs2.leftOp.pt.X >= hs1.rightOp.pt.X then Break - else if (hs2.leftToRight = hs1.leftToRight) or + if (hs2.leftOp.pt.X >= hs1.rightOp.pt.X) or + (hs2.leftToRight = hs1.leftToRight) or (hs2.rightOp.pt.X <= hs1.leftOp.pt.X) then Continue; currY := hs1.leftOp.pt.Y; @@ -2912,11 +3040,22 @@ procedure TClipperBase.ConvertHorzSegsToJoins; end; //------------------------------------------------------------------------------ +procedure MoveSplits(fromOr, toOr: POutRec); +var + i: integer; +begin + if not assigned(fromOr.splits) then Exit; + for i := 0 to High(fromOr.splits) do + AddSplit(toOr, fromOr.splits[i]); + fromOr.splits := nil; +end; +//------------------------------------------------------------------------------ + procedure TClipperBase.ProcessHorzJoins; var i: integer; or1, or2: POutRec; - op1b, op2b: POutPt; + op1b, op2b, tmp: POutPt; begin for i := 0 to FHorzJoinList.Count -1 do with PHorzJoin(FHorzJoinList[i])^ do @@ -2933,36 +3072,51 @@ procedure TClipperBase.ProcessHorzJoins; op1b.prev := op2b; op2b.next := op1b; - if or1 = or2 then + if or1 = or2 then // 'join' is really a split begin or2 := FOutRecList.Add; or2.pts := op1b; FixOutRecPts(or2); + + //if or1->pts has moved to or2 then update or1->pts!! if or1.pts.outrec = or2 then begin or1.pts := op1; or1.pts.outrec := or1; end; - if FUsingPolytree then + if FUsingPolytree then //#498, #520, #584, D#576, #618 begin - if Path1InsidePath2(or2.pts, or1.pts) then - SetOwner(or2, or1) - else if Path1InsidePath2(or1.pts, or2.pts) then - SetOwner(or1, or2) - else + if Path1InsidePath2(or1.pts, or2.pts) then begin - AddSplit(or1, or2); //(#498) + //swap or1's & or2's pts + tmp := or1.pts; + or1.pts := or2.pts; + or2.pts := tmp; + FixOutRecPts(or1); + FixOutRecPts(or2); + //or2 is now inside or1 or2.owner := or1; - end; - end else + end + else if Path1InsidePath2(or2.pts, or1.pts) then + begin + or2.owner := or1; + end + else + or2.owner := or1.owner; + + AddSplit(or1, or2); + end + else or2.owner := or1; end else begin or2.pts := nil; - if FUsingPolytree then - SetOwner(or2, or1) - else + if FUsingPolytree then + begin + SetOwner(or2, or1); + MoveSplits(or2, or1); //#618 + end else or2.owner := or1; end; end; @@ -2996,7 +3150,7 @@ procedure TClipperBase.AddNewIntersectNode(e1, e2: PActive; topY: Int64); absDx1, absDx2: double; node: PIntersectNode; begin - if not GetIntersectPoint(e1.bot, e1.top, e2.bot, e2.top, ip) then + if not GetSegmentIntersectPt(e1.bot, e1.top, e2.bot, e2.top, ip) then ip := Point64(e1.currX, topY); // Rounding errors can occasionally place the calculated intersection // point either below or above the scanbeam, so check and correct ... @@ -3016,12 +3170,8 @@ procedure TClipperBase.AddNewIntersectNode(e1, e2: PActive; topY: Int64); ip := GetClosestPointOnSegment(ip, e2.bot, e2.top) else begin - if (ip.Y < topY) then - ip.Y := topY else - ip.Y := fBotY; - if (absDx1 < absDx2) then - ip.X := TopX(e1, ip.Y) else - ip.X := TopX(e2, ip.Y); + ip.Y := Iif(ip.Y < topY, topY , fBotY); + ip.X := Iif(absDx1 < absDx2, TopX(e1, ip.Y), TopX(e2, ip.Y)); end; end; new(node); @@ -3207,41 +3357,6 @@ procedure TClipperBase.SwapPositionsInAEL(e1, e2: PActive); end; //------------------------------------------------------------------------------ -function HorzIsSpike(horzEdge: PActive): Boolean; -var - nextPt: TPoint64; -begin - nextPt := NextVertex(horzEdge).pt; - Result := (nextPt.Y = horzEdge.top.Y) and - (horzEdge.bot.X < horzEdge.top.X) <> (horzEdge.top.X < nextPt.X); -end; -//------------------------------------------------------------------------------ - -procedure TrimHorz(horzEdge: PActive; preserveCollinear: Boolean); -var - pt: TPoint64; - wasTrimmed: Boolean; -begin - wasTrimmed := false; - pt := NextVertex(horzEdge).pt; - while (pt.Y = horzEdge.top.Y) do - begin - // always trim 180 deg. spikes (in closed paths) - // but otherwise break if preserveCollinear = true - if preserveCollinear and - ((pt.X < horzEdge.top.X) <> (horzEdge.bot.X < horzEdge.top.X)) then - break; - - horzEdge.vertTop := NextVertex(horzEdge); - horzEdge.top := pt; - wasTrimmed := true; - if IsMaxima(horzEdge) then Break; - pt := NextVertex(horzEdge).pt; - end; - if wasTrimmed then SetDx(horzEdge); // +/-infinity -end; -//------------------------------------------------------------------------------ - function GetLastOp(hotEdge: PActive): POutPt; {$IFDEF INLINING} inline; {$ENDIF} var @@ -3293,7 +3408,6 @@ procedure TClipperBase.DoHorizontal(horzEdge: PActive); e: PActive; pt: TPoint64; op: POutPt; - currOr: POutRec; isLeftToRight, horzIsOpen: Boolean; begin (******************************************************************************* @@ -3319,10 +3433,6 @@ procedure TClipperBase.DoHorizontal(horzEdge: PActive); maxVertex := GetCurrYMaximaVertexOpen(horzEdge) else maxVertex := GetCurrYMaximaVertex(horzEdge); - if Assigned(maxVertex) and not horzIsOpen and - (maxVertex <> horzEdge.vertTop) then - TrimHorz(horzEdge, FPreserveCollinear); - isLeftToRight := ResetHorzDirection; // nb: TrimHorz above hence not using Bot.X here @@ -3335,7 +3445,6 @@ procedure TClipperBase.DoHorizontal(horzEdge: PActive); {$ENDIF} FHorzSegList.Add(op); end; - currOr := horzEdge.outrec; while true do // loop through consec. horizontal edges begin @@ -3348,7 +3457,7 @@ procedure TClipperBase.DoHorizontal(horzEdge: PActive); if (e.vertTop = maxVertex) then begin if IsHotEdge(horzEdge) and IsJoined(e) then - Split(e, e.top); + UndoJoin(e, e.top); if IsHotEdge(horzEdge) then begin @@ -3403,18 +3512,19 @@ procedure TClipperBase.DoHorizontal(horzEdge: PActive); begin IntersectEdges(horzEdge, e, pt); SwapPositionsInAEL(horzEdge, e); + CheckJoinLeft(e, pt); horzEdge.currX := e.currX; e := horzEdge.nextInAEL; end else begin IntersectEdges(e, horzEdge, pt); SwapPositionsInAEL(e, horzEdge); + CheckJoinRight(e, pt); horzEdge.currX := e.currX; e := horzEdge.prevInAEL; end; - if IsHotEdge(horzEdge) and (horzEdge.outrec <> currOr) then + if IsHotEdge(horzEdge) then begin - currOr := horzEdge.outrec; //nb: The outrec containining the op returned by IntersectEdges //above may no longer be associated with horzEdge. FHorzSegList.Add(GetLastOp(horzEdge)); @@ -3444,16 +3554,14 @@ procedure TClipperBase.DoHorizontal(horzEdge: PActive); if IsHotEdge(horzEdge) then AddOutPt(horzEdge, horzEdge.top); UpdateEdgeIntoAEL(horzEdge); - - if PreserveCollinear and - not horzIsOpen and HorzIsSpike(horzEdge) then - TrimHorz(horzEdge, true); - isLeftToRight := ResetHorzDirection; end; // end while horizontal if IsHotEdge(horzEdge) then - AddOutPt(horzEdge, horzEdge.top); + begin + op := AddOutPt(horzEdge, horzEdge.top); + FHorzSegList.Add(op); // Disc.#546 + end; UpdateEdgeIntoAEL(horzEdge); // this is the end of an intermediate horiz. end; @@ -3521,8 +3629,8 @@ function TClipperBase.DoMaxima(e: PActive): PActive; if not assigned(eMaxPair) then Exit; // EMaxPair is a horizontal ... end; - if IsJoined(e) then Split(e, e.top); - if IsJoined(eMaxPair) then Split(eMaxPair, eMaxPair.top); + if IsJoined(e) then UndoJoin(e, e.top); + if IsJoined(eMaxPair) then UndoJoin(eMaxPair, eMaxPair.top); // only non-horizontal maxima here. // process any edges between maxima pair ... @@ -3559,17 +3667,15 @@ function TClipperBase.DoMaxima(e: PActive): PActive; end; //------------------------------------------------------------------------------ -function TClipperBase.BuildPaths(out closedPaths, openPaths: TPaths64): Boolean; +function TClipperBase.BuildPaths(var closedPaths, openPaths: TPaths64): Boolean; var - i, cntClosed, cntOpen: Integer; + i: Integer; + closedCnt, openCnt: integer; outRec: POutRec; begin + closedCnt := Length(closedPaths); + openCnt := Length(openPaths); try - cntClosed := 0; cntOpen := 0; - SetLength(closedPaths, FOutRecList.Count); - if FHasOpenPaths then - SetLength(openPaths, FOutRecList.Count); - i := 0; while i < FOutRecList.Count do begin @@ -3579,22 +3685,21 @@ function TClipperBase.BuildPaths(out closedPaths, openPaths: TPaths64): Boolean; if outRec.isOpen then begin + SetLength(openPaths, openCnt +1); if BuildPath(outRec.pts, FReverseSolution, - true, openPaths[cntOpen]) then - inc(cntOpen); + true, openPaths[openCnt]) then inc(openCnt); end else begin // nb: CleanCollinear can add to FOutRecList CleanCollinear(outRec); // closed paths should always return a Positive orientation // except when ReverseSolution == true + SetLength(closedPaths, closedCnt +1); if BuildPath(outRec.pts, FReverseSolution, - false, closedPaths[cntClosed]) then - inc(cntClosed); + false, closedPaths[closedCnt]) then + inc(closedCnt); end; end; - SetLength(closedPaths, cntClosed); - SetLength(openPaths, cntOpen); result := true; except result := false; @@ -3619,21 +3724,30 @@ function TClipperBase.CheckBounds(outrec: POutRec): Boolean; end; //------------------------------------------------------------------------------ -function TClipperBase.CheckSplitOwner(outrec: POutRec): Boolean; +function TClipperBase.CheckSplitOwner(outrec: POutRec; const splits: TOutRecArray): Boolean; var i : integer; split : POutrec; begin - for i := 0 to High(outrec.owner.splits) do + // returns true if a valid owner is found in splits + // (and also assigns it to outrec.owner) + Result := true; + for i := 0 to High(splits) do begin - split := GetRealOutRec(outrec.owner.splits[i]); - if Assigned(split) and (split <> outrec) and - (split <> outrec.owner) and CheckBounds(split) and + split := GetRealOutRec(splits[i]); + if (split = nil) or + (split = outrec) or + (split.recursiveCheck = outrec) then Continue; + + split.recursiveCheck := outrec; // prevent infinite loops + if Assigned(split.splits) and + CheckSplitOwner(outrec, split.splits) then Exit + else if IsValidOwner(outrec, split) and + CheckBounds(split) and (split.bounds.Contains(outrec.bounds) and - Path1InsidePath2(outrec.pts, split.pts)) then + Path1InsidePath2(outrec.pts, split.pts)) then begin outrec.owner := split; - Result := True; Exit; end; end; @@ -3653,7 +3767,7 @@ procedure TClipperBase.RecursiveCheckOwners(outrec: POutRec; polytree: TPolyPath while Assigned(outrec.owner) do begin if Assigned(outrec.owner.splits) and - CheckSplitOwner(outrec) then Break; + CheckSplitOwner(outrec, outrec.owner.splits) then Break; if Assigned(outrec.owner.pts) and CheckBounds(outrec.owner) and (outrec.owner.bounds.Contains(outrec.bounds) and @@ -3743,6 +3857,12 @@ function TClipperBase.GetBounds: TRect64; // TClipper methods //------------------------------------------------------------------------------ +procedure TClipper64.AddReuseableData(const reuseableData: TReuseableDataContainer64); +begin + inherited AddReuseableData(reuseableData); +end; +//------------------------------------------------------------------------------ + procedure TClipper64.AddSubject(const subject: TPath64); begin AddPath(subject, ptSubject, false); @@ -3899,9 +4019,7 @@ function TPolyPathBase.GetLevel: Integer; function TPolyPathBase.GetIsHole: Boolean; begin - if not Assigned(Parent) then - Result := false else - Result := not Odd(GetLevel); + Result := Iif(Assigned(Parent), not Odd(GetLevel), false); end; //------------------------------------------------------------------------------ @@ -4109,6 +4227,16 @@ function TPolyPathD.AddChild(const path: TPath64): TPolyPathBase; end; //------------------------------------------------------------------------------ +function TPolyPathD.AddChild(const path: TPathD): TPolyPathBase; +begin + Result := TPolyPathD.Create; + Result.Parent := self; + TPolyPathD(Result).fScale := fScale; + TPolyPathD(Result).FPath := path; + ChildList.Add(Result); +end; +//------------------------------------------------------------------------------ + function TPolyPathD.GetChildD(index: Integer): TPolyPathD; begin Result := TPolyPathD(GetChild(index)); diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.Minkowski.pas b/Ext/SVGIconImageList/Image32/source/Clipper.Minkowski.pas index 1d7a82b..bacb3ea 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.Minkowski.pas +++ b/Ext/SVGIconImageList/Image32/source/Clipper.Minkowski.pas @@ -2,7 +2,7 @@ (******************************************************************************* * Author : Angus Johnson * -* Date : 15 October 2022 * +* Date : 21 December 2023 * * Copyright : Angus Johnson 2010-2022 * * Purpose : Minkowski Addition and Difference * * License : http://www.boost.org/LICENSE_1_0.txt * @@ -51,9 +51,7 @@ function Minkowski(const Base, Path: TPath64; tmp: TPaths64; quad: TPath64; begin - if IsClosed then - delta := 0 else - delta := 1; + delta := Iif(IsClosed, 0 , 1); baseLen := Length(Base); pathLen := Length(Path); setLength(tmp, pathLen); @@ -71,10 +69,7 @@ function Minkowski(const Base, Path: TPath64; SetLength(quad, 4); SetLength(Result, (pathLen - delta) * baseLen); - - if IsClosed then - g := pathLen - 1 else - g := 0; + g := Iif(IsClosed, pathLen - 1, 0); for i := delta to pathLen - 1 do begin diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.Offset.pas b/Ext/SVGIconImageList/Image32/source/Clipper.Offset.pas index d1d14e0..3fd9e9a 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.Offset.pas +++ b/Ext/SVGIconImageList/Image32/source/Clipper.Offset.pas @@ -2,9 +2,9 @@ (******************************************************************************* * Author : Angus Johnson * -* Date : 8 April 2023 * +* Date : 17 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2023 * +* Copyright : Angus Johnson 2010-2024 * * Purpose : Path Offset (Inflate/Shrink) * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -18,7 +18,10 @@ interface type - TJoinType = (jtSquare, jtRound, jtMiter); + TJoinType = (jtMiter, jtSquare, jtBevel, jtRound); + //jtSquare: Joins are 'squared' at exactly the offset distance (complex code) + //jtBevel : offset distances vary depending on the angle (simple code, faster) + TEndType = (etPolygon, etJoined, etButt, etSquare, etRound); // etButt : offsets both sides of a path, with square blunt ends // etSquare : offsets both sides of a path, with square extended ends @@ -26,19 +29,25 @@ interface // etJoined : offsets both sides of a path, with joined ends // etPolygon: offsets only one side of a closed path + TDeltaCallback64 = function (const path: TPath64; + const path_norms: TPathD; currIdx, prevIdx: integer): double of object; + + TDoubleArray = array of double; + BooleanArray = array of Boolean; + TGroup = class - paths : TPaths64; - reversed : Boolean; - joinType : TJoinType; - endType : TEndType; - constructor Create(jt: TJoinType; et: TEndType); + paths : TPaths64; + joinType : TJoinType; + endType : TEndType; + reversed : Boolean; + lowestPathIdx : integer; + constructor Create(const pathsIn: TPaths64; jt: TJoinType; et: TEndType); end; TClipperOffset = class private fDelta : Double; fGroupDelta : Double; //*0.5 for open paths; *-1.0 for neg areas - fAbsGrpDelta : Double; fMinLenSqrd : double; fJoinType : TJoinType; fEndType : TEndType; @@ -52,20 +61,29 @@ TClipperOffset = class fGroupList : TListEx; fInPath : TPath64; fOutPath : TPath64; - fOutPaths : TPaths64; fOutPathLen : Integer; fSolution : TPaths64; + fSolutionLen : Integer; + fSolutionTree : TPolyTree64; fPreserveCollinear : Boolean; fReverseSolution : Boolean; + fDeltaCallback64 : TDeltaCallback64; {$IFDEF USINGZ} fZCallback64 : TZCallback64; + procedure ZCB(const bot1, top1, bot2, top2: TPoint64; + var intersectPt: TPoint64); procedure AddPoint(x,y: double; z: Int64); overload; + procedure AddPoint(const pt: TPoint64); overload; + {$IFDEF INLINING} inline; {$ENDIF} + procedure AddPoint(const pt: TPoint64; newZ: Int64); overload; + {$IFDEF INLINING} inline; {$ENDIF} {$ELSE} procedure AddPoint(x,y: double); overload; -{$ENDIF} procedure AddPoint(const pt: TPoint64); overload; {$IFDEF INLINING} inline; {$ENDIF} +{$ENDIF} procedure DoSquare(j, k: Integer); + procedure DoBevel(j, k: Integer); procedure DoMiter(j, k: Integer; cosA: Double); procedure DoRound(j, k: integer; angle: double); procedure OffsetPoint(j: Integer; var k: integer); @@ -75,6 +93,10 @@ TClipperOffset = class procedure OffsetPolygon; procedure OffsetOpenJoined; procedure OffsetOpenPath; + function CalcSolutionCapacity: integer; + procedure UpdateSolution; {$IFDEF INLINING} inline; {$ENDIF} + + function CheckReverseOrientation: Boolean; procedure ExecuteInternal(delta: Double); public constructor Create(miterLimit: double = 2.0; @@ -89,6 +111,7 @@ TClipperOffset = class procedure Clear; procedure Execute(delta: Double; out solution: TPaths64); overload; procedure Execute(delta: Double; polytree: TPolyTree64); overload; + procedure Execute(DeltaCallback: TDeltaCallback64; out solution: TPaths64); overload; // MiterLimit: needed for mitered offsets (see offset_triginometry3.svg) property MiterLimit: Double read fMiterLimit write fMiterLimit; @@ -98,6 +121,8 @@ TClipperOffset = class read fPreserveCollinear write fPreserveCollinear; property ReverseSolution: Boolean read fReverseSolution write fReverseSolution; + property DeltaCallback: TDeltaCallback64 read + fDeltaCallback64 write fDeltaCallback64; {$IFDEF USINGZ} property ZCallback: TZCallback64 read fZCallback64 write fZCallback64; {$ENDIF} @@ -108,6 +133,10 @@ implementation uses Math; +resourcestring + rsClipper_CoordRangeError = + 'Offsetting will exceed the valid coordinate range'; + const TwoPi : Double = 2 * PI; InvTwoPi : Double = 1/(2 * PI); @@ -175,21 +204,21 @@ function GetUnitNormal(const pt1, pt2: TPoint64): TPointD; function GetLowestPolygonIdx(const paths: TPaths64): integer; var i,j: integer; - lp: TPoint64; - p: TPath64; + botPt: TPoint64; begin Result := -1; - lp := Point64(0, -MaxInt64); - for i := 0 to High(paths) do - begin - p := paths[i]; - for j := 0 to High(p) do - begin - if (p[j].Y < lp.Y) or - ((p[j].Y = lp.Y) and (p[j].X >= lp.X)) then Continue; - Result := i; - lp := p[j]; - end; + botPt := Point64(MaxInt64, MinInt64); + for i := 0 to High(paths) do + begin + for j := 0 to High(paths[i]) do + with paths[i][j] do + begin + if (Y < botPt.Y) or + ((Y = botPt.Y) and (X >= botPt.X)) then Continue; + result := i; + botPt.X := X; + botPt.Y := Y; + end; end; end; //------------------------------------------------------------------------------ @@ -204,10 +233,30 @@ function UnsafeGet(List: TList; Index: Integer): Pointer; // TGroup methods //------------------------------------------------------------------------------ -constructor TGroup.Create(jt: TJoinType; et: TEndType); +constructor TGroup.Create(const pathsIn: TPaths64; jt: TJoinType; et: TEndType); +var + i, len: integer; + isJoined: boolean; begin Self.joinType := jt; Self.endType := et; + + isJoined := et in [etPolygon, etJoined]; + len := Length(pathsIn); + SetLength(paths, len); + for i := 0 to len -1 do + paths[i] := StripDuplicates(pathsIn[i], isJoined); + + reversed := false; + if (et = etPolygon) then + begin + // the lowermost path must be an outer path, so if its orientation is + // negative, then flag that the whole group is 'reversed' (so negate + // delta etc.) as this is much more efficient than reversing every path. + lowestPathIdx := GetLowestPolygonIdx(pathsIn); + reversed := (lowestPathIdx >= 0) and (Area(pathsIn[lowestPathIdx]) < 0); + end else + lowestPathIdx := -1; end; //------------------------------------------------------------------------------ @@ -242,6 +291,7 @@ procedure TClipperOffset.Clear; TGroup(fGroupList[i]).Free; fGroupList.Clear; fSolution := nil; + fSolutionLen := 0; end; //------------------------------------------------------------------------------ @@ -263,8 +313,7 @@ procedure TClipperOffset.AddPaths(const paths: TPaths64; group: TGroup; begin if Length(paths) = 0 then Exit; - group := TGroup.Create(joinType, endType); - AppendPaths(group.paths, paths); + group := TGroup.Create(paths, joinType, endType); fGroupList.Add(group); end; //------------------------------------------------------------------------------ @@ -291,116 +340,104 @@ function GetPerpendicD(const pt: TPoint64; const norm: TPointD; delta: double): procedure TClipperOffset.DoGroupOffset(group: TGroup); var - i,j, len, lowestIdx: Integer; - r, stepsPer360, arcTol, area: Double; + i,j, len, steps: Integer; + r, stepsPer360, arcTol: Double; + absDelta: double; rec: TRect64; - isJoined: Boolean; + pt0: TPoint64; begin + if group.endType = etPolygon then begin - // the lowermost polygon must be an outer polygon. So we can use that as the - // designated orientation for outer polygons (needed for tidy-up clipping) - lowestIdx := GetLowestPolygonIdx(group.paths); - if lowestIdx < 0 then Exit; - // nb: don't use the default orientation here ... - area := Clipper.Core.Area(group.paths[lowestIdx]); - //if area = 0 then Exit; // this is probably unhelpful (#430) - group.reversed := (area < 0); - if group.reversed then fGroupDelta := -fDelta - else fGroupDelta := fDelta; - end else - begin - group.reversed := false; - fGroupDelta := Abs(fDelta) * 0.5; - end; - fAbsGrpDelta := Abs(fGroupDelta); + if (group.lowestPathIdx < 0) then fDelta := Abs(fDelta); + fGroupDelta := Iif(group.reversed, -fDelta, fDelta); + end + else + fGroupDelta := Abs(fDelta); + + absDelta := Abs(fGroupDelta); + fJoinType := group.joinType; fEndType := group.endType; - // calculate a sensible number of steps (for 360 deg for the given offset if (group.joinType = jtRound) or (group.endType = etRound) then begin - // arcTol - when fArcTolerance is undefined (0), the amount of - // curve imprecision that's allowed is based on the size of the - // offset (delta). Obviously very large offsets will almost always - // require much less precision. See also offset_triginometry2.svg - if fArcTolerance > 0.01 then - arcTol := Min(fAbsGrpDelta, fArcTolerance) else - arcTol := Log10(2 + fAbsGrpDelta) * 0.25; // empirically derived - //http://www.angusj.com/clipper2/Docs/Trigonometry.htm - stepsPer360 := Pi / ArcCos(1 - arcTol / fAbsGrpDelta); - if (stepsPer360 > fAbsGrpDelta * Pi) then - stepsPer360 := fAbsGrpDelta * Pi; // avoid excessive precision + // calculate the number of steps required to approximate a circle + // (see http://www.angusj.com/clipper2/Docs/Trigonometry.htm) + // arcTol - when arc_tolerance_ is undefined (0) then curve imprecision + // will be relative to the size of the offset (delta). Obviously very + //large offsets will almost always require much less precision. + arcTol := Iif(fArcTolerance > 0.01, + Min(absDelta, fArcTolerance), + Log10(2 + absDelta) * 0.25); // empirically derived + + stepsPer360 := Pi / ArcCos(1 - arcTol / absDelta); + if (stepsPer360 > absDelta * Pi) then + stepsPer360 := absDelta * Pi; // avoid excessive precision fStepSin := sin(TwoPi/stepsPer360); fStepCos := cos(TwoPi/stepsPer360); if (fGroupDelta < 0.0) then fStepSin := -fStepSin; fStepsPerRad := stepsPer360 / TwoPi; end; - fOutPaths := nil; - isJoined := fEndType in [etPolygon, etJoined]; for i := 0 to High(group.paths) do begin - fInPath := StripDuplicates(group.paths[i], IsJoined); - len := Length(fInPath); - if (len = 0) or ((len < 3) and (fEndType = etPolygon)) then - Continue; - + fInPath := group.paths[i]; fNorms := nil; - fOutPath := nil; - fOutPathLen := 0; + len := Length(fInPath); //if a single vertex then build a circle or a square ... if len = 1 then begin if fGroupDelta < 1 then Continue; + pt0 := fInPath[0]; + + if Assigned(fDeltaCallback64) then + begin + fGroupDelta := fDeltaCallback64(fInPath, fNorms, 0, 0); + if TGroup(fGroupList[0]).reversed then fGroupDelta := -fGroupDelta; + absDelta := Abs(fGroupDelta); + end; + if (group.endType = etRound) then begin - r := fAbsGrpDelta; - with fInPath[0] do - begin - fOutPath := Path64(Ellipse(RectD(X-r, Y-r, X+r, Y+r))); + r := absDelta; + steps := Ceil(fStepsPerRad * TwoPi); //#617 + fOutPath := Path64(Ellipse( + RectD(pt0.X-r, pt0.Y-r, pt0.X+r, pt0.Y+r), steps)); {$IFDEF USINGZ} - for j := 0 to high(fOutPath) do - fOutPath[j].Z := Z; + for j := 0 to high(fOutPath) do + fOutPath[j].Z := pt0.Z; {$ENDIF} - end; end else begin - j := Round(fGroupDelta); - with fInPath[0] do - begin - rec := Rect64(X -j, Y -j, X+j, Y+j); - fOutPath := rec.AsPath; + j := Round(absDelta); + rec := Rect64(pt0.X -j, pt0.Y -j, pt0.X+j, pt0.Y+j); + fOutPath := rec.AsPath; {$IFDEF USINGZ} - for j := 0 to high(fOutPath) do - fOutPath[j].Z := Z; + for j := 0 to high(fOutPath) do + fOutPath[j].Z := pt0.Z; {$ENDIF} - end end; - AppendPath(fOutPaths, fOutPath); + UpdateSolution; Continue; - end else - begin - if (len = 2) and (group.endType = etJoined) then - begin - if fJoinType = jtRound then - fEndType := etRound else - fEndType := etSquare; - end; + end; // end of offsetting a single point - BuildNormals; - if fEndType = etPolygon then OffsetPolygon - else if fEndType = etJoined then OffsetOpenJoined - else OffsetOpenPath; + if (len = 2) and (group.endType = etJoined) then + begin + if fJoinType = jtRound then + fEndType := etRound else + fEndType := etSquare; end; - if fOutPathLen = 0 then Continue; - SetLength(fOutPath, fOutPathLen); - AppendPath(fOutPaths, fOutPath); + BuildNormals; + if fEndType = etPolygon then + OffsetPolygon + else if fEndType = etJoined then + OffsetOpenJoined + else + OffsetOpenPath; end; - // finally copy the working 'outPaths' to the solution - AppendPaths(fSolution, fOutPaths); end; //------------------------------------------------------------------------------ @@ -416,6 +453,30 @@ procedure TClipperOffset.BuildNormals; end; //------------------------------------------------------------------------------ +procedure TClipperOffset.UpdateSolution; +begin + if fOutPathLen = 0 then Exit; + SetLength(fOutPath, fOutPathLen); + fSolution[fSolutionLen] := fOutPath; + inc(fSolutionLen); + fOutPath := nil; + fOutPathLen := 0; +end; +//------------------------------------------------------------------------------ + +function TClipperOffset.CalcSolutionCapacity: integer; +var + i: integer; +begin + Result := 0; + for i := 0 to fGroupList.Count -1 do + with TGroup(fGroupList[i]) do + if endType = etJoined then + inc(Result, Length(paths) *2) else + inc(Result, Length(paths)); +end; +//------------------------------------------------------------------------------ + procedure TClipperOffset.OffsetPolygon; var i,j: integer; @@ -423,23 +484,18 @@ procedure TClipperOffset.OffsetPolygon; j := high(fInPath); for i := 0 to high(fInPath) do OffsetPoint(i, j); + UpdateSolution; end; //------------------------------------------------------------------------------ procedure TClipperOffset.OffsetOpenJoined; begin OffsetPolygon; - SetLength(fOutPath, fOutPathLen); - AppendPath(fOutPaths, fOutPath); - fOutPath := nil; - fOutPathLen := 0; fInPath := ReversePath(fInPath); - // Rebuild normals // BuildNormals; fNorms := ReversePath(fNorms); fNorms := ShiftPath(fNorms, 1); fNorms := NegatePath(fNorms); - OffsetPolygon; end; //------------------------------------------------------------------------------ @@ -450,26 +506,32 @@ procedure TClipperOffset.OffsetOpenPath; begin highI := high(fInPath); - // do the line start cap - case fEndType of - etButt: - begin -{$IFDEF USINGZ} - with fInPath[0] do AddPoint(Point64( - X - fNorms[0].X * fGroupDelta, - Y - fNorms[0].Y * fGroupDelta, - Z)); -{$ELSE} - with fInPath[0] do AddPoint(Point64( - X - fNorms[0].X * fGroupDelta, - Y - fNorms[0].Y * fGroupDelta)); -{$ENDIF} - AddPoint(GetPerpendic(fInPath[0], fNorms[0], fGroupDelta)); - end; - etRound: DoRound(0,0, PI); - else DoSquare(0, 0); + if Assigned(fDeltaCallback64) then + fGroupDelta := fDeltaCallback64(fInPath, fNorms, 0, 0); + + if (Abs(fGroupDelta) < Tolerance) and + not Assigned(fDeltaCallback64) then + begin + inc(highI); + SetLength(fOutPath, highI); + Move(fInPath[0], fOutPath, highI + SizeOf(TPointD)); + fOutPathLen := highI; + Exit; end; + // do the line start cap + if Assigned(fDeltaCallback64) then + fGroupDelta := fDeltaCallback64(fInPath, fNorms, 0, 0); + + if (Abs(fGroupDelta) < Tolerance) then + AddPoint(fInPath[0]) + else + case fEndType of + etButt: DoBevel(0, 0); + etRound: DoRound(0,0, PI); + else DoSquare(0, 0); + end; + // offset the left side going forward k := 0; for i := 1 to highI -1 do //nb: -1 is important @@ -484,39 +546,40 @@ procedure TClipperOffset.OffsetOpenPath; fNorms[0] := fNorms[highI]; // do the line end cap + + if Assigned(fDeltaCallback64) then + fGroupDelta := fDeltaCallback64(fInPath, fNorms, highI, highI); + if Abs(fGroupDelta) < Tolerance then + begin + AddPoint(fInPath[highI]); + end else case fEndType of - etButt: - begin -{$IFDEF USINGZ} - with fInPath[highI] do AddPoint(Point64( - X - fNorms[highI].X *fGroupDelta, - Y - fNorms[highI].Y *fGroupDelta, - Z)); -{$ELSE} - with fInPath[highI] do AddPoint(Point64( - X - fNorms[highI].X *fGroupDelta, - Y - fNorms[highI].Y *fGroupDelta)); -{$ENDIF} - AddPoint(GetPerpendic(fInPath[highI], fNorms[highI], fGroupDelta)); - end; + etButt: DoBevel(highI, highI); etRound: DoRound(highI,highI, PI); else DoSquare(highI, highI); end; // offset the left side going back - k := 0; - for i := highI downto 1 do //and stop at 1! + k := highI; + for i := highI -1 downto 1 do //and stop at 1! OffsetPoint(i, k); + + UpdateSolution; end; //------------------------------------------------------------------------------ procedure TClipperOffset.ExecuteInternal(delta: Double); var - i: integer; + i,j: integer; group: TGroup; + pathsReversed: Boolean; + fillRule: TFillRule; + dummy: TPaths64; begin fSolution := nil; + fSolutionLen := 0; if fGroupList.Count = 0 then Exit; + SetLength(fSolution, CalcSolutionCapacity); fMinLenSqrd := 1; if abs(delta) < Tolerance then @@ -525,7 +588,11 @@ procedure TClipperOffset.ExecuteInternal(delta: Double); for i := 0 to fGroupList.Count -1 do begin group := TGroup(fGroupList[i]); - AppendPaths(fSolution, group.paths); + for j := 0 to High(group.paths) do + begin + fSolution[fSolutionLen] := group.paths[i]; + inc(fSolutionLen); + end; end; Exit; end; @@ -542,73 +609,88 @@ procedure TClipperOffset.ExecuteInternal(delta: Double); group := TGroup(fGroupList[i]); DoGroupOffset(group); end; + SetLength(fSolution, fSolutionLen); + + pathsReversed := CheckReverseOrientation(); + if pathsReversed then + fillRule := frNegative else + fillRule := frPositive; // clean up self-intersections ... with TClipper64.Create do try PreserveCollinear := fPreserveCollinear; // the solution should retain the orientation of the input - ReverseSolution := - fReverseSolution <> TGroup(fGroupList[0]).reversed; + ReverseSolution := fReverseSolution <> pathsReversed; +{$IFDEF USINGZ} + ZCallback := ZCB; +{$ENDIF} + AddSubject(fSolution); - if TGroup(fGroupList[0]).reversed then - Execute(ctUnion, frNegative, fSolution) else - Execute(ctUnion, frPositive, fSolution); + if assigned(fSolutionTree) then + Execute(ctUnion, fillRule, fSolutionTree, dummy); + Execute(ctUnion, fillRule, fSolution); finally free; end; end; //------------------------------------------------------------------------------ +function TClipperOffset.CheckReverseOrientation: Boolean; +var + i: integer; +begin + Result := false; + // find the orientation of the first closed path + for i := 0 to fGroupList.Count -1 do + with TGroup(fGroupList[i]) do + if endType = etPolygon then + begin + Result := reversed; + break; + end; +end; +//------------------------------------------------------------------------------ + procedure TClipperOffset.Execute(delta: Double; out solution: TPaths64); begin - fSolution := nil; solution := nil; - ExecuteInternal(delta); + fSolutionTree := nil; if fGroupList.Count = 0 then Exit; + ExecuteInternal(delta); + solution := fSolution; +end; +//------------------------------------------------------------------------------ - // clean up self-intersections ... - with TClipper64.Create do - try - PreserveCollinear := fPreserveCollinear; - // the solution should retain the orientation of the input - ReverseSolution := - fReverseSolution <> TGroup(fGroupList[0]).reversed; - AddSubject(fSolution); - if TGroup(fGroupList[0]).reversed then - Execute(ctUnion, frNegative, solution) else - Execute(ctUnion, frPositive, solution); - finally - free; - end; +procedure TClipperOffset.Execute(DeltaCallback: TDeltaCallback64; out solution: TPaths64); +begin + fDeltaCallback64 := DeltaCallback; + Execute(1.0, solution); end; //------------------------------------------------------------------------------ procedure TClipperOffset.Execute(delta: Double; polytree: TPolyTree64); -var - dummy: TPaths64; begin - fSolution := nil; if not Assigned(polytree) then Raise EClipper2LibException(rsClipper_PolyTreeErr); - + fSolutionTree := polytree; + fSolutionTree.Clear; ExecuteInternal(delta); +end; +//------------------------------------------------------------------------------ - // clean up self-intersections ... - with TClipper64.Create do - try - PreserveCollinear := fPreserveCollinear; - // the solution should retain the orientation of the input - ReverseSolution := - fReverseSolution <> TGroup(fGroupList[0]).reversed; - AddSubject(fSolution); - if TGroup(fGroupList[0]).reversed then - Execute(ctUnion, frNegative, polytree, dummy) else - Execute(ctUnion, frPositive, polytree, dummy); - finally - free; - end; +{$IFDEF USINGZ} +procedure TClipperOffset.ZCB(const bot1, top1, bot2, top2: TPoint64; + var intersectPt: TPoint64); +begin + if (bot1.Z <> 0) and + ((bot1.Z = bot2.Z) or (bot1.Z = top2.Z)) then intersectPt.Z := bot1.Z + else if (bot2.Z <> 0) and (bot2.Z = top1.Z) then intersectPt.Z := bot2.Z + else if (top1.Z <> 0) and (top1.Z = top2.Z) then intersectPt.Z := top1.Z + else if Assigned(ZCallback) then + ZCallback(bot1, top1, bot2, top2, intersectPt); end; +{$ENDIF} //------------------------------------------------------------------------------ {$IFDEF USINGZ} @@ -635,15 +717,26 @@ procedure TClipperOffset.AddPoint(x,y: double); end; //------------------------------------------------------------------------------ +{$IFDEF USINGZ} +procedure TClipperOffset.AddPoint(const pt: TPoint64; newZ: Int64); +begin + AddPoint(pt.X, pt.Y, newZ); +end; +//------------------------------------------------------------------------------ + procedure TClipperOffset.AddPoint(const pt: TPoint64); begin -{$IFDEF USINGZ} AddPoint(pt.X, pt.Y, pt.Z); +end; +//------------------------------------------------------------------------------ + {$ELSE} +procedure TClipperOffset.AddPoint(const pt: TPoint64); +begin AddPoint(pt.X, pt.Y); -{$ENDIF} end; //------------------------------------------------------------------------------ +{$ENDIF} function IntersectPoint(const ln1a, ln1b, ln2a, ln2b: TPointD): TPointD; var @@ -688,14 +781,58 @@ function ReflectPoint(const pt, pivot: TPointD): TPointD; end; //------------------------------------------------------------------------------ +procedure TClipperOffset.DoBevel(j, k: Integer); +var + absDelta: double; +begin + if k = j then + begin + absDelta := abs(fGroupDelta); +{$IFDEF USINGZ} + AddPoint( + fInPath[j].x - absDelta * fNorms[j].x, + fInPath[j].y - absDelta * fNorms[j].y, fInPath[j].z); + AddPoint( + fInPath[j].x + absDelta * fNorms[j].x, + fInPath[j].y + absDelta * fNorms[j].y, fInPath[j].z); +{$ELSE} + AddPoint( + fInPath[j].x - absDelta * fNorms[j].x, + fInPath[j].y - absDelta * fNorms[j].y); + AddPoint( + fInPath[j].x + absDelta * fNorms[j].x, + fInPath[j].y + absDelta * fNorms[j].y); +{$ENDIF} + end else + begin +{$IFDEF USINGZ} + AddPoint( + fInPath[j].x + fGroupDelta * fNorms[k].x, + fInPath[j].y + fGroupDelta * fNorms[k].y, fInPath[j].z); + AddPoint( + fInPath[j].x + fGroupDelta * fNorms[j].x, + fInPath[j].y + fGroupDelta * fNorms[j].y, fInPath[j].z); +{$ELSE} + AddPoint( + fInPath[j].x + fGroupDelta * fNorms[k].x, + fInPath[j].y + fGroupDelta * fNorms[k].y); + AddPoint( + fInPath[j].x + fGroupDelta * fNorms[j].x, + fInPath[j].y + fGroupDelta * fNorms[j].y); +{$ENDIF} + end; +end; +//------------------------------------------------------------------------------ + procedure TClipperOffset.DoSquare(j, k: Integer); var vec, pt1,pt2,pt3,pt4, pt,ptQ : TPointD; + absDelta: double; begin if k = j then begin - vec.X := fNorms[0].Y; //squaring a line end - vec.Y := -fNorms[0].X; + vec.X := fNorms[j].Y; //squaring a line end + vec.Y := -fNorms[j].X; end else begin // using the reciprocal of unit normals (as unit vectors) @@ -705,9 +842,10 @@ procedure TClipperOffset.DoSquare(j, k: Integer); PointD(fNorms[j].Y, -fNorms[j].X)); end; + absDelta := Abs(fGroupDelta); // now offset the original vertex delta units along unit vector ptQ := PointD(fInPath[j]); - ptQ := TranslatePoint(ptQ, fAbsGrpDelta * vec.X, fAbsGrpDelta * vec.Y); + ptQ := TranslatePoint(ptQ, absDelta * vec.X, absDelta * vec.Y); // get perpendicular vertices pt1 := TranslatePoint(ptQ, fGroupDelta * vec.Y, fGroupDelta * -vec.X); @@ -767,9 +905,29 @@ procedure TClipperOffset.DoMiter(j, k: Integer; cosA: Double); procedure TClipperOffset.DoRound(j, k: Integer; angle: double); var i, steps: Integer; + absDelta, arcTol, stepsPer360: double; pt: TPoint64; offDist: TPointD; begin + + if Assigned(fDeltaCallback64) then + begin + // when fDeltaCallback64 is assigned, fGroupDelta won't be constant, + // so we'll need to do the following calculations for *every* vertex. + absDelta := Abs(fGroupDelta); + arcTol := Iif(fArcTolerance > 0.01, + Min(absDelta, fArcTolerance), + Log10(2 + absDelta) * 0.25); // empirically derived + //http://www.angusj.com/clipper2/Docs/Trigonometry.htm + stepsPer360 := Pi / ArcCos(1 - arcTol / absDelta); + if (stepsPer360 > absDelta * Pi) then + stepsPer360 := absDelta * Pi; // avoid excessive precision + fStepSin := sin(TwoPi/stepsPer360); + fStepCos := cos(TwoPi/stepsPer360); + if (fGroupDelta < 0.0) then fStepSin := -fStepSin; + fStepsPerRad := stepsPer360 / TwoPi; + end; + // nb: angles may be negative but this will always be a convex join pt := fInPath[j]; offDist := ScalePoint(fNorms[k], fGroupDelta); @@ -794,7 +952,7 @@ procedure TClipperOffset.DoRound(j, k: Integer; angle: double); end; //------------------------------------------------------------------------------ -procedure TClipperOffset.OffsetPoint(j: Integer; var k: integer); + procedure TClipperOffset.OffsetPoint(j: Integer; var k: integer); var sinA, cosA: Double; begin @@ -814,30 +972,55 @@ procedure TClipperOffset.OffsetPoint(j: Integer; var k: integer); if (sinA > 1.0) then sinA := 1.0 else if (sinA < -1.0) then sinA := -1.0; + if Assigned(fDeltaCallback64) then + begin + fGroupDelta := fDeltaCallback64(fInPath, fNorms, j, k); + if TGroup(fGroupList[0]).reversed then fGroupDelta := -fGroupDelta; + end; - if (cosA > -0.99) and (sinA * fGroupDelta < 0) then + if Abs(fGroupDelta) <= Tolerance then + begin + AddPoint(fInPath[j]); + Exit; + end; + + //test for concavity first (#593) + if (cosA > -0.999) and (sinA * fGroupDelta < 0) then begin // is concave +{$IFDEF USINGZ} + AddPoint(GetPerpendic(fInPath[j], fNorms[k], fGroupDelta), fInPath[j].Z); +{$ELSE} AddPoint(GetPerpendic(fInPath[j], fNorms[k], fGroupDelta)); - // this extra point is the only (simple) way to ensure that - // path reversals are fully cleaned with the trailing clipper - AddPoint(fInPath[j]); // (#405) +{$ENDIF} + // this extra point is the only simple way to ensure that path reversals + // (ie over-shrunk paths) are fully cleaned out with the trailing union op. + // However it's probably safe to skip this whenever an angle is almost flat. + if (cosA < 0.99) then + AddPoint(fInPath[j]); // (#405) +{$IFDEF USINGZ} + AddPoint(GetPerpendic(fInPath[j], fNorms[j], fGroupDelta), fInPath[j].Z); +{$ELSE} AddPoint(GetPerpendic(fInPath[j], fNorms[j], fGroupDelta)); +{$ENDIF} + end + else if (cosA > 0.999) and (fJoinType <> jtRound) then + begin + // almost straight - less than 2.5 degree (#424, #482, #526 & #724) + DoMiter(j, k, cosA); end else if (fJoinType = jtMiter) then begin - // miter unless the angle is so acute the miter would exceeds ML + // miter unless the angle is sufficiently acute to exceed ML if (cosA > fTmpLimit -1) then DoMiter(j, k, cosA) else DoSquare(j, k); end - else if (cosA > 0.9998) then - // almost straight - less than 1 degree (#424) - DoMiter(j, k, cosA) - else if (cosA > 0.99) or (fJoinType = jtSquare) then - //angle less than 8 degrees or squared joins - DoSquare(j, k) + else if (fJoinType = jtRound) then + DoRound(j, k, ArcTan2(sinA, cosA)) + else if (fJoinType = jtBevel) then + DoBevel(j, k) else - DoRound(j, k, ArcTan2(sinA, cosA)); + DoSquare(j, k); k := j; end; diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.RectClip.pas b/Ext/SVGIconImageList/Image32/source/Clipper.RectClip.pas index bd581d6..8a0cf05 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.RectClip.pas +++ b/Ext/SVGIconImageList/Image32/source/Clipper.RectClip.pas @@ -2,9 +2,9 @@ (******************************************************************************* * Author : Angus Johnson * -* Date : 22 April 2023 * +* Date : 27 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2023 * +* Copyright : Angus Johnson 2010-2024 * * Purpose : FAST rectangular clipping * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -32,7 +32,7 @@ TOutPt2 = record prev: POutPt2; end; - TRectClip = class + TRectClip64 = class procedure ExecuteInternal(const path: TPath64); function GetPath(resultIdx: integer): TPath64; protected @@ -57,11 +57,10 @@ TRectClip = class public constructor Create(const rect: TRect64); destructor Destroy; override; - function Execute(const paths: TPaths64; - convexOnly: Boolean = false): TPaths64; + function Execute(const paths: TPaths64): TPaths64; end; - TRectClipLines = class(TRectClip) + TRectClipLines64 = class(TRectClip64) private procedure ExecuteInternal(const path: TPath64); function GetPath(resultIdx: integer): TPath64; @@ -115,101 +114,152 @@ function GetLocation(const rec: TRect64; const pt: TPoint64; end; //------------------------------------------------------------------------------ +function IsHorizontal(pt1: TPoint64; pt2: TPoint64): Boolean; + {$IFDEF INLINING} inline; {$ENDIF} +begin + Result := pt1.Y = pt2.Y; +end; +//------------------------------------------------------------------------------ + +function GetSegmentIntersectPt2(p1: TPoint64; +p2: TPoint64; p3: TPoint64; p4: TPoint64; out ip: TPoint64): Boolean; +var + res1, res2, res3, res4: double; +begin + res1 := CrossProduct(p1, p3, p4); + res2 := CrossProduct(p2, p3, p4); + if (res1 = 0) then + begin + ip := p1; + if (res2 = 0) then + result := false // segments are collinear + else if PointsEqual(p1, p3) or PointsEqual(p1, p4) then + result := true + else if (IsHorizontal(p3, p4)) then + result := ((p1.X > p3.X) = (p1.X < p4.X)) + else + result := (p1.Y > p3.Y) = (p1.Y < p4.Y); + Exit; + end; + + if (res2 = 0) then + begin + ip := p2; + if PointsEqual(p2, p3) or PointsEqual(p2, p4) then + Result := true + else if (IsHorizontal(p3, p4)) then + Result := ((p2.X > p3.X) = (p2.X < p4.X)) + else Result := ((p2.Y > p3.Y) = (p2.Y < p4.Y)); + Exit; + end; + + if ((res1 > 0) = (res2 > 0)) then + begin + //ip := Point64(0, 0); + Result := false; + Exit; + end; + + res3 := CrossProduct(p3, p1, p2); + res4 := CrossProduct(p4, p1, p2); + if (res3 = 0) then + begin + ip := p3; + if PointsEqual(p3, p1) or PointsEqual(p3, p2) then + Result := true + else if (IsHorizontal(p1, p2)) then + Result := (p3.X > p1.X) = (p3.X < p2.X) + else + Result := (p3.Y > p1.Y) = (p3.Y < p2.Y); + end + else if (res4 = 0) then + begin + ip := p4; + if PointsEqual(p4, p1) or PointsEqual(p4, p2) then + Result := true + else if (IsHorizontal(p1, p2)) then + Result := (p4.X > p1.X) = (p4.X < p2.X) + else + Result := (p4.Y > p1.Y) = (p4.Y < p2.Y); + end + else if ((res3 > 0) = (res4 > 0)) then + begin + //ip := Point64(0, 0); + Result := false; + end + else + // segments must intersect to get here + Result := GetSegmentIntersectPt(p1, p2, p3, p4, ip); +end; +//------------------------------------------------------------------------------ + function GetIntersection(const rectPath: TPath64; const p, p2: TPoint64; var loc: TLocation; out ip: TPoint64): Boolean; begin // gets the intersection closest to 'p' // when Result = false, loc will remain unchanged - Result := false; + Result := True; case loc of locLeft: - if SegmentsIntersect(p, p2, rectPath[0], rectPath[3], true) then - GetIntersectPoint(p, p2, rectPath[0], rectPath[3], ip) + if GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[3], ip) then + //Result := True else if (p.Y < rectPath[0].Y) and - SegmentsIntersect(p, p2, rectPath[0], rectPath[1], true) then - begin - GetIntersectPoint(p, p2, rectPath[0], rectPath[1], ip); - loc := locTop; - end - else if SegmentsIntersect(p, p2, rectPath[2], rectPath[3], true) then - begin - GetIntersectPoint(p, p2, rectPath[2], rectPath[3], ip); - loc := locBottom; - end - else Exit; + GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[1], ip) then + loc := locTop + else if GetSegmentIntersectPt2(p, p2, rectPath[2], rectPath[3], ip) then + loc := locBottom + else + Result := False; + locRight: - if SegmentsIntersect(p, p2, rectPath[1], rectPath[2], true) then - GetIntersectPoint(p, p2, rectPath[1], rectPath[2], ip) + if GetSegmentIntersectPt2(p, p2, rectPath[1], rectPath[2], ip) then + //Result := True else if (p.Y < rectPath[0].Y) and - SegmentsIntersect(p, p2, rectPath[0], rectPath[1], true) then - begin - GetIntersectPoint(p, p2, rectPath[0], rectPath[1], ip); - loc := locTop; - end - else if SegmentsIntersect(p, p2, rectPath[2], rectPath[3], true) then - begin - GetIntersectPoint(p, p2, rectPath[2], rectPath[3], ip); - loc := locBottom; - end - else Exit; + GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[1], ip) then + loc := locTop + else if GetSegmentIntersectPt2(p, p2, rectPath[2], rectPath[3], ip) then + loc := locBottom + else + Result := False; + locTop: - if SegmentsIntersect(p, p2, rectPath[0], rectPath[1], true) then - GetIntersectPoint(p, p2, rectPath[0], rectPath[1], ip) + if GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[1], ip) then + //Result := True else if (p.X < rectPath[0].X) and - SegmentsIntersect(p, p2, rectPath[0], rectPath[3], true) then - begin - GetIntersectPoint(p, p2, rectPath[0], rectPath[3], ip); - loc := locLeft; - end + GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[3], ip) then + loc := locLeft else if (p.X > rectPath[1].X) and - SegmentsIntersect(p, p2, rectPath[1], rectPath[2], true) then - begin - GetIntersectPoint(p, p2, rectPath[1], rectPath[2], ip); - loc := locRight; - end - else Exit; + GetSegmentIntersectPt2(p, p2, rectPath[1], rectPath[2], ip) then + loc := locRight + else + Result := False; + locBottom: - if SegmentsIntersect(p, p2, rectPath[2], rectPath[3], true) then - GetIntersectPoint(p, p2, rectPath[2], rectPath[3], ip) + if GetSegmentIntersectPt2(p, p2, rectPath[2], rectPath[3], ip) then + //Result := True else if (p.X < rectPath[3].X) and - SegmentsIntersect(p, p2, rectPath[0], rectPath[3], true) then - begin - GetIntersectPoint(p, p2, rectPath[0], rectPath[3], ip); - loc := locLeft; - end + GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[3], ip) then + loc := locLeft else if (p.X > rectPath[2].X) and - SegmentsIntersect(p, p2, rectPath[1], rectPath[2], true) then - begin - GetIntersectPoint(p, p2, rectPath[1], rectPath[2], ip); - loc := locRight; - end - else Exit; + GetSegmentIntersectPt2(p, p2, rectPath[1], rectPath[2], ip) then + loc := locRight + else + Result := False; else // loc = rInside begin - if SegmentsIntersect(p, p2, rectPath[0], rectPath[3], true) then - begin - GetIntersectPoint(p, p2, rectPath[0], rectPath[3], ip); - loc := locLeft; - end else if SegmentsIntersect(p, p2, rectPath[0], rectPath[1], true) then - begin - GetIntersectPoint(p, p2, rectPath[0], rectPath[1], ip); - loc := locTop; - end - else if SegmentsIntersect(p, p2, rectPath[1], rectPath[2], true) then - begin - GetIntersectPoint(p, p2, rectPath[1], rectPath[2], ip); - loc := locRight; - end - else if SegmentsIntersect(p, p2, rectPath[2], rectPath[3], true) then - begin - GetIntersectPoint(p, p2, rectPath[2], rectPath[3], ip); - loc := locBottom; - end - else Exit; + if GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[3], ip) then + loc := locLeft + else if GetSegmentIntersectPt2(p, p2, rectPath[0], rectPath[1], ip) then + loc := locTop + else if GetSegmentIntersectPt2(p, p2, rectPath[1], rectPath[2], ip) then + loc := locRight + else if GetSegmentIntersectPt2(p, p2, rectPath[2], rectPath[3], ip) then + loc := locBottom + else + Result := False; end; end; - Result := true; end; //------------------------------------------------------------------------------ @@ -232,7 +282,7 @@ function GetAdjacentLocation(loc: TLocation; isClockwise: Boolean): TLocation; var delta: integer; begin - if isClockwise then delta := 1 else delta := 3; + delta := Iif(isClockwise, 1 , 3); Result := TLocation((Ord(loc) + delta) mod 4); end; //------------------------------------------------------------------------------ @@ -241,9 +291,9 @@ function IsClockwise(prev, curr: TLocation; const prevPt, currPt, rectMidPt: TPoint64): Boolean; {$IFDEF INLINING} inline; {$ENDIF} begin - if AreOpposites(prev, curr) then - Result := CrossProduct(prevPt, rectMidPt, currPt) < 0 else - Result := HeadingClockwise(prev, curr); + Result := Iif(AreOpposites(prev, curr), + CrossProduct(prevPt, rectMidPt, currPt) < 0, + HeadingClockwise(prev, curr)); end; //------------------------------------------------------------------------------ @@ -377,10 +427,10 @@ function IsHeadingClockwise(const pt1, pt2: TPoint64; edgeIdx: integer): Boolean end; //------------------------------------------------------------------------------ -// TRectClip class +// TRectClip64 class //------------------------------------------------------------------------------ -constructor TRectClip.Create(const rect: TRect64); +constructor TRectClip64.Create(const rect: TRect64); begin fResults := TList.Create; @@ -392,7 +442,7 @@ constructor TRectClip.Create(const rect: TRect64); end; //------------------------------------------------------------------------------ -destructor TRectClip.Destroy; +destructor TRectClip64.Destroy; begin fStartLocs.Free; fResults.Free; @@ -414,7 +464,7 @@ procedure DisposeOps(op: POutPt2); end; //------------------------------------------------------------------------------ -procedure TRectClip.DisposeResults; +procedure TRectClip64.DisposeResults; var i: integer; begin @@ -424,7 +474,7 @@ procedure TRectClip.DisposeResults; end; //------------------------------------------------------------------------------ -function TRectClip.Add(const pt: TPoint64; startNewPath: Boolean): POutPt2; +function TRectClip64.Add(const pt: TPoint64; startNewPath: Boolean): POutPt2; var currIdx: integer; prevOp: POutPt2; @@ -462,19 +512,17 @@ function TRectClip.Add(const pt: TPoint64; startNewPath: Boolean): POutPt2; end; //------------------------------------------------------------------------------ -procedure TRectClip.AddCorner(prev, curr: TLocation); +procedure TRectClip64.AddCorner(prev, curr: TLocation); var cnrIdx: integer; begin if prev = curr then Exit; - if (HeadingClockwise(prev, curr)) then - cnrIdx := Ord(prev) else - cnrIdx := Ord(curr); + cnrIdx := Iif(HeadingClockwise(prev, curr), Ord(prev), Ord(curr)); Add(fRectPath[cnrIdx]); end; //------------------------------------------------------------------------------ -procedure TRectClip.AddCorner(var loc: TLocation; isClockwise: Boolean); +procedure TRectClip64.AddCorner(var loc: TLocation; isClockwise: Boolean); begin if (isClockwise) then begin @@ -488,7 +536,7 @@ procedure TRectClip.AddCorner(var loc: TLocation; isClockwise: Boolean); end; //------------------------------------------------------------------------------ -procedure TRectClip.GetNextLocation(const path: TPath64; +procedure TRectClip64.GetNextLocation(const path: TPath64; var loc: TLocation; var i: integer; highI: integer); begin case loc of @@ -564,7 +612,7 @@ function Path1ContainsPath2(const path1, path2: TPath64): Boolean; end; //------------------------------------------------------------------------------ -function TRectClip.Execute(const paths: TPaths64; convexOnly: Boolean): TPaths64; +function TRectClip64.Execute(const paths: TPaths64): TPaths64; var i,j, len: integer; path: TPath64; @@ -587,12 +635,9 @@ function TRectClip.Execute(const paths: TPaths64; convexOnly: Boolean): TPaths64 end; ExecuteInternal(path); - if not convexOnly then - begin - CheckEdges; - for j := 0 to 3 do - TidyEdgePair(j, fEdges[j*2], fEdges[j*2 +1]); - end; + CheckEdges; + for j := 0 to 3 do + TidyEdgePair(j, fEdges[j*2], fEdges[j*2 +1]); for j := 0 to fResults.Count -1 do AppendPath(Result, GetPath(j)); @@ -605,7 +650,7 @@ function TRectClip.Execute(const paths: TPaths64; convexOnly: Boolean): TPaths64 end; //------------------------------------------------------------------------------ -procedure TRectClip.ExecuteInternal(const path: TPath64); +procedure TRectClip64.ExecuteInternal(const path: TPath64); var i,highI : integer; prevPt,ip,ip2 : TPoint64; @@ -704,7 +749,7 @@ procedure TRectClip.ExecuteInternal(const path: TPath64); // intersect pt but we'll also need the first intersect pt (ip2) loc := prevLoc; GetIntersection(fRectPath, prevPt, path[i], loc, ip2); - if (prevCrossLoc <> locInside) then + if (prevCrossLoc <> locInside) and (prevCrossLoc <> loc) then //#579 AddCorner(prevCrossLoc, loc); if (firstCrossLoc = locInside) then @@ -782,7 +827,7 @@ procedure TRectClip.ExecuteInternal(const path: TPath64); end; //------------------------------------------------------------------------------ -procedure TRectClip.CheckEdges; +procedure TRectClip64.CheckEdges; var i,j: integer; edgeSet1, edgeSet2, combinedSet: Cardinal; @@ -795,7 +840,7 @@ procedure TRectClip.CheckEdges; op2 := op; repeat - if (CrossProduct(op2.prev.pt, op2.pt, op2.next.pt) = 0) then + if IsCollinear(op2.prev.pt, op2.pt, op2.next.pt) then begin if op2 = op then begin @@ -841,7 +886,7 @@ procedure TRectClip.CheckEdges; end; //------------------------------------------------------------------------------ -procedure TRectClip.TidyEdgePair(idx: integer; var cw, ccw: TOutPtArray); +procedure TRectClip64.TidyEdgePair(idx: integer; var cw, ccw: TOutPtArray); var isHorz, cwIsTowardLarger: Boolean; i, j, highJ, newIdx: integer; @@ -1025,7 +1070,7 @@ procedure TRectClip.TidyEdgePair(idx: integer; var cw, ccw: TOutPtArray); end; //------------------------------------------------------------------------------ -function TRectClip.GetPath(resultIdx: integer): TPath64; +function TRectClip64.GetPath(resultIdx: integer): TPath64; var i, len: integer; op, op2: POutPt2; @@ -1037,7 +1082,7 @@ function TRectClip.GetPath(resultIdx: integer): TPath64; op2 := op.next; while Assigned(op2) and (op2 <> op) do begin - if (CrossProduct(op2.prev.pt, op2.pt, op2.next.pt) = 0) then + if IsCollinear(op2.prev.pt, op2.pt, op2.next.pt) then begin op := op2.prev; op2 := DisposeOp(op2); @@ -1057,10 +1102,10 @@ function TRectClip.GetPath(resultIdx: integer): TPath64; end; //------------------------------------------------------------------------------ -// TRectClipLines +// TRectClipLines64 //------------------------------------------------------------------------------ -function TRectClipLines.Execute(const paths: TPaths64): TPaths64; +function TRectClipLines64.Execute(const paths: TPaths64): TPaths64; var i,j, len: integer; pathrec: TRect64; @@ -1089,7 +1134,7 @@ function TRectClipLines.Execute(const paths: TPaths64): TPaths64; end; //------------------------------------------------------------------------------ -procedure TRectClipLines.ExecuteInternal(const path: TPath64); +procedure TRectClipLines64.ExecuteInternal(const path: TPath64); var i, highI : integer; prevPt,ip,ip2 : TPoint64; @@ -1155,7 +1200,7 @@ procedure TRectClipLines.ExecuteInternal(const path: TPath64); end; //------------------------------------------------------------------------------ -function TRectClipLines.GetPath(resultIdx: integer): TPath64; +function TRectClipLines64.GetPath(resultIdx: integer): TPath64; var i, len: integer; op: POutPt2; diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.inc b/Ext/SVGIconImageList/Image32/source/Clipper.inc index 066d5dc..5b15f92 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.inc +++ b/Ext/SVGIconImageList/Image32/source/Clipper.inc @@ -14,21 +14,21 @@ {$DEFINE INLINING} {$MODE DELPHI} {$ELSE} - {$IF CompilerVersion < 14} + {$IF COMPILERVERSION < 14} Requires Delphi version 6 or above. {$IFEND} - {$IF CompilerVersion >= 18} //Delphi 2007 + {$IF COMPILERVERSION >= 18} //Delphi 2007 {$DEFINE RECORD_METHODS} {$DEFINE STRICT} - {$IF CompilerVersion >= 19} //Delphi 2009 + {$IF COMPILERVERSION >= 19} //Delphi 2009 //While "inlining" is supported from D2005, it's buggy (see QC41166) until D2009 {$DEFINE INLINING} - {$IFEND} - {$IF COMPILERVERSION >= 23} //Delphi XE2+ - {$DEFINE XPLAT_GENERICS} - {$DEFINE ROUNDINGMODE} - {$IF COMPILERVERSION >= 24} //Delphi XE3+ - {$LEGACYIFEND ON} + {$IF COMPILERVERSION >= 23} //Delphi XE2+ + {$DEFINE XPLAT_GENERICS} + {$DEFINE ROUNDINGMODE} + {$IF COMPILERVERSION >= 24} //Delphi XE3+ + {$LEGACYIFEND ON} + {$IFEND} {$IFEND} {$IFEND} {$IFEND} diff --git a/Ext/SVGIconImageList/Image32/source/Clipper.pas b/Ext/SVGIconImageList/Image32/source/Clipper.pas index 626d710..0c2fe87 100644 --- a/Ext/SVGIconImageList/Image32/source/Clipper.pas +++ b/Ext/SVGIconImageList/Image32/source/Clipper.pas @@ -2,9 +2,9 @@ (******************************************************************************* * Author : Angus Johnson * -* Date : 21 April 2023 * +* Date : 7 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2010-2023 * +* Copyright : Angus Johnson 2010-2024 * * Purpose : This module provides a simple interface to the Clipper Library * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -17,9 +17,8 @@ interface Math, SysUtils, Classes, Clipper.Core, Clipper.Engine, Clipper.Offset, Clipper.RectClip; -// Redeclare here a number of structures defined in -// other units so those units won't need to be declared -// just to use the following functions. +// A number of structures defined in other units are redeclared here +// so those units won't also need to be declared in your own units clauses. type TClipper = Clipper.Engine.TClipper64; TClipper64 = Clipper.Engine.TClipper64; @@ -43,6 +42,7 @@ interface frNonZero = Clipper.Core.frNonZero; frPositive = Clipper.Core.frPositive; frNegative = Clipper.Core.frNegative; + jtBevel = Clipper.Offset.jtBevel; jtSquare = Clipper.Offset.jtSquare; jtRound = Clipper.Offset.jtRound; jtMiter = Clipper.Offset.jtMiter; @@ -96,23 +96,18 @@ function InflatePaths(const paths: TPathsD; delta: Double; ArcTolerance: double = 0.0): TPathsD; overload; // RectClip: for closed paths only (otherwise use RectClipLines) -// much faster when only clipping convex polygons -function ExecuteRectClip(const rect: TRect64; const path: TPath64; - convexOnly: Boolean = false): TPath64; overload; -function ExecuteRectClip(const rect: TRect64; const paths: TPaths64; - convexOnly: Boolean = false): TPaths64; overload; -function ExecuteRectClip(const rect: TRectD; const path: TPathD; - convexOnly: Boolean = false; precision: integer = 2): TPathD; overload; -function ExecuteRectClip(const rect: TRectD; const paths: TPathsD; - convexOnly: Boolean = false; precision: integer = 2): TPathsD; overload; - -function ExecuteRectClipLines(const rect: TRect64; +function RectClip(const rect: TRect64; const path: TPath64): TPath64; overload; +function RectClip(const rect: TRect64; const paths: TPaths64): TPaths64; overload; +function RectClip(const rect: TRectD; const path: TPathD; precision: integer = 2): TPathD; overload; +function RectClip(const rect: TRectD; const paths: TPathsD; precision: integer = 2): TPathsD; overload; + +function RectClipLines(const rect: TRect64; const path: TPath64): TPaths64; overload; -function ExecuteRectClipLines(const rect: TRect64; +function RectClipLines(const rect: TRect64; const paths: TPaths64): TPaths64; overload; -function ExecuteRectClipLines(const rect: TRectD; const path: TPathD; +function RectClipLines(const rect: TRectD; const path: TPathD; precision: integer = 2): TPathsD; overload; -function ExecuteRectClipLines(const rect: TRectD; const paths: TPathsD; +function RectClipLines(const rect: TRectD; const paths: TPathsD; precision: integer = 2): TPathsD; overload; function TranslatePath(const path: TPath64; dx, dy: Int64): TPath64; overload; @@ -128,6 +123,15 @@ function MinkowskiSum(const pattern, path: TPathD; function PolyTreeToPaths64(PolyTree: TPolyTree64): TPaths64; function PolyTreeToPathsD(PolyTree: TPolyTreeD): TPathsD; +function PathToString(const p: TPath64; + indentSpaces: integer = 0; pointsPerRow: integer = 0): string; overload; +function PathToString(const p: TPathD; decimals: integer; + indentSpaces: integer = 0; pointsPerRow: integer = 0): string; overload; +function PathsToString(const p: TPaths64; + indentSpaces: integer = 0; pointsPerRow: integer = 0): string; overload; +function PathsToString(const p: TPathsD; decimals: integer; + indentSpaces: integer = 0; pointsPerRow: integer = 0): string; overload; + //ShowPolyTreeStructure: only useful when debugging procedure ShowPolyTreeStructure(polytree: TPolyTree64; strings: TStrings); overload; procedure ShowPolyTreeStructure(polytree: TPolyTreeD; strings: TStrings); overload; @@ -141,14 +145,16 @@ function TrimCollinear(const path: TPathD; precision: integer; isOpenPath: Boolean = false): TPathD; overload; function PointInPolygon(const pt: TPoint64; const polygon: TPath64): - TPointInPolygonResult; {$IFDEF INLINE} inline; {$ENDIF} + TPointInPolygonResult; function SimplifyPath(const path: TPath64; - epsilon: double; isClosedPath: Boolean = false): TPath64; - {$IFDEF INLINE} inline; {$ENDIF} + shapeTolerance: double; isClosedPath: Boolean = true): TPath64; overload; function SimplifyPaths(const paths: TPaths64; - epsilon: double; isClosedPaths: Boolean = false): TPaths64; - {$IFDEF INLINE} inline; {$ENDIF} + shapeTolerance: double; isClosedPath: Boolean = true): TPaths64; overload; +function SimplifyPath(const path: TPathD; shapeTolerance: double; + isClosedPath: Boolean = true; decimalPrecision: integer = 2): TPathD; overload; +function SimplifyPaths(const paths: TPathsD; shapeTolerance: double; + isClosedPath: Boolean = true; decimalPrecision: integer = 2): TPathsD; overload; implementation @@ -413,36 +419,34 @@ function InflatePaths(const paths: TPathsD; delta: Double; end; //------------------------------------------------------------------------------ -function ExecuteRectClip(const rect: TRect64; - const path: TPath64; convexOnly: Boolean): TPath64; +function RectClip(const rect: TRect64; + const path: TPath64): TPath64; var paths: TPaths64; begin SetLength(paths, 1); paths[0] := path; - paths := ExecuteRectClip(rect, paths, convexOnly); + paths := RectClip(rect, paths); if Assigned(paths) then Result := paths[0] else Result := nil; end; //------------------------------------------------------------------------------ -function ExecuteRectClip(const rect: TRect64; - const paths: TPaths64; convexOnly: Boolean): TPaths64; +function RectClip(const rect: TRect64; const paths: TPaths64): TPaths64; begin Result := nil; if rect.IsEmpty then Exit; - with TRectClip.Create(rect) do + with TRectClip64.Create(rect) do try - Result := Execute(paths, convexOnly); + Result := Execute(paths); finally Free; end; end; //------------------------------------------------------------------------------ -function ExecuteRectClip(const rect: TRectD; const path: TPathD; - convexOnly: Boolean; precision: integer): TPathD; +function RectClip(const rect: TRectD; const path: TPathD; precision: integer): TPathD; var scale: double; tmpPath: TPath64; @@ -454,13 +458,12 @@ function ExecuteRectClip(const rect: TRectD; const path: TPathD; scale := Math.Power(10, precision); rec := Rect64(ScaleRect(rect, scale)); tmpPath := ScalePath(path, scale); - tmpPath := ExecuteRectClip(rec, tmpPath, convexOnly); + tmpPath := RectClip(rec, tmpPath); Result := ScalePathD(tmpPath, 1/scale); end; //------------------------------------------------------------------------------ -function ExecuteRectClip(const rect: TRectD; const paths: TPathsD; - convexOnly: Boolean; precision: integer): TPathsD; +function RectClip(const rect: TRectD; const paths: TPathsD; precision: integer): TPathsD; var scale: double; tmpPaths: TPaths64; @@ -471,7 +474,7 @@ function ExecuteRectClip(const rect: TRectD; const paths: TPathsD; rec := Rect64(ScaleRect(rect, scale)); tmpPaths := ScalePaths(paths, scale); - with TRectClip.Create(rec) do + with TRectClip64.Create(rec) do try tmpPaths := Execute(tmpPaths); finally @@ -481,14 +484,14 @@ function ExecuteRectClip(const rect: TRectD; const paths: TPathsD; end; //------------------------------------------------------------------------------ -function ExecuteRectClipLines(const rect: TRect64; const path: TPath64): TPaths64; +function RectClipLines(const rect: TRect64; const path: TPath64): TPaths64; var tmp: TPaths64; begin Result := nil; SetLength(tmp, 1); tmp[0] := path; - with TRectClipLines.Create(rect) do + with TRectClipLines64.Create(rect) do try Result := Execute(tmp); finally @@ -497,11 +500,11 @@ function ExecuteRectClipLines(const rect: TRect64; const path: TPath64): TPaths6 end; //------------------------------------------------------------------------------ -function ExecuteRectClipLines(const rect: TRect64; const paths: TPaths64): TPaths64; +function RectClipLines(const rect: TRect64; const paths: TPaths64): TPaths64; begin Result := nil; if rect.IsEmpty then Exit; - with TRectClipLines.Create(rect) do + with TRectClipLines64.Create(rect) do try Result := Execute(paths); finally @@ -510,7 +513,7 @@ function ExecuteRectClipLines(const rect: TRect64; const paths: TPaths64): TPath end; //------------------------------------------------------------------------------ -function ExecuteRectClipLines(const rect: TRectD; +function RectClipLines(const rect: TRectD; const path: TPathD; precision: integer): TPathsD; var scale: double; @@ -524,12 +527,12 @@ function ExecuteRectClipLines(const rect: TRectD; scale := Math.Power(10, precision); rec := Rect64(ScaleRect(rect, scale)); tmpPath := ScalePath(path, scale); - tmpPaths := ExecuteRectClipLines(rec, tmpPath); + tmpPaths := RectClipLines(rec, tmpPath); Result := ScalePathsD(tmpPaths, 1/scale); end; //------------------------------------------------------------------------------ -function ExecuteRectClipLines(const rect: TRectD; const paths: TPathsD; +function RectClipLines(const rect: TRectD; const paths: TPathsD; precision: integer = 2): TPathsD; var scale: double; @@ -542,7 +545,7 @@ function ExecuteRectClipLines(const rect: TRectD; const paths: TPathsD; scale := Math.Power(10, precision); rec := Rect64(ScaleRect(rect, scale)); tmpPaths := ScalePaths(paths, scale); - with TRectClipLines.Create(rec) do + with TRectClipLines64.Create(rec) do try tmpPaths := Execute(tmpPaths); finally @@ -620,22 +623,81 @@ function MinkowskiSum(const pattern, path: TPathD; end; //------------------------------------------------------------------------------ -procedure ShowPolyPathStructure64(pp: TPolyPath64; level: integer; strings: TStrings); +function PathToString(const p: TPath64; + indentSpaces: integer; pointsPerRow: integer): string; +var + i, highI: Integer; + spaces: string; +begin + spaces := StringOfChar(' ', indentSpaces); + Result := spaces; + highI := high(p); + if highI < 0 then Exit; + for i := 0 to highI -1 do + begin + Result := Result + format('%d,%d, ',[p[i].X,p[i].Y]); + if (pointsPerRow > 0) and ((i + 1) mod pointsPerRow = 0) then + Result := Result + #10 + spaces; + end; + Result := Result + format('%d,%d',[p[highI].X,p[highI].Y]); +end; +//------------------------------------------------------------------------------ + +function PathToString(const p: TPathD; decimals: integer; + indentSpaces: integer; pointsPerRow: integer): string; +var + i, highI: Integer; + spaces: string; +begin + spaces := StringOfChar(' ', indentSpaces); + Result := ''; + highI := high(p); + if highI < 0 then Exit; + for i := 0 to highI -1 do + Result := Result + format('%1.*n,%1.*n, ', + [decimals, p[i].X, decimals, p[i].Y]); + Result := Result + format('%1.*n,%1.*n',[ + decimals, p[highI].X, decimals, p[highI].Y]); +end; +//------------------------------------------------------------------------------ + +function PathsToString(const p: TPaths64; + indentSpaces: integer = 0; pointsPerRow: integer = 0): string; +var + i: integer; +begin + Result := ''; + for i := 0 to High(p) do + Result := Result + PathToString(p[i], indentSpaces, pointsPerRow) + #10#10; +end; +//------------------------------------------------------------------------------ + +function PathsToString(const p: TPathsD; decimals: integer; + indentSpaces: integer = 0; pointsPerRow: integer = 0): string; var i: integer; - spaces, caption: string; +begin + Result := ''; + for i := 0 to High(p) do + Result := Result + PathToString(p[i], indentSpaces, pointsPerRow) + #10#10; +end; +//------------------------------------------------------------------------------ + +procedure ShowPolyPathStructure64(pp: TPolyPath64; level: integer; + strings: TStrings); +var + i: integer; + spaces, plural: string; begin spaces := StringOfChar(' ', level * 2); + if pp.Count = 1 then plural := '' else plural := 's'; if pp.IsHole then - caption := 'Hole' else - caption := 'Outer'; - if (pp.Count > 0) then - begin - strings.Add(Format('%s%s (%d)',[spaces, caption, pp.Count])); - for i := 0 to pp.Count -1 do + strings.Add(Format('%sA hole containing %d polygon%s', [spaces, pp.Count, plural])) + else + strings.Add(Format('%sA polygon containing %d hole%s', [spaces, pp.Count, plural])); + for i := 0 to pp.Count -1 do + if pp.child[i].Count> 0 then ShowPolyPathStructure64(pp.child[i], level + 1, strings); - end else - strings.Add(spaces + caption); end; //------------------------------------------------------------------------------ @@ -643,28 +705,29 @@ procedure ShowPolyTreeStructure(polytree: TPolyTree64; strings: TStrings); var i: integer; begin - strings.Add('Polytree Root'); + if polytree.Count = 1 then + strings.Add('Polytree with just 1 polygon.') else + strings.Add(Format('Polytree with just %d polygons.', [polytree.Count])); for i := 0 to polytree.Count -1 do - ShowPolyPathStructure64(polytree[i], 1, strings); + if polytree[i].Count > 0 then + ShowPolyPathStructure64(polytree[i], 1, strings); end; //------------------------------------------------------------------------------ procedure ShowPolyPathStructureD(pp: TPolyPathD; level: integer; strings: TStrings); var i: integer; - spaces, caption: string; + spaces, plural: string; begin spaces := StringOfChar(' ', level * 2); + if pp.Count = 1 then plural := '' else plural := 's'; if pp.IsHole then - caption := 'Hole ' else - caption := 'Outer '; - if (pp.Count > 0) then - begin - strings.Add(Format('%s%s (%d)',[spaces + caption, pp.Count])); - for i := 0 to pp.Count -1 do + strings.Add(Format('%sA hole containing %d polygon%s', [spaces, pp.Count, plural])) + else + strings.Add(Format('%sA polygon containing %d hole%s', [spaces, pp.Count, plural])); + for i := 0 to pp.Count -1 do + if pp.child[i].Count> 0 then ShowPolyPathStructureD(pp.child[i], level + 1, strings); - end else - strings.Add(spaces + caption); end; //------------------------------------------------------------------------------ @@ -672,13 +735,15 @@ procedure ShowPolyTreeStructure(polytree: TPolyTreeD; strings: TStrings); var i: integer; begin - strings.Add('Polytree Root'); + if polytree.Count = 1 then + strings.Add('Polytree with just 1 polygon.') else + strings.Add(Format('Polytree with just %d polygons.', [polytree.Count])); for i := 0 to polytree.Count -1 do - ShowPolyPathStructureD(polytree[i], 1, strings); + if polytree[i].Count > 0 then + ShowPolyPathStructureD(polytree[i], 1, strings); end; //------------------------------------------------------------------------------ - function TrimCollinear(const p: TPath64; isOpenPath: Boolean = false): TPath64; var i,j, len: integer; @@ -689,9 +754,9 @@ function TrimCollinear(const p: TPath64; isOpenPath: Boolean = false): TPath64; if not isOpenPath then begin while (i < len -1) and - (CrossProduct(p[len -1], p[i], p[i+1]) = 0) do inc(i); + IsCollinear(p[len -1], p[i], p[i+1]) do inc(i); while (i < len -1) and - (CrossProduct(p[len -2], p[len -1], p[i]) = 0) do dec(len); + IsCollinear(p[len -2], p[len -1], p[i]) do dec(len); end; if (len - i < 3) then begin @@ -706,7 +771,7 @@ function TrimCollinear(const p: TPath64; isOpenPath: Boolean = false): TPath64; Result[0] := p[i]; j := 0; for i := i+1 to len -2 do - if CrossProduct(result[j], p[i], p[i+1]) <> 0 then + if not IsCollinear(result[j], p[i], p[i+1]) then begin inc(j); result[j] := p[i]; @@ -717,14 +782,14 @@ function TrimCollinear(const p: TPath64; isOpenPath: Boolean = false): TPath64; inc(j); result[j] := p[len-1]; end - else if CrossProduct(result[j], p[len-1], result[0]) <> 0 then + else if not IsCollinear(result[j], p[len-1], result[0]) then begin inc(j); result[j] := p[len-1]; end else begin while (j > 1) and - (CrossProduct(result[j-1], result[j], result[0]) = 0) do dec(j); + IsCollinear(result[j-1], result[j], result[0]) do dec(j); if j < 2 then j := -1; end; SetLength(Result, j +1); @@ -751,7 +816,19 @@ function PointInPolygon(const pt: TPoint64; end; //------------------------------------------------------------------------------ -function PerpendicDistFromLineSqrd(const pt, line1, line2: TPoint64): double; +function DistanceSqrd(const pt1, pt2: TPoint64): double; + {$IFDEF INLINE} inline; {$ENDIF} +var + x1,y1,x2,y2: double; +begin + // nb: older versions of Delphi don't allow explicit typcasting + x1 := pt1.X; y1 := pt1.Y; + x2 := pt2.X; y2 := pt2.Y; + result := Sqr(x1 - x2) + Sqr(y1 - y2); +end; +//------------------------------------------------------------------------------ + +function PerpendicDistSqrd(const pt, line1, line2: TPoint64): double; {$IFDEF INLINE} inline; {$ENDIF} var a,b,c,d: double; @@ -760,125 +837,136 @@ function PerpendicDistFromLineSqrd(const pt, line1, line2: TPoint64): double; b := pt.Y - line1.Y; c := line2.X - line1.X; d := line2.Y - line1.Y; - if (c = 0) and (d = 0) then - result := 0 else - result := Sqr(a * d - c * b) / (c * c + d * d); + result := Iif((c = 0) and (d = 0), + 0, Sqr(a * d - c * b) / (c * c + d * d)); end; -//------------------------------------------------------------------------------ -function GetNext(current, high: integer; var flags: array of Boolean): integer; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result := current +1; - while (Result <= high) and flags[Result] do inc(Result); - if (Result <= high) then Exit; - Result := 0; - while (flags[Result]) do inc(Result); -end; +//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ -function GetPrior(current, high: integer; var flags: array of Boolean): integer; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result := current; - if (Result = 0) then Result := high - else dec(Result); - while (Result > 0) and flags[Result] do dec(Result); - if not flags[Result] then Exit; - Result := high; - while flags[Result] do dec(Result); -end; +type + PSimplifyRec = ^TSimplifyRec; + TSimplifyRec = record + pt : TPoint64; + pdSqrd : double; + prev : PSimplifyRec; + next : PSimplifyRec; + //isEnd : Boolean; + end; function SimplifyPath(const path: TPath64; - epsilon: double; isClosedPath: Boolean = false): TPath64; + shapeTolerance: double; isClosedPath: Boolean): TPath64; var - i,j, len, high: integer; - curr, prev, start, prev2, next, next2: integer; - epsSqr: double; - flags: array of boolean; - dsq: array of double; + i, highI, minHigh: integer; + tolSqrd: double; + srArray: array of TSimplifyRec; + first, last: PSimplifyRec; begin Result := nil; - len := Length(path); - if (len < 4) then Exit;; - high := len -1; - epsSqr := Sqr(epsilon); - SetLength(flags, len); - SetLength(dsq, len); - - curr := 0; - if (isClosedPath) then - begin - dsq[0] := PerpendicDistFromLineSqrd(path[0], path[high], path[1]); - dsq[high] := PerpendicDistFromLineSqrd(path[high], path[0], path[high - 1]); - end else + highI := High(path); + + minHigh := Iif(isClosedPath, 2, 1); + if highI < minHigh then Exit; + + SetLength(srArray, highI +1); + with srArray[0] do begin - dsq[0] := MaxDouble; - dsq[high] := MaxDouble; + pt := path[0]; + prev := @srArray[highI]; + next := @srArray[1]; + pdSqrd := Iif(isClosedPath, + PerpendicDistSqrd(path[0], path[highI], path[1]), invalidD); end; - for i := 1 to high -1 do - dsq[i] := PerpendicDistFromLineSqrd(path[i], path[i - 1], path[i + 1]); - - while true do + with srArray[highI] do begin - if (dsq[curr] > epsSqr) then + pt := path[highI]; + prev := @srArray[highI-1]; + next := @srArray[0]; + pdSqrd := Iif(isClosedPath, + PerpendicDistSqrd(path[highI], path[highI-1], path[0]), invalidD); + end; + + for i := 1 to highI -1 do + with srArray[i] do begin - start := curr; - repeat - curr := GetNext(curr, high, flags); - until (curr = start) or (dsq[curr] < epsSqr); - if (curr = start) then break; + pt := path[i]; + prev := @srArray[i-1]; + next := @srArray[i+1]; + pdSqrd := PerpendicDistSqrd(path[i], path[i-1], path[i+1]); end; - prev := GetPrior(curr, high, flags); - next := GetNext(curr, high, flags); - if (next = prev) then break; + first := @srArray[0]; + last := first.prev; - if (dsq[next] < dsq[curr]) then - begin - flags[next] := true; - next := GetNext(next, high, flags); - next2 := GetNext(next, high, flags); - dsq[curr] := PerpendicDistFromLineSqrd( - path[curr], path[prev], path[next]); - if (next <> high) or isClosedPath then - dsq[next] := PerpendicDistFromLineSqrd( - path[next], path[curr], path[next2]); - curr := next; - end else + tolSqrd := Sqr(shapeTolerance); + while first <> last do + begin + if (first.pdSqrd > tolSqrd) or + (first.next.pdSqrd < first.pdSqrd) then begin - flags[curr] := true; - curr := next; - next := GetNext(next, high, flags); - prev2 := GetPrior(prev, high, flags); - dsq[curr] := PerpendicDistFromLineSqrd( - path[curr], path[prev], path[next]); - if (prev <> 0) or isClosedPath then - dsq[prev] := PerpendicDistFromLineSqrd( - path[prev], path[prev2], path[curr]); + first := first.next; + Continue; end; + dec(highI); + first.prev.next := first.next; + first.next.prev := first.prev; + last := first.prev; + first := last.next; + if first.next = first.prev then break; + last.pdSqrd := PerpendicDistSqrd(last.pt, last.prev.pt, first.pt); + first.pdSqrd := PerpendicDistSqrd(first.pt, last.pt, first.next.pt); + end; + if highI < minHigh then Exit; + if not isClosedPath then first := @srArray[0]; + SetLength(Result, highI +1); + for i := 0 to HighI do + begin + Result[i] := first.pt; + first := first.next; end; - j := 0; - SetLength(Result, len); - for i := 0 to High do - if not flags[i] then - begin - Result[j] := path[i]; - inc(j); - end; - SetLength(Result, j); end; +//------------------------------------------------------------------------------ function SimplifyPaths(const paths: TPaths64; - epsilon: double; isClosedPaths: Boolean = false): TPaths64; + shapeTolerance: double; isClosedPath: Boolean): TPaths64; var i, len: integer; begin len := Length(paths); SetLength(Result, len); for i := 0 to len -1 do - result[i] := SimplifyPath(paths[i], epsilon, isClosedPaths); + result[i] := SimplifyPath(paths[i], shapeTolerance, isClosedPath); end; +//------------------------------------------------------------------------------ + +function SimplifyPath(const path: TPathD; shapeTolerance: double; + isClosedPath: Boolean; decimalPrecision: integer): TPathD; +var + p: TPath64; + scale: double; +begin + scale := power(10, decimalPrecision); + p := ScalePath(path, scale); + p := SimplifyPath(p, shapeTolerance, isClosedPath); + Result := ScalePathD(p, 1/scale); +end; +//------------------------------------------------------------------------------ + +function SimplifyPaths(const paths: TPathsD; shapeTolerance: double; + isClosedPath: Boolean; decimalPrecision: integer): TPathsD; +var + pp: TPaths64; + scale: double; +begin + scale := power(10, decimalPrecision); + pp := ScalePaths(paths, scale); + pp := SimplifyPaths(pp, shapeTolerance, isClosedPath); + Result := ScalePathsD(pp, 1/scale); +end; +//------------------------------------------------------------------------------ + end. + diff --git a/Ext/SVGIconImageList/Image32/source/Img32.CQ.pas b/Ext/SVGIconImageList/Image32/source/Img32.CQ.pas index cd8d5f6..8acea08 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.CQ.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.CQ.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 4 July 2023 * +* Date : 10 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2021 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : Color reduction for TImage32 * * : Uses Octree Color Quantization & Floyd / Steinberg Dithering * * License : http://www.boost.org/LICENSE_1_0.txt * @@ -90,6 +90,7 @@ TOctree = class destructor Destroy; override; procedure Reset; procedure BuildTree(image: TImage32); + procedure ApplyPalette(image: TImage32); function GetColorFreqArray: TArrayOfColFreq; property ColorCount: cardinal read fLeaves; // PixelCount: = Sum( leaves[ 0 .. n-1 ].Count ) @@ -343,12 +344,16 @@ procedure PaletteSort(var ptrArray: TArrayOfColFreq; function RoundDownNearestPower2(val: Cardinal): Cardinal; begin - Result := val or val shr 1; - Result := Result or Result shr 2; - Result := Result or Result shr 3; - Result := Result or Result shr 4; - Result := Result or Result shr 16; - Result := Result - Result shr 1; + if (val and (val - 1)) > 0 then + begin + Result := val or val shr 1; + Result := Result or (Result shr 2); + Result := Result or (Result shr 3); + Result := Result or (Result shr 4); + Result := Result or (Result shr 16); + Result := Result - (Result shr 1); + end else + Result := val; end; //------------------------------------------------------------------------------ @@ -630,6 +635,25 @@ procedure TOctree.BuildTree(image: TImage32); end; //------------------------------------------------------------------------------ +type TImg32 = class(TImage32); + +procedure TOctree.ApplyPalette(image: TImage32); +var + i: integer; + pc: PARGB; +begin + pc := PARGB(image.PixelBase); + for i := 0 to image.Width * image.Height -1 do + begin + if pc.A < OpacityThreshold then + pc.Color := clNone32 else + fTop.GetNodeColor(pc.Color); + inc(pc); + end; + TImg32(image).ResetColorCount; +end; +//------------------------------------------------------------------------------ + function TOctree.ReduceOne: Boolean; var lvl, i, childCnt: integer; @@ -985,6 +1009,7 @@ function ReduceImage(image: TImage32; maxColors: Cardinal; if octree.fReduceType = rtSimple then begin Result := octree.BasicReduce(maxColors); + octree.ApplyPalette(image); Exit; end; @@ -1043,6 +1068,7 @@ function ReduceImage(image: TImage32; maxColors: Cardinal; finally octree.Free; end; + TImg32(image).ResetColorCount; end; //------------------------------------------------------------------------------ @@ -1078,8 +1104,8 @@ procedure DrawPalette(image: TImage32; const palette: TArrayOfColor32); begin image.FillRect(rec, palette[i] or $FF000000); if (i + 1) mod w = 0 then - Types.OffsetRect(rec, -15 * w, 16) else - Types.OffsetRect(rec, 16, 0); + TranslateRect(rec, -15 * w, 16) else + TranslateRect(rec, 16, 0); end; end; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Clipper2.pas b/Ext/SVGIconImageList/Image32/source/Img32.Clipper2.pas index feb61d9..4fa6708 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Clipper2.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Clipper2.pas @@ -94,9 +94,10 @@ function InflatePaths(const paths: Img32.TPathsD; jt: Clipper.Offset.TJoinType; begin case joinStyle of - jsSquare: jt := jtSquare; - jsMiter: jt := jtMiter; - jsRound: jt := jtRound; + jsSquare : jt := jtSquare; + jsButt : jt := jtBevel; + jsMiter : jt := jtMiter; + jsRound : jt := jtRound; else if endType = etRound then jt := jtRound else jt := jtSquare; end; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Draw.pas b/Ext/SVGIconImageList/Image32/source/Img32.Draw.pas index ae49c68..e7b89c4 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Draw.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Draw.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 26 March 2023 * +* Date : 23 March 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * +* Copyright : Angus Johnson 2019-2024 * * * * Purpose : Polygon renderer for TImage32 * * * @@ -18,7 +18,13 @@ interface {$I Img32.inc} -{.$DEFINE MemCheck} //for debugging only (adds a minimal cost to performance) +// MemCheck may be useful for debugging (adds a minimal cost to performance) +{.$DEFINE MemCheck} + +// UseTrunc makes rendering thread safe, +// so it's generally preferred over Round and SetRoundMode(). +// See https://github.com/AngusJohnson/Image32/issues/45 +{$DEFINE UseTrunc} uses SysUtils, Classes, Types, Math, Img32, Img32.Vector; @@ -424,27 +430,6 @@ procedure ApplyClearType(img: TImage32; textColor: TColor32 = clBlack32; // Other miscellaneous functions // ------------------------------------------------------------------------------ -// //__Trunc: An efficient Trunc() algorithm (ie rounds toward zero) -// function __Trunc(val: double): integer; {$IFDEF INLINE} inline; {$ENDIF} -// var -// exp: integer; -// i64: UInt64 absolute val; -// begin -// //https://en.wikipedia.org/wiki/Double-precision_floating-point_format -// Result := 0; -// if i64 = 0 then Exit; -// exp := Integer(Cardinal(i64 shr 52) and $7FF) - 1023; -// //nb: when exp == 1024 then val == INF or NAN. -// if exp < 0 then -// Exit -// else if exp > 52 then -// Result := ((i64 and $1FFFFFFFFFFFFF) shl (exp - 52)) or (UInt64(1) shl exp) -// else -// Result := ((i64 and $1FFFFFFFFFFFFF) shr (52 - exp)) or (UInt64(1) shl exp); -// if val < 0 then Result := -Result; -// end; -// ------------------------------------------------------------------------------ - function ClampByte(val: double): byte; {$IFDEF INLINE} inline; {$ENDIF} begin if val < 0 then result := 0 @@ -534,9 +519,15 @@ function MirrorQ(q, endQ: integer): integer; function MirrorD(d: double; colorCnt: integer): integer; begin dec(colorCnt); +{$IFDEF UseTrunc} // used in TSvgRadialGradientRenderer.RenderProc + if Odd(Trunc(d)) then + result := Trunc((1 - frac(d)) * colorCnt) else + result := Trunc(frac(d) * colorCnt); +{$ELSE} if Odd(Round(d)) then result := Round((1 - frac(d)) * colorCnt) else result := Round(frac(d) * colorCnt); +{$ENDIF} end; // ------------------------------------------------------------------------------ @@ -564,9 +555,15 @@ function SoftRptQ(q, endQ: integer): integer; function RepeatD(d: double; colorCnt: integer): integer; begin dec(colorCnt); +{$IFDEF UseTrunc} // used in TSvgRadialGradientRenderer.RenderProc + if (d < 0) then + result := Trunc((1 + frac(d)) * colorCnt) else + result := Trunc(frac(d) * colorCnt); +{$ELSE} if (d < 0) then result := Round((1 + frac(d)) * colorCnt) else result := Round(frac(d) * colorCnt); +{$ENDIF} end; // ------------------------------------------------------------------------------ @@ -659,10 +656,18 @@ procedure AllocateScanlines(const polygons: TPathsD; begin highJ := high(polygons[i]); if highJ < 2 then continue; +{$IFDEF UseTrunc} + y1 := Trunc(polygons[i][highJ].Y); +{$ELSE} y1 := Round(polygons[i][highJ].Y); +{$ENDIF} for j := 0 to highJ do begin +{$IFDEF UseTrunc} + y2 := Trunc(polygons[i][j].Y); +{$ELSE} y2 := Round(polygons[i][j].Y); +{$ENDIF} if y1 < y2 then begin // descending (but ignore edges outside the clipping range) @@ -758,8 +763,13 @@ procedure SplitEdgeIntoFragments(const pt1, pt2: TPointD; // but still update maxX for each scanline the edge passes if bot.X > maxX then begin +{$IFDEF UseTrunc} + for i := Min(maxY, Trunc(bot.Y)) downto Max(0, Trunc(top.Y)) do + scanlines[i].maxX := maxX; +{$ELSE} for i := Min(maxY, Round(bot.Y)) downto Max(0, Round(top.Y)) do scanlines[i].maxX := maxX; +{$ENDIF} Exit; end; @@ -776,14 +786,24 @@ procedure SplitEdgeIntoFragments(const pt1, pt2: TPointD; begin if top.X >= maxX then begin +{$IFDEF UseTrunc} + for i := Min(maxY, Trunc(bot.Y)) downto Max(0, Trunc(top.Y)) do + scanlines[i].maxX := maxX; +{$ELSE} for i := Min(maxY, Round(bot.Y)) downto Max(0, Round(top.Y)) do scanlines[i].maxX := maxX; +{$ENDIF} Exit; end; // here the edge must be oriented bottom-right to top-left y := bot.Y - (bot.X - maxX) * Abs(dydx); +{$IFDEF UseTrunc} + for i := Min(maxY, Trunc(bot.Y)) downto Max(0, Trunc(y)) do + scanlines[i].maxX := maxX; +{$ELSE} for i := Min(maxY, Round(bot.Y)) downto Max(0, Round(y)) do scanlines[i].maxX := maxX; +{$ENDIF} bot.Y := y; if bot.Y <= 0 then Exit; bot.X := maxX; @@ -792,8 +812,13 @@ procedure SplitEdgeIntoFragments(const pt1, pt2: TPointD; begin // here the edge must be oriented bottom-left to top-right y := top.Y + (top.X - maxX) * Abs(dydx); +{$IFDEF UseTrunc} + for i := Min(maxY, Trunc(y)) downto Max(0, Trunc(top.Y)) do + scanlines[i].maxX := maxX; +{$ELSE} for i := Min(maxY, Round(y)) downto Max(0, Round(top.Y)) do scanlines[i].maxX := maxX; +{$ENDIF} top.Y := y; if top.Y >= maxY then Exit; top.X := maxX; @@ -812,7 +837,11 @@ procedure SplitEdgeIntoFragments(const pt1, pt2: TPointD; end; // SPLIT THE EDGE INTO MULTIPLE SCANLINE FRAGMENTS +{$IFDEF UseTrunc} + scanlineY := Trunc(bot.Y); +{$ELSE} scanlineY := Round(bot.Y); +{$ENDIF} if bot.Y = scanlineY then dec(scanlineY); // at the lower-most extent of the edge 'split' the first fragment @@ -920,8 +949,13 @@ procedure ProcessScanlineFragments(var scanline: TScanLine; right := q; end; +{$IFDEF UseTrunc} + leftXi := Max(0, Trunc(left)); + rightXi := Max(0, Trunc(right)); +{$ELSE} leftXi := Max(0, Round(left)); rightXi := Max(0, Round(right)); +{$ENDIF} if (leftXi = rightXi) then begin @@ -992,97 +1026,119 @@ procedure Rasterize(const paths: TPathsD; const clipRec: TRect; scanlines: TArrayOfScanline; fragments: PDouble; scanline: PScanline; +{$IFnDEF UseTrunc} savedRoundMode: TRoundingMode; +{$ENDIF} begin // See also https://nothings.org/gamedev/rasterize/ if not assigned(renderer) then Exit; Types.IntersectRect(clipRec2, clipRec, GetBounds(paths)); if IsEmptyRect(clipRec2) then Exit; - paths2 := OffsetPath(paths, -clipRec2.Left, -clipRec2.Top); + paths2 := TranslatePath(paths, -clipRec2.Left, -clipRec2.Top); // Delphi's Round() function is *much* faster than Trunc(), - // and even a little faster than __Trunc() above (except + // and even a little faster than Trunc() above (except // when the FastMM4 memory manager is enabled.) - savedRoundMode := SetRoundMode(rmDown); - fragments := nil; - RectWidthHeight(clipRec2, maxW, maxH); - SetLength(scanlines, maxH +1); - SetLength(windingAccum, maxW +2); - AllocateScanlines(paths2, scanlines, fragments, maxH, maxW-1); - InitializeScanlines(paths2, scanlines, fragments, clipRec2); - SetLength(byteBuffer, maxW); - if byteBuffer = nil then - begin - FreeMem(fragments); - Exit; - end; - - scanline := @scanlines[0]; - for i := 0 to high(scanlines) do - begin - if scanline.fragCnt = 0 then +{$IFnDEF UseTrunc} + savedRoundMode := SetRoundMode(rmDown); +{$ENDIF} + try + RectWidthHeight(clipRec2, maxW, maxH); + SetLength(scanlines, maxH +1); + SetLength(windingAccum, maxW +2); + AllocateScanlines(paths2, scanlines, fragments, maxH, maxW-1); + InitializeScanlines(paths2, scanlines, fragments, clipRec2); + SetLength(byteBuffer, maxW); + if byteBuffer = nil then Exit; + + scanline := @scanlines[0]; + for i := 0 to high(scanlines) do begin - inc(scanline); - Continue; - end; + if scanline.fragCnt = 0 then + begin + inc(scanline); + Continue; + end; - // process each scanline to fill the winding count accumulation buffer - ProcessScanlineFragments(scanline^, fragments, windingAccum); - // it's faster to process only the modified sub-array of windingAccum - xli := scanline.minX; - xri := Min(maxW -1, scanline.maxX +1); - FillChar(byteBuffer[xli], xri - xli +1, 0); + // process each scanline to fill the winding count accumulation buffer + ProcessScanlineFragments(scanline^, fragments, windingAccum); + // it's faster to process only the modified sub-array of windingAccum + xli := scanline.minX; + xri := Min(maxW -1, scanline.maxX +1); + FillChar(byteBuffer[xli], xri - xli +1, 0); - // a 25% weighting has been added to the alpha channel to minimize any - // background bleed-through where polygons join with a common edge. + // a 25% weighting has been added to the alpha channel to minimize any + // background bleed-through where polygons join with a common edge. - accum := 0; //winding count accumulator - for j := xli to xri do - begin - accum := accum + windingAccum[j]; - case fillRule of - frEvenOdd: - begin - aa := Round(Abs(accum) * 1275) mod 2550; // *5 - if aa > 1275 then - byteBuffer[j] := Min(255, (2550 - aa) shr 2) else // /4 - byteBuffer[j] := Min(255, aa shr 2); // /4 - end; - frNonZero: - begin - byteBuffer[j] := Min(255, Round(Abs(accum) * 318)); - end; -{$IFDEF REVERSE_ORIENTATION} - frPositive: + accum := 0; //winding count accumulator + for j := xli to xri do + begin + accum := accum + windingAccum[j]; + case fillRule of + frEvenOdd: + begin +{$IFDEF UseTrunc} + aa := Trunc(Abs(accum) * 1275) mod 2550; // *5 {$ELSE} - frNegative: + aa := Round(Abs(accum) * 1275) mod 2550; // *5 {$ENDIF} - begin - if accum > 0.002 then - byteBuffer[j] := Min(255, Round(accum * 318)); - end; -{$IFDEF REVERSE_ORIENTATION} - frNegative: + if aa > 1275 then + byteBuffer[j] := Min(255, (2550 - aa) shr 2) else // /4 + byteBuffer[j] := Min(255, aa shr 2); // /4 + end; + frNonZero: + begin +{$IFDEF UseTrunc} + byteBuffer[j] := Min(255, Trunc(Abs(accum) * 318)); {$ELSE} - frPositive: + byteBuffer[j] := Min(255, Round(Abs(accum) * 318)); {$ENDIF} - begin - if accum < -0.002 then - byteBuffer[j] := Min(255, Round(-accum * 318)); - end; + end; + {$IFDEF REVERSE_ORIENTATION} + frPositive: + {$ELSE} + frNegative: + {$ENDIF} + begin +{$IFDEF UseTrunc} + if accum > 0.002 then + byteBuffer[j] := Min(255, Trunc(accum * 318)); +{$ELSE} + if accum > 0.002 then + byteBuffer[j] := Min(255, Round(accum * 318)); +{$ENDIF} + end; + {$IFDEF REVERSE_ORIENTATION} + frNegative: + {$ELSE} + frPositive: + {$ENDIF} + begin +{$IFDEF UseTrunc} + if accum < -0.002 then + byteBuffer[j] := Min(255, Trunc(-accum * 318)); +{$ELSE} + if accum < -0.002 then + byteBuffer[j] := Min(255, Round(-accum * 318)); +{$ENDIF} + end; + end; end; - end; - renderer.RenderProc(clipRec2.Left + xli, clipRec2.Left + xri, - clipRec2.Top + i, @byteBuffer[xli]); + renderer.RenderProc(clipRec2.Left + xli, clipRec2.Left + xri, + clipRec2.Top + i, @byteBuffer[xli]); - // cleanup and deallocate memory - FillChar(windingAccum[xli], (xri - xli +1) * sizeOf(Double), 0); - inc(scanline); + // cleanup and deallocate memory + FillChar(windingAccum[xli], (xri - xli +1) * sizeOf(Double), 0); + inc(scanline); + end; + finally + FreeMem(fragments); +{$IFnDEF UseTrunc} + SetRoundMode(savedRoundMode); +{$ENDIF} end; - FreeMem(fragments); - SetRoundMode(savedRoundMode); end; // ------------------------------------------------------------------------------ @@ -1502,7 +1558,11 @@ procedure TRadialGradientRenderer.RenderProc(x1, x2, y: integer; alpha: PByte); for i := x1 to x2 do begin dist := Hypot((y - fCenterPt.Y) *fScaleY, (i - fCenterPt.X) *fScaleX); +{$IFDEF UseTrunc} + color.Color := fColors[fBoundsProc(Trunc(dist), fColorsCnt)]; +{$ELSE} color.Color := fColors[fBoundsProc(Round(dist), fColorsCnt)]; +{$ENDIF} pDst^ := BlendToAlpha(pDst^, MulBytes(color.A, Ord(alpha^)) shl 24 or (color.Color and $FFFFFF)); inc(pDst); inc(alpha); @@ -1553,7 +1613,7 @@ procedure TSvgRadialGradientRenderer.SetParameters(const ellipseRect: TRect; procedure TSvgRadialGradientRenderer.RenderProc(x1, x2, y: integer; alpha: PByte); var i: integer; - q,m,c, qa,qb,qc,qs: double; + q,qq, m,c, qa,qb,qc,qs: double; dist, dist2: double; color: TARGB; pDst: PColor32; @@ -1569,7 +1629,10 @@ procedure TSvgRadialGradientRenderer.RenderProc(x1, x2, y: integer; alpha: PByte if (pt.X = fFocusPt.X) then //vertical line begin // let x = pt.X, then y*y = b*b(1 - Sqr(pt.X)/aa) - q := Sqrt(fBB*(1 - Sqr(pt.X)/fAA)); + qq := (1 - Sqr(pt.X)/fAA); + if (qq > 1) then qq := 1 + else if (qq < 0) then qq := 0; + q := Sqrt(fBB*qq); ellipsePt.X := pt.X; if pt.Y >= fFocusPt.Y then ellipsePt.Y := q else @@ -1836,7 +1899,7 @@ procedure DrawLine(img: TImage32; const lines: TPathsD; begin if not assigned(lines) then exit; if (lineWidth < MinStrokeWidth) then lineWidth := MinStrokeWidth; - lines2 := Outline(lines, lineWidth, joinStyle, endStyle, miterLimit); + lines2 := RoughOutline(lines, lineWidth, joinStyle, endStyle, miterLimit); if img.AntiAliased then cr := TColorRenderer.Create(color) else @@ -1862,7 +1925,7 @@ procedure DrawLine(img: TImage32; const lines: TPathsD; begin if (not assigned(lines)) or (not assigned(renderer)) then exit; if (lineWidth < MinStrokeWidth) then lineWidth := MinStrokeWidth; - lines2 := Outline(lines, lineWidth, joinStyle, endStyle, miterLimit); + lines2 := RoughOutline(lines, lineWidth, joinStyle, endStyle, miterLimit); if renderer.Initialize(img) then begin Rasterize(lines2, img.bounds, frNonZero, renderer); @@ -1880,7 +1943,7 @@ procedure DrawInvertedLine(img: TImage32; begin if not assigned(lines) then exit; if (lineWidth < MinStrokeWidth) then lineWidth := MinStrokeWidth; - lines2 := Outline(lines, lineWidth, joinStyle, endStyle, 2); + lines2 := RoughOutline(lines, lineWidth, joinStyle, endStyle, 2); ir := TInverseRenderer.Create; try if ir.Initialize(img) then @@ -1910,15 +1973,20 @@ procedure DrawDashedLine(img: TImage32; const line: TPathD; lines := GetDashedPath(line, endStyle = esPolygon, dashPattern, patternOffset); if Length(lines) = 0 then Exit; + case joinStyle of + jsAuto: + if endStyle = esRound then + joinStyle := jsRound else + joinStyle := jsSquare; jsSquare, jsMiter: endStyle := esSquare; jsRound: endStyle := esRound; - else + jsButt: endStyle := esButt; end; - lines := Outline(lines, lineWidth, joinStyle, endStyle); + lines := RoughOutline(lines, lineWidth, joinStyle, endStyle); cr := TColorRenderer.Create(color); try if cr.Initialize(img) then @@ -1960,7 +2028,7 @@ procedure DrawDashedLine(img: TImage32; const line: TPathD; lines := GetDashedPath(line, endStyle = esPolygon, dashPattern, patternOffset); if Length(lines) = 0 then Exit; - lines := Outline(lines, lineWidth, joinStyle, endStyle); + lines := RoughOutline(lines, lineWidth, joinStyle, endStyle); if renderer.Initialize(img) then begin Rasterize(lines, img.bounds, frNonZero, renderer); @@ -1999,7 +2067,7 @@ procedure DrawInvertedDashedLine(img: TImage32; lines := GetDashedPath(line, endStyle = esPolygon, dashPattern, patternOffset); if Length(lines) = 0 then Exit; - lines := Outline(lines, lineWidth, joinStyle, endStyle); + lines := RoughOutline(lines, lineWidth, joinStyle, endStyle); renderer := TInverseRenderer.Create; try if renderer.Initialize(img) then @@ -2134,7 +2202,7 @@ procedure DrawPolygon_ClearType(img: TImage32; const polygons: TPathsD; RectWidthHeight(rec, w, h); tmpImg := TImage32.Create(w *3, h); try - tmpPolygons := OffsetPath(polygons, -rec.Left, -rec.Top); + tmpPolygons := TranslatePath(polygons, -rec.Left, -rec.Top); tmpPolygons := ScalePath(tmpPolygons, 3, 1); cr := TColorRenderer.Create(clBlack32); try diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Extra.pas b/Ext/SVGIconImageList/Image32/source/Img32.Extra.pas index fe25f24..4e8a576 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Extra.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Extra.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 1 May 2023 * +* Date : 11 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : Miscellaneous routines that don't belong in other modules. * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -22,46 +22,6 @@ interface TButtonAttribute = (baShadow, ba3D, baEraseBeneath); TButtonAttributes = set of TButtonAttribute; -type - PPt = ^TPt; - TPt = record - pt : TPointD; - vec : TPointD; - len : double; - next : PPt; - prev : PPt; - end; - - TFitCurveContainer = class - private - ppts : PPt; - solution : TPathD; - tolSqrd : double; - function Count(first, last: PPt): integer; - function AddPt(const pt: TPointD): PPt; - procedure Clear; - function ComputeLeftTangent(p: PPt): TPointD; - function ComputeRightTangent(p: PPt): TPointD; - function ComputeCenterTangent(p: PPt): TPointD; - function ChordLengthParameterize( - first: PPt; cnt: integer): TArrayOfDouble; - function GenerateBezier(first, last: PPt; cnt: integer; - const u: TArrayOfDouble; const firstTan, lastTan: TPointD): TPathD; - function Reparameterize(first: PPt; cnt: integer; - const u: TArrayOfDouble; const bezier: TPathD): TArrayOfDouble; - function NewtonRaphsonRootFind(const q: TPathD; - const pt: TPointD; u: double): double; - function ComputeMaxErrorSqrd(first, last: PPt; - const bezier: TPathD; const u: TArrayOfDouble; - out SplitPoint: PPt): double; - function FitCubic(first, last: PPt; - firstTan, lastTan: TPointD): Boolean; - procedure AppendSolution(const bezier: TPathD); - public - function FitCurve(const path: TPathD; closed: Boolean; - tolerance: double; minSegLength: double): TPathD; - end; - procedure DrawEdge(img: TImage32; const rec: TRect; topLeftColor, bottomRightColor: TColor32; penWidth: double = 1.0); overload; procedure DrawEdge(img: TImage32; const rec: TRectD; @@ -85,9 +45,6 @@ procedure DrawGlow(img: TImage32; const polygon: TPathD; procedure DrawGlow(img: TImage32; const polygons: TPathsD; fillRule: TFillRule; color: TColor32; blurRadius: integer); overload; -procedure TileImage(img: TImage32; const rec: TRect; tile: TImage32); overload; -procedure TileImage(img: TImage32; const rec: TRect; tile: TImage32; const tileRec: TRect); overload; - //FloodFill: If no CompareFunc is provided, FloodFill will fill whereever //adjoining pixels exactly match the starting pixel - Point(x,y). procedure FloodFill(img: TImage32; x, y: Integer; newColor: TColor32; @@ -178,36 +135,42 @@ function RamerDouglasPeucker(const path: TPathD; function RamerDouglasPeucker(const paths: TPathsD; epsilon: double): TPathsD; overload; +{$IFDEF USE_OLD_SIMPLIFYPATHS} +// SimplifyPath: Better than RDP when simplifying closed paths +function SimplifyPath(const path: TPathD; + shapeTolerance: double = 0.1; isOpenPath: Boolean = false): TPathD; +function SimplifyPaths(const paths: TPathsD; + shapeTolerance: double = 0.1; isOpenPath: Boolean = false): TPathsD; +{$ELSE} // SimplifyPath: Better than RDP when simplifying closed paths function SimplifyPath(const path: TPathD; - shapeTolerance: double; isOpenPath: Boolean = false): TPathD; + shapeTolerance: double = 0.1; isClosedPath: Boolean = true): TPathD; function SimplifyPaths(const paths: TPathsD; - shapeTolerance: double; isOpenPath: Boolean = false): TPathsD; + shapeTolerance: double = 0.1; isClosedPath: Boolean = true): TPathsD; +{$ENDIF} // SimplifyPathEx: this is mainly useful following Vectorize() -function SimplifyPathEx(const path: TPathD; - shapeTolerance: double): TPathD; -function SimplifyPathsEx(const paths: TPathsD; - shapeTolerance: double): TPathsD; - -// SmoothToCubicBezier - produces a series of cubic bezier control points. -// This function is very useful in the following combination: -// SimplifyPath(), SmoothToCubicBezier(), FlattenCBezier(). +// Also removes very short segments that zig-zag (rather than curve) +function SimplifyPathEx(const path: TPathD; shapeTolerance: double): TPathD; +function SimplifyPathsEx(const paths: TPathsD; shapeTolerance: double): TPathsD; + +// SmoothToCubicBezier and SmoothToCubicBezier2 have been deprecated in +// favour of SmoothPath that's much simpler function SmoothToCubicBezier(const path: TPathD; - pathIsClosed: Boolean; maxOffset: integer = 0): TPathD; overload; + pathIsClosed: Boolean; maxOffset: integer = 0): TPathD; overload; deprecated; function SmoothToCubicBezier(const paths: TPathsD; - pathIsClosed: Boolean; maxOffset: integer = 0): TPathsD; overload; - -// SmoothToCubicBezier2 - similar to SmoothToCubicBezier but is -// insensitive to join angles + pathIsClosed: Boolean; maxOffset: integer = 0): TPathsD; overload; deprecated; function SmoothToCubicBezier2(const path: TPathD; - pathIsClosed: Boolean; maxOffset: integer = 0): TPathD; overload; + pathIsClosed: Boolean; maxOffset: integer = 0): TPathD; overload; deprecated; function SmoothToCubicBezier2(const paths: TPathsD; - pathIsClosed: Boolean; maxOffset: integer = 0): TPathsD; overload; + pathIsClosed: Boolean; maxOffset: integer = 0): TPathsD; overload; deprecated; -//InterpolatePoints: smooths a simple line chart. -//Points should be left to right and equidistant along the X axis -function InterpolatePoints(const points: TPathD; tension: integer = 0): TPathD; +// SmoothPath - smooths a path using bicubic interpolation +// tension (range -1 to 1): from least to most curve constraint +function SmoothPath(const path: TPathD; isClosedPath: Boolean; + tension: double = 0; shapeTolerance: double = 0.1): TPathD; +function SmoothPaths(const paths: TPathsD; isClosedPath: Boolean; + tension: double = 0; shapeTolerance: double = 0.1): TPathsD; function GetFloodFillMask(imgIn, imgMaskOut: TImage32; x, y: Integer; tolerance: Byte; compareFunc: TCompareFunctionEx): Boolean; @@ -219,25 +182,12 @@ function BlendAverage(bgColor, fgColor: TColor32): TColor32; function BlendLinearBurn(bgColor, fgColor: TColor32): TColor32; function BlendColorDodge(bgColor, fgColor: TColor32): TColor32; -//CurveFit: this function is based on - -//"An Algorithm for Automatically Fitting Digitized Curves" -//by Philip J. Schneider in "Graphics Gems", Academic Press, 1990 -//Smooths out many very closely positioned points -//tolerance range: 1..10 where 10 == max tolerance. - -function CurveFit(const path: TPathD; closed: Boolean; - tolerance: double; minSegLength: double = 2): TPathD; overload; -function CurveFit(const paths: TPathsD; closed: Boolean; - tolerance: double; minSegLength: double = 2): TPathsD; overload; - implementation uses - {$IFNDEF MSWINDOWS} - {$IFNDEF FPC} + {$IFDEF USING_FMX} Img32.FMX, {$ENDIF} - {$ENDIF} Img32.Transform; const @@ -395,7 +345,7 @@ procedure DrawEdge(img: TImage32; const path: TPathD; p := path; if closePath and not PointsNearEqual(p[0], p[highI], 0.01) then begin - AppendPath(p, p[0]); + AppendToPath(p, p[0]); inc(highI); end; for i := 1 to highI do @@ -596,8 +546,8 @@ procedure DrawShadow(img: TImage32; const polygons: TPathsD; y := depth * y; blurSize := Max(1,Round(depth / 2)); Img32.Vector.InflateRect(rec, Ceil(depth*2), Ceil(depth*2)); - polys := OffsetPath(polygons, -rec.Left, -rec.Top); - shadowPolys := OffsetPath(polys, x, y); + polys := TranslatePath(polygons, -rec.Left, -rec.Top); + shadowPolys := TranslatePath(polys, x, y); RectWidthHeight(rec, w, h); shadowImg := TImage32.Create(w, h); try @@ -631,7 +581,7 @@ procedure DrawGlow(img: TImage32; const polygons: TPathsD; glowImg: TImage32; begin rec := GetBounds(polygons); - glowPolys := OffsetPath(polygons, + glowPolys := TranslatePath(polygons, blurRadius -rec.Left +1, blurRadius -rec.Top +1); Img32.Vector.InflateRect(rec, blurRadius +1, blurRadius +1); RectWidthHeight(rec, w, h); @@ -647,41 +597,6 @@ procedure DrawGlow(img: TImage32; const polygons: TPathsD; end; //------------------------------------------------------------------------------ -procedure TileImage(img: TImage32; const rec: TRect; tile: TImage32); -begin - TileImage(img, rec, tile, tile.Bounds); -end; -//------------------------------------------------------------------------------ - -procedure TileImage(img: TImage32; - const rec: TRect; tile: TImage32; const tileRec: TRect); -var - i, dstW, dstH, srcW, srcH, cnt: integer; - dstRec, srcRec: TRect; -begin - if tile.IsEmpty or IsEmptyRect(tileRec) then Exit; - RectWidthHeight(rec, dstW,dstH); - RectWidthHeight(tileRec, srcW, srcH); - cnt := Ceil(dstW / srcW); - dstRec := Img32.Vector.Rect(rec.Left, rec.Top, - rec.Left + srcW, rec.Top + srcH); - for i := 1 to cnt do - begin - img.Copy(tile, tileRec, dstRec); - Types.OffsetRect(dstRec, srcW, 0); - end; - cnt := Ceil(dstH / srcH) -1; - srcRec := Img32.Vector.Rect(rec.Left, rec.Top, - rec.Right, rec.Top + srcH); - dstRec := srcRec; - for i := 1 to cnt do - begin - Types.OffsetRect(dstRec, 0, srcH); - img.Copy(img, srcRec, dstRec); - end; -end; -//------------------------------------------------------------------------------ - procedure Sharpen(img: TImage32; radius: Integer; amount: Integer); var i: Integer; @@ -731,13 +646,12 @@ procedure HatchBackground(img: TImage32; const rec: TRect; try for i := rec.Top to rec.Bottom -1 do begin - pc := img.PixelRow[i]; - inc(pc, rec.Left); + pc := @img.Pixels[i * img.Width + rec.Left]; hatch := Odd(i div hatchSize); for j := rec.Left to rec.Right -1 do begin if (j + 1) mod hatchSize = 0 then hatch := not hatch; - pc^ := BlendToOpaque(pc^, colors[hatch]); + pc^ := BlendToOpaque(colors[hatch], pc^); inc(pc); end; end; @@ -1019,7 +933,7 @@ procedure EraseOutsidePath(img: TImage32; const path: TPathD; RectWidthHeight(outsideBounds, w,h); mask := TImage32.Create(w, h); try - p := OffsetPath(path, -outsideBounds.Left, -outsideBounds.top); + p := TranslatePath(path, -outsideBounds.Left, -outsideBounds.top); DrawPolygon(mask, p, fillRule, clBlack32); img.CopyBlend(mask, mask.Bounds, outsideBounds, BlendMask); finally @@ -1039,7 +953,7 @@ procedure EraseOutsidePaths(img: TImage32; const paths: TPathsD; RectWidthHeight(outsideBounds, w,h); mask := TImage32.Create(w, h); try - pp := OffsetPath(paths, -outsideBounds.Left, -outsideBounds.top); + pp := TranslatePath(paths, -outsideBounds.Left, -outsideBounds.top); DrawPolygon(mask, pp, fillRule, clBlack32); img.CopyBlend(mask, mask.Bounds, outsideBounds, BlendMask); finally @@ -1074,14 +988,14 @@ procedure Draw3D(img: TImage32; const polygons: TPathsD; if IsEmptyRect(rec) then Exit; if not ClockwiseRotationIsAnglePositive then angleRads := -angleRads; GetSinCos(angleRads, y, x); - paths := OffsetPath(polygons, -rec.Left, -rec.Top); + paths := TranslatePath(polygons, -rec.Left, -rec.Top); RectWidthHeight(rec, w, h); tmp := TImage32.Create(w, h); try if GetAlpha(colorLt) > 0 then begin tmp.Clear(colorLt); - paths2 := OffsetPath(paths, -height*x, -height*y); + paths2 := TranslatePath(paths, -height*x, -height*y); EraseInsidePaths(tmp, paths2, fillRule); FastGaussianBlur(tmp, tmp.Bounds, Round(blurRadius), 0); EraseOutsidePaths(tmp, paths, fillRule, tmp.Bounds); @@ -1090,7 +1004,7 @@ procedure Draw3D(img: TImage32; const polygons: TPathsD; if GetAlpha(colorDk) > 0 then begin tmp.Clear(colorDk); - paths2 := OffsetPath(paths, height*x, height*y); + paths2 := TranslatePath(paths, height*x, height*y); EraseInsidePaths(tmp, paths2, fillRule); FastGaussianBlur(tmp, tmp.Bounds, Round(blurRadius), 0); EraseOutsidePaths(tmp, paths, fillRule, tmp.Bounds); @@ -1750,7 +1664,7 @@ TSimplifyRec = record end; function SimplifyPath(const path: TPathD; - shapeTolerance: double; isOpenPath: Boolean = false): TPathD; + shapeTolerance: double; isClosedPath: Boolean): TPathD; var i, highI, minLen: integer; tolSqrd: double; @@ -1759,7 +1673,7 @@ function SimplifyPath(const path: TPathD; begin Result := nil; highI := High(path); - if isOpenPath then minLen := 2 else minLen := 3; + if not isClosedPath then minLen := 2 else minLen := 3; if highI +1 < minLen then Exit; @@ -1769,14 +1683,14 @@ function SimplifyPath(const path: TPathD; pt := path[0]; prev := @srArray[highI]; next := @srArray[1]; - if isOpenPath then - begin - pdSqrd := MaxDouble; - isEnd := true; - end else + if isClosedPath then begin pdSqrd := PerpendicularDistSqrd(path[0], path[highI], path[1]); isEnd := false; + end else + begin + pdSqrd := MaxDouble; + isEnd := true; end; end; @@ -1785,14 +1699,14 @@ function SimplifyPath(const path: TPathD; pt := path[highI]; prev := @srArray[highI-1]; next := @srArray[0]; - if isOpenPath then - begin - pdSqrd := MaxDouble; - isEnd := true; - end else + if isClosedPath then begin pdSqrd := PerpendicularDistSqrd(path[highI], path[highI-1], path[0]); isEnd := false; + end else + begin + pdSqrd := MaxDouble; + isEnd := true; end; end; @@ -1831,7 +1745,7 @@ function SimplifyPath(const path: TPathD; end; end; if highI +1 < minLen then Exit; - if isOpenPath then first := @srArray[0]; + if not isClosedPath then first := @srArray[0]; SetLength(Result, highI +1); for i := 0 to HighI do begin @@ -1842,14 +1756,19 @@ function SimplifyPath(const path: TPathD; //------------------------------------------------------------------------------ function SimplifyPaths(const paths: TPathsD; - shapeTolerance: double; isOpenPath: Boolean = false): TPathsD; + shapeTolerance: double; isClosedPath: Boolean): TPathsD; var - i, len: integer; + i,j, len: integer; begin len := Length(paths); SetLength(Result, len); + j := 0; for i := 0 to len -1 do - result[i] := SimplifyPath(paths[i], shapeTolerance, isOpenPath); + begin + result[j] := SimplifyPath(paths[i], shapeTolerance, isClosedPath); + if Length(result[j]) > 0 then inc(j); + end; + SetLength(Result, j); end; //--------------------------------------------------------------------------- @@ -1883,8 +1802,8 @@ function DeleteCurrent(var current: PSimplifyExRec): Boolean; function SimplifyPathEx(const path: TPathD; shapeTolerance: double): TPathD; var - i, highI: integer; - shapeTolSqr: double; + i, prevI, nextI, highI: integer; + cp, cp2, shapeTolSqr, shapeTolSqrEx: double; srArray: array of TSimplifyExRec; current, start: PSimplifyExRec; begin @@ -1893,33 +1812,25 @@ function SimplifyPathEx(const path: TPathD; shapeTolerance: double): TPathD; if highI < 2 then Exit; shapeTolSqr := Sqr(shapeTolerance); + shapeTolSqrEx := shapeTolerance * 4 +1; // may need adjusting SetLength(srArray, highI +1); - with srArray[0] do - begin - pt := path[0]; - segLenSq:= DistanceSqrd(path[highI], path[0]); - pdSqrd := PerpendicularDistSqrd(path[0], path[highI], path[1]); - prev := @srArray[highI]; - next := @srArray[1]; - end; - with srArray[highI] do + + for i := 0 to highI do begin - pt := path[highI]; - segLenSq:= DistanceSqrd(path[highI-1], path[highI]); - pdSqrd := PerpendicularDistSqrd(path[highI], path[highI-1], path[0]); - prev := @srArray[highI-1]; - next := @srArray[0]; - end; + prevI := i -1; + nextI := i +1; + if i = 0 then prevI := highI + else if i = highI then nextI := 0; - for i := 1 to highI -1 do with srArray[i] do begin pt := path[i]; - segLenSq:= DistanceSqrd(path[i-1], path[i]); - pdSqrd := PerpendicularDistSqrd(path[i], path[i-1], path[i+1]); - prev := @srArray[i-1]; - next := @srArray[i+1]; + segLenSq:= DistanceSqrd(path[prevI], path[i]); + pdSqrd := PerpendicularDistSqrd(path[i], path[prevI], path[nextI]); + prev := @srArray[prevI]; + next := @srArray[nextI]; end; + end; current := @srArray[0]; start := current.prev; @@ -1935,29 +1846,24 @@ function SimplifyPathEx(const path: TPathD; shapeTolerance: double): TPathD; dec(highI); if not DeleteCurrent(current) then Break; start := current.prev; - end else if (current.segLenSq * 25 < current.prev.segLenSq) and - (current.segLenSq * 25 < current.next.segLenSq) then + end else if + (current.segLenSq * shapeTolSqrEx < current.prev.segLenSq) and + (current.segLenSq * shapeTolSqrEx < current.next.segLenSq) then begin - current := current.next; -// cp := CrossProduct(current.prev.prev.pt, current.prev.pt, current.pt); -// cp2 := CrossProduct(current.prev.pt, current.pt, current.next.pt); -// if ((cp > 0) = (cp2 > 0)) then -// begin -// // nat a zig-zag (ie avoids truncating tightly rounded corners) -// current := current.next; -// end else -// begin -// // remove insignificant zigzags -// dec(highI); -//// current.prev.pt := MidPoint(current.pt, current.prev.pt); -//// current.prev.segLenSq := -//// DistanceSqrd(current.prev.prev.pt, current.prev.pt); -// -//// if (current.prev.segLenSq < current.next.segLenSq) then -//// current := current.prev; -// if not DeleteCurrent(current) then Break; -// start := current.prev; -// end; + cp := CrossProduct(current.prev.prev.pt, current.prev.pt, current.pt); + cp2 := CrossProduct(current.prev.pt, current.pt, current.next.pt); + if ((cp > 0) = (cp2 > 0)) then + begin + // not a zig-zag (ie avoids truncating tightly rounded corners) + current := current.next; + end else + begin + // remove insignificant zigzags + current.prev.pt := MidPoint(current.pt, current.prev.pt); + if not DeleteCurrent(current) then Break; + start := current.prev; + dec(highI); + end; end else current := current.next; end; @@ -1972,15 +1878,19 @@ function SimplifyPathEx(const path: TPathD; shapeTolerance: double): TPathD; end; //------------------------------------------------------------------------------ -function SimplifyPathsEx(const paths: TPathsD; - shapeTolerance: double): TPathsD; +function SimplifyPathsEx(const paths: TPathsD; shapeTolerance: double): TPathsD; var - i, len: integer; + i,j, len: integer; begin len := Length(paths); SetLength(Result, len); + j := 0; for i := 0 to len -1 do - Result[i] := SimplifyPathEx(paths[i], shapeTolerance); + begin + Result[j] := SimplifyPathEx(paths[i], shapeTolerance); + if Length(Result[j]) > 0 then inc(j); + end; + SetLength(Result, len); end; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- @@ -2038,11 +1948,11 @@ function SmoothToCubicBezier(const path: TPathD; end; if i = 0 then - Result[len*3-1] := OffsetPoint(path[0], -vec.X * d1, -vec.Y * d1) + Result[len*3-1] := TranslatePoint(path[0], -vec.X * d1, -vec.Y * d1) else - Result[i*3-1] := OffsetPoint(path[i], -vec.X * d1, -vec.Y * d1); + Result[i*3-1] := TranslatePoint(path[i], -vec.X * d1, -vec.Y * d1); Result[i*3] := path[i]; - Result[i*3+1] := OffsetPoint(path[i], vec.X * d2, vec.Y * d2); + Result[i*3+1] := TranslatePoint(path[i], vec.X * d2, vec.Y * d2); end; Result[len*3] := path[0]; @@ -2109,11 +2019,11 @@ function SmoothToCubicBezier2(const path: TPathD; end; if i = 0 then - Result[len*3-1] := OffsetPoint(path[0], -vec.X * d1, -vec.Y * d1) + Result[len*3-1] := TranslatePoint(path[0], -vec.X * d1, -vec.Y * d1) else - Result[i*3-1] := OffsetPoint(path[i], -vec.X * d1, -vec.Y * d1); + Result[i*3-1] := TranslatePoint(path[i], -vec.X * d1, -vec.Y * d1); Result[i*3] := path[i]; - Result[i*3+1] := OffsetPoint(path[i], vec.X * d2, vec.Y * d2); + Result[i*3+1] := TranslatePoint(path[i], vec.X * d2, vec.Y * d2); end; Result[len*3] := path[0]; @@ -2137,67 +2047,130 @@ function SmoothToCubicBezier2(const paths: TPathsD; end; //------------------------------------------------------------------------------ -function HermiteInterpolation(y1, y2, y3, y4: double; - mu, tension: double): double; +function Clamp(val, endVal: integer): integer; inline; +begin + if val < 0 then Result := 0 + else if val >= endVal then Result := endVal -1 + else Result := val; +end; +//------------------------------------------------------------------------------ + +function ModEx(val, endVal: integer): integer; inline; +begin + Result := val mod endVal; + if Result < 0 then Result := endVal + Result; +end; +//------------------------------------------------------------------------------ + +function CubicInterpolate(v1, v2, v3, v4: double; + t: double; tension: double = 0): double; var - m0,m1,mu2,mu3: double; - a0,a1,a2,a3: double; + m0, m1, tt, ttt, tensionEx: double; + a, b: double; begin - // http://paulbourke.net/miscellaneous/interpolation/ - // nb: optional bias toward left or right has been disabled. - mu2 := mu * mu; - mu3 := mu2 * mu; - m0 := (y2-y1)*(1-tension)/2; - m0 := m0 + (y3-y2)*(1-tension)/2; - m1 := (y3-y2)*(1-tension)/2; - m1 := m1 + (y4-y3)*(1-tension)/2; - a0 := 2*mu3 - 3*mu2 + 1; - a1 := mu3 - 2*mu2 + mu; - a2 := mu3 - mu2; - a3 := -2*mu3 + 3*mu2; - Result := a0*y2+a1*m0+a2*m1+a3*y3; + tt := t * t; + ttt := tt * t; + tensionEx := (1-tension) * 0.5; + m0 := (v3 - v1)*tensionEx; + m1 := (v4 - v2)*tensionEx; + a := 2*v2 - 2*v3 + m0 + m1; + b := 3*v3 -3*v2 -2*m0 - m1; + Result := a*ttt + b*tt + m0*t + v2; end; //------------------------------------------------------------------------------ -function InterpolateY(const y1,y2,y3,y4: double; - dx: integer; tension: double): TArrayOfDouble; +procedure Append(var path: TPathD; const pt: TPointD); inline; var - i: integer; + len: integer; begin - SetLength(Result, dx); - if dx = 0 then Exit; - Result[0] := y2; - for i := 1 to dx-1 do - Result[i] := HermiteInterpolation(y1,y2,y3,y4, i/dx, tension); + len := Length(path); + SetLength(path, len +1); + path[len] := pt; end; //------------------------------------------------------------------------------ -function InterpolatePoints(const points: TPathD; tension: integer): TPathD; +function SmoothPath(const path: TPathD; isClosedPath: Boolean; + tension: double; shapeTolerance: double): TPathD; var - i, j, len, len2: integer; - p, p2: TPathD; - ys: TArrayOfDouble; + i, j, highI, len, cnt: integer; + pt: TPointD; + dists: TArrayOfDouble; +const + maxInterval = 1.5; begin - if tension < -1 then tension := -1 - else if tension > 1 then tension := 1; Result := nil; - len := Length(points); - if len < 2 then Exit; - SetLength(p, len +2); - p[0] := points[0]; - p[len+1] := points[len -1]; - Move(points[0],p[1], len * SizeOf(TPointD)); - for i := 1 to len-1 do + len := Length(path); + if len < 3 then Exit; + SetLength(dists, len); + highI := len -1; + dists[highI] := Distance(path[highI], path[0]); + for i := 0 to highI-1 do + dists[i] := Distance(path[i], path[i+1]); + + if tension > 1 then tension := 1 + else if tension < -1 then tension := -1; + if tension > 0.9 then + begin + Result := path; + Exit; + end; + + if isClosedPath then + for i := 0 to highI do + begin + cnt := Ceil(dists[i]/maxInterval); + Append(Result, path[i]); + for j := 1 to cnt -1 do + begin + pt.X := CubicInterpolate( + path[ModEx(i-1, len)].X, + path[i].X, + path[ModEx(i+1, len)].X, + path[ModEx(i+2, len)].X, j/cnt, tension); + pt.Y := CubicInterpolate( + path[ModEx(i-1, len)].Y, + path[i].Y, + path[ModEx(i+1, len)].Y, + path[ModEx(i+2, len)].Y, j/cnt, tension); + Append(Result, pt); + end; + end + else begin - ys := InterpolateY(p[i-1].Y,p[i].Y,p[i+1].Y,p[i+2].Y, - Trunc(p[i+1].X - p[i].X), tension); - len2 := Length(ys); - SetLength(p2, len2); - for j := 0 to len2 -1 do - p2[j] := PointD(p[i].X +j, ys[j]); - AppendPath(Result, p2); + for i := 0 to highI -1 do + begin + cnt := Ceil(dists[i]/maxInterval); + Append(Result, path[i]); + for j := 1 to cnt -1 do + begin + pt.X := CubicInterpolate( + path[Clamp(i-1, len)].X, + path[Clamp(i, len)].X, + path[Clamp(i+1, len)].X, + path[Clamp(i+2, len)].X, j/cnt, tension); + pt.Y := CubicInterpolate( + path[Clamp(i-1, len)].Y, + path[Clamp(i, len)].Y, + path[Clamp(i+1, len)].Y, + path[Clamp(i+2, len)].Y, j/cnt, tension); + Append(Result, pt); + end; + end; + Append(Result, path[highi]); end; - AppendPoint(Result, p[len]); + Result := SimplifyPath(Result, shapeTolerance, false); +end; +//------------------------------------------------------------------------------ + +function SmoothPaths(const paths: TPathsD; isClosedPath: Boolean; + tension: double = 0; shapeTolerance: double = 0.1): TPathsD; +var + i, len: integer; +begin + len := Length(paths); + SetLength(Result, len); + for i := 0 to len -1 do + Result[i] := SmoothPath(paths[i], isClosedPath, tension, shapeTolerance); end; //------------------------------------------------------------------------------ @@ -2454,595 +2427,4 @@ procedure FastGaussianBlur(img: TImage32; end; //------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -// CurveFit() support structures and functions -//------------------------------------------------------------------------------ - -//CurveFit: this function is based on - -//"An Algorithm for Automatically Fitting Digitized Curves" -//by Philip J. Schneider in "Graphics Gems", Academic Press, 1990 -//Smooths out many very closely positioned points -//tolerance range: 1..10 where 10 == max tolerance. - -//This function has been archived as I believe that -//RamerDouglasPeuker(), GetSmoothPath() and FlattenCBezier() -//will usually achieve a better result - -function Scale(const vec: TPointD; newLen: double): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result.X := vec.X * newLen; - Result.Y := vec.Y * newLen; -end; -//------------------------------------------------------------------------------ - -function Mul(const vec: TPointD; val: double): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result.X := vec.X * val; - Result.Y := vec.Y * val; -end; -//------------------------------------------------------------------------------ - -function AddVecs(const vec1, vec2: TPointD): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result.X := vec1.X + vec2.X; - Result.Y := vec1.Y + vec2.Y; -end; -//------------------------------------------------------------------------------ - -function SubVecs(const vec1, vec2: TPointD): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result.X := vec1.X - vec2.X; - Result.Y := vec1.Y - vec2.Y; -end; -//------------------------------------------------------------------------------ - -function NormalizeVec(const vec: TPointD): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -var - len: double; -begin - len := Sqrt(vec.X * vec.X + vec.Y * vec.Y); - if len <> 0 then - begin - Result.X := vec.X / len; - Result.Y := vec.Y / len; - end else - result := vec; -end; -//------------------------------------------------------------------------------ - -function NormalizeTPt(const pt: PPt): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -begin - with pt^ do - if len <> 0 then - begin - Result.X := vec.X / len; - Result.Y := vec.Y / len; - end else - result := vec; -end; -//------------------------------------------------------------------------------ - -function NegateVec(vec: TPointD): TPointD; - {$IFDEF INLINE} inline; {$ENDIF} -begin - Result.X := -vec.X; - Result.Y := -vec.Y; -end; -//------------------------------------------------------------------------------ - -function B0(u: double): double; {$IFDEF INLINE} inline; {$ENDIF} -var - tmp: double; -begin - tmp := 1.0 - u; - result := tmp * tmp * tmp; -end; -//------------------------------------------------------------------------------ - -function B1(u: double): double; {$IFDEF INLINE} inline; {$ENDIF} -var - tmp: double; -begin - tmp := 1.0 - u; - result := 3 * u * tmp * tmp; -end; -//------------------------------------------------------------------------------ - -function B2(u: double): double; {$IFDEF INLINE} inline; {$ENDIF} -begin - result := 3 * u * u * (1.0 - u); -end; -//------------------------------------------------------------------------------ - -function B3(u: double): double; {$IFDEF INLINE} inline; {$ENDIF} -begin - result := u * u * u; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.AddPt(const pt: TPointD): PPt; -begin - new(Result); - Result.pt := pt; - if not assigned(ppts) then - begin - Result.prev := Result; - Result.next := Result; - ppts := Result; - end else - begin - Result.prev := ppts.prev; - ppts.prev.next := Result; - ppts.prev := Result; - Result.next := ppts; - end; -end; -//------------------------------------------------------------------------------ - -procedure TFitCurveContainer.Clear; -var - p: PPt; -begin - solution := nil; - ppts.prev.next := nil; //break loop - while assigned(ppts) do - begin - p := ppts; - ppts := ppts.next; - Dispose(p); - end; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.Count(first, last: PPt): integer; -begin - if first = last then - result := 0 else - result := 1; - repeat - inc(Result); - first := first.next; - until (first = last); -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.ComputeLeftTangent(p: PPt): TPointD; -begin - Result := NormalizeTPt(p); -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.ComputeRightTangent(p: PPt): TPointD; -begin - Result := NegateVec(NormalizeTPt(p.prev)); -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.ComputeCenterTangent(p: PPt): TPointD; -var - v1, v2: TPointD; -begin - v1 := SubVecs(p.pt, p.prev.pt); - v2 := SubVecs(p.next.pt, p.pt); - Result := AddVecs(v1, v2); - Result := NormalizeVec(Result); -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.ChordLengthParameterize( - first: PPt; cnt: integer): TArrayOfDouble; -var - d: double; - i: integer; -begin - SetLength(Result, cnt); - Result[0] := 0; - d := 0; - for i := 1 to cnt -1 do - begin - d := d + first.len; - Result[i] := d; - first := first.next; - end; - for i := 1 to cnt -1 do - Result[i] := Result[i] / d; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.GenerateBezier(first, last: PPt; cnt: integer; - const u: TArrayOfDouble; const firstTan, lastTan: TPointD): TPathD; -var - i: integer; - p: PPt; - dist, epsilon: double; - v1,v2, tmp: TPointD; - a0, a1: TPathD; - c: array [0..1, 0..1] of double; - x: array [0..1] of double; - det_c0_c1, det_c0_x, det_x_c1, alphaL, alphaR: double; -begin - SetLength(a0, cnt); - SetLength(a1, cnt); - dist := Distance(first.pt, last.pt); - for i := 0 to cnt -1 do - begin - v1 := Scale(firstTan, B1(u[i])); - v2 := Scale(lastTan, B2(u[i])); - a0[i] := v1; - a1[i] := v2; - end; - FillChar(c[0][0], 4 * SizeOf(double), 0); - FillChar(x[0], 2 * SizeOf(double), 0); - p := first; - for i := 0 to cnt -1 do - begin - c[0][0] := c[0][0] + DotProdVecs(a0[i], (a0[i])); - c[0][1] := c[0][1] + DotProdVecs(a0[i], (a1[i])); - c[1][0] := c[0][1]; - c[1][1] := c[1][1] + DotProdVecs(a1[i], (a1[i])); - tmp := SubVecs(p.pt, - AddVecs(Mul(first.pt, B0(u[i])), - AddVecs(Mul(first.pt, B1(u[i])), - AddVecs(Mul(last.pt, B2(u[i])), - Mul(last.pt, B3(u[i])))))); - x[0] := x[0] + DotProdVecs(a0[i], tmp); - x[1] := x[1] + DotProdVecs(a1[i], tmp); - p := p.next; - end; - det_c0_c1 := c[0][0] * c[1][1] - c[1][0] * c[0][1]; - det_c0_x := c[0][0] * x[1] - c[1][0] * x[0]; - det_x_c1 := x[0] * c[1][1] - x[1] * c[0][1]; - if det_c0_c1 = 0 then - alphaL := 0 else - alphaL := det_x_c1 / det_c0_c1; - if det_c0_c1 = 0 then - alphaR := 0 else - alphaR := det_c0_x / det_c0_c1; - //check for unlikely fit - if (alphaL > dist * 2) then alphaL := 0 - else if (alphaR > dist * 2) then alphaR := 0; - epsilon := 1.0e-6 * dist; - SetLength(Result, 4); - Result[0] := first.pt; - Result[3] := last.pt; - if (alphaL < epsilon) or (alphaR < epsilon) then - begin - dist := dist / 3; - Result[1] := AddVecs(Result[0], Scale(firstTan, dist)); - Result[2] := AddVecs(Result[3], Scale(lastTan, dist)); - end else - begin - Result[1] := AddVecs(Result[0], Scale(firstTan, alphaL)); - Result[2] := AddVecs(Result[3], Scale(lastTan, alphaR)); - end; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.Reparameterize(first: PPt; cnt: integer; - const u: TArrayOfDouble; const bezier: TPathD): TArrayOfDouble; -var - i: integer; -begin - SetLength(Result, cnt); - for i := 0 to cnt -1 do - begin - Result[i] := NewtonRaphsonRootFind(bezier, first.pt, u[i]); - first := first.next; - end; -end; -//------------------------------------------------------------------------------ - -function BezierII(degree: integer; const v: array of TPointD; t: double): TPointD; -var - i,j: integer; - tmp: array[0..3] of TPointD; -begin - Move(v[0], tmp[0], degree * sizeOf(TPointD)); - for i := 1 to degree do - for j := 0 to degree - i do - begin - tmp[j].x := (1.0 - t) * tmp[j].x + t * tmp[j+1].x; - tmp[j].y := (1.0 - t) * tmp[j].y + t * tmp[j+1].y; - end; - Result := tmp[0]; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.ComputeMaxErrorSqrd(first, last: PPt; - const bezier: TPathD; const u: TArrayOfDouble; - out SplitPoint: PPt): double; -var - i: integer; - distSqrd: double; - pt: TPointD; - p: PPt; -begin - Result := 0; - i := 1; - SplitPoint := first.next; - p := first.next; - while p <> last do - begin - pt := BezierII(3, bezier, u[i]); - distSqrd := DistanceSqrd(pt, p.pt); - if (distSqrd >= Result) then - begin - Result := distSqrd; - SplitPoint := p; - end; - inc(i); - p := p.next; - end; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.NewtonRaphsonRootFind(const q: TPathD; - const pt: TPointD; u: double): double; -var - numerator, denominator: double; - qu, q1u, q2u: TPointD; - q1: array[0..2] of TPointD; - q2: array[0..1] of TPointD; -begin - q1[0].x := (q[1].x - q[0].x) * 3.0; - q1[0].y := (q[1].y - q[0].y) * 3.0; - q1[1].x := (q[2].x - q[1].x) * 3.0; - q1[1].y := (q[2].y - q[1].y) * 3.0; - q1[2].x := (q[3].x - q[2].x) * 3.0; - q1[2].y := (q[3].y - q[2].y) * 3.0; - q2[0].x := (q1[1].x - q1[0].x) * 2.0; - q2[0].y := (q1[1].y - q1[0].y) * 2.0; - q2[1].x := (q1[2].x - q1[1].x) * 2.0; - q2[1].y := (q1[2].y - q1[1].y) * 2.0; - qu := BezierII(3, q, u); - q1u := BezierII(2, q1, u); - q2u := BezierII(1, q2, u); - numerator := (qu.x - pt.x) * (q1u.x) + (qu.y - pt.y) * (q1u.y); - denominator := (q1u.x) * (q1u.x) + (q1u.y) * (q1u.y) + - (qu.x - pt.x) * (q2u.x) + (qu.y - pt.y) * (q2u.y); - if (denominator = 0) then - Result := u else - Result := u - (numerator / denominator); -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.FitCubic(first, last: PPt; - firstTan, lastTan: TPointD): Boolean; -var - i, cnt: integer; - splitPoint: PPt; - centerTan: TPointD; - bezier: TPathD; - clps, uPrime: TArrayOfDouble; - maxErrorSqrd: double; -const - maxRetries = 4; -begin - Result := true; - cnt := Count(first, last); - if cnt = 2 then - begin - SetLength(bezier, 4); - bezier[0] := first.pt; - bezier[3] := last.pt; - bezier[1] := bezier[0]; - bezier[2] := bezier[3]; - AppendSolution(bezier); - Exit; - end - else if cnt = 3 then - begin - if TurnsLeft(first.prev.pt, first.pt, first.next.pt) = - TurnsLeft(first.pt, first.next.pt, last.pt) then - firstTan := ComputeCenterTangent(first); - if TurnsLeft(last.prev.pt, last.pt, last.next.pt) = - TurnsLeft(first.pt, first.next.pt, last.pt) then - lastTan := NegateVec(ComputeCenterTangent(last)); - end; - - clps := ChordLengthParameterize(first, cnt); - bezier := GenerateBezier(first, last, cnt, clps, firstTan, lastTan); - maxErrorSqrd := ComputeMaxErrorSqrd(first, last, bezier, clps, splitPoint); - if (maxErrorSqrd < tolSqrd) then - begin - AppendSolution(bezier); - Exit; - end; - if (maxErrorSqrd < tolSqrd * 4) then //close enough to try again - begin - for i := 1 to maxRetries do - begin - uPrime := Reparameterize(first, cnt, clps, bezier); - bezier := GenerateBezier(first, last, cnt, uPrime, firstTan, lastTan); - maxErrorSqrd := - ComputeMaxErrorSqrd(first, last, bezier, uPrime, splitPoint); - if (maxErrorSqrd < tolSqrd) then - begin - AppendSolution(bezier); - Exit; - end; - clps := uPrime; - end; - end; - //We need to break the curve because it's too complex for a single Bezier. - //If we're changing direction then make this a 'hard' break (see below). - if TurnsLeft(splitPoint.prev.prev.pt, splitPoint.prev.pt, splitPoint.pt) <> - TurnsLeft(splitPoint.prev.pt, splitPoint.pt, splitPoint.next.pt) then - begin - centerTan := ComputeRightTangent(splitPoint); - FitCubic(first, splitPoint, firstTan, centerTan); - centerTan := ComputeLeftTangent(splitPoint); - FitCubic(splitPoint, last, centerTan, lastTan); - end else - begin - centerTan := ComputeCenterTangent(splitPoint); - FitCubic(first, splitPoint, firstTan, NegateVec(centerTan)); - FitCubic(splitPoint, last, centerTan, lastTan); - end; -end; -//------------------------------------------------------------------------------ - -function HardBreakCheck(ppt: PPt; compareLen: double): Boolean; -var - q: double; -const - longLen = 15; -begin - //A 'break' means starting a new Bezier. A 'hard' break avoids smoothing - //whereas a 'soft' break will still be smoothed. There is as much art as - //science in determining where to smooth and where not to. For example, - //long edges should generally remain straight but how long does an edge - //have to be to be considered a 'long' edge? - if (ppt.prev.len * 4 < ppt.len) or (ppt.len * 4 < ppt.prev.len) then - begin - //We'll hard break whenever there's significant asymmetry between - //segment lengths because GenerateBezier() will perform poorly. - result := true; - end - else if ((ppt.prev.len > longLen) and (ppt.len > longLen)) then - begin - //hard break long segments only when turning by more than ~45 degrees - q := (Sqr(ppt.prev.len) + Sqr(ppt.len) - DistanceSqrd(ppt.prev.pt, ppt.next.pt)) / - (2 * ppt.prev.len * ppt.len); //Cosine Rule. - result := (1 - abs(q)) > 0.3; - end - else if ((TurnsLeft(ppt.prev.prev.pt, ppt.prev.pt, ppt.pt) = - TurnsRight(ppt.prev.pt, ppt.pt, ppt.next.pt)) and - (ppt.prev.len > compareLen) and (ppt.len > compareLen)) then - begin - //we'll also hard break whenever there's a significant inflection point - result := true; - end else - begin - //Finally, we'll also force a 'hard' break when there's a significant bend. - //Again uses the Cosine Rule. - q :=(Sqr(ppt.prev.len) + Sqr(ppt.len) - - DistanceSqrd(ppt.prev.pt, ppt.next.pt)) / (2 * ppt.prev.len * ppt.len); - Result := (q > -0.2); //ie more than 90% - end; -end; -//------------------------------------------------------------------------------ - -function TFitCurveContainer.FitCurve(const path: TPathD; - closed: Boolean; tolerance: double; minSegLength: double): TPathD; -var - i, highI: integer; - d: double; - p, p2, pEnd: PPt; -begin - //tolerance: specifies the maximum allowed variance between the existing - //vertices and the new Bezier curves. More tolerance will produce - //fewer Beziers and simpler paths, but at the cost of less precison. - tolSqrd := Sqr(Max(1, Min(10, tolerance))); //range 1..10 - //minSegLength: Typically when vectorizing raster images, the produced - //vector paths will have many series of axis aligned segments that trace - //pixel boundaries. These paths will also contain many 1 unit segments at - //right angles to adjacent segments. Importantly, these very short segments - //will cause artifacts in the solution unless they are trimmed. - highI := High(path); - if closed then - while (highI > 0) and (Distance(path[highI], path[0]) < minSegLength) do - dec(highI); - p := AddPt(path[0]); - for i := 1 to highI do - begin - d := Distance(p.pt, path[i]); - //skip line segments with lengths less than 'minSegLength' - if d < minSegLength then Continue; - p := AddPt(path[i]); - p.prev.len := d; - p.prev.vec := SubVecs(p.pt, p.prev.pt); - end; - p.len := Distance(ppts.pt, p.pt); - p.vec := SubVecs(p.next.pt, p.pt); - p := ppts; - if (p.next = p) or (closed and (p.next = p.prev)) then - begin - Clear; - result := nil; - Exit; - end; - //for closed paths, find a good starting point - if closed then - begin - repeat - if HardBreakCheck(p, tolerance) then break; - p := p.next; - until p = ppts; - pEnd := p; - end else - pEnd := ppts.prev; - p2 := p.next; - repeat - if HardBreakCheck(p2, tolerance) then - begin - FitCubic(p, p2, ComputeLeftTangent(p), ComputeRightTangent(p2)); - p := p2; - end; - p2 := p2.next; - until (p2 = pEnd); - FitCubic(p, p2, ComputeLeftTangent(p), ComputeRightTangent(p2)); - Result := solution; - Clear; -end; -//------------------------------------------------------------------------------ - -procedure TFitCurveContainer.AppendSolution(const bezier: TPathD); -var - i, len: integer; -begin - len := Length(solution); - if len > 0 then - begin - SetLength(solution, len + 3); - for i := 0 to 2 do - solution[len +i] := bezier[i +1]; - end else - solution := bezier; -end; -//------------------------------------------------------------------------------ - -function CurveFit(const path: TPathD; closed: Boolean; - tolerance: double; minSegLength: double): TPathD; -var - paths, solution: TPathsD; -begin - SetLength(paths, 1); - paths[0] := path; - solution := CurveFit(paths, closed, tolerance, minSegLength); - if solution <> nil then - Result := solution[0]; -end; -//------------------------------------------------------------------------------ - -function CurveFit(const paths: TPathsD; closed: Boolean; - tolerance: double; minSegLength: double): TPathsD; -var - i,j, len: integer; -begin - j := 0; - len := Length(paths); - SetLength(Result, len); - with TFitCurveContainer.Create do - try - for i := 0 to len -1 do - if (paths[i] <> nil) and (Abs(Area(paths[i])) > Sqr(tolerance)) then - begin - Result[j] := FitCurve(paths[i], closed, tolerance, minSegLength); - inc(j); - end; - finally - Free; - end; - SetLength(Result, j); -end; -//------------------------------------------------------------------------------ - - end. diff --git a/Ext/SVGIconImageList/Image32/source/Img32.FMX.pas b/Ext/SVGIconImageList/Image32/source/Img32.FMX.pas index d6cbfad..a2cf921 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.FMX.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.FMX.pas @@ -218,6 +218,7 @@ procedure AssignImage32ToFmxBitmap(img: TImage32; bmp: TBitmap); //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ + procedure CheckScreenScale; var ScreenService: IFMXScreenService; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.BMP.pas b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.BMP.pas index d81f295..80c1a3e 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.BMP.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.BMP.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 12 March 2023 * +* Date : 8 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : BMP file format extension for TImage32 * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -32,10 +32,12 @@ TImageFormat_BMP = class(TImageFormat) class function IsValidImageStream(stream: TStream): Boolean; override; function LoadFromStream(stream: TStream; img32: TImage32; imgIndex: integer = 0): Boolean; override; + // SaveToFile: compressionQuality parameter is ignored here function SaveToFile(const filename: string; - img32: TImage32; quality: integer = 0): Boolean; override; + img32: TImage32; compressionQuality: integer = 0): Boolean; override; + // SaveToStream: the compressionQuality parameter is ignored here procedure SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); override; + img32: TImage32; compressionQuality: integer = 0); override; {$IFDEF MSWINDOWS} class function CanCopyToClipboard: Boolean; override; class function CopyToClipboard(img32: TImage32): Boolean; override; @@ -485,7 +487,8 @@ function TImageFormat_BMP.LoadFromStream(stream: TStream; isTopDown := bih.biHeight < 0; bih.biHeight := abs(bih.biHeight); - if ((bih.biCompression and BI_BITFIELDS) = BI_BITFIELDS) then + if //(bih.biBitCount < 32) and + ((bih.biCompression and BI_BITFIELDS) = BI_BITFIELDS) then begin stream.Position := bihStart + 40; stream.Read(bitfields[0], Sizeof(TTriColor32)); @@ -536,13 +539,11 @@ function TImageFormat_BMP.LoadFromStream(stream: TStream; if hasValidBitFields then tmp := StreamReadImageWithBitfields( stream, img32.Width, img32.Height, bih.biBitCount, bitfields) - else if (bih.biBitCount = 32) then begin Read(img32.Pixels[0], bih.biWidth * bih.biHeight * sizeof(TColor32)); if AlphaChannelAllZero(img32) then ResetAlphaChannel(img32); end - else if (bih.biCompression = BI_RLE8) or (bih.biCompression = BI_RLE4) then tmp := ReadRLE4orRLE8Compression( stream, img32.Width, img32.Height, bih.biBitCount, pal) @@ -728,6 +729,7 @@ procedure StreamWrite24BitImage(img32: TImage32; stream: TStream); pc: PColor32; pb: PByte; begin + //rowSize = img32.Width *3 then rounded up to a multiple of 4 rowSize := GetRowSize(24, img32.Width); delta := rowSize - (img32.Width *3); totalBytes := rowSize * img32.Height; @@ -749,7 +751,7 @@ procedure StreamWrite24BitImage(img32: TImage32; stream: TStream); //------------------------------------------------------------------------------ procedure TImageFormat_BMP.SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); + img32: TImage32; compressionQuality: integer = 0); var bfh: TBitmapFileHeader; bih: TBitmapV4Header; @@ -757,7 +759,6 @@ procedure TImageFormat_BMP.SaveToStream(stream: TStream; UsesAlpha: Boolean; pals: TArrayOfColor32; tmp: TImage32; - writeValue: TTriColor32; begin //write everything except a BMP file header because some streams //(eg resource streams) don't need a file header @@ -824,10 +825,9 @@ procedure TImageFormat_BMP.SaveToStream(stream: TStream; end; 24: begin - bih.bV4V4Compression := BI_BITFIELDS; stream.Write(bih, bih.bV4Size); - writeValue := MakeBitfields; - stream.Write(writeValue, SizeOf(TTriColor32)); + // nb: BI_BITFIELDS only used in 16bpp and 32bpp formats + // See BITMAPINFOHEADER structure StreamWrite24BitImage(tmp, stream); end else @@ -852,7 +852,7 @@ procedure TImageFormat_BMP.SaveToStream(stream: TStream; //------------------------------------------------------------------------------ function TImageFormat_BMP.SaveToFile(const filename: string; - img32: TImage32; quality: integer = 0): Boolean; + img32: TImage32; compressionQuality: integer = 0): Boolean; var SaveStateIncludeFileHeader: Boolean; stream: TFilestream; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.JPG.pas b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.JPG.pas index da5f69d..4d9a97f 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.JPG.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.JPG.pas @@ -24,8 +24,9 @@ TImageFormat_JPG = class(TImageFormat) class function IsValidImageStream(stream: TStream): Boolean; override; function LoadFromStream(stream: TStream; img32: TImage32; imgIndex: integer = 0): Boolean; override; + //SaveToStream: compressionQuality (range: 0-100%) procedure SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); override; + img32: TImage32; compressionQlty: integer = -1); override; class function CopyToClipboard(img32: TImage32): Boolean; override; class function CanPasteFromClipboard: Boolean; override; class function PasteFromClipboard(img32: TImage32): Boolean; override; @@ -90,15 +91,15 @@ function TImageFormat_JPG.LoadFromStream(stream: TStream; //------------------------------------------------------------------------------ procedure TImageFormat_JPG.SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); + img32: TImage32; compressionQlty: integer); var Jpeg: TJpegImage; begin Jpeg := TJpegImage.Create; with TJpegImageHack(jpeg) do try - if (quality > 0) and (quality <= 100) then - CompressionQuality := quality; + if (compressionQlty >= 0) then + jpeg.CompressionQuality := Min(100, compressionQlty); NewImage; NewBitmap; Bitmap.Width := img32.Width; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.PNG.pas b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.PNG.pas index 2ad0c5e..6f1bfb8 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.PNG.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.PNG.pas @@ -14,10 +14,10 @@ interface {$I Img32.inc} -{$IFDEF DELPHI_PNG} +{$IF DEFINED(USING_VCL) AND DEFINED(DELPHI_PNG)} uses - SysUtils, Classes, Windows, - {$IFDEF FPC} Graphics {$ELSE} Math, PngImage {$ENDIF}, Img32; + SysUtils, Classes, + {$IFDEF FPC} Graphics {$ELSE} Windows, Math, PngImage {$ENDIF}, Img32; type TImageFormat_PNG = class(TImageFormat) @@ -25,8 +25,9 @@ TImageFormat_PNG = class(TImageFormat) class function IsValidImageStream(stream: TStream): Boolean; override; function LoadFromStream(stream: TStream; img32: TImage32; imgIndex: integer = 0): Boolean; override; + // SaveToStream: the compressionQuality parameter is ignored here procedure SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); override; + img32: TImage32; compressionQuality: integer = 0); override; class function CanCopyToClipboard: Boolean; override; class function CopyToClipboard(img32: TImage32): Boolean; override; class function CanPasteFromClipboard: Boolean; override; @@ -36,11 +37,11 @@ TImageFormat_PNG = class(TImageFormat) var CF_PNG: Cardinal = 0; //Windows Clipboard CF_IMAGEPNG: Cardinal = 0; -{$ENDIF} //DELPHI_PNG - undefined in old versions +{$IFEND} //DELPHI_PNG - undefined in old versions implementation -{$IFDEF DELPHI_PNG} +{$IF DEFINED(USING_VCL) AND DEFINED(DELPHI_PNG)} resourcestring s_cf_png_error = 'TImage32 - PNG clipboard format error'; s_cf_imagepng_error = 'TImage32 - image/png clipboard format error'; @@ -86,7 +87,7 @@ function TImageFormat_PNG.LoadFromStream(stream: TStream; //------------------------------------------------------------------------------ procedure TImageFormat_PNG.SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); + img32: TImage32; compressionQuality: integer = 0); var png: TPortableNetworkGraphic; begin @@ -186,7 +187,7 @@ function TImageFormat_PNG.LoadFromStream(stream: TStream; //------------------------------------------------------------------------------ procedure TImageFormat_PNG.SaveToStream(stream: TStream; - img32: TImage32; quality: integer = 0); + img32: TImage32; compressionQuality: integer = 0); var i,j: integer; png: TPngImage; @@ -328,6 +329,6 @@ initialization TImage32.RegisterImageFormatClass('PNG', TImageFormat_PNG, cpHigh); CF_PNG := RegisterClipboardFormat('PNG'); CF_IMAGEPNG := RegisterClipboardFormat('image/png'); -{$ENDIF} +{$IFEND} end. diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.QOI.pas b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.QOI.pas index 81c9b72..3f5363c 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.QOI.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.QOI.pas @@ -2,7 +2,7 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 30 January 2023 * +* Date : 12 March 2023 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2019-2023 * * Purpose : QOI file format extension for TImage32 * @@ -43,7 +43,9 @@ TImageFormat_QOI = class(TImageFormat) class function IsValidImageStream(stream: TStream): Boolean; override; function LoadFromStream(stream: TStream; img32: TImage32; imgIndex: integer = 0): Boolean; override; - procedure SaveToStream(stream: TStream; img32: TImage32); override; + // SaveToStream: the compressionQuality parameter is ignored here + procedure SaveToStream(stream: TStream; + img32: TImage32; compressionQuality: integer = 0); override; class function CanCopyToClipboard: Boolean; override; class function CopyToClipboard(img32: TImage32): Boolean; override; class function CanPasteFromClipboard: Boolean; override; @@ -245,7 +247,8 @@ procedure qoi_write_8(var p: PByte; val: Byte); end; //------------------------------------------------------------------------------ -procedure TImageFormat_QOI.SaveToStream(stream: TStream; img32: TImage32); +procedure TImageFormat_QOI.SaveToStream(stream: TStream; + img32: TImage32; compressionQuality: integer); var i, max_size, run: integer; vr, vg, vb, vg_r, vg_b: integer; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.SVG.pas b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.SVG.pas index a810b72..2166d71 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Fmt.SVG.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Fmt.SVG.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 12 March 2023 * +* Date : 11 March 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : SVG file format extension for TImage32 * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -15,9 +15,14 @@ interface {$I Img32.inc} uses - {$IFDEF MSWINDOWS} Windows, {$ENDIF} SysUtils, Classes, Math, + {$IFDEF MSWINDOWS} Windows, {$ENDIF} + {$IF NOT DEFINED(NEWPOSFUNC) OR DEFINED(FPC)} StrUtils, {$IFEND} + {$IFDEF UNICODE} AnsiStrings, {$ENDIF} + SysUtils, Classes, Math, {$IFDEF XPLAT_GENERICS} Generics.Collections, Generics.Defaults, {$ENDIF} - Img32, Img32.Vector, Img32.SVG.Reader; + Img32, Img32.Vector, Img32.SVG.Core, Img32.SVG.Reader + {$IF DEFINED(USING_LCL)}, Types{$IFEND} + ; type TImageFormat_SVG = class(TImageFormat) @@ -25,6 +30,7 @@ TImageFormat_SVG = class(TImageFormat) class function IsValidImageStream(stream: TStream): Boolean; override; function LoadFromStream(stream: TStream; img32: TImage32; imgIndex: integer = 0): Boolean; override; + // SaveToStream: not implemented for SVG streams procedure SaveToStream(stream: TStream; img32: TImage32; quality: integer = 0); override; class function CanCopyToClipboard: Boolean; override; @@ -85,71 +91,8 @@ TSvgImageList32 = class(TInterfacedObj, INotifySender) {$ENDIF} end; -function GetImageSize(const filename: string): TSize; - -var - defaultSvgWidth: integer = 800; - defaultSvgHeight: integer = 600; - implementation -function GetImageSize(const filename: string): TSize; -var - i,j, l,t,r,b: integer; - s: string; - - function GetVal(var i: integer): integer; - begin - Result := 0; - while (s[i] >= '0') and (s[i] <= '9') do - begin - Result := Result * 10 + Ord(s[i]) - Ord('0'); - inc(i); - end; - end; - -begin - // this is quick and dirty code that - // needs to be made much more reliable - FillChar(Result.cx, SizeOf(TSize), 0); - if not FileExists(filename) then Exit; - with TStringList.Create do - try - LoadFromFile(filename); - s := text; - finally - free; - end; - i := Pos('', s, i); //watch out for inside '>' - if j < i then Exit; - s := Lowercase(Copy(s, i + 5, j - i -5)); - i := Pos('width="', s); //watch out for space before = - j := Pos('height="', s); - if (i > 0) and (j > 0) then - begin - inc(i,7); - Result.cx := GetVal(i); - inc(j,8); - Result.cy := GetVal(j); - end else - begin - i := Pos('viewbox="', s); - if i < 1 then Exit; - inc(i, 9); - l := GetVal(i); - while (s[i] <= #32) do inc(i); - t := GetVal(i); - while (s[i] <= #32) do inc(i); - r := GetVal(i); - while (s[i] <= #32) do inc(i); - b := GetVal(i); - Result.cx := r - l; - Result.cy := b - t; - end; -end; - //------------------------------------------------------------------------------ // Three routines used to enumerate a resource type //------------------------------------------------------------------------------ @@ -427,32 +370,23 @@ function TImageFormat_SVG.LoadFromStream(stream: TStream; img32: TImage32; imgIndex: integer = 0): Boolean; var r: TRectWH; - w,h, sx,sy: double; + sx: double; begin with TSvgReader.Create do try Result := LoadFromStream(stream); if not Result then Exit; - r := GetViewbox(img32.Width, img32.Height); + r := RootElement.GetViewbox; img32.BeginUpdate; try if img32.IsEmpty and not r.IsEmpty then img32.SetSize(Round(r.Width), Round(r.Height)) else if not r.IsEmpty then begin - //then scale the SVG to fit image - w := r.Width; - h := r.Height; - sx := img32.Width / w; - sy := img32.Height / h; - if sy < sx then sx := sy; - if not(SameValue(sx, 1, 0.00001)) then - begin - w := w * sx; - h := h * sx; - end; - img32.SetSize(Round(w), Round(h)); + // scale the SVG to best fit the image dimensions + sx := GetScaleForBestFit(r.Width, r.Height, img32.Width, img32.Height); + img32.SetSize(Round(r.Width * sx), Round(r.Height * sx)); end else img32.SetSize(defaultSvgWidth, defaultSvgHeight); diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Layers.pas b/Ext/SVGIconImageList/Image32/source/Img32.Layers.pas index c28acee..c91b417 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Layers.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Layers.pas @@ -2,16 +2,12 @@ (******************************************************************************* * Author : Angus Johnson * -* Version : 4.3 * -* Date : 3 September 2023 * +* Version : 4.4 * +* Date : 16 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * -* * +* Copyright : Angus Johnson 2019-2024 * * Purpose : Layered images support * -* * -* License : Use, modification & distribution is subject to * -* Boost Software License Ver 1 * -* http://www.boost.org/LICENSE_1_0.txt * +* License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) interface @@ -254,26 +250,22 @@ TVectorLayer32 = class(TRotLayer32) property OnDraw: TNotifyEvent read fOnDraw write fOnDraw; end; - TRasterLayer32 = class(TRotLayer32) //display laer for raster images + TRasterLayer32 = class(TRotLayer32) //display layer for raster images private fMasterImg : TImage32; //fMatrix: allows combining any number of scaling & rotating ops. fMatrix : TMatrixD; fRotating : Boolean; - fSavedMidPt : TPointD; fPreScaleSize : TSize; fAutoHitTest : Boolean; procedure DoAutoHitTest; - function GetMatrix: TMatrixD; protected procedure ImageChanged(Sender: TImage32); override; - procedure SetPivotPt(const pivot: TPointD); override; procedure UpdateHitTestMaskTranspar(compareFunc: TCompareFunction; referenceColor: TColor32; tolerance: integer); public constructor Create(parent: TLayer32 = nil; const name: string = ''); override; destructor Destroy; override; - procedure Offset(dx,dy: double); override; procedure UpdateHitTestMaskOpaque; virtual; procedure UpdateHitTestMaskTransparent(alphaValue: Byte = 127); overload; virtual; procedure SetInnerBounds(const newBounds: TRectD); override; @@ -281,7 +273,6 @@ TRasterLayer32 = class(TRotLayer32) //display laer for raster images property AutoSetHitTestMask: Boolean read fAutoHitTest write fAutoHitTest; property MasterImage: TImage32 read fMasterImg; - property Matrix: TMatrixD read GetMatrix; end; TButtonDesignerLayer32 = class; @@ -466,11 +457,9 @@ function UpdateRotatingButtonGroup(rotateButton: TLayer32): double; implementation - {$IFNDEF MSWINDOWS} - {$IFNDEF FPC} + {$IFDEF USING_FMX} uses Img32.FMX; {$ENDIF} - {$ENDIF} resourcestring rsRoot = 'root'; @@ -726,17 +715,10 @@ function TLayer32.GetPrevLayerInGroup: TLayer32; //------------------------------------------------------------------------------ procedure TLayer32.ImageChanged(Sender: TImage32); -var - w,h: integer; begin if (StorageState = ssLoading) then Exit; - w := Ceil(fLeft + fWidth + fOuterMargin *2); - h := Ceil(fTop + fHeight + fOuterMargin *2); - if (Image.Width <> w) or (Image.Height <> h) then - begin - fWidth := Image.Width -fOuterMargin *2; - fHeight := Image.Height -fOuterMargin *2; - end; + fWidth := Image.Width -fOuterMargin *2; + fHeight := Image.Height -fOuterMargin *2; Invalidate; end; //------------------------------------------------------------------------------ @@ -747,8 +729,8 @@ procedure TLayer32.SetSize(width, height: double); begin if StorageState = ssDestroying then Exit; fWidth := width; fHeight := height; - w := Ceil(fLeft + fWidth + fOuterMargin *2); - h := Ceil(fTop + fHeight + fOuterMargin *2); + w := Ceil(fWidth + fOuterMargin *2); + h := Ceil(fHeight + fOuterMargin *2); Image.SetSize(w, h); end; //------------------------------------------------------------------------------ @@ -821,8 +803,7 @@ procedure TLayer32.PositionCenteredAt(const pt: TPointD); procedure TLayer32.Offset(dx, dy: double); begin - if (dx <> 0) or (dy <> 0) then - PositionAt(fLeft + dx, fTop + dy); + PositionAt(fLeft + dx, fTop + dy); end; //------------------------------------------------------------------------------ @@ -976,7 +957,7 @@ function TLayer32.MakeAbsolute(const pt: TPointD): TPointD; while assigned(layer) do begin if not (layer is TGroupLayer32) then - Result := OffsetPoint(Result, layer.Left, layer.Top); + Result := TranslatePoint(Result, layer.Left, layer.Top); layer := layer.Parent; end; end; @@ -1128,7 +1109,7 @@ procedure TLayer32.SetClipPath(const path: TPathsD); if Assigned(fClipImage) then fClipImage.SetSize(Image.Width, Image.Height) else fClipImage := TImage32.Create(Image.Width, Image.Height); - pp := OffsetPath(path, fOuterMargin, fOuterMargin); + pp := TranslatePath(path, fOuterMargin, fOuterMargin); DrawPolygon(fClipImage, pp, frEvenOdd, clWhite32); end else FreeAndNil(fClipImage); @@ -1194,7 +1175,7 @@ procedure TLayer32.Merge(hideDesigners: Boolean; updateRect: TRect); //that fMergeImage will then merge with its parent fMergeImage until root. if not (self is TGroupLayer32) then - Types.OffsetRect(updateRect, -Floor(fLeft), -Floor(fTop)); + TranslateRect(updateRect, -Floor(fLeft), -Floor(fTop)); if (self is TGroupLayer32) or (ChildCount = 0) then begin @@ -1236,11 +1217,11 @@ procedure TLayer32.Merge(hideDesigners: Boolean; updateRect: TRect); //childs of group layers are positioned //independently of the group layer's positioning if (self is TGroupLayer32) then - Types.OffsetRect(dstRect, Floor(-self.Left), Floor(-self.Top)); + TranslateRect(dstRect, Floor(-self.Left), Floor(-self.Top)); Types.IntersectRect(dstRect, dstRect, self.Image.Bounds); end; - if dstRect.IsEmpty then Continue; + if IsEmptyRect(dstRect) then Continue; //get srcRect (offset to childLayer coords) //and further adjust dstRect to accommodate OuterMargin @@ -1251,9 +1232,9 @@ procedure TLayer32.Merge(hideDesigners: Boolean; updateRect: TRect); end; if (self is TGroupLayer32) then - Types.OffsetRect(srcRect, Floor(fLeft), Floor(fTop)) + TranslateRect(srcRect, Floor(fLeft), Floor(fTop)) else //nb: offsetting **dstRect** below - Types.OffsetRect(dstRect, + TranslateRect(dstRect, Round(fOuterMargin), Round(fOuterMargin)); //DRAW THE CHILD ONTO THE PARENT'S IMAGE @@ -1270,7 +1251,7 @@ procedure TLayer32.Merge(hideDesigners: Boolean; updateRect: TRect); //use the clipping mask to 'trim' childLayer's image rec := fClipImage.Bounds; rec2 := rec; - Types.OffsetRect(rec2, + TranslateRect(rec2, Floor(childLayer.fOuterMargin -childLayer.Left -fOuterMargin), Floor(childLayer.fOuterMargin -childLayer.Top -fOuterMargin)); childImg2.CopyBlend(fClipImage, rec, rec2, BlendMask); @@ -1307,7 +1288,7 @@ function TLayer32.GetLayerAt(const pt: TPointD; ignoreDesigners: Boolean): TLaye if (self is TGroupLayer32) then pt2 := pt else - pt2 := OffsetPoint(pt, -Left, -Top); + pt2 := TranslatePoint(pt, -Left, -Top); //if 'pt2' is outside the clip mask then don't continue if Assigned(fClipImage) then @@ -1660,9 +1641,9 @@ procedure TVectorLayer32.SetInnerBounds(const newBounds: TRectD); procedure TVectorLayer32.Offset(dx,dy: double); begin inherited; - fPaths := OffsetPath(fPaths, dx,dy); + fPaths := TranslatePath(fPaths, dx,dy); if fAutoPivot and not PointsEqual(fPivotPt, InvalidPointD) then - fPivotPt := OffsetPoint(fPivotPt, dx,dy); + fPivotPt := TranslatePoint(fPivotPt, dx,dy); end; //------------------------------------------------------------------------------ @@ -1804,20 +1785,6 @@ procedure TRasterLayer32.ImageChanged(Sender: TImage32); end; //------------------------------------------------------------------------------ -procedure TRasterLayer32.Offset(dx,dy: double); -begin - inherited; - fSavedMidPt := OffsetPoint(fSavedMidPt, dx,dy); -end; -//------------------------------------------------------------------------------ - -procedure TRasterLayer32.SetPivotPt(const pivot: TPointD); -begin - inherited; - fSavedMidPt := MidPoint; -end; -//------------------------------------------------------------------------------ - procedure TRasterLayer32.SetInnerBounds(const newBounds: TRectD); var newWidth, newHeight: double; @@ -1826,28 +1793,30 @@ procedure TRasterLayer32.SetInnerBounds(const newBounds: TRectD); if fRotating and Assigned(Image) then begin + //rotation has just ended fRotating := false; - //rotation has just ended so add the rotation angle to fMatrix + //update fMatrix with the new rotation angle if (fAngle <> 0) then MatrixRotate(fMatrix, Image.MidPoint, fAngle); - fAngle := 0; + //and since we're about to start scaling, we need //to store the starting size, and reset the angle fPreScaleSize := Size(Image.Width, Image.Height); + fAngle := 0; end; newWidth := newBounds.Width; newHeight := newBounds.Height; //make sure the image is large enough to scale safely - if (MasterImage.Width > 1) and (MasterImage.Height > 1) and - (newWidth > 1) and (newHeight > 1) then + if not MasterImage.IsEmpty and (newWidth > 1) and (newHeight > 1) then begin Image.BeginUpdate; try Image.Assign(MasterImage); //apply any prior transformations - AffineTransformImage(Image, fMatrix); + Image.Resampler := rWeightedBilinear; + AffineTransformImage(Image, fMatrix, true); // assumes no skew //cropping is very important with rotation SymmetricCropTransparent(Image); w := Ceil(newBounds.Right) - Floor(newBounds.Left); @@ -1863,31 +1832,20 @@ procedure TRasterLayer32.SetInnerBounds(const newBounds: TRectD); end; //------------------------------------------------------------------------------ -function TRasterLayer32.GetMatrix: TMatrixD; -begin - Result := fMatrix; - //update for transformations not yet unapplied to fMatrix - if fRotating then - begin - if fAngle <> 0 then - MatrixRotate(Result, MidPoint, fAngle); - end else - begin - MatrixScale(Result, Image.Width/fPreScaleSize.cx, - Image.Height/fPreScaleSize.cy); - end; -end; -//------------------------------------------------------------------------------ - function TRasterLayer32.Rotate(angleDelta: double): Boolean; var mat: TMatrixD; + pt, mp: TPointD; begin - Result := not MasterImage.IsEmpty and + Result := (angleDelta <> 0) and + not MasterImage.IsEmpty and inherited Rotate(angleDelta); + if not Result then Exit; - //if not already rotating, then update scaling in fMatrix + mp := MidPoint; + + //if not already rotating, then update fMatrix with prior scaling if not fRotating then begin Assert((fPreScaleSize.cx > 0) and (fPreScaleSize.cy > 0), 'oops!'); @@ -1896,25 +1854,26 @@ function TRasterLayer32.Rotate(angleDelta: double): Boolean; Image.Height/fPreScaleSize.cy); fRotating := true; - fSavedMidPt := MidPoint; - if fAutoPivot then fPivotPt := fSavedMidPt; + if fAutoPivot then fPivotPt := mp; end; - if not fAutoPivot then - RotatePoint(fSavedMidPt, PivotPt, angleDelta); + RotatePoint(mp, PivotPt, angleDelta); - Image.BeginUpdate; + Image.BlockNotify; try Image.Assign(MasterImage); mat := fMatrix; - MatrixRotate(mat, NullPointD, Angle); - AffineTransformImage(Image, mat); - SymmetricCropTransparent(Image); + pt := PointD(PivotPt.X - fLeft, PivotPt.Y - fTop); + MatrixRotate(mat, pt, Angle); + Image.Resampler := rWeightedBilinear; + AffineTransformImage(Image, mat, true); // assumes no skew finally - Image.EndUpdate; + Image.UnblockNotify; end; - PositionCenteredAt(fSavedMidPt); + fWidth := Image.Width; + fHeight := Image.Height; + PositionCenteredAt(mp); DoAutoHitTest; end; @@ -1958,7 +1917,7 @@ procedure TRotatingGroupLayer32.Init(const rec: TRect; begin SetInnerBounds(rec2); q := DPIAware(2); - pt := OffsetPoint(pivot, -Left, -Top); + pt := TranslatePoint(pivot, -Left, -Top); DrawDashedLine(Image, Circle(pt, dist - q), dashes, nil, q, clRed32, esPolygon); end; @@ -2663,7 +2622,7 @@ function UpdateRotatingButtonGroup(rotateButton: TLayer32): double; rec := RectD(mp.X -radius, mp.Y -radius, mp.X +radius,mp.Y +radius); designer := DesignLayer; designer.SetInnerBounds(rec); - pt2 := OffsetPoint(mp, -rec.Left, -rec.Top); + pt2 := TranslatePoint(mp, -rec.Left, -rec.Top); DrawDashedLine(designer.Image, Circle(pt2, radius -dpiAwareOne), dashes, nil, DPIAware(2), clRed32, esPolygon); diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Panels.pas b/Ext/SVGIconImageList/Image32/source/Img32.Panels.pas index 5922968..8083609 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Panels.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Panels.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 26 March 2023 * +* Date : 24 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2021 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : Component that displays images on a TPanel descendant * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -207,7 +207,7 @@ procedure Register; implementation uses - Img32.Extra; + Img32.Extra, Img32.Vector; procedure Register; begin @@ -325,13 +325,6 @@ function GetThemeColor(const className: widestring; end; //------------------------------------------------------------------------------ -function OffsetPoint(const pt: TPoint; dx, dy: integer): TPoint; -begin - Result.X := pt.X + dx; - Result.Y := pt.Y + dy; -end; -//------------------------------------------------------------------------------ - function LeftMouseBtnDown: Boolean; begin Result := (GetKeyState(VK_LBUTTON) shr 8 > 0); @@ -422,7 +415,7 @@ procedure TBaseImgPanel.WMSize(var Message: TWMSize); function TBaseImgPanel.GetDstOffset: TPoint; begin if not fAutoCenter then - Result := Point(0,0) + Result := Types.Point(0,0) else with GetInnerClientRect do begin @@ -491,7 +484,7 @@ procedure TBaseImgPanel.ScaleToFit; h,w: integer; begin if IsEmpty then Exit; - fScale := 1; + //fScale := 1; fScrollbarHorz.srcOffset := 0; fScrollbarVert.srcOffset := 0; rec := GetInnerClientRect; @@ -521,7 +514,7 @@ procedure TBaseImgPanel.ScaleAtPoint(scaleDelta: double; const pt: TPoint); q := 1 - 1/scaleDelta; marg := GetInnerMargin; pt1 := ClientToImage(pt); - pt2 := ClientToImage(Point(marg, marg)); + pt2 := ClientToImage(Types.Point(marg, marg)); SetScale(fScale * scaleDelta); with fScrollbarHorz do inc(srcOffset, Round((pt1.X - pt2.X) * q)); @@ -726,7 +719,7 @@ function TBaseImgPanel.RecenterImageAt(const imagePt: TPoint): Boolean; innerW := ClientWidth - marg*2; innerH := ClientHeight - marg*2; pt1 := imagePt; - pt2 := ClientToImage(Point(marg + innerW div 2, marg + innerH div 2)); + pt2 := ClientToImage(Types.Point(marg + innerW div 2, marg + innerH div 2)); with fScrollbarHorz do begin q := (pt1.X - pt2.X); @@ -781,7 +774,7 @@ procedure TBaseImgPanel.MouseMove(Shift: TShiftState; X, Y: Integer); inDrawRegion: Boolean; begin rec := GetInnerClientRect; - inDrawRegion := PtInRect(rec, Point(X,Y)); + inDrawRegion := PtInRect(rec, Types.Point(X,Y)); if inDrawRegion and not (fScrollbarHorz.MouseDown or fScrollbarVert.MouseDown) then begin @@ -916,7 +909,7 @@ procedure TBaseImgPanel.Paint; var tImage : TImage32; begin - tImage := TImage32.Create(rec.Width, rec.Height); + tImage := TImage32.Create(RectWidth(rec), RectHeight(rec)); try HatchBackground(timage, fBkgChBrdColor1, fBkgChBrdColor2, DpiAware(fBkgChBrdSize)); @@ -934,8 +927,8 @@ procedure TBaseImgPanel.Paint; Canvas.Pen.Width := 1; while width > 0 do begin - tr := Point(rec.Right, rec.Top); - bl := Point(rec.Left, rec.Bottom); + tr := Types.Point(rec.Right, rec.Top); + bl := Types.Point(rec.Left, rec.Bottom); Canvas.Pen.Color := tlColor; Canvas.PolyLine([bl, rec.TopLeft, tr]); Canvas.Pen.Color := brColor; @@ -969,7 +962,7 @@ procedure TBaseImgPanel.Paint; dpiAwareBW := DpiAware(BorderWidth); dstRec := innerRec; srcRec := dstRec; - OffsetRect(srcRec, -marg, -marg); + TranslateRect(srcRec, -marg, -marg); ScaleRect(srcRec, 1/fScale); //if the scaled drawing is smaller than InnerClientRect then center it pt := GetDstOffset; @@ -996,7 +989,7 @@ procedure TBaseImgPanel.Paint; fScrollbarVert.srcOffset := Round(fScrollbarVert.maxSrcOffset); if fScrollbarHorz.srcOffset > fScrollbarHorz.maxSrcOffset then fScrollbarHorz.srcOffset := Round(fScrollbarHorz.maxSrcOffset); - OffsetRect(srcRec, fScrollbarHorz.srcOffset, fScrollbarVert.srcOffset); + TranslateRect(srcRec, fScrollbarHorz.srcOffset, fScrollbarVert.srcOffset); //paint innerRec background backgroundPainted := ParentBackground and {$IFDEF STYLESERVICES} @@ -1202,7 +1195,7 @@ procedure TBaseImgPanel.WMKeyDown(var Message: TWMKey); begin if not fAllowZoom then Exit; //zoom in and out with CTRL+UP and CTRL+DOWN respectively - midPoint := Point(ClientWidth div 2, ClientHeight div 2); + midPoint := Types.Point(ClientWidth div 2, ClientHeight div 2); case Message.CharCode of VK_UP: ScaleAtPoint(1.1, midPoint); VK_DOWN: ScaleAtPoint(0.9, midPoint); diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Resamplers.pas b/Ext/SVGIconImageList/Image32/source/Img32.Resamplers.pas index ab66f01..d708832 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Resamplers.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Resamplers.pas @@ -2,10 +2,10 @@ (******************************************************************************* * Author : Angus Johnson * -* Version : 4.3 * -* Date : 27 September 2022 * +* Version : 4.4 * +* Date : 2 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2021 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : For image transformations (scaling, rotating etc.) * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -15,111 +15,253 @@ interface {$I Img32.inc} uses - SysUtils, Classes, Img32; - -//BoxDownSampling: As the name implies, this routine is only intended for -//image down-sampling (ie when shrinking images) where it generally performs -//better than other resamplers which tend to lose too much detail. However, -//because this routine is inferior to other resamplers when performing other -//transformations (ie when enlarging, rotating, and skewing images), it's not -//intended as a general purpose resampler. -procedure BoxDownSampling(Image: TImage32; newWidth, newHeight: Integer); - -(* The following functions are registered in the initialization section below -function NearestResampler(img: TImage32; x256, y256: Integer): TColor32; -function BilinearResample(img: TImage32; x256, y256: Integer): TColor32; -function BicubicResample(img: TImage32; x256, y256: Integer): TColor32; -*) + SysUtils, Classes, Math, Img32; + +// BoxDownSampling: As the name implies, is only intended for image +// down-sampling (ie shrinking images) where it performs a little better +// than other resamplers which tend toward pixelation. Nevertheless, this +// routine is inferior to other resamplers when performing other +// types of transformations (ie when enlarging, rotating, and skewing images), +// so BoxDownSampling should not be used as a general purpose resampler. +procedure BoxDownSampling(Image: TImage32; scale: double); overload; +procedure BoxDownSampling(Image: TImage32; scaleX, scaleY: double); overload; +procedure BoxDownSampling(Image: TImage32; newWidth, newHeight: Integer); overload; + +// The following general purpose resamplers are registered below: +// function NearestResampler(img: TImage32; x, y: double): TColor32; +// function BilinearResample(img: TImage32; x, y: double): TColor32; +// function BicubicResample (img: TImage32; x, y: double): TColor32; +// function WeightedBilinear(img: TImage32; x, y: double): TColor32; implementation uses Img32.Transform; +var + sinWeighted: array [0..255] of Cardinal; + //------------------------------------------------------------------------------ // NearestNeighbor resampler //------------------------------------------------------------------------------ -function NearestResampler(img: TImage32; x256, y256: Integer): TColor32; +function NearestResampler(img: TImage32; x, y: double): TColor32; +var + xi, yi: integer; begin - if (x256 < -$7f) then + xi := Round(x); yi := Round(y); + if (xi < 0) or (yi < 0) or (xi >= img.Width) or (yi >= img.Height) then + Result := clNone32 else + Result := img.Pixels[xi + yi * img.Width]; +end; + +//------------------------------------------------------------------------------ +// BiLinear resampler +//------------------------------------------------------------------------------ + +function BilinearResample(img: TImage32; x, y: double): TColor32; +var + iw, ih: integer; + xx, yy, xR, yB: integer; + weight: Cardinal; + pixels: TArrayOfColor32; + weightedColor: TWeightedColor; + xf, yf: double; +begin + iw := img.Width; + ih := img.Height; + pixels := img.Pixels; + + if (x < 0) then begin - Result := clNone32; - Exit; + if (x < -0.5) then + begin + xf := -x; + end else + begin + x := 0; + xf := 0; + end; + xx := 0; + xR := 0; + end else + begin + xf := 1-frac(x); + if x >= iw -1 then + begin + xx := iw -1; + xR := xx; + end else + begin + xx := Trunc(x); + xR := xx +1; + end; end; - if (y256 < -$7f) then + if (y < 0) then begin - Result := clNone32; - Exit; + if (y < -0.5) then + begin + yf := -y; + end else + begin + y := 0; + yf := 0; + end; + yy := 0; + yB := 0; + end else + begin + yf := 1-frac(y); + if y >= ih -1 then + begin + yy := ih -1; + yB := yy; + end else + begin + yy := Trunc(y); + yB := yy +1; + end; end; - if (x256 and $FF > $7F) then inc(x256, $100); - x256 := x256 shr 8; - if y256 and $FF > $7F then inc(y256, $100); - y256 := y256 shr 8; + weightedColor.Reset; - if (x256 < 0) or (x256 >= img.Width) or - (y256 < 0) or (y256 >= img.Height) then - Result := clNone32 else - Result := img.Pixels[y256 * img.Width + x256]; -end; + weight := Round(xf * yf * 255); //top-left + if weight > 0 then + begin + if (x < 0) or (y < 0) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xx + yy * iw], weight); + end; -//------------------------------------------------------------------------------ -// BiLinear resampler + weight := Round((1-xf) * yf * 255); //top-right + if weight > 0 then + begin + if (x > iw - 0.5) or (y < 0) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xR + yy * iw], weight); + end; + + weight := Round(xf * (1-yf) * 255); //bottom-left + if weight > 0 then + begin + if (x < 0) or (y > ih - 0.5) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xx + yB * iw], weight); + end; + + weight := Round((1-xf) * (1-yf) * 255); //bottom-right + if weight > 0 then + begin + if (x > iw - 0.5) or (y > ih - 0.5) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xR + yB * iw], weight); + end; + Result := weightedColor.Color; +end; //------------------------------------------------------------------------------ -function BilinearResample(img: TImage32; x256, y256: Integer): TColor32; +// WeightedBilinearResample: A modified bilinear resampler that's +// less blurry but also a little more pixelated. +function WeightedBilinearResample(img: TImage32; x, y: double): TColor32; var - xi,yi, weight: Integer; iw, ih: integer; + xx, yy, xR, yB: integer; + weight: Cardinal; pixels: TArrayOfColor32; - color: TWeightedColor; - xf, yf: cardinal; + weightedColor: TWeightedColor; + xf, yf: double; begin iw := img.Width; ih := img.Height; pixels := img.Pixels; - if (x256 <= -$100) or (x256 >= iw *$100) or - (y256 <= -$100) or (y256 >= ih *$100) then + if (x < 0) then begin - result := clNone32; - Exit; + if (x < -0.5) then + begin + xf := -x; + end else + begin + x := 0; + xf := 0; + end; + xx := 0; + xR := 0; + end else + begin + xf := 1-frac(x); + if x >= iw -1 then + begin + xx := iw -1; + xR := xx; + end else + begin + xx := Trunc(x); + xR := xx +1; + end; end; - if x256 < 0 then xi := -1 - else xi := x256 shr 8; - - if y256 < 0 then yi := -1 - else yi := y256 shr 8; - - xf := x256 and $FF; - yf := y256 and $FF; - - color.Reset; + if (y < 0) then + begin + if (y < -0.5) then + begin + yf := -y; + end else + begin + y := 0; + yf := 0; + end; + yy := 0; + yB := 0; + end else + begin + yf := 1-frac(y); + if y >= ih -1 then + begin + yy := ih -1; + yB := yy; + end else + begin + yy := Trunc(y); + yB := yy +1; + end; + end; - weight := (($100 - xf) * ($100 - yf)) shr 8; //top-left - if (xi < 0) or (yi < 0) then - color.AddWeight(weight) else - color.Add(pixels[xi + yi * iw], weight); + weightedColor.Reset; - weight := (xf * ($100 - yf)) shr 8; //top-right - if ((xi+1) >= iw) or (yi < 0) then - color.AddWeight(weight) else - color.Add(pixels[(xi+1) + yi * iw], weight); + weight := sinWeighted[Round(xf * yf * 255)]; //top-left + if weight > 0 then + begin + if (x < 0) or (y < 0) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xx + yy * iw], weight); + end; - weight := (($100 - xf) * yf) shr 8; //bottom-left - if (xi < 0) or ((yi+1) >= ih) then - color.AddWeight(weight) else - color.Add(pixels[(xi) + (yi+1) * iw], weight); + weight := sinWeighted[Round((1-xf) * yf * 255)]; //top-right + if weight > 0 then + begin + if (x > iw - 0.5) or (y < 0) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xR + yy * iw], weight); + end; - weight := (xf * yf) shr 8; //bottom-right - if (xi + 1 >= iw) or (yi + 1 >= ih) then - color.AddWeight(weight) else - color.Add(pixels[(xi+1) + (yi+1) * iw], weight); + weight := sinWeighted[Round(xf * (1-yf) * 255)]; //bottom-left + if weight > 0 then + begin + if (x < 0) or (y > ih - 0.5) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xx + yB * iw], weight); + end; - Result := color.Color; + weight := sinWeighted[Round((1-xf) * (1-yf) * 255)]; //bottom-right + if weight > 0 then + begin + if (x > iw - 0.5) or (y > ih - 0.5) then + weightedColor.AddWeight(weight) else + weightedColor.Add(pixels[xR + yB * iw], weight); + end; + Result := weightedColor.Color; end; //------------------------------------------------------------------------------ @@ -127,7 +269,8 @@ function BilinearResample(img: TImage32; x256, y256: Integer): TColor32; //------------------------------------------------------------------------------ type - TBiCubicEdgeAdjust = (eaNone, eaOne, eaTwo, eaThree, eaFour); + TBiCubicEdgeAdjust = (eaCenterFill, + eaPreStart, eaStart, eaPostStart, eaEnd, eaPostEnd); var byteFrac: array [0..255] of double; @@ -136,48 +279,49 @@ function BilinearResample(img: TImage32; x256, y256: Integer): TColor32; //------------------------------------------------------------------------------ -function CubicHermite(aclr: PColor32; t: Byte; bce: TBiCubicEdgeAdjust): TColor32; +function CubicInterpolate(aclr: PColor32; + t: Byte; bce: TBiCubicEdgeAdjust): TColor32; var a,b,c,d: PARGB; q: TARGB; - aa, bb, cc: integer; + aa, bb, m0, m1: double; t1, t2, t3: double; res: TARGB absolute Result; const clTrans: TColor32 = clNone32; begin case bce of - eaOne: + eaPreStart: begin a := @clTrans; b := @clTrans; c := PARGB(aclr); - Inc(aclr); - d := PARGB(aclr); + d := c; + end; + eaStart: + begin + Result := aclr^; + Exit; end; - eaTwo: + eaPostStart: begin a := PARGB(aclr); b := a; Inc(aclr); c := PARGB(aclr); - Inc(aclr); - d := PARGB(aclr); + d := c; end; - eaThree: + eaEnd: begin - a := PARGB(aclr); Inc(aclr); - b := PARGB(aclr); - Inc(aclr); - c := PARGB(aclr); - d := c; + Result := aclr^; + Exit; end; - eaFour: + eaPostEnd: begin - a := PARGB(aclr); Inc(aclr); - b := PARGB(aclr); + a := PARGB(aclr); + b := a; c := @clTrans; d := @clTrans; end; @@ -198,14 +342,21 @@ function CubicHermite(aclr: PColor32; t: Byte; bce: TBiCubicEdgeAdjust): TColor3 result := clNone32; Exit; end + else if (b = c) then + begin + result := b.Color; + Exit; + end else if b.A = 0 then begin + // ignore differences between b & c's color channels q := c^; q.A := 0; b := @q; end; if c.A = 0 then begin + // ignore differences between b & c's color channels q := b^; q.A := 0; c := @q; @@ -215,76 +366,147 @@ function CubicHermite(aclr: PColor32; t: Byte; bce: TBiCubicEdgeAdjust): TColor3 t2 := byteFracSq[t]; t3 := byteFracCubed[t]; - aa := Integer(-a.A + 3*b.A - 3*c.A + d.A) div 2; - bb := Integer(2*a.A - 5*b.A + 4*c.A - d.A) div 2; - cc := Integer(-a.A + c.A) div 2; - Res.A := ClampByte(aa*t3 + bb*t2 + cc*t1 + b.A); - - aa := Integer(-a.R + 3*b.R - 3*c.R + d.R) div 2; - bb := Integer(2*a.R - 5*b.R + 4*c.R - d.R) div 2; - cc := Integer(-a.R + c.R) div 2; - Res.R := ClampByte(aa*t3 + bb*t2 + cc*t1 + b.R); - - aa := Integer(-a.G + 3*b.G - 3*c.G + d.G) div 2; - bb := Integer(2*a.G - 5*b.G + 4*c.G - d.G) div 2; - cc := Integer(-a.G + c.G) div 2; - Res.G := ClampByte(aa*t3 + bb*t2 + cc*t1 + b.G); - - aa := Integer(-a.B + 3*b.B - 3*c.B + d.B) div 2; - bb := Integer(2*a.B - 5*b.B + 4*c.B - d.B) div 2; - cc := Integer(-a.B + c.B) div 2; - Res.B := ClampByte(aa*t3 + bb*t2 + cc*t1 + b.B); + // find piecewise bicubic interpolation between pixel_b and pixel_c + // at point 't' (as byte div 255) ... + // given parametric equation aa(t^3) + bb(t^2) + cc(t)+ dd = 0 + // where t(0) = pixel_b and t(1) = pixel_c + // let m1 = slope at pixel_b (using slope of pixel_c - pixel_a) + // let m2 = slope at pixel_c (using slope of pixel_d - pixel_b) + // then t(0) = aa(0^3) + bb(0^2) + cc(0) + dd = dd + // then t(1) = aa(1^3) + bb(1^2) + cc(1) + dd = aa + bb + cc + dd + // differentiating parametic equation at t'(0) and t'(1) ... + // t'(0) = m0 = 3*aa(0^2) + 2*bb(0) + cc = cc + // t'(1) = m1 = 3*aa(1^2) + 2*bb(1) + cc = 3*aa + 2*bb + cc + // t(0) = dd ::EQ1 + // t(1) = aa+bb+cc+dd ::EQ2 + // t'(0) = cc ::EQ3 + // t'(1) = 3*aa + 2*bb + cc ::EQ4 + // solving simultaneous equations + // aa = 2*t(0) -2*t(1) +t'(0) +t'(1) + // bb = 3*t(1) -3*t(0) -2*t'(0) -t'(1) + // cc = m0 + // dd = t(0) + + m0 {aka t'(0)} := (c.A - a.A) /2; + m1 {aka t'(1)} := (d.A - b.A) /2; + aa := 2*b.A - 2*c.A + m0 + m1; + bb := 3*c.A -3*b.A -2*m0 - m1; + Res.A := ClampByte(aa*t3 + bb*t2 + m0*t1 + b.A); + + m0 := (c.R - a.R) /2; + m1 := (d.R - b.R) /2; + aa := 2*b.R - 2*c.R + m0 + m1; + bb := 3*c.R -3*b.R -2*m0 - m1; + Res.R := ClampByte(aa*t3 + bb*t2 + m0*t1 + b.R); + + m0 := (c.G - a.G) /2; + m1 := (d.G - b.G) /2; + aa := 2*b.G - 2*c.G + m0 + m1; + bb := 3*c.G -3*b.G -2*m0 - m1; + Res.G := ClampByte(aa*t3 + bb*t2 + m0*t1 + b.G); + + m0 := (c.B - a.B) /2; + m1 := (d.B - b.B) /2; + aa := 2*b.B - 2*c.B + m0 + m1; + bb := 3*c.B -3*b.B -2*m0 - m1; + Res.B := ClampByte(aa*t3 + bb*t2 + m0*t1 + b.B); end; //------------------------------------------------------------------------------ -function BicubicResample(img: TImage32; x256, y256: Integer): TColor32; +function BicubicResample(img: TImage32; x, y: double): TColor32; var - i, dx,dy, pi, iw, w,h: Integer; + i, pi, iw, ih, last: Integer; c: array[0..3] of TColor32; - x, y: Integer; + xFrac, yFrac: byte; bceX, bceY: TBiCubicEdgeAdjust; begin - Result := clNone32; - iw := img.Width; - w := iw -1; - h := img.Height -1; - - x := Abs(x256) shr 8; - y := Abs(y256) shr 8; - - if (x256 < -$FF) or (x > w) or (y256 < -$FF) or (y > h) then Exit; - - if (x256 < 0) then bceX := eaOne - else if (x = 0) then bceX := eaTwo - else if (x256 > w shl 8) then bceX := eaFour - else if (x256 > (w -1) shl 8) then bceX := eaThree - else bceX := eaNone; - - if (bceX = eaOne) or (bceX = eaTwo) then dx := 1 - else dx := 0; - - if (y256 < 0) then bceY := eaOne - else if y = 0 then bceY := eaTwo - else if y = h -1 then bceY := eaThree - else if y = h then bceY := eaFour - else bceY := eaNone; + ih := img.Height; + last := iw * ih -1; - if (bceY = eaOne) or (bceY = eaTwo) then dy := 1 - else dy := 0; + if x < 1 then + begin + if x < -0.5 then + begin + xFrac := Round((1+x) *255); + bceX := eaPreStart; + end + else if (x < 0) or + ((iw = 1) and (x < 0.5)) then + begin + x := 0; + xFrac := 0; + bceX := eaStart; + end + else if (iw = 1) and (x > 0.5) then + begin + // the following is a workaround to avoid the increment in eaPostEnd + bceX := eaPreStart; // ie anti-aliase but without increment + xFrac := Round((1-x) *127); // reversed because 'end' not 'start' + end else + begin + xFrac := Round(frac(x) *255); + bceX := eaPostStart; + end; + end else + begin + xFrac := Round(frac(x) *255); + if x > iw - 1 then + begin + if x > iw - 0.5 then bceX := eaPostEnd + else bceX := eaEnd + end + else + bceX := eaCenterFill; + end; - pi := (y -1 +dy) * iw + (x -1 + dx); + if y < 1 then + begin + if y < -0.5 then + begin + yFrac := Round((1+y) *255); + bceY := eaPreStart; + end + else if (y < 0) or + ((ih = 1) and (y < 0.5)) then + begin + y := 0; + yFrac := 0; + bceY := eaStart; + end + else if (ih = 1) and (y > 0.5) then + begin + // the following is a workaround to avoid the increment in eaPostEnd + bceY := eaPreStart; // ie anti-aliase but without increment + yFrac := Round((1-y) *127); // reversed because 'end' not 'start' + end else + begin + yFrac := Round(frac(y) *255); + bceY := eaPostStart; + end; + end else + begin + yFrac := Round(frac(y) *255); + if y > ih - 1 then + begin + if y > ih - 0.5 then bceY := eaPostEnd + else bceY := eaEnd + end + else + bceY := eaCenterFill; + end; - if bceY = eaFour then dx := 2 - else if bceY = eaThree then dx := 1 - else dx := 0; + x := Max(0, Min(iw -1, x -1)); + y := Max(0, Min(ih -1, y -1)); + pi := Trunc(y) * iw + Trunc(x); - for i := dy to 3 -dx do + for i := 0 to 3 do begin - c[i] := CubicHermite(@img.Pixels[pi], x256 and $FF, bceX); + c[i] := CubicInterpolate(@img.Pixels[pi], xFrac, bceX); inc(pi, iw); + if pi > last then break; end; - Result := CubicHermite(@c[dy], y256 and $FF, bceY); + Result := CubicInterpolate(@c[0], yFrac, bceY); end; //------------------------------------------------------------------------------ @@ -355,6 +577,22 @@ function GetWeightedColor(const srcBits: TArrayOfColor32; end; //------------------------------------------------------------------------------ +procedure BoxDownSampling(Image: TImage32; scaleX, scaleY: double); +begin + BoxDownSampling(Image, + Max(1, Integer(Round(Image.Width * scaleX))), + Max(1, Integer(Round(Image.Height * scaleY)))); +end; +//------------------------------------------------------------------------------ + +procedure BoxDownSampling(Image: TImage32; scale: double); +begin + BoxDownSampling(Image, + Max(1, Integer(Round(Image.Width * scale))), + Max(1, Integer(Round(Image.Height * scale)))); +end; +//------------------------------------------------------------------------------ + procedure BoxDownSampling(Image: TImage32; newWidth, newHeight: Integer); var x,y, x256,y256,xx256,yy256: Integer; @@ -403,12 +641,15 @@ procedure InitByteExponents; inv255 : double = 1/255; inv255sqrd : double = 1/(255*255); inv255cubed: double = 1/(255*255*255); + piDiv256 : double = Pi / 256; begin for i := 0 to 255 do begin byteFrac[i] := i *inv255; byteFracSq[i] := i*i *inv255sqrd; byteFracCubed[i] := i*i*i *inv255cubed; + + sinWeighted[i] := Round((Sin(i * piDiv256 - Pi/2) +1) /2 * 255); end; end; //------------------------------------------------------------------------------ @@ -419,6 +660,7 @@ initialization rNearestResampler := RegisterResampler(NearestResampler, 'NearestNeighbor'); rBilinearResampler := RegisterResampler(BilinearResample, 'Bilinear'); rBicubicResampler := RegisterResampler(BicubicResample, 'HermiteBicubic'); + rWeightedBilinear := RegisterResampler(WeightedBilinearResample, 'WeightedBilinear'); DefaultResampler := rBilinearResampler; end. diff --git a/Ext/SVGIconImageList/Image32/source/Img32.SVG.Core.pas b/Ext/SVGIconImageList/Image32/source/Img32.SVG.Core.pas index 366f8c5..afe6b31 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.SVG.Core.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.SVG.Core.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 16 March 2023 * +* Date : 13 March 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2022 * +* Copyright : Angus Johnson 2019-2024 * * * * Purpose : Essential structures and functions to read SVG files * * * @@ -191,7 +191,7 @@ TSvgTreeEl = class(TXmlEl) TSvgParser = class private svgStream : TMemoryStream; - procedure ParseStream; + procedure ParseUtf8Stream; public classStyles :TClassStylesList; xmlHeader : TXmlEl; @@ -243,6 +243,13 @@ TSvgParser = class function SkipBlanks(var c: PUTF8Char; endC: PUTF8Char): Boolean; function SkipBlanksAndComma(var current: PUTF8Char; currentEnd: PUTF8Char): Boolean; + procedure ConvertUnicodeToUtf8(memStream: TMemoryStream); + + function GetScale(src, dst: double): double; + function GetScaleForBestFit(srcW, srcH, dstW, dstH: double): double; + + function Base64Decode(const str: PAnsiChar; len: integer; memStream: TMemoryStream): Boolean; + type TSetOfUTF8Char = set of UTF8Char; UTF8Strings = array of UTF8String; @@ -283,10 +290,106 @@ TColorObj = class //include hashed html entity constants {$I Img32.SVG.HtmlHashConsts.inc} +//------------------------------------------------------------------------------ +// Base64 (MIME) Encode & Decode and other encoding functions ... +//------------------------------------------------------------------------------ + +type + PFourChars = ^TFourChars; + TFourChars = record + c1: ansichar; + c2: ansichar; + c3: ansichar; + c4: ansichar; + end; + +function Chr64ToVal(c: ansiChar): integer; {$IFDEF INLINE} inline; {$ENDIF} +begin + case c of + '+': result := 62; + '/': result := 63; + '0'..'9': result := ord(c) + 4; + 'A'..'Z': result := ord(c) -65; + 'a'..'z': result := ord(c) -71; + else Raise Exception.Create('Corrupted MIME encoded text'); + end; +end; +//------------------------------------------------------------------------------ + +function FrstChr(c: PFourChars): ansichar; {$IFDEF INLINE} inline; {$ENDIF} +begin + result := ansichar(Chr64ToVal(c.c1) shl 2 or Chr64ToVal(c.c2) shr 4); +end; +//------------------------------------------------------------------------------ + +function ScndChr(c: PFourChars): ansichar; {$IFDEF INLINE} inline; {$ENDIF} +begin + result := ansichar(Chr64ToVal(c.c2) shl 4 or Chr64ToVal(c.c3) shr 2); +end; +//------------------------------------------------------------------------------ + +function ThrdChr(c: PFourChars): ansichar; {$IFDEF INLINE} inline; {$ENDIF} +begin + result := ansichar( Chr64ToVal(c.c3) shl 6 or Chr64ToVal(c.c4) ); +end; +//------------------------------------------------------------------------------ + +function Base64Decode(const str: PAnsiChar; len: integer; memStream: TMemoryStream): Boolean; +var + i, j, extra: integer; + Chars4: PFourChars; + dst: PAnsiChar; +begin + result := false; + if (len = 0) or (len mod 4 > 0) or not Assigned(memStream) then exit; + if str[len-2] = '=' then extra := 2 + else if str[len-1] = '=' then extra := 1 + else extra := 0; + memStream.SetSize(LongInt((len div 4 * 3) - extra)); + dst := memStream.Memory; + Chars4 := @str[0]; + i := 0; + try + for j := 1 to (len div 4) -1 do + begin + dst[i] := FrstChr(Chars4); + dst[i+1] := ScndChr(Chars4); + dst[i+2] := ThrdChr(Chars4); + inc(pbyte(Chars4),4); + inc(i,3); + end; + dst[i] := FrstChr(Chars4); + if extra < 2 then dst[i+1] := ScndChr(Chars4); + if extra < 1 then dst[i+2] := ThrdChr(Chars4); + except + Exit; + end; + Result := true; +end; + //------------------------------------------------------------------------------ // Miscellaneous functions ... //------------------------------------------------------------------------------ +function GetScale(src, dst: double): double; +begin + Result := dst / src; + if (SameValue(Result, 1, 0.00001)) then Result := 1; +end; +//------------------------------------------------------------------------------ + +function GetScaleForBestFit(srcW, srcH, dstW, dstH: double): double; +var + sx,sy: double; +begin + sx := dstW / srcW; + sy := dstH / srcH; + if sy < sx then sx := sy; + if (SameValue(sx, 1, 0.00001)) then + Result := 1 else + Result := sx; +end; + function ClampRange(val, min, max: double): double; {$IFDEF INLINE} inline; {$ENDIF} begin @@ -360,15 +463,21 @@ function Split(const str: UTF8String): UTF8Strings; function GetXmlEncoding(memory: Pointer; len: integer): TSvgEncoding; var - p: PUTF8Char; + p, p1: PUTF8Char; begin Result := eUnknown; if (len < 4) or not Assigned(memory) then Exit; p := PUTF8Char(memory); + p1 := (p + 1); case p^ of - #$EF: if ((p +1)^ = #$BB) and ((p +2)^ = #$BF) then Result := eUtf8; - #$FF: if ((p +1)^ = #$FE) then Result := eUnicodeLE; - #$FE: if ((p +1)^ = #$FF) then Result := eUnicodeBE; + #$EF: if (p1^ = #$BB) then + if ((p +2)^ = #$BF) then + Result := eUtf8 else + Exit; + #$FF: if (p1^ = #$FE) or (p1^ = #0) then + Result := eUnicodeLE; + #$FE: if (p1^ = #$FF) then + Result := eUnicodeBE; end; end; //------------------------------------------------------------------------------ @@ -1783,42 +1892,45 @@ function TSvgParser.LoadFromFile(const filename: string): Boolean; end; //------------------------------------------------------------------------------ -function TSvgParser.LoadFromStream(stream: TStream): Boolean; +procedure ConvertUnicodeToUtf8(memStream: TMemoryStream); var i, len: LongInt; encoding: TSvgEncoding; s: UnicodeString; wc: PWord; utf8: UTF8String; +begin + memStream.Position := 0; + encoding := GetXmlEncoding(memStream.Memory, memStream.Size); + if not (encoding in [eUnicodeLE, eUnicodeBE]) then Exit; + SetLength(s, memStream.Size div 2); + Move(memStream.Memory^, s[1], memStream.Size); + if encoding = eUnicodeBE then + begin + wc := @s[1]; + for i := 1 to Length(s) do + begin + wc^ := Swap(wc^); + inc(wc); + end; + end; + utf8 := UTF8Encode(s); + len := Length(utf8); + memStream.SetSize(len); + Move(utf8[1], memStream.Memory^, len); +end; +//------------------------------------------------------------------------------ + +function TSvgParser.LoadFromStream(stream: TStream): Boolean; begin Clear; Result := true; try svgStream.LoadFromStream(stream); - - //check encoding and set to UTF-8 if necessary - encoding := GetXmlEncoding(svgStream.Memory, svgStream.Size); - case encoding of - eUnicodeLE, eUnicodeBE: - begin - SetLength(s, svgStream.Size div 2); - Move(svgStream.Memory^, s[1], svgStream.Size); - if encoding = eUnicodeBE then - begin - wc := @s[1]; - for i := 1 to Length(s) do - begin - wc^ := Swap(wc^); - inc(wc); - end; - end; - utf8 := UTF8Encode(s); - len := Length(utf8); - svgStream.SetSize(len); - Move(utf8[1], svgStream.Memory^, len); - end; - end; - ParseStream; + // very few SVG files are unicode encoded, almost all are Utf8 + // so it's more efficient to parse them all as Utf8 encoded files + ConvertUnicodeToUtf8(svgStream); + ParseUtf8Stream; except Result := false; end; @@ -1842,7 +1954,7 @@ function TSvgParser.LoadFromString(const str: string): Boolean; end; //------------------------------------------------------------------------------ -procedure TSvgParser.ParseStream; +procedure TSvgParser.ParseUtf8Stream; var c, endC: PUTF8Char; begin diff --git a/Ext/SVGIconImageList/Image32/source/Img32.SVG.HashConsts.inc b/Ext/SVGIconImageList/Image32/source/Img32.SVG.HashConsts.inc index 3581fab..85ffe4d 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.SVG.HashConsts.inc +++ b/Ext/SVGIconImageList/Image32/source/Img32.SVG.HashConsts.inc @@ -46,6 +46,7 @@ const hfeFuncG = $E45FE81A; // feFuncG hfeFuncR = $F8BB10C8; // feFuncR hfeGaussianBlur = $B2225552; // feGaussianBlur + hfeImage = $905096A0; // feImage hfeMerge = $A2C358C0; // feMerge hfeMergeNode = $F5F1E90F; // feMergeNode hfeOffset = $04493A72; // feOffset @@ -74,6 +75,7 @@ const hhidden = $4C4D777D; // hidden hHref = $8E926F4B; // Href hId = $1B60404D; // Id + hImage = $D58C8637; // Image hIn = $4D5FA44B; // In hIn2 = $FBFE02B1; // In2 hIntercept = $7CBB607F; // Intercept diff --git a/Ext/SVGIconImageList/Image32/source/Img32.SVG.Path.pas b/Ext/SVGIconImageList/Image32/source/Img32.SVG.Path.pas index abd9559..7941f87 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.SVG.Path.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.SVG.Path.pas @@ -2,10 +2,10 @@ (******************************************************************************* * Author : Angus Johnson * -* Version : 4.0 * -* Date : 28 December 2021 * +* Version : 4.4 * +* Date : 16 March 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2021 * +* Copyright : Angus Johnson 2019-2024 * * * * Purpose : Essential structures and functions to read SVG Path elements * * * @@ -276,7 +276,6 @@ implementation resourcestring rsSvgPathRangeError = 'TSvgPath.GetPath range error'; rsSvgSubPathRangeError = 'TSvgSubPath.GetSeg range error'; - //rsSvgSegmentRangeError = 'TSvgSegment.GetVal range error'; //------------------------------------------------------------------------------ // Miscellaneous functions ... @@ -418,22 +417,22 @@ procedure TSvgPathSeg.Scale(value: double); function TSvgPathSeg.DescaleAndOffset(const pt: TPointD): TPointD; begin Result := pt; - OffsetPoint(Result, -parent.PathOffset.X, -parent.PathOffset.Y); + TranslatePoint(Result, -parent.PathOffset.X, -parent.PathOffset.Y); Result := ScalePoint(Result, 1/Owner.Scale); end; //------------------------------------------------------------------------------ function TSvgPathSeg.DescaleAndOffset(const p: TPathD): TPathD; begin - Result := OffsetPath(p, -parent.PathOffset.X, -parent.PathOffset.Y); + Result := TranslatePath(p, -parent.PathOffset.X, -parent.PathOffset.Y); Result := ScalePath(Result, 1/Owner.Scale); end; //------------------------------------------------------------------------------ procedure TSvgPathSeg.Offset(dx, dy: double); begin - fFirstPt := OffsetPoint(fFirstPt, dx, dy); - fCtrlPts := OffsetPath(fCtrlPts, dx, dy); + fFirstPt := TranslatePoint(fFirstPt, dx, dy); + fCtrlPts := TranslatePath(fCtrlPts, dx, dy); end; //------------------------------------------------------------------------------ @@ -562,9 +561,9 @@ procedure TSvgASegment.SetArcInfo(ai: TArcInfo); begin dx := ai.startPos.X - startPos.X; dy := ai.startPos.Y - startPos.Y; - OffsetRect(rec, dx, dy); + TranslateRect(rec, dx, dy); startPos := ai.startPos; - endPos := OffsetPoint(endPos, dx, dy); + endPos := TranslatePoint(endPos, dx, dy); end; end; SetCtrlPtsFromArcInfo; @@ -669,9 +668,9 @@ procedure TSvgASegment.Offset(dx, dy: double); inherited; with fArcInfo do begin - OffsetRect(rec, dx, dy); - startPos := OffsetPoint(startPos, dx, dy); - endPos := OffsetPoint(endPos, dx, dy); + TranslateRect(rec, dx, dy); + startPos := TranslatePoint(startPos, dx, dy); + endPos := TranslatePoint(endPos, dx, dy); end; end; //------------------------------------------------------------------------------ @@ -1287,7 +1286,6 @@ procedure TSvgSubPath.Offset(dx, dy: double); var i: integer; begin - //fPathOffset := OffsetPoint(pathOffset, dx,dy); //DON'T DO THIS! for i := 0 to High(fSegs) do fSegs[i].Offset(dx, dy); end; //------------------------------------------------------------------------------ @@ -1429,11 +1427,18 @@ procedure TSvgPath.Parse(const value: UTF8String); end else if (currSegType = stClose) then begin + if currPt.X = InvalidD then Continue; + if Assigned(currSubPath) and (currSubPath.Count > 0) then begin lastPt := currPt; currPt := currSubPath.GetFirstPt; currSubPath.AddZSeg(lastPt, currPt); + end else + begin + if not Assigned(currSubPath) then + currSubPath := AddPath; + currSubPath.AddZSeg(currPt, currPt); end; currSubPath := nil; Continue; @@ -1585,16 +1590,26 @@ function TSvgPath.GetControlBounds: TRectD; for i := 0 to Count -1 do with fSubPaths[i] do begin - AppendPath(p, GetFirstPt); + AppendToPath(p, GetFirstPt); for j := 0 to High(fSegs) do AppendPath(p, fSegs[j].fCtrlPts); end; Result := GetBoundsD(p); //watch out for straight horizontal or vertical lines - if not IsEmptyRect(Result) then Exit; - p := Grow(p, nil, 1, jsSquare, 0); - Result := GetBoundsD(p); + if IsEmptyRect(Result) then + begin + if Result.Width = 0 then + begin + Result.Left := Result.Left - 0.5; + Result.Right := Result.Left + 1.0; + end + else if Result.Height = 0 then + begin + Result.Top := Result.Top - 0.5; + Result.Bottom := Result.Top + 1.0; + end; + end; end; //------------------------------------------------------------------------------ diff --git a/Ext/SVGIconImageList/Image32/source/Img32.SVG.PathDesign.pas b/Ext/SVGIconImageList/Image32/source/Img32.SVG.PathDesign.pas index 2adfe95..d1b33a1 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.SVG.PathDesign.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.SVG.PathDesign.pas @@ -2,8 +2,8 @@ (******************************************************************************* * Author : Angus Johnson * -* Version : 4.2 * -* Date : 30 May 2022 * +* Version : 4.0 * +* Date : 10 January 2022 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2019-2022 * * * @@ -1111,7 +1111,6 @@ procedure TSubPathLayer.Init(subPath: TSvgSubPath); begin fOwner := Parent as TSvgPathLayer; fSubPath := subPath; - seg := nil; for i := 0 to subPath.Count -1 do begin case subPath[i].segType of diff --git a/Ext/SVGIconImageList/Image32/source/Img32.SVG.Reader.pas b/Ext/SVGIconImageList/Image32/source/Img32.SVG.Reader.pas index 3d6a2ee..6508841 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.SVG.Reader.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.SVG.Reader.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 7 April 2023 * +* Date : 23 March 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2022 * +* Copyright : Angus Johnson 2019-2024 * * * * Purpose : Read SVG 2.0 files * * * @@ -29,7 +29,9 @@ interface {$ENDIF} type - TSvgElement = class; + + TBaseElement = class; + TElementClass = class of TBaseElement; TDrawData = record currentColor : TColor32; @@ -56,29 +58,28 @@ TDrawData = record opacity : integer; matrix : TMatrixD; visible : Boolean; - useEl : TSvgElement; //to check for and prevent recursion + useEl : TBaseElement; //to check for and prevent recursion bounds : TRectD; end; TSvgReader = class; - TElementClass = class of TSvgElement; - TSvgElement = class + TBaseElement = class private - fParent : TSvgElement; + fParent : TBaseElement; fParserEl : TSvgTreeEl; fReader : TSvgReader; {$IFDEF XPLAT_GENERICS} - fChilds : TList; + fChilds : TList; {$ELSE} fChilds : TList; {$ENDIF} fId : UTF8String; fDrawData : TDrawData; //currently both static and dynamic vars - function FindRefElement(refname: UTF8String): TSvgElement; + function FindRefElement(refname: UTF8String): TBaseElement; function GetChildCount: integer; - function GetChild(index: integer): TSvgElement; - function FindChild(const idName: UTF8String): TSvgElement; + function GetChild(index: integer): TBaseElement; + function FindChild(const idName: UTF8String): TBaseElement; protected elRectWH : TValueRecWH; //multifunction variable function IsFirstChild: Boolean; @@ -90,19 +91,20 @@ TSvgElement = class procedure Draw(image: TImage32; drawDat: TDrawData); virtual; procedure DrawChildren(image: TImage32; drawDat: TDrawData); virtual; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); virtual; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); virtual; destructor Destroy; override; - property Child[index: integer]: TSvgElement read GetChild; default; + property Child[index: integer]: TBaseElement read GetChild; default; property ChildCount: integer read GetChildCount; property DrawData: TDrawData read fDrawData write fDrawData; property Id: UTF8String read fId; end; - TSvgRootElement = class(TSvgElement) + TSvgElement = class(TBaseElement) protected viewboxWH : TRectWH; + procedure Draw(image: TImage32; drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + function GetViewbox: TRectWH; end; TSvgReader = class @@ -116,8 +118,7 @@ TSvgReader = class fClassStyles : TClassStylesList; fLinGradRenderer : TLinearGradientRenderer; fRadGradRenderer : TSvgRadialGradientRenderer; - fImgRenderer : TImageRenderer; - fRootElement : TSvgRootElement; + fRootElement : TSvgElement; fFontCache : TFontCache; fUsePropScale : Boolean; fSimpleDraw : Boolean; @@ -131,14 +132,12 @@ TSvgReader = class procedure GetBestFontForFontCache(const svgFontInfo: TSVGFontInfo); property RadGradRenderer: TSvgRadialGradientRenderer read fRadGradRenderer; property LinGradRenderer: TLinearGradientRenderer read fLinGradRenderer; - property ImageRenderer : TImageRenderer read fImgRenderer; property BackgndImage : TImage32 read fBackgndImage; property TempImage : TImage32 read fTempImage; public constructor Create; destructor Destroy; override; procedure Clear; - function GetViewbox(containerWidth, containerHeight: integer): TRectWH; procedure DrawImage(img: TImage32; scaleToImage: Boolean); function LoadFromStream(stream: TStream): Boolean; function LoadFromFile(const filename: string): Boolean; @@ -149,7 +148,7 @@ TSvgReader = class procedure SetOverrideFillColor(color: TColor32); //deprecated; procedure SetOverrideStrokeColor(color: TColor32); //deprecated; - function FindElement(const idName: UTF8String): TSvgElement; + function FindElement(const idName: UTF8String): TBaseElement; property BackgroundColor : TColor32 read fBkgndColor write fBkgndColor; property BlurQuality : integer read fBlurQuality write SetBlurQuality; property IsEmpty : Boolean read GetIsEmpty; @@ -157,7 +156,7 @@ TSvgReader = class //the third-party SVGIconImageList. (IMHO it should always = true) property KeepAspectRatio: Boolean read fUsePropScale write fUsePropScale; - property RootElement : TSvgRootElement read fRootElement; + property RootElement : TSvgElement read fRootElement; //RecordSimpleDraw: record simple drawing instructions property RecordSimpleDraw: Boolean read fSimpleDraw write fSimpleDraw; //SimpleDrawList: list of PSimpleDrawData records; @@ -172,6 +171,12 @@ TSimpleDrawData = record tag : integer; end; +var + // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width + defaultSvgWidth: integer = 300; + // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/height + defaultSvgHeight: integer = 150; + implementation uses @@ -180,14 +185,29 @@ implementation type TFourDoubles = array [0..3] of double; - TDefsElement = class(TSvgElement) + TDefsElement = class(TBaseElement) public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; + end; + + //------------------------------------- + + // TImageElement only supports *embedded* jpg & png images. + // And it requires Img32.Fmt.JPG & Img32.Fmt.PNG to be included + // in the USES clause of at least one of the application's units. + // (nb: If using the FMX framework, then add Img32.FMX instead of + // Img32.Fmt.JPG & Img32.Fmt.PNG to the USES clause.) + + TImageElement = class(TBaseElement) + private + refEl: UTF8String; + protected + procedure Draw(image: TImage32; drawDat: TDrawData); override; end; //------------------------------------- - TShapeElement = class(TSvgElement) + TShapeElement = class(TBaseElement) private procedure SimpleDrawFill(const paths: TPathsD; fillRule: TFillRule; color: TColor32); @@ -208,7 +228,7 @@ TShapeElement = class(TSvgElement) procedure DrawMarkers(img: TImage32; drawDat: TDrawData); procedure Draw(image: TImage32; drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TGroupElement = class(TShapeElement) @@ -223,8 +243,8 @@ TSwitchElement = class(TShapeElement) TUseElement = class(TShapeElement) private - callerUse: TSvgElement; - function ValidateNonRecursion(el: TSvgElement): Boolean; + callerUse: TBaseElement; + function ValidateNonRecursion(el: TBaseElement): Boolean; protected refEl: UTF8String; procedure GetPaths(const drawDat: TDrawData); override; @@ -242,7 +262,7 @@ TSymbolElement = class(TShapeElement) protected viewboxWH: TRectWH; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; //------------------------------------- @@ -258,7 +278,7 @@ TPathElement = class(TShapeElement) procedure GetPaths(const drawDat: TDrawData); override; function GetSimplePath(const drawDat: TDrawData): TPathsD; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; destructor Destroy; override; end; @@ -278,7 +298,7 @@ TLineElement = class(TShapeElement) procedure GetPaths(const drawDat: TDrawData); override; function GetSimplePath(const drawDat: TDrawData): TPathsD; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TCircleElement = class(TShapeElement) @@ -288,7 +308,7 @@ TCircleElement = class(TShapeElement) function GetBounds: TRectD; override; procedure GetPaths(const drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TEllipseElement = class(TShapeElement) @@ -298,7 +318,7 @@ TEllipseElement = class(TShapeElement) function GetBounds: TRectD; override; procedure GetPaths(const drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TRectElement = class(TShapeElement) @@ -308,7 +328,7 @@ TRectElement = class(TShapeElement) procedure GetPaths(const drawDat: TDrawData); override; function GetSimplePath(const drawDat: TDrawData): TPathsD; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; //TTextElement: although this is a TShapeElement descendant, it's really @@ -325,12 +345,12 @@ TTextElement = class(TShapeElement) function LoadContent: Boolean; override; procedure Draw(img: TImage32; drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TTSpanElement = class(TTextElement) public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TSubtextElement = class(TShapeElement) @@ -339,7 +359,7 @@ TSubtextElement = class(TShapeElement) procedure GetPaths(const drawDat: TDrawData); override; function GetBounds: TRectD; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; //------------------------------------- @@ -363,7 +383,7 @@ TMarkerElement = class(TShapeElement) function SetMiddlePoints(const points: TPathD): Boolean; procedure Draw(img: TImage32; drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TSvgColorStop = record @@ -372,7 +392,7 @@ TSvgColorStop = record end; TSvgColorStops = array of TSvgColorStop; - TFillElement = class(TSvgElement) + TFillElement = class(TBaseElement) protected refEl : UTF8String; units : Cardinal; @@ -381,11 +401,13 @@ TFillElement = class(TSvgElement) TPatternElement = class(TFillElement) protected - pattBoxWH : TRectWH; + ImgRenderer : TImageRenderer; + pattBoxWH : TRectWH; function PrepareRenderer(renderer: TImageRenderer; drawDat: TDrawData): Boolean; virtual; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; + destructor Destroy; override; end; //nb: gradients with objectBoundingBox should not be applied to @@ -396,7 +418,7 @@ TGradientElement = class(TFillElement) spreadMethod : TGradientFillStyle; function LoadContent: Boolean; override; procedure AddStop(color: TColor32; offset: double); - procedure AssignTo(other: TSvgElement); virtual; + procedure AssignTo(other: TBaseElement); virtual; function PrepareRenderer(renderer: TCustomGradientRenderer; drawDat: TDrawData): Boolean; virtual; end; @@ -405,32 +427,32 @@ TRadGradElement = class(TGradientElement) protected radius: TValuePt; F, C: TValuePt; - procedure AssignTo(other: TSvgElement); override; + procedure AssignTo(other: TBaseElement); override; function PrepareRenderer(renderer: TCustomGradientRenderer; drawDat: TDrawData): Boolean; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TLinGradElement = class(TGradientElement) protected startPt, endPt: TValuePt; - procedure AssignTo(other: TSvgElement); override; + procedure AssignTo(other: TBaseElement); override; function PrepareRenderer(renderer: TCustomGradientRenderer; drawDat: TDrawData): Boolean; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; - TGradStopElement = class(TSvgElement) + TGradStopElement = class(TBaseElement) protected offset: double; color: TColor32; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; - TFilterElement = class(TSvgElement) + TFilterElement = class(TBaseElement) private fSrcImg : TImage32; fLastImg : TImage32; @@ -449,11 +471,11 @@ TFilterElement = class(TSvgElement) procedure Apply(img: TImage32; const filterBounds: TRect; const matrix: TMatrixD); public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; destructor Destroy; override; end; - TFeBaseElement = class(TSvgElement) + TFeBaseElement = class(TBaseElement) private function GetParentAsFilterEl: TFilterElement; protected @@ -473,6 +495,13 @@ TFeBlendElement = class(TFeBaseElement) procedure Apply; override; end; + TFeImageElement = class(TFeBaseElement) + private + refEl: UTF8String; + protected + procedure Apply; override; + end; + TCompositeOp = (coOver, coIn, coOut, coAtop, coXOR, coArithmetic); TFeCompositeElement = class(TFeBaseElement) @@ -481,7 +510,7 @@ TFeCompositeElement = class(TFeBaseElement) compositeOp: TCompositeOp; procedure Apply; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TFeColorMatrixElement = class(TFeBaseElement) @@ -506,7 +535,7 @@ TFeDropShadowElement = class(TFeBaseElement) floodColor : TColor32; procedure Apply; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TFeFloodElement = class(TFeBaseElement) @@ -514,7 +543,7 @@ TFeFloodElement = class(TFeBaseElement) floodColor : TColor32; procedure Apply; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TFeGaussElement = class(TFeBaseElement) @@ -522,7 +551,7 @@ TFeGaussElement = class(TFeBaseElement) stdDev: double; procedure Apply; override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; TFeMergeElement = class(TFeBaseElement) @@ -558,7 +587,7 @@ TClipPathElement = class(TShapeElement) units: Cardinal; procedure GetPaths(const drawDat: TDrawData); override; public - constructor Create(parent: TSvgElement; svgEl: TSvgTreeEl); override; + constructor Create(parent: TBaseElement; svgEl: TSvgTreeEl); override; end; //------------------------------------- @@ -612,12 +641,14 @@ function HashToElementClass(hash: Cardinal): TElementClass; hfeDropShadow : Result := TFeDropShadowElement; hfeFlood : Result := TFeFloodElement; hFeGaussianBlur : Result := TFeGaussElement; + hFeImage : Result := TFeImageElement; hfeMerge : Result := TFeMergeElement; hfeMergeNode : Result := TFeMergeNodeElement; hfeOffset : Result := TFeOffsetElement; hfePointLight : Result := TFePointLightElement; hfeSpecularLighting : Result := TFeSpecLightElement; hG : Result := TGroupElement; + hImage : Result := TImageElement; hLine : Result := TLineElement; hLineargradient : Result := TLinGradElement; hMarker : Result := TMarkerElement; @@ -629,19 +660,19 @@ function HashToElementClass(hash: Cardinal): TElementClass; hRadialgradient : Result := TRadGradElement; hRect : Result := TRectElement; hStop : Result := TGradStopElement; - hSvg : Result := TSvgRootElement; + hSvg : Result := TSvgElement; hSwitch : Result := TSwitchElement; hSymbol : Result := TSymbolElement; hText : Result := TTextElement; hTextPath : Result := TTextPathElement; hTSpan : Result := TTSpanElement; hUse : Result := TUseElement; - else Result := TSvgElement; //use generic class + else Result := TBaseElement; //use generic class end; end; //------------------------------------------------------------------------------ -procedure UpdateDrawInfo(var drawDat: TDrawData; thisElement: TSvgElement); +procedure UpdateDrawInfo(var drawDat: TDrawData; thisElement: TBaseElement); begin with thisElement.fDrawData do begin @@ -667,7 +698,7 @@ procedure UpdateDrawInfo(var drawDat: TDrawData; thisElement: TSvgElement); drawDat.strokeWidth := strokeWidth; if strokeCap = esPolygon then drawDat.strokeCap := strokeCap; - if strokeJoin = jsAuto then + if strokeJoin <> jsMiter then drawDat.strokeJoin := strokeJoin; if strokeMitLim > 0 then drawDat.strokeMitLim := strokeMitLim; @@ -824,20 +855,89 @@ function MatrixApply(const paths: TPathsD; const matrix: TMatrixD): TPathsD; ove // TDefsElement //------------------------------------------------------------------------------ -constructor TDefsElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TDefsElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fDrawData.visible := false; end; +//------------------------------------------------------------------------------ +// TImageElement +//------------------------------------------------------------------------------ + +function TrimSpaces(const s: UTF8String): UTF8String; +var + i, j, len: integer; +begin + len := Length(s); + SetLength(Result, len); + j := 0; + for i := 1 to len do + if s[i] > #32 then + begin + inc(j); + Result[j] := s[i]; + end; + SetLength(Result, j); +end; +//------------------------------------------------------------------------------ + +function DrawRefElImage(const refEl: UTF8String; + image: TImage32; dstRec: TRect): Boolean; +var + len, offset: integer; + s: UTF8String; + ms: TMemoryStream; + img: TImage32; +begin + Result := false; + // unfortunately white spaces are sometimes found inside encoded base64 + s := TrimSpaces(refEl); + + len := Length(s); + // currently only accepts **embedded** images + if (len = 0) then Exit; + if Match(@s[1], 'data:image/jpg;base64,') then offset := 22 + else if Match(@s[1], 'data:image/jpeg;base64,') then offset := 23 + else if Match(@s[1], 'data:image/png;base64,') then offset := 22 + else if Match(@s[1], 'data:img/jpg;base64,') then offset := 20 + else if Match(@s[1], 'data:img/jpeg;base64,') then offset := 21 + else if Match(@s[1], 'data:img/png;base64,') then offset := 20 + else Exit; + + ms := TMemoryStream.Create; + img := TImage32.Create; + try + if not Base64Decode(@s[offset +1], len -offset, ms) or + not img.LoadFromStream(ms) then Exit; + image.Copy(img, img.Bounds, dstRec); + finally + ms.Free; + img.Free; + end; + Result := true; +end; +//------------------------------------------------------------------------------ + +procedure TImageElement.Draw(image: TImage32; drawDat: TDrawData); +var + dstRecD: TRectD; +begin + dstRecD := Self.elRectWH.GetRectD(0,0); + drawDat.matrix := MatrixMultiply(drawDat.matrix, fDrawData.matrix); + + MatrixApply(drawDat.matrix, dstRecD); + DrawRefElImage(refEl, image, Rect(dstRecD)); +end; + //------------------------------------------------------------------------------ // TGroupElement //------------------------------------------------------------------------------ procedure TGroupElement.Draw(image: TImage32; drawDat: TDrawData); var - clipEl : TSvgElement; - maskEl : TSvgElement; + clipEl : TBaseElement; + maskEl : TBaseElement; tmpImg : TImage32; clipPaths : TPathsD; clipRec : TRect; @@ -908,7 +1008,7 @@ procedure TSwitchElement.Draw(image: TImage32; drawDat: TDrawData); i: integer; begin for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TShapeElement then + if TBaseElement(fChilds[i]) is TShapeElement then with TShapeElement(fChilds[i]) do if fDrawData.visible then begin @@ -923,7 +1023,7 @@ procedure TSwitchElement.Draw(image: TImage32; drawDat: TDrawData); procedure TUseElement.GetPaths(const drawDat: TDrawData); var - el: TSvgElement; + el: TBaseElement; dx, dy: double; begin if Assigned(drawPathsF) or (refEl = '') then Exit; @@ -946,8 +1046,8 @@ procedure TUseElement.GetPaths(const drawDat: TDrawData); if (dx <> 0) or (dy <> 0) then begin - drawPathsC := OffsetPath(drawPathsC, dx, dy); - drawPathsO := OffsetPath(drawPathsO, dx, dy); + drawPathsC := TranslatePath(drawPathsC, dx, dy); + drawPathsO := TranslatePath(drawPathsO, dx, dy); end; drawPathsF := CopyPaths(drawPathsC); @@ -955,7 +1055,7 @@ procedure TUseElement.GetPaths(const drawDat: TDrawData); end; //------------------------------------------------------------------------------ -function TUseElement.ValidateNonRecursion(el: TSvgElement): Boolean; +function TUseElement.ValidateNonRecursion(el: TBaseElement): Boolean; begin Result := false; while assigned(el) do @@ -970,7 +1070,7 @@ function TUseElement.ValidateNonRecursion(el: TSvgElement): Boolean; procedure TUseElement.Draw(img: TImage32; drawDat: TDrawData); var - el: TSvgElement; + el: TBaseElement; s, dx, dy: double; scale, scale2: TSizeD; mat: TMatrixD; @@ -1055,6 +1155,8 @@ procedure TUseElement.Draw(img: TImage32; drawDat: TDrawData); DrawChildren(img, drawDat); end; end + else if el is TImageElement then + el.Draw(img, drawDat) else if el is TShapeElement then el.Draw(img, drawDat); end; @@ -1070,7 +1172,7 @@ procedure TMaskElement.GetPaths(const drawDat: TDrawData); begin maskRec := NullRect; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TShapeElement then + if TBaseElement(fChilds[i]) is TShapeElement then begin el := TShapeElement(fChilds[i]); el.GetPaths(drawDat); @@ -1098,7 +1200,7 @@ procedure TMaskElement.ApplyMask(img: TImage32; const drawDat: TDrawData); // TSymbolElement //------------------------------------------------------------------------------ -constructor TSymbolElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TSymbolElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fDrawData.visible := false; @@ -1114,7 +1216,7 @@ function TGradientElement.LoadContent: Boolean; begin Result := inherited LoadContent; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TGradStopElement then + if TBaseElement(fChilds[i]) is TGradStopElement then with TGradStopElement(fChilds[i]) do AddStop(color, offset); end; @@ -1135,7 +1237,7 @@ procedure TGradientElement.AddStop(color: TColor32; offset: double); end; //------------------------------------------------------------------------------ -procedure TGradientElement.AssignTo(other: TSvgElement); +procedure TGradientElement.AssignTo(other: TBaseElement); var i, len: integer; begin @@ -1164,7 +1266,7 @@ procedure TGradientElement.AssignTo(other: TSvgElement); function TGradientElement.PrepareRenderer( renderer: TCustomGradientRenderer; drawDat: TDrawData): Boolean; var - el: TSvgElement; + el: TBaseElement; begin if (refEl <> '') then begin @@ -1179,7 +1281,7 @@ function TGradientElement.PrepareRenderer( // TRadGradElement //------------------------------------------------------------------------------ -constructor TRadGradElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TRadGradElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; radius.Init; @@ -1188,7 +1290,7 @@ constructor TRadGradElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); end; //------------------------------------------------------------------------------ -procedure TRadGradElement.AssignTo(other: TSvgElement); +procedure TRadGradElement.AssignTo(other: TBaseElement); begin if not Assigned(other) or not (other is TGradientElement) then Exit; inherited; @@ -1238,7 +1340,7 @@ function TRadGradElement.PrepareRenderer(renderer: TCustomGradientRenderer; if C.X.HasFontUnits then cp := C.GetPoint(drawDat.fontInfo.size, GetRelFracLimit) else cp := C.GetPoint(rec2, GetRelFracLimit); - cp := OffsetPoint(cp, rec2.Left, rec2.Top); + cp := TranslatePoint(cp, rec2.Left, rec2.Top); end else cp := rec2.MidPoint; MatrixApply(fDrawData.matrix, cp); @@ -1251,7 +1353,7 @@ function TRadGradElement.PrepareRenderer(renderer: TCustomGradientRenderer; if F.X.HasFontUnits then fp := F.GetPoint(drawDat.fontInfo.size, GetRelFracLimit) else fp := F.GetPoint(rec2, GetRelFracLimit); - fp := OffsetPoint(fp, rec2.Left, rec2.Top); + fp := TranslatePoint(fp, rec2.Left, rec2.Top); MatrixApply(fDrawData.matrix, fp); MatrixApply(drawDat.matrix, fp); end else @@ -1271,7 +1373,7 @@ function TRadGradElement.PrepareRenderer(renderer: TCustomGradientRenderer; // TLinGradElement //------------------------------------------------------------------------------ -constructor TLinGradElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TLinGradElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; startPt.Init; @@ -1279,7 +1381,7 @@ constructor TLinGradElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); end; //------------------------------------------------------------------------------ -procedure TLinGradElement.AssignTo(other: TSvgElement); +procedure TLinGradElement.AssignTo(other: TBaseElement); begin if not Assigned(other) or not (other is TGradientElement) then Exit; inherited; @@ -1338,7 +1440,7 @@ function TLinGradElement.PrepareRenderer( pt2.X := rec2.Width else pt2.X := endPt.X.GetValue(rec2.Width, GetRelFracLimit); pt2.Y := endPt.Y.GetValue(rec2.Height, GetRelFracLimit); - pt2 := OffsetPoint(pt2, rec2.Left, rec2.Top); + pt2 := TranslatePoint(pt2, rec2.Left, rec2.Top); MatrixApply(fDrawData.matrix, pt2); MatrixApply(drawDat.matrix, pt2); @@ -1361,7 +1463,7 @@ function TLinGradElement.PrepareRenderer( // TGradStopElement //------------------------------------------------------------------------------ -constructor TGradStopElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TGradStopElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; color := clBlack32; @@ -1371,7 +1473,7 @@ constructor TGradStopElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); // TFilterElement //------------------------------------------------------------------------------ -constructor TFilterElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TFilterElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fDrawData.visible := false; @@ -1458,6 +1560,8 @@ function TFilterElement.GetAdjustedBounds(const bounds: TRectD): TRectD; end; end; + if (delta.cx = InvalidD) or (delta.cy = InvalidD) then Exit; + //limit the filter margin to 20% if only blurring if not hasOffset then with delta, bounds do @@ -1569,13 +1673,14 @@ procedure TFilterElement.Apply(img: TImage32; try for i := 0 to fChilds.Count -1 do begin - case TSvgElement(fChilds[i]).fParserEl.hash of + case TBaseElement(fChilds[i]).fParserEl.hash of hfeBlend : TFeBlendElement(fChilds[i]).Apply; hfeColorMatrix : TFeColorMatrixElement(fChilds[i]).Apply; hfeComposite : TFeCompositeElement(fChilds[i]).Apply; hfeDefuseLighting : TFeDefuseLightElement(fChilds[i]).Apply; hfeDropShadow : TFeDropShadowElement(fChilds[i]).Apply; hfeFlood : TFeFloodElement(fChilds[i]).Apply; + hfeImage : TFeImageElement(fChilds[i]).Apply; hFeGaussianBlur : TFeGaussElement(fChilds[i]).Apply; hfeMerge : TFeMergeElement(fChilds[i]).Apply; hfeOffset : TFeOffsetElement(fChilds[i]).Apply; @@ -1595,7 +1700,7 @@ procedure TFilterElement.Apply(img: TImage32; function TFeBaseElement.GetParentAsFilterEl: TFilterElement; var - el: TSvgElement; + el: TBaseElement; begin el := fParent; while Assigned(el) and not (el is TFilterElement) do @@ -1666,11 +1771,21 @@ procedure TFeBlendElement.Apply; dstImg.Copy(dstImg2, dstRec2, dstRec); end; +//------------------------------------------------------------------------------ +// TFeImageElement +//------------------------------------------------------------------------------ + +procedure TFeImageElement.Apply; +begin + if GetSrcAndDst then + DrawRefElImage(refEl, dstImg, dstRec); +end; + //------------------------------------------------------------------------------ // TFeCompositeElement //------------------------------------------------------------------------------ -constructor TFeCompositeElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TFeCompositeElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fourKs[0] := InvalidD; fourKs[1] := InvalidD; @@ -1845,7 +1960,7 @@ procedure TFeDefuseLightElement.Apply; // TFeDropShadowElement //------------------------------------------------------------------------------ -constructor TFeDropShadowElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TFeDropShadowElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; stdDev := InvalidD; @@ -1871,7 +1986,7 @@ procedure TFeDropShadowElement.Apply; off := offset.GetPoint(RectD(pfe.fObjectBounds), GetRelFracLimit); off := ScalePoint(off, pfe.fScale); dstOffRec := dstRec; - with Point(off) do Types.OffsetRect(dstOffRec, X, Y); + with Point(off) do TranslateRect(dstOffRec, X, Y); dstImg.Copy(srcImg, srcRec, dstOffRec); dstImg.SetRGB(floodColor); alpha := GetAlpha(floodColor); @@ -1887,7 +2002,7 @@ procedure TFeDropShadowElement.Apply; // TFeFloodElement //------------------------------------------------------------------------------ -constructor TFeFloodElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TFeFloodElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; floodColor := clInvalid; @@ -1909,7 +2024,7 @@ procedure TFeFloodElement.Apply; // TFeGaussElement //------------------------------------------------------------------------------ -constructor TFeGaussElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TFeGaussElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; stdDev := InvalidD; @@ -1918,16 +2033,12 @@ constructor TFeGaussElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); procedure TFeGaussElement.Apply; begin - if not GetSrcAndDst then Exit; - + if not GetSrcAndDst or (stdDev = InvalidD) then Exit; if srcImg <> dstImg then dstImg.Copy(srcImg, srcRec, dstRec); - ////True GaussianBlur is visually optimal, but it's also *extremely* slow. - //GaussianBlur(dstImg, dstRec, Ceil(stdDev *PI * ParentFilterEl.fScale)); - - //FastGaussianBlur is a very good approximation and also very much faster. - //Empirically stdDev * PI/4 more closely emulates other renderers. + // FastGaussianBlur is a very good approximation and also very much faster. + // Empirically stdDev * PI/4 more closely emulates other renderers. FastGaussianBlur(dstImg, dstRec, Ceil(stdDev * PI/4 * ParentFilterEl.fScale)); end; @@ -1946,7 +2057,7 @@ procedure TFeMergeElement.Apply; pfe := ParentFilterEl; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TFeMergeNodeElement then + if TBaseElement(fChilds[i]) is TFeMergeNodeElement then with TFeMergeNodeElement(fChilds[i]) do begin if not GetSrcAndDst then Continue; @@ -1987,7 +2098,7 @@ procedure TFeOffsetElement.Apply; off := offset.GetPoint(RectD(pfe.fObjectBounds), GetRelFracLimit); off := ScalePoint(off, pfe.fScale); dstOffRec := dstRec; - with Point(off) do Types.OffsetRect(dstOffRec, X, Y); + with Point(off) do TranslateRect(dstOffRec, X, Y); if srcImg = dstImg then begin @@ -2018,7 +2129,7 @@ procedure TFeSpecLightElement.Apply; // TClipPathElement //------------------------------------------------------------------------------ -constructor TClipPathElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TClipPathElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fDrawData.visible := false; @@ -2031,7 +2142,7 @@ procedure TClipPathElement.GetPaths(const drawDat: TDrawData); begin if Assigned(drawPathsC) or Assigned(drawPathsO) then Exit; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TShapeElement then + if TBaseElement(fChilds[i]) is TShapeElement then with TShapeElement(fChilds[i]) do begin GetPaths(drawDat); @@ -2046,7 +2157,7 @@ procedure TClipPathElement.GetPaths(const drawDat: TDrawData); // TShapeElement //------------------------------------------------------------------------------ -constructor TShapeElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TShapeElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; elRectWH.Init; @@ -2062,7 +2173,7 @@ function TShapeElement.GetBounds: TRectD; begin Result := NullRectD; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TShapeElement then + if TBaseElement(fChilds[i]) is TShapeElement then Result := UnionRect(Result, TShapeElement(fChilds[i]).GetBounds); end; //------------------------------------------------------------------------------ @@ -2082,9 +2193,9 @@ procedure TShapeElement.Draw(image: TImage32; drawDat: TDrawData); filled : Boolean; clipRec : TRectD; clipRec2 : TRect; - clipPathEl : TSvgElement; - filterEl : TSvgElement; - maskEl : TSvgElement; + clipPathEl : TBaseElement; + filterEl : TBaseElement; + maskEl : TBaseElement; clipPaths : TPathsD; di : TDrawData; usingTempImage: Boolean; @@ -2216,7 +2327,7 @@ procedure TShapeElement.DrawMarkers(img: TImage32; drawDat: TDrawData); var i,j: integer; sw: double; - markerEl: TSvgElement; + markerEl: TBaseElement; markerPaths: TPathsD; pt1, pt2: TPointD; di: TDrawData; @@ -2301,8 +2412,9 @@ function TShapeElement.GetSimplePath(const drawDat: TDrawData): TPathsD; procedure TShapeElement.DrawFilled(img: TImage32; drawDat: TDrawData); var - refEl: TSvgElement; + refEl: TBaseElement; fillPaths: TPathsD; + rec: TRect; begin if not assigned(drawPathsF) then Exit; if drawDat.fillColor = clCurrent then @@ -2330,9 +2442,13 @@ procedure TShapeElement.DrawFilled(img: TImage32; drawDat: TDrawData); end else if refEl is TPatternElement then begin - with TPatternElement(refEl), fReader do - if PrepareRenderer(ImageRenderer, drawDat) then - DrawPolygon(img, fillPaths, drawDat.fillRule, ImageRenderer); + with TPatternElement(refEl) do + if PrepareRenderer(ImgRenderer, drawDat) then + begin + rec := img32.Vector.GetBounds(fillPaths); + ImgRenderer.Offset := rec.TopLeft; + DrawPolygon(img, fillPaths, drawDat.fillRule, ImgRenderer); + end; end; end; end @@ -2362,7 +2478,7 @@ procedure TShapeElement.DrawStroke(img: TImage32; scale: Double; strokeClr: TColor32; strokePaths: TPathsD; - refEl: TSvgElement; + refEl: TBaseElement; endStyle: TEndStyle; joinStyle: TJoinStyle; bounds: TRectD; @@ -2430,12 +2546,12 @@ procedure TShapeElement.DrawStroke(img: TImage32; fReader.LinGradRenderer, endStyle, joinStyle, roundingScale); end else if refEl is TPatternElement then - begin with TPatternElement(refEl) do - PrepareRenderer(fReader.ImageRenderer, drawDat); - DrawLine(img, strokePaths, scaledStrokeWidth, - fReader.ImageRenderer, endStyle, joinStyle, roundingScale); - end; + begin + PrepareRenderer(imgRenderer, drawDat); + DrawLine(img, strokePaths, scaledStrokeWidth, + imgRenderer, endStyle, joinStyle, roundingScale); + end; end else if (joinStyle = jsMiter) then begin @@ -2486,7 +2602,7 @@ procedure TShapeElement.SimpleDrawStroke(const paths: TPathsD; // TPathElement //------------------------------------------------------------------------------ -constructor TPathElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TPathElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fSvgPaths := TSvgPath.Create; @@ -2625,7 +2741,7 @@ procedure TPolyElement.ParsePoints(const value: UTF8String); // TLineElement //------------------------------------------------------------------------------ -constructor TLineElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TLineElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; SetLength(path, 2); @@ -2657,7 +2773,7 @@ function TLineElement.GetSimplePath(const drawDat: TDrawData): TPathsD; // TCircleElement //------------------------------------------------------------------------------ -constructor TCircleElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TCircleElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; centerPt.Init; @@ -2701,7 +2817,7 @@ procedure TCircleElement.GetPaths(const drawDat: TDrawData); // TEllipseElement //------------------------------------------------------------------------------ -constructor TEllipseElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TEllipseElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; centerPt.Init; @@ -2745,7 +2861,7 @@ procedure TEllipseElement.GetPaths(const drawDat: TDrawData); // TRectElement //------------------------------------------------------------------------------ -constructor TRectElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TRectElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; radius.Init; @@ -2799,7 +2915,7 @@ function TRectElement.GetSimplePath(const drawDat: TDrawData): TPathsD; // TTextElement //------------------------------------------------------------------------------ -constructor TTextElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TTextElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; offset.Init; @@ -2812,7 +2928,7 @@ function TTextElement.LoadContent: Boolean; i : integer; svgEl : TSvgTreeEl; elClass : TElementClass; - el : TSvgElement; + el : TBaseElement; begin Result := false; for i := 0 to fParserEl.childs.Count -1 do @@ -2827,7 +2943,7 @@ function TTextElement.LoadContent: Boolean; end else begin elClass := HashToElementClass(svgEl.hash); - if elClass = TSvgElement then Continue; + if elClass = TBaseElement then Continue; el := elClass.Create(self, svgEl); Self.fChilds.Add(el); el.LoadAttributes; @@ -2840,7 +2956,7 @@ function TTextElement.LoadContent: Boolean; function TTextElement.GetTopTextElement: TTextElement; var - el: TSvgElement; + el: TBaseElement; begin el := self; while Assigned(el.fParent) and (el.fParent is TTextElement) do @@ -2854,14 +2970,14 @@ procedure TTextElement.DoOffsetX(dx: double); i: integer; begin for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TTextElement then + if TBaseElement(fChilds[i]) is TTextElement then TTextElement(fChilds[i]).DoOffsetX(dx) - else if TSvgElement(fChilds[i]) is TSubTextElement then + else if TBaseElement(fChilds[i]) is TSubTextElement then with TSubTextElement(fChilds[i]) do begin - drawPathsC := OffsetPath(drawPathsC, dx, 0); - drawPathsO := OffsetPath(drawPathsO, dx, 0); - drawPathsF := OffsetPath(drawPathsF, dx, 0); + drawPathsC := TranslatePath(drawPathsC, dx, 0); + drawPathsO := TranslatePath(drawPathsO, dx, 0); + drawPathsF := TranslatePath(drawPathsF, dx, 0); end; end; //------------------------------------------------------------------------------ @@ -2870,7 +2986,7 @@ procedure TTextElement.GetPaths(const drawDat: TDrawData); var i : integer; dy : double; - el : TSvgElement; + el : TBaseElement; di : TDrawData; topTextEl : TTextElement; begin @@ -2929,7 +3045,7 @@ procedure TTextElement.GetPaths(const drawDat: TDrawData); end; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TShapeElement then + if TBaseElement(fChilds[i]) is TShapeElement then TShapeElement(fChilds[i]).GetPaths(di); end; //------------------------------------------------------------------------------ @@ -2978,7 +3094,7 @@ procedure TTextElement.Draw(img: TImage32; drawDat: TDrawData); // TSubtextElement //------------------------------------------------------------------------------ -constructor TSubtextElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TSubtextElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; hasPaths := true; @@ -3031,7 +3147,7 @@ function IsBlankText(const text: UnicodeString): Boolean; procedure TSubtextElement.GetPaths(const drawDat: TDrawData); var - el : TSvgElement; + el : TBaseElement; topTextEl : TTextElement; s: UnicodeString; tmpX, offsetX, scale, fontSize, bs: double; @@ -3113,7 +3229,7 @@ function TSubtextElement.GetBounds: TRectD; // TTSpanElement //------------------------------------------------------------------------------ -constructor TTSpanElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TTSpanElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fDrawData.FontInfo.decoration := fdUndefined; @@ -3140,7 +3256,7 @@ function GetPathDistance(const path: TPathD): double; procedure TTextPathElement.GetPaths(const drawDat: TDrawData); var parentTextEl, topTextEl: TTextElement; - el: TSvgElement; + el: TBaseElement; isFirst: Boolean; s: UnicodeString; i, dy, len, charsThatFit: integer; @@ -3176,11 +3292,11 @@ procedure TTextPathElement.GetPaths(const drawDat: TDrawData); if (fParserEl.text = '') then begin if (fChilds.Count = 0) or - not (TSvgElement(fChilds[0]) is TTSpanElement) then + not (TBaseElement(fChilds[0]) is TTSpanElement) then Exit; - el := TSvgElement(fChilds[0]); + el := TBaseElement(fChilds[0]); if (el.fChilds.Count = 0) or - not (TSvgElement(el.fChilds[0]) is TSubtextElement) then + not (TBaseElement(el.fChilds[0]) is TSubtextElement) then Exit; with TSubtextElement(el.fChilds[0]) do begin @@ -3264,7 +3380,7 @@ procedure TTextPathElement.GetPaths(const drawDat: TDrawData); // TMarkerElement //------------------------------------------------------------------------------ -constructor TMarkerElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TMarkerElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; fDrawData.visible := false; @@ -3360,9 +3476,10 @@ function TFillElement.GetRelFracLimit: double; // TPatternElement //------------------------------------------------------------------------------ -constructor TPatternElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TPatternElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin inherited; + imgRenderer := TImageRenderer.Create; elRectWH.Init; pattBoxWH.Width := InvalidD; pattBoxWH.Height := InvalidD; @@ -3370,12 +3487,19 @@ constructor TPatternElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); end; //------------------------------------------------------------------------------ +destructor TPatternElement.Destroy; +begin + imgRenderer.Free; + inherited; +end; +//------------------------------------------------------------------------------ + function TPatternElement.PrepareRenderer(renderer: TImageRenderer; drawDat: TDrawData): Boolean; var i : integer; recWH : TRectWH; - el : TSvgElement; + el : TBaseElement; rec : TRectD; mat : TMatrixD; sx,sy : double; @@ -3384,6 +3508,7 @@ function TPatternElement.PrepareRenderer(renderer: TImageRenderer; Result := false; scale := ExtractScaleFromMatrix(drawDat.matrix); + if units = hUserSpaceOnUse then rec := fReader.userSpaceBounds else rec := drawDat.bounds; @@ -3419,7 +3544,6 @@ function TPatternElement.PrepareRenderer(renderer: TImageRenderer; mat := IdentityMatrix; MatrixScale(mat, scale.cx * sx, scale.cy * sy); - //recWH.Left := 0; recWH.Top := 0; if (refEl <> '') then begin el := FindRefElement(refEl); @@ -3434,8 +3558,16 @@ function TPatternElement.PrepareRenderer(renderer: TImageRenderer; end; for i := 0 to fChilds.Count -1 do - if TSvgElement(fChilds[i]) is TShapeElement then + if TBaseElement(fChilds[i]) is TShapeElement then with TShapeElement(fChilds[i]) do + begin + drawDat := fDrawData; + drawDat.matrix := mat; + drawDat.bounds := rec; + Draw(renderer.Image, drawDat); + end + else if TBaseElement(fChilds[i]) is TImageElement then + with TImageElement(fChilds[i]) do begin drawDat := fDrawData; drawDat.matrix := mat; @@ -3445,74 +3577,97 @@ function TPatternElement.PrepareRenderer(renderer: TImageRenderer; end; //------------------------------------------------------------------------------ -// TSvgRootElement +// TSvgElement //------------------------------------------------------------------------------ -constructor TSvgRootElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +procedure TSvgElement.Draw(image: TImage32; drawDat: TDrawData); +var + sx, sy: double; begin - inherited Create(parent, svgEl); + if (fReader.RootElement <> self) and not viewboxWH.IsEmpty then + begin + sx := image.Width / viewboxWH.Width; + sy := image.Height / viewboxWH.Height; + MatrixScale(drawDat.matrix, sx, sy); + end; + inherited; +end; +//------------------------------------------------------------------------------ + +function TSvgElement.GetViewbox: TRectWH; +begin + if viewboxWH.IsEmpty then + begin + viewboxWH.Width := elRectWH.width.GetValue(defaultSvgWidth, 0); + viewboxWH.height := elRectWH.height.GetValue(defaultSvgHeight, 0); + end; + Result := viewboxWH; end; //------------------------------------------------------------------------------ -// TElement +// TBaseElement //------------------------------------------------------------------------------ -constructor TSvgElement.Create(parent: TSvgElement; svgEl: TSvgTreeEl); +constructor TBaseElement.Create(parent: TBaseElement; svgEl: TSvgTreeEl); begin {$IFDEF XPLAT_GENERICS} - fChilds := TList.create; + fChilds := TList.create; {$ELSE} fChilds := TList.Create; {$ENDIF} - fParserEl := svgEl; + fParserEl := svgEl; self.fParent := parent; - fDrawData := emptyDrawInfo; elRectWH.Init; + fDrawData := emptyDrawInfo; if Assigned(parent) then + begin + fDrawData.strokeCap := parent.fDrawData.strokeCap; + fDrawData.strokeJoin := parent.fDrawData.strokeJoin; fReader := parent.fReader; + end; end; //------------------------------------------------------------------------------ -destructor TSvgElement.Destroy; +destructor TBaseElement.Destroy; var i: integer; begin for i := 0 to fChilds.Count -1 do - TSvgElement(fChilds[i]).Free; + TBaseElement(fChilds[i]).Free; fChilds.Free; inherited; end; //------------------------------------------------------------------------------ -function TSvgElement.IsFirstChild: Boolean; +function TBaseElement.IsFirstChild: Boolean; begin Result := not Assigned(fParent) or (self = fParent.fChilds[0]); end; //------------------------------------------------------------------------------ -procedure TSvgElement.Draw(image: TImage32; drawDat: TDrawData); +procedure TBaseElement.Draw(image: TImage32; drawDat: TDrawData); begin DrawChildren(image, drawDat); end; //------------------------------------------------------------------------------ -procedure TSvgElement.DrawChildren(image: TImage32; drawDat: TDrawData); +procedure TBaseElement.DrawChildren(image: TImage32; drawDat: TDrawData); var i: integer; begin for i := 0 to fChilds.Count -1 do - with TSvgElement(fChilds[i]) do + with TBaseElement(fChilds[i]) do if fDrawData.visible then Draw(image, drawDat); end; //------------------------------------------------------------------------------ -function TSvgElement.GetChildCount: integer; +function TBaseElement.GetChildCount: integer; begin Result := fChilds.Count; end; //------------------------------------------------------------------------------ -function TSvgElement.FindChild(const idName: UTF8String): TSvgElement; +function TBaseElement.FindChild(const idName: UTF8String): TBaseElement; var i: integer; begin @@ -3531,15 +3686,15 @@ function TSvgElement.FindChild(const idName: UTF8String): TSvgElement; end; //------------------------------------------------------------------------------ -function TSvgElement.GetChild(index: integer): TSvgElement; +function TBaseElement.GetChild(index: integer): TBaseElement; begin if (index < 0) or (index >= fChilds.count) then Result := nil else - Result := TSvgElement(fChilds[index]); + Result := TBaseElement(fChilds[index]); end; //------------------------------------------------------------------------------ -function TSvgElement.FindRefElement(refname: UTF8String): TSvgElement; +function TBaseElement.FindRefElement(refname: UTF8String): TBaseElement; var i, len: integer; c, endC: PUTF8Char; @@ -3559,7 +3714,7 @@ function TSvgElement.FindRefElement(refname: UTF8String): TSvgElement; ref := ToUTF8String(c, endC); i := fReader.fIdList.IndexOf(string(ref)); if i >= 0 then - Result := TSvgElement(fReader.fIdList.Objects[i]) else + Result := TBaseElement(fReader.fIdList.Objects[i]) else Result := nil; end; @@ -3567,40 +3722,44 @@ function TSvgElement.FindRefElement(refname: UTF8String): TSvgElement; // dozens of function to process various element attributes //------------------------------------------------------------------------------ -procedure Id_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Id_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin aOwnerEl.fId := value; aOwnerEl.fReader.fIdList.AddObject(string(value), aOwnerEl); end; //------------------------------------------------------------------------------ -procedure In_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure In_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if aOwnerEl is TFeBaseElement then TFeBaseElement(aOwnerEl).in1 := value; end; //------------------------------------------------------------------------------ -procedure In2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure In2_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if aOwnerEl is TFeBaseElement then TFeBaseElement(aOwnerEl).in2 := value; end; //------------------------------------------------------------------------------ -procedure LetterSpacing_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure LetterSpacing_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin with TTextElement(aOwnerEl) do UTF8StringToFloat(value, fDrawData.FontInfo.spacing); end; //------------------------------------------------------------------------------ -procedure Href_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Href_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var - el: TSvgElement; + el: TBaseElement; begin el := aOwnerEl; case el.fParserEl.Hash of + hFeImage: + TFeImageElement(el).refEl := ExtractRef(value); + hImage: + TImageElement(el).refEl := ExtractRef(value); hUse: TUseElement(el).refEl := ExtractRef(value); hTextPath: @@ -3611,7 +3770,7 @@ procedure Href_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure BaselineShift_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure BaselineShift_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -3635,7 +3794,7 @@ procedure BaselineShift_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Color_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Color_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var color: TColor32; begin @@ -3648,7 +3807,7 @@ procedure Color_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure LightingColor_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure LightingColor_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var color: TColor32; begin @@ -3661,20 +3820,20 @@ procedure LightingColor_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure ClipPath_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure ClipPath_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin aOwnerEl.fDrawData.clipElRef := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure D_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure D_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if aOwnerEl is TPathElement then TPathElement(aOwnerEl).ParseDAttrib(value); end; //------------------------------------------------------------------------------ -procedure Fill_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Fill_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin case aOwnerEl.fParserEl.Hash of hfeDropShadow: @@ -3692,7 +3851,7 @@ procedure Fill_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure FillOpacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure FillOpacity_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -3710,7 +3869,7 @@ procedure FillOpacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure DashArray_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure DashArray_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var c, endC: PUTF8Char; val: double; @@ -3731,7 +3890,7 @@ procedure DashArray_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure DashOffset_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure DashOffset_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var c, endC: PUTF8Char; begin @@ -3742,20 +3901,20 @@ procedure DashOffset_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Display_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Display_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if GetHash(value) = hNone then aOwnerEl.fDrawData.visible := false; end; //------------------------------------------------------------------------------ -procedure Font_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Font_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin GetSvgFontInfo(value, aOwnerEl.fDrawData.FontInfo); end; //------------------------------------------------------------------------------ -procedure FontFamily_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure FontFamily_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var word: UTF8String; c, endC: PUTF8Char; @@ -3779,7 +3938,7 @@ procedure FontFamily_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure FontSize_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure FontSize_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var num: double; c, endC: PUTF8Char; @@ -3790,7 +3949,7 @@ procedure FontSize_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure FontStyle_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure FontStyle_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin with aOwnerEl.fDrawData.FontInfo do if GetHash(value) = hItalic then @@ -3799,7 +3958,7 @@ procedure FontStyle_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure FontWeight_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure FontWeight_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var num: double; @@ -3827,7 +3986,7 @@ procedure FontWeight_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Fx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Fx_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TRadGradElement) then with TRadGradElement(aOwnerEl) do @@ -3837,7 +3996,7 @@ procedure Fx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Fy_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Fy_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TRadGradElement) then with TRadGradElement(aOwnerEl) do @@ -3847,7 +4006,7 @@ procedure Fy_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure TextAlign_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure TextAlign_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin with aOwnerEl.fDrawData.FontInfo do case GetHash(value) of @@ -3859,7 +4018,7 @@ procedure TextAlign_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure TextDecoration_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure TextDecoration_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin with aOwnerEl.fDrawData.FontInfo do case GetHash(value) of @@ -3870,49 +4029,49 @@ procedure TextDecoration_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure TextLength_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure TextLength_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin UTF8StringToFloat(value, aOwnerEl.fDrawData.FontInfo.textLength); end; //------------------------------------------------------------------------------ -procedure MarkerStart_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure MarkerStart_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if not (aOwnerEl is TShapeElement) then Exit; aOwnerEl.fDrawData.markerStart := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure MarkerMiddle_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure MarkerMiddle_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if not (aOwnerEl is TShapeElement) then Exit; aOwnerEl.fDrawData.markerMiddle := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure MarkerEnd_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure MarkerEnd_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if not (aOwnerEl is TShapeElement) then Exit; aOwnerEl.fDrawData.markerEnd := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure Filter_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Filter_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TShapeElement) then aOwnerEl.fDrawData.filterElRef := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure Mask_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Mask_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TShapeElement) then aOwnerEl.fDrawData.maskElRef := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure Offset_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Offset_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: TValue; begin @@ -3926,7 +4085,7 @@ procedure Offset_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Opacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Opacity_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var opacity: double; begin @@ -3937,7 +4096,7 @@ procedure Opacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Operator_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Operator_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TFeCompositeElement) then with TFeCompositeElement(aOwnerEl) do @@ -3952,7 +4111,7 @@ procedure Operator_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Orient_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Orient_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TMarkerElement) and (GetHash(value) = hauto_045_start_045_reverse) then @@ -3960,7 +4119,7 @@ procedure Orient_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure StopColor_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StopColor_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var acolor: TColor32; begin @@ -3976,30 +4135,32 @@ procedure StopColor_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure StopOpacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StopOpacity_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if aOwnerEl is TGradStopElement then UTF8StringToOpacity(value, TGradStopElement(aOwnerEl).color); end; //------------------------------------------------------------------------------ -procedure Points_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Points_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if aOwnerEl is TPolyElement then TPolyElement(aOwnerEl).ParsePoints(value); end; //------------------------------------------------------------------------------ -procedure Stroke_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Stroke_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if Match(PUTF8Char(value), 'url(') then aOwnerEl.fDrawData.strokeEl := ExtractRef(value) + else if Match(PUTF8Char(value), 'currentcolor') then + // do nothing else UTF8StringToColor32(value, aOwnerEl.fDrawData.strokeColor); end; //------------------------------------------------------------------------------ -procedure StrokeLineCap_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StrokeLineCap_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var word: UTF8String; c, endC: PUTF8Char; @@ -4016,7 +4177,7 @@ procedure StrokeLineCap_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure StrokeLineJoin_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StrokeLineJoin_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var word: UTF8String; c, endC: PUTF8Char; @@ -4033,13 +4194,13 @@ procedure StrokeLineJoin_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure StrokeMiterLimit_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StrokeMiterLimit_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin UTF8StringToFloat(value, aOwnerEl.fDrawData.strokeMitLim); end; //------------------------------------------------------------------------------ -procedure StrokeOpacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StrokeOpacity_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -4048,7 +4209,7 @@ procedure StrokeOpacity_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure StrokeWidth_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StrokeWidth_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin with aOwnerEl do begin @@ -4058,7 +4219,7 @@ procedure StrokeWidth_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure FillRule_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure FillRule_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if LowerCaseTable[value[1]] = 'e' then aOwnerEl.fDrawData.fillRule := frEvenOdd else @@ -4066,14 +4227,14 @@ procedure FillRule_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Transform_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Transform_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin with aOwnerEl.fDrawData do matrix := MatrixMultiply(matrix, ParseTransform(value)); end; //------------------------------------------------------------------------------ -procedure Values_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Values_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var cnt: integer; c, endC: PUTF8Char; @@ -4092,7 +4253,7 @@ procedure Values_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure GradientTransform_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure GradientTransform_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mat: TMatrixD; begin @@ -4103,7 +4264,7 @@ procedure GradientTransform_Attrib(aOwnerEl: TSvgElement; const value: UTF8Strin end; //------------------------------------------------------------------------------ -procedure GradientUnits_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure GradientUnits_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if aOwnerEl is TFillElement then with TFillElement(aOwnerEl) do @@ -4111,7 +4272,7 @@ procedure GradientUnits_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Viewbox_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Viewbox_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); function LoadViewbox: TRectWH; var @@ -4129,7 +4290,7 @@ procedure Viewbox_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); begin case aOwnerEl.fParserEl.Hash of - hSvg : TSvgRootElement(aOwnerEl).viewboxWH := LoadViewbox; + hSvg : TSvgElement(aOwnerEl).viewboxWH := LoadViewbox; hMarker : TMarkerElement(aOwnerEl).markerBoxWH := LoadViewbox; hSymbol : TSymbolElement(aOwnerEl).viewboxWH := LoadViewbox; else if aOwnerEl is TPatternElement then @@ -4138,7 +4299,7 @@ procedure Viewbox_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Visibility_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Visibility_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin case GetHash(value) of hCollapse: aOwnerEl.fDrawData.visible := false; @@ -4149,7 +4310,7 @@ procedure Visibility_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); //------------------------------------------------------------------------------ -procedure Height_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Height_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4162,7 +4323,7 @@ procedure Height_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Width_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Width_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4175,7 +4336,7 @@ procedure Width_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Cx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Cx_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4195,7 +4356,7 @@ procedure Cx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Cy_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Cy_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4215,7 +4376,7 @@ procedure Cy_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Dx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Dx_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4232,7 +4393,7 @@ procedure Dx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Dy_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Dy_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4249,14 +4410,14 @@ procedure Dy_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Result_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Result_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); begin if (aOwnerEl is TFeBaseElement) then TFeBaseElement(aOwnerEl).res := ExtractRef(value); end; //------------------------------------------------------------------------------ -procedure Rx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Rx_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4291,7 +4452,7 @@ procedure Rx_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Ry_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Ry_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4314,7 +4475,7 @@ procedure Ry_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure SpreadMethod_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure SpreadMethod_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var word: UTF8String; c, endC: PUTF8Char; @@ -4332,7 +4493,7 @@ procedure SpreadMethod_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure SpectacularExponent(aOwnerEl: TSvgElement; const value: UTF8String); +procedure SpectacularExponent(aOwnerEl: TBaseElement; const value: UTF8String); var se: double; begin @@ -4343,7 +4504,7 @@ procedure SpectacularExponent(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure StdDev_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure StdDev_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var sd: double; begin @@ -4358,7 +4519,7 @@ procedure StdDev_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure K1_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure K1_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -4368,7 +4529,7 @@ procedure K1_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure K2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure K2_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -4378,7 +4539,7 @@ procedure K2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure K3_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure K3_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -4388,7 +4549,7 @@ procedure K3_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure K4_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure K4_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -4398,7 +4559,7 @@ procedure K4_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure X1_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure X1_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4423,7 +4584,7 @@ procedure X1_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure X2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure X2_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4441,7 +4602,7 @@ procedure X2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Y1_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Y1_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4466,7 +4627,7 @@ procedure Y1_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Y2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Y2_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var mu: TUnitType; val: double; @@ -4484,7 +4645,7 @@ procedure Y2_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); end; //------------------------------------------------------------------------------ -procedure Z_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); +procedure Z_Attrib(aOwnerEl: TBaseElement; const value: UTF8String); var val: double; begin @@ -4496,7 +4657,7 @@ procedure Z_Attrib(aOwnerEl: TSvgElement; const value: UTF8String); //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -procedure TSvgElement.LoadAttribute(attrib: PSvgAttrib); +procedure TBaseElement.LoadAttribute(attrib: PSvgAttrib); begin with attrib^ do case hash of @@ -4587,7 +4748,7 @@ procedure TSvgElement.LoadAttribute(attrib: PSvgAttrib); end; //------------------------------------------------------------------------------ -procedure TSvgElement.LoadAttributes; +procedure TBaseElement.LoadAttributes; var i: integer; begin @@ -4608,7 +4769,7 @@ function PreferRelativeFraction(val: TValue): TTriState; end; //------------------------------------------------------------------------------ -function TSvgElement.GetRelFracLimit: double; +function TBaseElement.GetRelFracLimit: double; begin //the default behaviour here is to assume untyped fractional values //below 1.0 are values relative (to the bounding size) BUT ONLY WHEN @@ -4628,12 +4789,12 @@ function TSvgElement.GetRelFracLimit: double; end; //------------------------------------------------------------------------------ -function TSvgElement.LoadContent: Boolean; +function TBaseElement.LoadContent: Boolean; var i : integer; svgEl : TSvgTreeEl; elClass : TElementClass; - el : TSvgElement; + el : TBaseElement; begin Result := false; for i := 0 to fParserEl.childs.Count -1 do @@ -4661,7 +4822,6 @@ constructor TSvgReader.Create; fClassStyles := TClassStylesList.Create; fLinGradRenderer := TLinearGradientRenderer.Create; fRadGradRenderer := TSvgRadialGradientRenderer.Create; - fImgRenderer := TImageRenderer.Create; fIdList := TStringList.Create; fIdList.Duplicates := dupIgnore; fIdList.CaseSensitive := false; @@ -4684,7 +4844,6 @@ destructor TSvgReader.Destroy; fLinGradRenderer.Free; fRadGradRenderer.Free; - fImgRenderer.Free; FreeAndNil(fFontCache); fSimpleDrawList.Free; @@ -4702,7 +4861,6 @@ procedure TSvgReader.Clear; fClassStyles.Clear; fLinGradRenderer.Clear; fRadGradRenderer.Clear; - fImgRenderer.Image.Clear; currentColor := clBlack32; userSpaceBounds := NullRectD; for i := 0 to fSimpleDrawList.Count -1 do @@ -4711,32 +4869,6 @@ procedure TSvgReader.Clear; end; //------------------------------------------------------------------------------ -function TSvgReader.GetViewbox(containerWidth, containerHeight: integer): TRectWH; -begin - if not Assigned(RootElement) then - begin - Result := RectWH(0,0,0,0); - Exit; - end; - - with RootElement do - begin - Result.Left := 0; - Result.Top := 0; - Result.Width := elRectWH.width.GetValue(containerWidth, 0); - Result.Height := elRectWH.height.GetValue(containerHeight, 0); - - if viewboxWH.IsEmpty then - begin - if Result.IsEmpty then - Result := RectWH(0, 0,containerWidth, containerHeight); - viewboxWH := Result; - end else if Result.IsEmpty then - Result := viewboxWH; - end; -end; -//------------------------------------------------------------------------------ - procedure TSvgReader.DrawImage(img: TImage32; scaleToImage: Boolean); var scale, scale2: double; @@ -4744,12 +4876,13 @@ procedure TSvgReader.DrawImage(img: TImage32; scaleToImage: Boolean); di: TDrawData; begin if not Assigned(fRootElement) or not assigned(img) then Exit; - vbox := GetViewbox(img.Width, img.Height); - if vbox.IsEmpty then Exit; - fBackgndImage := img; with fRootElement do begin + vbox := GetViewbox; + if vbox.IsEmpty then Exit; // this should never happen + fBackgndImage := img; + di := fDrawData; if di.currentColor = clInvalid then di.currentColor := currentColor; @@ -4760,9 +4893,7 @@ procedure TSvgReader.DrawImage(img: TImage32; scaleToImage: Boolean); //rendered image unless they are percentage values. Nevertheless, these //values can be still overridden by the scaleToImage parameter above - if vbox.IsEmpty then - di.bounds := RectD(img.Bounds) else - di.bounds := viewboxWH.RectD; + di.bounds := viewboxWH.RectD; userSpaceBounds := fDrawData.bounds; if scaleToImage and not img.IsEmpty then @@ -4770,13 +4901,15 @@ procedure TSvgReader.DrawImage(img: TImage32; scaleToImage: Boolean); //nb: the calculated vbox.width and vbox.height are ignored here since //we're scaling the SVG image to the display image. However we still //need to call GetViewbox (above) to make sure that viewboxWH is filled. - - scale := img.width / viewboxWH.Width; - scale2 := img.height / viewboxWH.Height; if fUsePropScale then begin - if scale2 < scale then scale := scale2 - else scale2 := scale; + scale := GetScaleForBestFit( + viewboxWH.Width, viewboxWH.Height, img.Width, img.Height); + scale2 := scale; + end else + begin + scale := GetScale(viewboxWH.Width, img.Width); + scale2 := GetScale(viewboxWH.Height, img.Height); end; MatrixScale(di.matrix, scale, scale2); img.SetSize( @@ -4811,7 +4944,7 @@ function TSvgReader.LoadInternal: Boolean; Result := false; if not Assigned(fSvgParser.svgTree) or (fSvgParser.svgTree.hash <> hSvg) then Exit; - fRootElement := TSvgRootElement.Create(nil, fSvgParser.svgTree); + fRootElement := TSvgElement.Create(nil, fSvgParser.svgTree); fRootElement.fReader := self; fRootElement.LoadAttributes; Result := fRootElement.LoadContent; @@ -4862,7 +4995,7 @@ procedure TSvgReader.SetOverrideStrokeColor(color: TColor32); end; //------------------------------------------------------------------------------ -function TSvgReader.FindElement(const idName: UTF8String): TSvgElement; +function TSvgReader.FindElement(const idName: UTF8String): TBaseElement; begin if Assigned(RootElement) then Result := RootElement.FindChild(idName) else diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Text.pas b/Ext/SVGIconImageList/Image32/source/Img32.Text.pas index 620d2eb..bf4821c 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Text.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Text.pas @@ -2036,7 +2036,7 @@ function TFontReader.GetWeight: integer; end; GetGlyphInfo(Ord('G'),glyph, dummy, gm); rec := GetBoundsD(glyph); - glyph := Img32.Vector.OffsetPath(glyph, -rec.Left, -rec.Top); + glyph := Img32.Vector.TranslatePath(glyph, -rec.Left, -rec.Top); glyph := Img32.Vector.ScalePath(glyph, imgSize/rec.Width, imgSize/rec.Height); img := TImage32.Create(imgSize,imgSize); @@ -2441,7 +2441,7 @@ function TFontCache.GetTextOutline(const rec: TRect; with wordList.GetWord(j) do if aWord > #32 then begin - app := OffsetPath(paths, x, y + Ascent); + app := TranslatePath(paths, x, y + Ascent); pp := MergePathsArray(app); AppendPath(Result, pp); x := x + width; @@ -2483,7 +2483,7 @@ function TFontCache.GetTextOutline(const rec: TRect; else Exit; end; - Result := OffsetPath(Result, 0, dy); + Result := TranslatePath(Result, 0, dy); finally wl.Free; end; @@ -2552,7 +2552,7 @@ function TFontCache.GetVerticalTextOutline(x, y: double; y := y + yMax * scale; //yMax = char ascent dy := - yMin * scale; //yMin = char descent end; - AppendPath(Result, Img32.Vector.OffsetPath( glyphInfo.contours, x + dx, y)); + AppendPath(Result, TranslatePath( glyphInfo.contours, x + dx, y)); if text[i] = #32 then y := y + dy - interCharSpace else y := y + dy + interCharSpace; @@ -2593,7 +2593,7 @@ function TFontCache.GetTextOutlineInternal(x, y: double; nextX := nextX + prevGlyphKernList[j].kernValue * fScale; end; - currGlyph := OffsetPath(glyphInfo.contours, nextX, y); + currGlyph := TranslatePath(glyphInfo.contours, nextX, y); dx := glyphInfo.metrics.hmtx.advanceWidth * fScale; if i = underlineIdx then @@ -2895,7 +2895,7 @@ function DrawVerticalText(image: TImage32; x, y, interCharSpace: double; y := y + yMax * scale; //yMax = char ascent dy := - yMin * scale; //yMin = char descent end; - glyphs := Img32.Vector.OffsetPath( glyphInfo.contours, x + dx, y); + glyphs := TranslatePath( glyphInfo.contours, x + dx, y); DrawPolygon(image, glyphs, frNonZero, textColor); if text[i] = #32 then y := y + dy - interCharSpace else @@ -3012,7 +3012,7 @@ function GetTextOutlineOnPath(const text: UnicodeString; pt.X := pathInfo.pt.X + pathInfo.vector.X * dx - rotatePt.X; pt.Y := pathInfo.pt.Y + pathInfo.vector.Y * dx - rotatePt.Y; - tmpPaths := OffsetPath(tmpPaths, pt.X, pt.Y); + tmpPaths := TranslatePath(tmpPaths, pt.X, pt.Y); AppendPath(Result, tmpPaths); end; end; diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Transform.pas b/Ext/SVGIconImageList/Image32/source/Img32.Transform.pas index d5d561c..36dcf6c 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Transform.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Transform.pas @@ -3,15 +3,11 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 7 April 2023 * +* Date : 30 April 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2021 * -* * +* Copyright : Angus Johnson 2019-2024 * * Purpose : Affine and projective transformation routines for TImage32 * -* * -* License : Use, modification & distribution is subject to * -* Boost Software License Ver 1 * -* http://www.boost.org/LICENSE_1_0.txt * +* License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) interface @@ -19,8 +15,7 @@ interface {$I Img32.inc} uses - SysUtils, Classes, Math, Types, - Img32, Img32.Vector; + SysUtils, Classes, Math, Types, Img32, Img32.Vector; type TMatrixD = array [0..2, 0..2] of double; @@ -41,12 +36,15 @@ interface procedure MatrixApply(const matrix: TMatrixD; var rec: TRectD); overload; procedure MatrixApply(const matrix: TMatrixD; var path: TPathD); overload; procedure MatrixApply(const matrix: TMatrixD; var paths: TPathsD); overload; + procedure MatrixApply(const matrix: TMatrixD; + img: TImage32; scaleAdjust: Boolean = false); overload; + function MatrixInvert(var matrix: TMatrixD): Boolean; - //MatrixSkew: dx represents the delta offset of an X coordinate as a - //fraction of its Y coordinate, and likewise for dy. For example, if dx = 0.1 - //and dy = 0, and the matrix is applied to the coordinate [20,15], then the - //transformed coordinate will become [20 + (15 * 0.1),10], ie [21.5,10]. + // MatrixSkew: dx represents the delta offset of an X coordinate as a + // fraction of its Y coordinate, and likewise for dy. Example: if dx = 0.1 + // and dy = 0, and the matrix is applied to the coordinate [20,15], then the + // transformed coordinate will become [20 + (15 * 0.1),10], ie [21.5,10]. procedure MatrixSkew(var matrix: TMatrixD; angleX, angleY: double); procedure MatrixScale(var matrix: TMatrixD; scale: double); overload; procedure MatrixScale(var matrix: TMatrixD; scaleX, scaleY: double); overload; @@ -54,10 +52,18 @@ interface const center: TPointD; angRad: double); procedure MatrixTranslate(var matrix: TMatrixD; dx, dy: double); - //AffineTransformImage: automagically resizes and translates the image - function AffineTransformImage(img: TImage32; matrix: TMatrixD): TPoint; + // The following MatrixExtract routines assume here is no skew + procedure MatrixExtractScale(const mat: TMatrixD; out sx, sy: double); + procedure MatrixExtractTranslation(const mat: TMatrixD; out dx, dy: double); + procedure MatrixExtractRotation(const mat: TMatrixD; out angle: double); + + // AffineTransformImage: will automagically translate the image + // Note: "scaleAdjust" prevents antialiasing extending way outside of images + // when they are being enlarged significantly and rotated concurrently + function AffineTransformImage(img: TImage32; matrix: TMatrixD; + scaleAdjust: Boolean = false): TPoint; - //ProjectiveTransform: + // ProjectiveTransform: // srcPts, dstPts => each path must contain 4 points // margins => the margins around dstPts (in the dest. projective). // Margins are only meaningful when srcPts are inside the image. @@ -106,6 +112,8 @@ interface implementation +uses Img32.Resamplers; + resourcestring rsInvalidScale = 'Invalid matrix scaling factor (0)'; @@ -204,15 +212,11 @@ procedure MatrixApply(const matrix: TMatrixD; var pt: TPointD); procedure MatrixApply(const matrix: TMatrixD; var rec: TRect); var - l,t,b,r,tmpX: double; + path: TPathD; begin - tmpX := rec.Left; - l := tmpX * matrix[0, 0] + rec.Top * matrix[1, 0] + matrix[2, 0]; - t := tmpX * matrix[0, 1] + rec.Top * matrix[1, 1] + matrix[2, 1]; - tmpX := rec.Right; - r := tmpX * matrix[0, 0] + rec.Bottom * matrix[1, 0] + matrix[2, 0]; - b := tmpX * matrix[0, 1] + rec.Bottom * matrix[1, 1] + matrix[2, 1]; - rec := Rect(RectD(l,t,r,b)); + path := Rectangle(rec); + MatrixApply(matrix, path); + rec := GetBounds(path); end; //------------------------------------------------------------------------------ @@ -270,6 +274,13 @@ procedure MatrixApply(const matrix: TMatrixD; var paths: TPathsD); end; //------------------------------------------------------------------------------ +procedure MatrixApply(const matrix: TMatrixD; + img: TImage32; scaleAdjust: Boolean); +begin + AffineTransformImage(img, matrix, scaleAdjust); +end; +//------------------------------------------------------------------------------ + function MatrixMultiply(const modifier, matrix: TMatrixD): TMatrixD; var i, j: Integer; @@ -376,6 +387,36 @@ procedure MatrixSkew(var matrix: TMatrixD; angleX, angleY: double); m[0, 1] := tan(angleY); matrix := MatrixMultiply(m, matrix); end; +//------------------------------------------------------------------------------ + +procedure MatrixExtractScale(const mat: TMatrixD; out sx, sy: double); +begin + sx := Sqrt(Sqr(mat[0,0]) + Sqr(mat[0,1])); + sy := Sqrt(Sqr(mat[1,0]) + Sqr(mat[1,1])); +end; +//------------------------------------------------------------------------------ + +procedure MatrixExtractTranslation(const mat: TMatrixD; out dx, dy: double); +begin + dx := mat[2,0]; + dy := mat[2,1]; +end; +//------------------------------------------------------------------------------ + +procedure MatrixExtractRotation(const mat: TMatrixD; out angle: double); +var + sx, sy: double; + mat2: TMatrixD; +begin + MatrixExtractScale(mat, sx, sy); + mat2 := mat; + mat2[0,0] := mat2[0,0] / sx; + mat2[0,1] := mat2[0,1] / sx; + mat2[1,0] := mat2[1,0] / sy; + mat2[1,1] := mat2[1,1] / sy; + + angle := ArcCos(mat2[0,0]); +end; //------------------------------------------------------------------------------ // Affine Transformation @@ -391,31 +432,58 @@ function GetTransformBounds(img: TImage32; const matrix: TMatrixD): TRect; end; //------------------------------------------------------------------------------ -function AffineTransformImage(img: TImage32; matrix: TMatrixD): TPoint; +function AffineTransformImage(img: TImage32; matrix: TMatrixD; + scaleAdjust: Boolean): TPoint; var - i,j, srcWidth, srcHeight: integer; + i, j: integer; newWidth, newHeight: integer; - x,y: double; + sx, sy, x,y: double; + xLimLo, yLimLo, xLimHi, yLimHi: double; pc: PColor32; tmp: TArrayOfColor32; dstRec: TRect; resampler: TResamplerFunction; +{$IFDEF USE_DOWNSAMPLER_AUTOMATICALLY} + rx: double; + useBoxDownsampler: Boolean; +{$ENDIF} begin Result := NullPoint; - srcWidth := img.Width; - srcHeight := img.Height; - - if img.Resampler = 0 then - resampler := nil else - resampler := GetResampler(img.Resampler); + if IsIdentityMatrix(matrix) or + img.IsEmpty or (img.Resampler = 0) then Exit; - if not Assigned(resampler) or - (srcWidth * srcHeight = 0) or IsIdentityMatrix(matrix) then - Exit; + resampler := GetResampler(img.Resampler); + if not Assigned(resampler) then Exit; //auto-resize the image so it'll fit transformed image - dstRec := GetTransformBounds(img, matrix); + + dstRec := img.Bounds; + MatrixApply(matrix, dstRec); RectWidthHeight(dstRec, newWidth, newHeight); + + MatrixExtractScale(matrix, sx, sy); +{$IFDEF USE_DOWNSAMPLER_AUTOMATICALLY} + if (sx < 1.0) and (sy < 1.0) then + begin + //only use box downsampling when downsizing + MatrixExtractRotation(matrix, rx); + useBoxDownsampler := (rx = 0); + end else + useBoxDownsampler := false; + + if useBoxDownsampler then + begin + BoxDownSampling(img, sx, sy); + Exit; + end; +{$ENDIF} + + if scaleAdjust then + begin + sx := Max(1, sx * 0.5); + sy := Max(1, sy * 0.5); + end; + //auto-translate the image too Result := dstRec.TopLeft; @@ -425,17 +493,29 @@ function AffineTransformImage(img: TImage32; matrix: TMatrixD): TPoint; SetLength(tmp, newWidth * newHeight); pc := @tmp[0]; + xLimLo := -0.5/sx; + xLimHi := img.Width + 0.5/sx; + yLimLo := -0.5/sy; + yLimHi := img.Height + 0.5/sy; - for i := dstRec.Top to + dstRec.Bottom -1 do + for i := dstRec.Top to dstRec.Bottom -1 do + begin for j := dstRec.Left to dstRec.Right -1 do begin - //convert dest X,Y to src X,Y ... x := j; y := i; MatrixApply(matrix, x, y); - //get weighted pixel (slow) - pc^ := resampler(img, Round(x * 256), Round(y * 256)); + + if (x <= xLimLo) or (x >= xLimHi) or (y <= yLimLo) or (y >= yLimHi) then + pc^ := clNone32 + else + // nb: -0.5 below is needed to properly center the transformed image + // (and this is most obviously needed when there is large scaling) + pc^ := resampler(img, x - 0.5, y - 0.5); + inc(pc); end; + end; + img.BeginUpdate; try img.SetSize(newWidth, newHeight); @@ -507,6 +587,36 @@ procedure GetSrcCoords256(const matrix: TMatrixD; var x, y: integer); end; //------------------------------------------------------------------------------ +procedure GetSrcCoords(const matrix: TMatrixD; var x, y: double); +{$IFDEF INLINE} inline; {$ENDIF} +var + zz: double; +const + Q: integer = MaxInt div 256; +begin + //returns coords multiplied by 256 in anticipation of the following + //GetWeightedPixel function call which in turn expects the lower 8bits + //of the integer coord value to represent a fraction. + zz := 1; + MatrixMulCoord(matrix, x, y, zz); + + if zz = 0 then + begin + if x >= 0 then x := Q else x := -MaxDouble; + if y >= 0 then y := Q else y := -MaxDouble; + end else + begin + x := x/zz; + if x > Q then x := MaxDouble + else if x < -Q then x := -MaxDouble; + + y := y/zz; + if y > Q then y := MaxDouble + else if y < -Q then y := -MaxDouble + end; +end; +//------------------------------------------------------------------------------ + function GetProjectionMatrix(const srcPts, dstPts: TPathD): TMatrixD; var srcMat, dstMat: TMatrixD; @@ -528,7 +638,8 @@ function ProjectiveTransform(img: TImage32; const srcPts, dstPts: TPathD; const margins: TRect): Boolean; var w,h,i,j: integer; - x,y: integer; + x,y: double; + xLimLo, yLimLo, xLimHi, yLimHi: double; rec: TRect; dstPts2: TPathD; mat: TMatrixD; @@ -551,7 +662,12 @@ function ProjectiveTransform(img: TImage32; dec(rec.Top, margins.Top); inc(rec.Right, margins.Right); inc(rec.Bottom, margins.Bottom); - dstPts2 := OffsetPath(dstPts, -rec.Left, -rec.Top); + dstPts2 := TranslatePath(dstPts, -rec.Left, -rec.Top); + + xLimLo := -0.5; + xLimHi := img.Width + 0.5; + yLimLo := -0.5; + yLimHi := img.Height + 0.5; mat := GetProjectionMatrix(srcPts, dstPts2); RectWidthHeight(rec, w, h); @@ -561,8 +677,12 @@ function ProjectiveTransform(img: TImage32; for j := 0 to w -1 do begin x := j; y := i; - GetSrcCoords256(mat, x, y); - pc^ := resampler(img, x, y); + GetSrcCoords(mat, x, y); + + if (x <= xLimLo) or (x >= xLimHi) or (y <= yLimLo) or (y >= yLimHi) then + pc^ := clNone32 + else + pc^ := resampler(img, x -0.5, y -0.5); inc(pc); end; img.SetSize(w, h); @@ -688,7 +808,8 @@ function SplineVertTransform(img: TImage32; const topSpline: TPathD; splineType: TSplineType; backColor: TColor32; out offset: TPoint): Boolean; var i,j, w,h, len: integer; - y, q: double; + x,y, yy, q: double; + yLimLo, yLimHi: double; distances: TArrayOfDouble; pc: PColor32; rec: TRect; @@ -725,29 +846,34 @@ function SplineVertTransform(img: TImage32; const topSpline: TPathD; backColor := backColor and $00FFFFFF; distances := GetCumulativeDistances(topPath); - q := img.Width * 256 / distances[High(distances)];; + q := img.Width / distances[High(distances)]; + + yLimLo := -0.5; + yLimHi := img.Height + 0.5; + for i := 0 to len -1 do begin pc := @tmp[Round(topPath[i].X)-rec.Left]; backColoring := allowBackColoring and (prevX >= topPath[i].X); prevX := topPath[i].X; - y := topPath[i].Y; + yy := topPath[i].Y; for j := rec.top to rec.bottom -1 do begin - if (j > y-1.0) and (j < y + img.Height) then - if backColoring then - pc^ := BlendToAlpha(pc^, - ReColor(resampler(img, Round(Distances[i]*q) ,Round((j - y)*256)), backColor)) - else - pc^ := BlendToAlpha(pc^, - resampler(img, Round(Distances[i]*q) ,Round((j - y)*256))); + x := Distances[i]*q; + y := j - yy; + if (y < yLimLo) or (y > yLimHi) then + // do nothing ! + else if backColoring then + pc^ := BlendToAlpha(pc^, ReColor(resampler(img, x -0.5, y -0.5), backColor)) + else + pc^ := BlendToAlpha(pc^, resampler(img, x -0.5, y -0.5)); inc(pc, w); end; end; img.BeginUpdate; img.SetSize(w,h); - Move(tmp[0], img.Pixels[0], img.Width * img.Height * SizeOf(TColor32)); + Move(tmp[0], img.Pixels[0], w*h * SizeOf(TColor32)); img.EndUpdate; end; //------------------------------------------------------------------------------ @@ -756,7 +882,8 @@ function SplineHorzTransform(img: TImage32; const leftSpline: TPathD; splineType: TSplineType; backColor: TColor32; out offset: TPoint): Boolean; var i,j, len, w,h: integer; - x, q, prevY: double; + x,y, xx, q, prevY: double; + xLimLo, xLimHi: double; leftPath: TPathD; distances: TArrayOfDouble; rec: TRect; @@ -793,22 +920,28 @@ function SplineHorzTransform(img: TImage32; const leftSpline: TPathD; backColor := backColor and $00FFFFFF; distances := GetCumulativeDistances(leftPath); - q := img.Height * 256 / distances[High(distances)];; + q := img.Height / distances[High(distances)];; + xLimLo := -0.5; + xLimHi := img.Width + 0.5; + for i := 0 to len -1 do begin pc := @tmp[Round(leftPath[i].Y - rec.Top) * w]; backColoring := allowBackColoring and (prevY >= leftPath[i].Y); prevY := leftPath[i].Y; - x := leftPath[i].X; + xx := leftPath[i].X; + y := Distances[i]*q; for j := rec.left to rec.right -1 do begin - if (j > x-1.0) and (j < x + img.Width) then - if backColoring then - pc^ := BlendToAlpha(pc^, - ReColor(resampler(img, Round((j - x) *256), Round(Distances[i]*q)), backColor)) - else - pc^ := BlendToAlpha(pc^, - resampler(img, Round((j - x) *256), Round(Distances[i]*q))); + x := j - xx; + + if (x < xLimLo) or (x > xLimHi) then + // do nothing ! + else if backColoring then + pc^ := BlendToAlpha(pc^, ReColor(resampler(img, x -0.5, y -0.5), backColor)) + else + pc^ := BlendToAlpha(pc^, resampler(img, x -0.5, y -0.5)); + inc(pc); end; end; @@ -850,8 +983,8 @@ procedure TWeightedColor.Reset(c: TColor32; w: Integer); begin fAlphaTot := a; fColorTotB := (a * argb.B); - fColorTotG := (a * argb.B); - fColorTotR := (a * argb.B); + fColorTotG := (a * argb.G); + fColorTotR := (a * argb.R); end; end; //------------------------------------------------------------------------------ diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Vector.pas b/Ext/SVGIconImageList/Image32/source/Img32.Vector.pas index 5673fc5..3fe1ac9 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Vector.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Vector.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 24 March 2023 * +* Date : 2 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * +* Copyright : Angus Johnson 2019-2024 * * * * Purpose : Vector drawing for TImage32 * * * @@ -23,7 +23,16 @@ interface type TArrowStyle = (asNone, asSimple, asFancy, asDiamond, asCircle, asTail); - TJoinStyle = (jsAuto, jsSquare, jsMiter, jsRound); + // TJoinStyle: + // jsSquare - Convex joins will be truncated using a 'squaring' edge. + // The mid-points of these squaring edges will also be exactly the offset + // (ie delta) distance away from their origins (ie the starting vertices). + // jsButt - joins are similar to 'squared' joins except that squaring + // won't occur at a fixed distance. While bevelled joins may not be as + // pretty as squared joins, bevelling will be much faster than squaring. + // And perhaps this is why bevelling (rather than squaring) is preferred + // in numerous graphics display formats (including SVG & PDF documents). + TJoinStyle = (jsAuto, jsSquare, jsButt, jsMiter, jsRound); TEndStyle = (esPolygon = 0, esClosed = 0, esButt, esSquare, esRound); TPathEnd = (peStart, peEnd, peBothEnds); TSplineType = (stQuadratic, stCubic); @@ -158,14 +167,14 @@ interface patternOffset: PDouble; lineWidth: double; joinStyle: TJoinStyle; endStyle: TEndStyle): TPathsD; - function OffsetPoint(const pt: TPoint; dx, dy: integer): TPoint; overload; - function OffsetPoint(const pt: TPointD; dx, dy: double): TPointD; overload; + function TranslatePoint(const pt: TPoint; dx, dy: integer): TPoint; overload; + function TranslatePoint(const pt: TPointD; dx, dy: double): TPointD; overload; - function OffsetPath(const path: TPathD; + function TranslatePath(const path: TPathD; dx, dy: double): TPathD; overload; - function OffsetPath(const paths: TPathsD; + function TranslatePath(const paths: TPathsD; dx, dy: double): TPathsD; overload; - function OffsetPath(const ppp: TArrayOfPathsD; + function TranslatePath(const ppp: TArrayOfPathsD; dx, dy: double): TArrayOfPathsD; overload; function Paths(const path: TPathD): TPathsD; @@ -195,6 +204,9 @@ interface function ScaleRect(const rec: TRect; sx, sy: double): TRect; overload; function ScaleRect(const rec: TRectD; sx, sy: double): TRectD; overload; + function ScalePathToFit(const path: TPathD; const rec: TRect): TPathD; + function ScalePathsToFit(const paths: TPathsD; const rec: TRect): TPathsD; + function ReversePath(const path: TPathD): TPathD; overload; function ReversePath(const paths: TPathsD): TPathsD; overload; @@ -202,7 +214,7 @@ interface procedure AppendPoint(var path: TPathD; const extra: TPointD); - procedure AppendPath(var path: TPathD; const pt: TPointD); overload; + procedure AppendToPath(var path: TPathD; const pt: TPointD); overload; procedure AppendPath(var path1: TPathD; const path2: TPathD); overload; procedure AppendPath(var paths: TPathsD; const extra: TPathD); overload; procedure AppendPath(var paths: TPathsD; const extra: TPathsD); overload; @@ -261,7 +273,8 @@ interface function RectsEqual(const rec1, rec2: TRect): Boolean; - procedure OffsetRect(var rec: TRectD; dx, dy: double); overload; + procedure TranslateRect(var rec: TRect; dx, dy: integer); overload; + procedure TranslateRect(var rec: TRectD; dx, dy: double); overload; function MakeSquare(rec: TRect): TRect; @@ -389,8 +402,8 @@ interface function IsPointInEllipse(const ellipseRec: TRect; const pt: TPoint): Boolean; - //GetIntersectsEllipseAndLine: Gets the intersection of an ellipse and - //a line. The function result = true when the line either touches + //GetLineEllipseIntersects: Gets the intersection of a line and + //an ellipse. The function succeeds when the line either touches //tangentially or passes through the ellipse. If the line touches //tangentially, the coordintates returned in pt1 and pt2 will match. function GetLineEllipseIntersects(const ellipseRec: TRect; @@ -410,18 +423,20 @@ interface function GetClosestPtOnRotatedEllipse(const ellipseRect: TRectD; ellipseRotation: double; const pt: TPointD): TPointD; - function Outline(const line: TPathD; lineWidth: double; + // RoughOutline: these are **rough** because outlines are untidy with + // numerous self-intersections and negative area regions. Nevertheless + // these functions are **much** faster that Img32.Clipper.InflatePaths. + // (These two functions are really only intended for internal use.) + function RoughOutline(const line: TPathD; lineWidth: double; joinStyle: TJoinStyle; endStyle: TEndStyle; miterLimOrRndScale: double = 0): TPathsD; overload; - function Outline(const lines: TPathsD; lineWidth: double; + function RoughOutline(const lines: TPathsD; lineWidth: double; joinStyle: TJoinStyle; endStyle: TEndStyle; miterLimOrRndScale: double = 0): TPathsD; overload; - //Grow: Offsets path by 'delta' (positive is away from the left of the path). - //With a positive delta, clockwise paths will expand and counter-clockwise - //ones will contract. The reverse happens with negative deltas. - function Grow(const path, normals: TPathD; delta: double; joinStyle: TJoinStyle; - miterLim: double; isOpen: Boolean = false): TPathD; + // Grow: only intended for internal use + function Grow(const path, normals: TPathD; delta: double; + joinStyle: TJoinStyle; miterLim: double; isOpen: Boolean = false): TPathD; function ValueAlmostZero(val: double; epsilon: double = 0.001): Boolean; function ValueAlmostOne(val: double; epsilon: double = 0.001): Boolean; @@ -704,44 +719,27 @@ procedure GetSinCos(angle: double; out sinA, cosA: double); function GetRotatedRectBounds(const rec: TRect; angle: double): TRect; var - sinA, cosA: double; - w,h, recW, recH: integer; - mp: TPoint; + p: TPathD; + mp: TPointD; begin - NormalizeAngle(angle); + p := Rectangle(rec); + mp := PointD((rec.Left + rec.Right)/2, (rec.Top + rec.Bottom)/2); if angle <> 0 then - begin - GetSinCos(angle, sinA, cosA); //the sign of the angle isn't important - sinA := Abs(sinA); cosA := Abs(cosA); - RectWidthHeight(rec, recW, recH); - w := Ceil((recW *cosA + recH *sinA) /2); - h := Ceil((recW *sinA + recH *cosA) /2); - mp := MidPoint(rec); - Result := Rect(mp.X - w, mp.Y - h, mp.X + w, mp.Y +h); - end - else - Result := rec; + p := RotatePath(p, mp, angle); + Result := GetBounds(p); end; //------------------------------------------------------------------------------ function GetRotatedRectBounds(const rec: TRectD; angle: double): TRectD; var - sinA, cosA: double; - w,h: double; + p: TPathD; mp: TPointD; begin - NormalizeAngle(angle); + p := Rectangle(rec); + mp := PointD((rec.Left + rec.Right)/2, (rec.Top + rec.Bottom)/2); if angle <> 0 then - begin - GetSinCos(angle, sinA, cosA); //the sign of the angle isn't important - sinA := Abs(sinA); cosA := Abs(cosA); - w := (rec.Width *cosA + rec.Height *sinA) /2; - h := (rec.Width *sinA + rec.Height *cosA) /2; - mp := rec.MidPoint; - Result := RectD(mp.X - w, mp.Y - h, mp.X + w, mp.Y +h); - end - else - Result := rec; + p := RotatePath(p, mp, angle); + Result := GetBoundsD(p); end; //------------------------------------------------------------------------------ @@ -801,7 +799,16 @@ function Area(const path: TPathD): Double; end; //------------------------------------------------------------------------------ -procedure OffsetRect(var rec: TRectD; dx, dy: double); +procedure TranslateRect(var rec: TRect; dx, dy: integer); +begin + rec.Left := rec.Left + dx; + rec.Top := rec.Top + dy; + rec.Right := rec.Right + dx; + rec.Bottom := rec.Bottom + dy; +end; +//------------------------------------------------------------------------------ + +procedure TranslateRect(var rec: TRectD; dx, dy: double); begin rec.Left := rec.Left + dx; rec.Top := rec.Top + dy; @@ -1117,21 +1124,21 @@ function CopyPaths(const paths: TPathsD): TPathsD; end; //------------------------------------------------------------------------------ -function OffsetPoint(const pt: TPoint; dx, dy: integer): TPoint; +function TranslatePoint(const pt: TPoint; dx, dy: integer): TPoint; begin result.x := pt.x + dx; result.y := pt.y + dy; end; //------------------------------------------------------------------------------ -function OffsetPoint(const pt: TPointD; dx, dy: double): TPointD; +function TranslatePoint(const pt: TPointD; dx, dy: double): TPointD; begin result.x := pt.x + dx; result.y := pt.y + dy; end; //------------------------------------------------------------------------------ -function OffsetPath(const path: TPathD; dx, dy: double): TPathD; +function TranslatePath(const path: TPathD; dx, dy: double): TPathD; var i, len: integer; begin @@ -1145,7 +1152,7 @@ function OffsetPath(const path: TPathD; dx, dy: double): TPathD; end; //------------------------------------------------------------------------------ -function OffsetPath(const paths: TPathsD; +function TranslatePath(const paths: TPathsD; dx, dy: double): TPathsD; var i,len: integer; @@ -1153,18 +1160,18 @@ function OffsetPath(const paths: TPathsD; len := length(paths); setLength(result, len); for i := 0 to len -1 do - result[i] := OffsetPath(paths[i], dx, dy); + result[i] := TranslatePath(paths[i], dx, dy); end; //------------------------------------------------------------------------------ -function OffsetPath(const ppp: TArrayOfPathsD; dx, dy: double): TArrayOfPathsD; +function TranslatePath(const ppp: TArrayOfPathsD; dx, dy: double): TArrayOfPathsD; var i,len: integer; begin len := length(ppp); setLength(result, len); for i := 0 to len -1 do - result[i] := OffsetPath(ppp[i], dx, dy); + result[i] := TranslatePath(ppp[i], dx, dy); end; //------------------------------------------------------------------------------ @@ -1270,6 +1277,42 @@ function ScaleRect(const rec: TRectD; sx, sy: double): TRectD; end; //------------------------------------------------------------------------------ +function ScalePathToFit(const path: TPathD; const rec: TRect): TPathD; +var + pathWidth, pathHeight, outHeight, outWidth: integer; + pathBounds: TRect; + scale: double; +begin + pathBounds := GetBounds(path); + RectWidthHeight(pathBounds, pathWidth, pathHeight); + RectWidthHeight(rec, outWidth, outHeight); + Result := TranslatePath(path, + rec.Left - pathBounds.Left, rec.Top - pathBounds.Top); + if outWidth / pathWidth < outHeight / pathHeight then + scale := outWidth / pathWidth else + scale := outHeight / pathHeight; + Result := ScalePath(Result, scale, scale); +end; +//------------------------------------------------------------------------------ + +function ScalePathsToFit(const paths: TPathsD; const rec: TRect): TPathsD; +var + pathWidth, pathHeight, outHeight, outWidth: integer; + pathBounds: TRect; + scale: double; +begin + pathBounds := GetBounds(paths); + RectWidthHeight(pathBounds, pathWidth, pathHeight); + RectWidthHeight(rec, outWidth, outHeight); + Result := TranslatePath(paths, + rec.Left - pathBounds.Left, rec.Top - pathBounds.Top); + if outWidth / pathWidth < outHeight / pathHeight then + scale := outWidth / pathWidth else + scale := outHeight / pathHeight; + Result := ScalePath(Result, scale, scale); +end; +//------------------------------------------------------------------------------ + function ReversePath(const path: TPathD): TPathD; var i, highI: integer; @@ -1701,7 +1744,7 @@ function IsPointInEllipse(const ellipseRec: TRect; const pt: TPoint): Boolean; dx := ellipseRec.Left + a; dy := ellipseRec.Top + b; rec := RectD(ellipseRec); - OffsetRect(rec, -dx, -dy); + TranslateRect(rec, -dx, -dy); x := pt.X -dx; y := pt.Y -dy; //first make sure pt is inside rect Result := (abs(x) <= a) and (abs(y) <= b); @@ -1728,9 +1771,9 @@ function GetLineEllipseIntersects(const ellipseRec: TRect; b := rec.Height *0.5; //offset ellipseRect so it's centered over the coordinate origin dx := ellipseRec.Left + a; dy := ellipseRec.Top + b; - offsetRect(rec, -dx, -dy); - pt1 := OffsetPoint(linePt1, -dx, -dy); - pt2 := OffsetPoint(linePt2, -dx, -dy); + TranslateRect(rec, -dx, -dy); + pt1 := TranslatePoint(linePt1, -dx, -dy); + pt2 := TranslatePoint(linePt2, -dx, -dy); //equation of ellipse = (x*x)/(a*a) + (y*y)/(b*b) = 1 //equation of line = y = mx + c; if (pt1.X = pt2.X) then //vertical line (ie infinite slope) @@ -1767,8 +1810,8 @@ function GetLineEllipseIntersects(const ellipseRec: TRect; pt2.Y := m * pt2.X + c; end; //finally reverse initial offset - linePt1 := OffsetPoint(pt1, dx, dy); - linePt2 := OffsetPoint(pt2, dx, dy); + linePt1 := TranslatePoint(pt1, dx, dy); + linePt2 := TranslatePoint(pt2, dx, dy); end; //------------------------------------------------------------------------------ @@ -1787,267 +1830,7 @@ function ApplyNormal(const pt, norm: TPointD; delta: double): TPointD; end; //------------------------------------------------------------------------------ -function GetParallelOffests(const path, norms: TPathD; - delta: double): TPathD; -var - i, highI, len: integer; -begin - len := Length(path); - highI := len -1; - SetLength(Result, len *2); - Result[0] := ApplyNormal(path[0], norms[0], delta); - for i := 1 to highI do - begin - Result[i*2-1] := ApplyNormal(path[i], norms[i-1], delta); - Result[i*2] := ApplyNormal(path[i], norms[i], delta); - end; - Result[highI*2+1] := ApplyNormal(path[0], norms[highI], delta); -end; -//------------------------------------------------------------------------------ - -type - TGrowRec = record - StepsPerRad : double; - StepSin : double; - StepCos : double; - Radius : double; - aSin : double; - aCos : double; - pt : TPointD; - norm1 : TPointD; - norm2 : TPointD; - end; - -function DoRound(const growRec: TGrowRec): TPathD; -var - i, steps: Integer; - a: Double; - pt2: TPointD; -begin - with growRec do - begin - a := ArcTan2(aSin, aCos); - steps := Round(StepsPerRad * Abs(a)); - SetLength(Result, steps + 2); - pt2 := PointD(norm1.x * Radius, norm1.y * Radius); - Result[0] := PointD(pt.x + pt2.x, pt.y + pt2.y); - for i := 1 to steps do - begin - pt2 := PointD(pt2.X * StepCos - StepSin * pt2.Y, - pt2.X * StepSin + pt2.Y * StepCos); - Result[i] := PointD(pt.X + pt2.X, pt.Y + pt2.Y); - end; - pt2 := PointD(norm2.x * Radius, norm2.y * Radius); - Result[steps+1] := PointD(pt.x + pt2.x, pt.y + pt2.y); - end; -end; -//------------------------------------------------------------------------------ - -function CalcRoundingSteps(radius: double): double; -begin - //the results of this function have been derived empirically - //and may need further adjustment - if radius < 0.55 then result := 4 - else result := Pi * Sqrt(radius); -end; -//------------------------------------------------------------------------------ - -function Grow(const path, normals: TPathD; delta: double; - joinStyle: TJoinStyle; miterLim: double; isOpen: Boolean): TPathD; -var - resCnt, resCap: integer; - norms : TPathD; - parallelOffsets : TPathD; - - procedure AddPoint(const pt: TPointD); - begin - if resCnt >= resCap then - begin - inc(resCap, 64); - setLength(result, resCap); - end; - result[resCnt] := pt; - inc(resCnt); - end; - - procedure DoMiter(const growRec: TGrowRec); - var - a: double; - begin - with growRec do - begin - a := delta / (1 + aCos); //see offset_triginometry4.svg - AddPoint(PointD(pt.X + (norm2.X + norm1.X) * a, - pt.Y + (norm2.Y + norm1.Y) * a)); - end; - end; - - procedure DoSquare(const growRec: TGrowRec; const po1, po2: TPointD); - var - pt1, pt2: TPointD; - ip, ptQ : TPointD; - vec : TPointD; - begin - with growRec do - begin - // using the reciprocal of unit normals (as unit vectors) - // get the average unit vector ... - //vec := GetAvgUnitVector(PointD(-norm1.Y, norm1.X),PointD(norm2.Y,-norm2.X)); - vec := NormalizeVector(PointD(norm2.Y - norm1.Y, norm1.X - norm2.X)); - // now offset the original vertex delta units along unit vector - ptQ := OffsetPoint(pt, delta * vec.X, delta * vec.Y); - - // get perpendicular vertices - pt1 := OffsetPoint(ptQ, delta * vec.Y, delta * -vec.X); - pt2 := OffsetPoint(ptQ, delta * -vec.Y, delta * vec.X); - // using 2 vertices along one edge offset (po1 & po2) - IntersectPoint(pt1,pt2,po1,po2, ip); - AddPoint(ip); - //get the second intersect point through reflecion - ip := ReflectPoint(ip, ptQ); - AddPoint(ip); - end; - end; - - procedure AppendPath(const path: TPathD); - var - len: integer; - begin - len := Length(path); - if resCnt + len > resCap then - begin - inc(resCap, len); - setLength(result, resCap); - end; - Move(path[0], result[resCnt], len * SizeOf(TPointD)); - inc(resCnt, len); - end; - -var - i : cardinal; - prevI : cardinal; - len : cardinal; - highI : cardinal; - iLo,iHi : cardinal; - growRec : TGrowRec; - absDelta : double; -begin - Result := nil; - if not Assigned(path) then exit; - len := Length(path); - if not isOpen then - while (len > 2) and - PointsNearEqual(path[len -1], path[0], 0.001) do - dec(len); - if len < 2 then Exit; - - absDelta := Abs(delta); - if absDelta < MinStrokeWidth/2 then - begin - if delta < 0 then - delta := -MinStrokeWidth/2 else - delta := MinStrokeWidth/2; - end; - if absDelta < 1 then - joinStyle := jsSquare - else if joinStyle = jsAuto then - begin - if delta < AutoWidthThreshold / 2 then - joinStyle := jsSquare else - joinStyle := jsRound; - end; - - if assigned(normals) then - norms := normals else - norms := GetNormals(path); - - highI := len -1; - parallelOffsets := GetParallelOffests(path, norms, delta); - - if joinStyle = jsRound then - begin - growRec.Radius := delta; - growRec.StepsPerRad := CalcRoundingSteps(growRec.Radius)/(Pi *2); - if delta < 0 then - GetSinCos(-1/growRec.StepsPerRad, growRec.StepSin, growRec.StepCos) else - GetSinCos(1/growRec.StepsPerRad, growRec.StepSin, growRec.StepCos); - end else - begin - if miterLim <= 0 then miterLim := DefaultMiterLimit - else if miterLim < 2 then miterLim := 2; - miterLim := 2 /(sqr(miterLim)); - growRec.StepsPerRad := 0; //stop compiler warning. - end; - - resCnt := 0; resCap := 0; - - if isOpen then - begin - iLo := 1; iHi := highI -1; - prevI := 0; - AddPoint(parallelOffsets[0]); - end else - begin - iLo := 0; iHi := highI; - prevI := highI; - end; - - for i := iLo to iHi do - begin - - if PointsNearEqual(path[i], path[prevI], 0.01) then - begin - prevI := i; - Continue; - end; - - growRec.aSin := CrossProduct(norms[prevI], norms[i]); - growRec.aCos := DotProduct(norms[prevI], norms[i]); - if (growRec.aSin > 1.0) then growRec.aSin := 1.0 - else if (growRec.aSin < -1.0) then growRec.aSin := -1.0; - - growRec.pt := path[i]; - growRec.norm1 := norms[prevI]; - growRec.norm2 := norms[i]; - - if (growRec.aCos > 0.99) then // almost straight - less than 8 degrees - begin - AddPoint(parallelOffsets[prevI*2+1]); - if (growRec.aCos < 0.9998) then // greater than 1 degree - AddPoint(parallelOffsets[i*2]); - end - else if (growRec.aCos > -0.99) and (growRec.aSin * delta < 0) then - begin //ie is concave - AddPoint(parallelOffsets[prevI*2+1]); - AddPoint(path[i]); - AddPoint(parallelOffsets[i*2]); - end - else if (joinStyle = jsRound) then - begin - AppendPath(DoRound(growRec)); - end - else if (joinStyle = jsMiter) then // nb: miterLim <= 2 - begin - if (1 + growRec.aCos > miterLim) then //within miter range - DoMiter(growRec) else - DoSquare(growRec, - parallelOffsets[prevI*2], parallelOffsets[prevI*2 +1]); - end - // don't bother squaring angles that deviate < ~20 deg. because squaring - // will be indistinguishable from mitering and just be a lot slower - else if (growRec.aCos > 0.9) then - DoMiter(growRec) - else - DoSquare(growRec, parallelOffsets[prevI*2], parallelOffsets[prevI*2 +1]); - - prevI := i; - end; - if isOpen then AddPoint(parallelOffsets[highI*2-1]); - SetLength(Result, resCnt); -end; -//------------------------------------------------------------------------------ - -procedure AppendPath(var path: TPathD; const pt: TPointD); +procedure AppendToPath(var path: TPathD; const pt: TPointD); var len: integer; begin @@ -2353,182 +2136,582 @@ function SegmentsIntersect(const ln1a, ln1b, ln2a, ln2b: TPointD; end; //------------------------------------------------------------------------------ -function ReverseNormals(const norms: TPathD): TPathD; +function CalcRoundingSteps(radius: double): double; +begin + //the results of this function have been derived empirically + //and may need further adjustment + if radius < 0.55 then result := 4 + else result := Pi * Sqrt(radius *2); +end; +//------------------------------------------------------------------------------ + +function Grow(const path, normals: TPathD; delta: double; + joinStyle: TJoinStyle; miterLim: double; isOpen: Boolean): TPathD; var - i, highI: integer; + resCnt, resCap : integer; + norms : TPathD; + stepsPerRadian : double; + stepSin, stepCos : double; + asin, acos : double; + + procedure AddPoint(const pt: TPointD); + begin + if resCnt >= resCap then + begin + inc(resCap, 64); + setLength(result, resCap); + end; + result[resCnt] := pt; + inc(resCnt); + end; + + procedure DoMiter(j, k: Integer; cosA: Double); + var + q: Double; + begin + q := delta / (cosA +1); + AddPoint(PointD( + path[j].X + (norms[k].X + norms[j].X) *q, + path[j].Y + (norms[k].Y + norms[j].Y) *q)); + end; + + procedure DoBevel(j, k: Integer); + var + absDelta: double; + begin + if k = j then + begin + absDelta := Abs(delta); + AddPoint(PointD( + path[j].x - absDelta * norms[j].x, + path[j].y - absDelta * norms[j].y)); + AddPoint(PointD( + path[j].x + absDelta * norms[j].x, + path[j].y + absDelta * norms[j].y)); + end else + begin + AddPoint(PointD( + path[j].x + delta * norms[k].x, + path[j].y + delta * norms[k].y)); + AddPoint(PointD( + path[j].x + delta * norms[j].x, + path[j].y + delta * norms[j].y)); + end; + end; + + procedure DoSquare(j, k: Integer); + var + vec, ptQ, ptR, ptS, ptT, ptU, ip: TPointD; + absDelta: double; + begin + if k = j then + begin + vec.X := norms[j].Y; //squaring a line end + vec.Y := -norms[j].X; + end else + begin + // using the reciprocal of unit normals (as unit vectors) + // get the average unit vector ... + vec := GetAvgUnitVector( + PointD(-norms[k].Y, norms[k].X), + PointD(norms[j].Y, -norms[j].X)); + end; + + absDelta := Abs(delta); + ptQ := PointD(path[j].X + absDelta * vec.X, path[j].Y + absDelta * vec.Y); + + ptR := PointD(ptQ.X + delta * vec.Y, ptQ.Y + delta * -vec.X); + ptS := ReflectPoint(ptR, ptQ); + + // get 2 vertices along one edge offset + ptT := PointD( + path[k].X + norms[k].X * delta, + path[k].Y + norms[k].Y * delta); + + if (j = k) then + begin + ptU.X := ptT.X + vec.X * delta; + ptU.Y := ptT.Y + vec.Y * delta; + ip := IntersectPoint(ptR, ptS, ptT, ptU); + AddPoint(ReflectPoint(ip, ptQ)); + AddPoint(ip); + end else + begin + ptU := PointD( + path[j].X + norms[k].X * delta, + path[j].Y + norms[k].Y * delta); + ip := IntersectPoint(ptR, ptS, ptT, ptU); + AddPoint(ip); + AddPoint(ReflectPoint(ip, ptQ)); + end; + end; + + procedure DoRound(j, k: Integer); + var + i, steps: Integer; + pt: TPointD; + dx, dy, oldDx: double; + angle: double; + begin + // nb: angles may be negative but this will always be a convex join + pt := path[j]; + if j = k then + begin + dx := -norms[k].X * delta; + dy := -norms[k].Y * delta; + end else + begin + dx := norms[k].X * delta; + dy := norms[k].Y * delta; + end; + AddPoint(PointD(pt.X + dx, pt.Y + dy)); + + angle := ArcTan2(asin, acos); + steps := Ceil(stepsPerRadian * abs(angle)); + + for i := 2 to steps do + begin + oldDx := dx; + dx := oldDx * stepCos - stepSin * dy; + dy := oldDx * stepSin + stepCos * dy; + AddPoint(PointD(pt.X + dx, pt.Y + dy)); + end; + AddPoint(PointD( + pt.X + norms[j].X * delta, + pt.Y + norms[j].Y * delta)); + end; + +var + j, k : cardinal; + len : cardinal; + steps : double; + highI : cardinal; + iLo,iHi : cardinal; + absDelta : double; begin - highI := high(norms); - setLength(result, highI +1); - for i := 1 to highI do + Result := nil; + if not Assigned(path) then exit; + len := Length(path); + if not isOpen then + while (len > 2) and + PointsNearEqual(path[len -1], path[0], 0.001) do + dec(len); + if len < 2 then Exit; + + absDelta := Abs(delta); + if absDelta < MinStrokeWidth/2 then begin - result[i -1].X := -norms[highI -i].X; - result[i -1].Y := -norms[highI -i].Y; + if delta < 0 then + delta := -MinStrokeWidth/2 else + delta := MinStrokeWidth/2; + end; + if absDelta < 1 then + joinStyle := jsButt + else if joinStyle = jsAuto then + begin + if delta < AutoWidthThreshold / 2 then + joinStyle := jsSquare else + joinStyle := jsRound; + end; + + if assigned(normals) then + norms := normals else + norms := GetNormals(path); + + highI := len -1; + + stepsPerRadian := 0; + if joinStyle = jsRound then + begin + steps := CalcRoundingSteps(delta); +// // avoid excessive precision // todo - recheck if needed +// if (steps > absDelta * Pi) then +// steps := absDelta * Pi; + stepSin := sin(TwoPi/steps); + stepCos := cos(TwoPi/steps); + if (delta < 0) then stepSin := -stepSin; + stepsPerRadian := steps / TwoPi; end; - result[highI].X := -norms[highI].X; - result[highI].Y := -norms[highI].Y; + + if miterLim <= 0 then miterLim := DefaultMiterLimit + else if miterLim < 2 then miterLim := 2; + miterLim := 2 /(sqr(miterLim)); + + resCnt := 0; + resCap := 0; + + if isOpen then + begin + iLo := 1; iHi := highI -1; + k := 0; + AddPoint(PointD( + path[0].X + norms[0].X * delta, + path[0].Y + norms[0].Y * delta)); + end else + begin + iLo := 0; iHi := highI; + k := highI; + end; + + for j := iLo to iHi do + begin + + if PointsNearEqual(path[j], path[k], 0.01) then + begin + k := j; // todo - check if needed + Continue; + end; + + asin := CrossProduct(norms[k], norms[j]); + if (asin > 1.0) then asin := 1.0 + else if (asin < -1.0) then asin := -1.0; + acos := DotProduct(norms[k], norms[j]); + + if (acos > -0.999) and (asin * delta < 0) then + begin + // is concave + AddPoint(PointD( + path[j].X + norms[k].X * delta, path[j].Y + norms[k].Y * delta)); + AddPoint(path[j]); + AddPoint(PointD( + path[j].X + norms[j].X * delta, path[j].Y + norms[j].Y * delta)); + end + else if (acos > 0.999) and (joinStyle <> jsRound) then + begin + // almost straight - less than 2.5 degree, so miter + DoMiter(j, k, acos); + end + else if (joinStyle = jsMiter) then + begin + if (1 + acos > miterLim) then + DoMiter(j, k, acos) else + DoSquare(j, k); + end + else if (joinStyle = jsRound) then + DoRound(j, k) + else if (joinStyle = jsSquare) then + DoSquare(j, k) + else + DoBevel(j, k); + k := j; + end; + + if isOpen then + AddPoint(PointD( + path[highI].X + norms[highI].X * delta, //todo - check this !!! + path[highI].Y + norms[highI].Y * delta)); + + SetLength(Result, resCnt); end; //------------------------------------------------------------------------------ -function GrowOpenLine(const line: TPathD; width: double; +function GrowOpenLine(const line: TPathD; delta: double; joinStyle: TJoinStyle; endStyle: TEndStyle; - miterLimOrRndScale: double): TPathD; + miterLim: double): TPathD; var - len, x,y: integer; - segLen, halfWidth: double; - normals, line2, lineL, lineR, arc: TPathD; - invNorm: TPointD; - growRec: TGrowRec; + len : integer; + resCnt, resCap : integer; + asin, acos : double; + stepSin, stepCos : double; + stepsPerRadian : double; + path, norms : TPathD; + + procedure AddPoint(const pt: TPointD); + begin + if resCnt >= resCap then + begin + inc(resCap, 64); + setLength(result, resCap); + end; + result[resCnt] := pt; + inc(resCnt); + end; + + procedure DoMiter(j, k: Integer; cosA: Double); + var + q: Double; + begin + q := delta / (cosA +1); + AddPoint(PointD( + path[j].X + (norms[k].X + norms[j].X) *q, + path[j].Y + (norms[k].Y + norms[j].Y) *q)); + end; + + procedure DoBevel(j, k: Integer); + var + absDelta: double; + begin + if k = j then + begin + absDelta := Abs(delta); + AddPoint(PointD( + path[j].x - absDelta * norms[j].x, + path[j].y - absDelta * norms[j].y)); + AddPoint(PointD( + path[j].x + absDelta * norms[j].x, + path[j].y + absDelta * norms[j].y)); + end else + begin + AddPoint(PointD( + path[j].x + delta * norms[k].x, + path[j].y + delta * norms[k].y)); + AddPoint(PointD( + path[j].x + delta * norms[j].x, + path[j].y + delta * norms[j].y)); + end; + end; + + procedure DoSquare(j, k: Integer); + var + vec, ptQ, ptR, ptS, ptT, ptU, ip: TPointD; + absDelta: double; + begin + if k = j then + begin + vec.X := norms[j].Y; //squaring a line end + vec.Y := -norms[j].X; + end else + begin + // using the reciprocal of unit normals (as unit vectors) + // get the average unit vector ... + vec := GetAvgUnitVector( + PointD(-norms[k].Y, norms[k].X), + PointD(norms[j].Y, -norms[j].X)); + end; + + absDelta := Abs(delta); + ptQ := PointD(path[j].X + absDelta * vec.X, path[j].Y + absDelta * vec.Y); + + ptR := PointD(ptQ.X + delta * vec.Y, ptQ.Y + delta * -vec.X); + ptS := ReflectPoint(ptR, ptQ); + + // get 2 vertices along one edge offset + ptT := PointD( + path[k].X + norms[k].X * delta, + path[k].Y + norms[k].Y * delta); + + if (j = k) then + begin + ptU.X := ptT.X + vec.X * delta; + ptU.Y := ptT.Y + vec.Y * delta; + ip := IntersectPoint(ptR, ptS, ptT, ptU); + AddPoint(ReflectPoint(ip, ptQ)); + AddPoint(ip); + end else + begin + ptU := PointD( + path[j].X + norms[k].X * delta, + path[j].Y + norms[k].Y * delta); + ip := IntersectPoint(ptR, ptS, ptT, ptU); + AddPoint(ip); + AddPoint(ReflectPoint(ip, ptQ)); + end; + end; + + procedure DoRound(j, k: Integer); + var + i, steps: Integer; + pt: TPointD; + dx, dy, oldDx: double; + angle: double; + begin + // nb: angles may be negative but this will always be a convex join + pt := path[j]; + if j = k then + begin + dx := -norms[k].X * delta; + dy := -norms[k].Y * delta; + angle := PI; + end else + begin + dx := norms[k].X * delta; + dy := norms[k].Y * delta; + angle := ArcTan2(asin, acos); + end; + AddPoint(PointD(pt.X + dx, pt.Y + dy)); + + steps := Ceil(stepsPerRadian * abs(angle)); + for i := 2 to steps do + begin + oldDx := dx; + dx := oldDx * stepCos - stepSin * dy; + dy := oldDx * stepSin + stepCos * dy; + AddPoint(PointD(pt.X + dx, pt.Y + dy)); + end; + AddPoint(PointD( + pt.X + norms[j].X * delta, + pt.Y + norms[j].Y * delta)); + end; + + procedure DoPoint(j: Cardinal; var k: Cardinal); + begin + asin := CrossProduct(norms[k], norms[j]); + if (asin > 1.0) then asin := 1.0 + else if (asin < -1.0) then asin := -1.0; + acos := DotProduct(norms[k], norms[j]); + + if (acos > -0.999) and (asin * delta < 0) then + begin + // is concave + AddPoint(PointD( + path[j].X + norms[k].X * delta, path[j].Y + norms[k].Y * delta)); + AddPoint(path[j]); + AddPoint(PointD( + path[j].X + norms[j].X * delta, path[j].Y + norms[j].Y * delta)); + end + else if (acos > 0.999) and (joinStyle <> jsRound) then + // almost straight - less than 2.5 degree, so miter + DoMiter(j, k, acos) + else if (joinStyle = jsMiter) then + begin + if (1 + acos > miterLim) then + DoMiter(j, k, acos) else + DoSquare(j, k); + end + else if (joinStyle = jsRound) then + DoRound(j, k) + else if (joinStyle = jsSquare) then + DoSquare(j, k) + else + DoBevel(j, k); + k := j; + end; + +var + highJ : cardinal; + j, k : cardinal; + steps : double; begin Result := nil; - line2 := StripNearDuplicates(line, 0.5, false); - len := length(line2); + path := StripNearDuplicates(line, 0.5, false); + len := length(path); if len = 0 then Exit; - if width < MinStrokeWidth then - width := MinStrokeWidth; - halfWidth := width * 0.5; + if delta < MinStrokeWidth then + delta := MinStrokeWidth; + delta := delta * 0.5; + if len = 1 then begin - x := Round(line2[0].X); - y := Round(line2[0].Y); - SetLength(result, 1); - result := Ellipse(RectD(x -halfWidth, y -halfWidth, - x +halfWidth, y +halfWidth)); + with path[0] do + result := Ellipse(RectD(x-delta, y-delta, x+delta, y+delta)); Exit; end; + //Assert(endStyle <> esClosed); + //with very narrow lines, don't get fancy with joins and line ends - if (width <= 2) then + if (delta <= 1) then begin - joinStyle := jsSquare; + joinStyle := jsButt; if endStyle = esRound then endStyle := esSquare; end else if joinStyle = jsAuto then begin if (endStyle = esRound) and - (width >= AutoWidthThreshold) then + (delta >= AutoWidthThreshold) then joinStyle := jsRound else joinStyle := jsSquare; end; - normals := GetNormals(line2); - if endStyle = esRound then - begin - //grow the line's left side of the line => line1 - lineL := Grow(line2, normals, - halfWidth, joinStyle, miterLimOrRndScale, true); - //build the rounding at the start => result - invNorm.X := -normals[0].X; - invNorm.Y := -normals[0].Y; - //get the rounding parameters - growRec.StepsPerRad := - CalcRoundingSteps(halfWidth * miterLimOrRndScale)/(Pi*2); - GetSinCos(1/growRec.StepsPerRad, growRec.StepSin, growRec.StepCos); - growRec.aSin := invNorm.X * normals[0].Y - invNorm.Y * normals[0].X; - growRec.aCos := invNorm.X * normals[0].X + invNorm.Y * normals[0].Y; - growRec.Radius := halfWidth; - growRec.pt := line2[0]; - growRec.norm1 := invNorm; - growRec.norm2 := normals[0]; - Result := DoRound(growRec); - //join line1 into result - AppendPath(Result, lineL); - //reverse the normals and build the end arc => arc - normals := ReverseNormals(normals); - invNorm.X := -normals[0].X; invNorm.Y := -normals[0].Y; - growRec.aSin := invNorm.X * normals[0].Y - invNorm.Y * normals[0].X; - growRec.aCos := invNorm.X * normals[0].X + invNorm.Y * normals[0].Y; - growRec.pt := line2[High(line2)]; - growRec.norm1 := invNorm; - growRec.norm2 := normals[0]; - arc := DoRound(growRec); - //grow the line's right side of the line - lineR := Grow(ReversePath(line2), normals, - halfWidth, joinStyle, miterLimOrRndScale, true); - //join arc and line2 into result - AppendPath(Result, arc); - AppendPath(Result, lineR); - end else + stepsPerRadian := 0; + if (joinStyle = jsRound) or (endStyle = esRound) then begin - lineL := Copy(line2, 0, len); - if endStyle = esSquare then - begin - // esSquare => extends both line ends by 1/2 lineWidth - AdjustPoint(lineL[0], lineL[1], width * 0.5); - AdjustPoint(lineL[len-1], lineL[len-2], width * 0.5); - end else - begin - //esButt -> extend only very short end segments - segLen := Distance(lineL[0], lineL[1]); - if segLen < width * 0.5 then - AdjustPoint(lineL[0], lineL[1], width * 0.5 - segLen); - segLen := Distance(lineL[len-1], lineL[len-2]); - if segLen < width * 0.5 then - AdjustPoint(lineL[len-1], lineL[len-2], width * 0.5 - segLen); - end; - //first grow the left side of the line => Result - Result := Grow(lineL, normals, - halfWidth, joinStyle, miterLimOrRndScale, true); - //reverse normals and path and grow the right side => lineR - normals := ReverseNormals(normals); - lineR := Grow(ReversePath(lineL), normals, - halfWidth, joinStyle, miterLimOrRndScale, true); - //join both sides - AppendPath(Result, lineR); + steps := CalcRoundingSteps(delta); +// if (steps > absDelta * Pi) then // todo - recheck if needed +// steps := absDelta * Pi; + stepSin := sin(TwoPi/steps); + stepCos := cos(TwoPi/steps); + if (delta < 0) then stepSin := -stepSin; + stepsPerRadian := steps / TwoPi; + end; + + if miterLim <= 0 then miterLim := DefaultMiterLimit + else if miterLim < 2 then miterLim := 2; + miterLim := 2 /(sqr(miterLim)); + + norms := GetNormals(path); + resCnt := 0; resCap := 0; + + case endStyle of + esButt: DoBevel(0,0); + esRound: DoRound(0,0); + else DoSquare(0, 0); end; + + // offset the left side going **forward** + k := 0; + highJ := len -1; + for j := 1 to highJ -1 do DoPoint(j,k); + + // reverse the normals ... + for j := highJ downto 1 do + begin + norms[j].X := -norms[j-1].X; + norms[j].Y := -norms[j-1].Y; + end; + norms[0] := norms[len -1]; + + case endStyle of + esButt: DoBevel(highJ,highJ); + esRound: DoRound(highJ,highJ); + else DoSquare(highJ,highJ); + end; + + // offset the left side going **backward** + k := highJ; + for j := highJ -1 downto 1 do + DoPoint(j, k); + + SetLength(Result, resCnt); end; //------------------------------------------------------------------------------ function GrowClosedLine(const line: TPathD; width: double; joinStyle: TJoinStyle; miterLimOrRndScale: double): TPathsD; var - line2, norms: TPathD; + norms: TPathD; rec: TRectD; skipHole: Boolean; begin - line2 := StripNearDuplicates(line, 0.5, true); - rec := GetBoundsD(line2); + rec := GetBoundsD(line); skipHole := (rec.Width <= width) or (rec.Height <= width); if skipHole then begin SetLength(Result, 1); - norms := GetNormals(line2); - Result[0] := Grow(line2, norms, width/2, joinStyle, miterLimOrRndScale); + norms := GetNormals(line); + Result[0] := Grow(line, norms, width/2, joinStyle, miterLimOrRndScale, false); end else begin SetLength(Result, 2); - norms := GetNormals(line2); - Result[0] := Grow(line2, norms, width/2, joinStyle, miterLimOrRndScale); - line2 := ReversePath(line2); - norms := ReverseNormals(norms); - Result[1] := Grow(line2, norms, width/2, joinStyle, miterLimOrRndScale); + norms := GetNormals(line); + Result[0] := Grow(line, norms, width/2, joinStyle, miterLimOrRndScale, false); + Result[1] := ReversePath( + Grow(line, norms, -width/2, joinStyle, miterLimOrRndScale, false)); end; end; //------------------------------------------------------------------------------ -function Outline(const line: TPathD; lineWidth: double; +function RoughOutline(const line: TPathD; lineWidth: double; joinStyle: TJoinStyle; endStyle: TEndStyle; miterLimOrRndScale: double): TPathsD; +var + lines: TPathsD; begin - if not assigned(line) then - Result := nil - else if endStyle = esClosed then - result := GrowClosedLine(line, - lineWidth, joinStyle, miterLimOrRndScale) - else - begin - SetLength(Result,1); - result[0] := GrowOpenLine(line, lineWidth, - joinStyle, endStyle, miterLimOrRndScale); - end; + SetLength(lines,1); + lines[0] := line; + Result := RoughOutline(lines, lineWidth, + joinStyle, endStyle, miterLimOrRndScale); end; //------------------------------------------------------------------------------ -function Outline(const lines: TPathsD; lineWidth: double; +function RoughOutline(const lines: TPathsD; lineWidth: double; joinStyle: TJoinStyle; endStyle: TEndStyle; miterLimOrRndScale: double): TPathsD; var i: integer; + lwDiv2: double; + p: TPathD; begin result := nil; if not assigned(lines) then exit; @@ -2539,9 +2722,24 @@ function Outline(const lines: TPathsD; lineWidth: double; joinStyle := jsSquare; end; if endStyle = esPolygon then + begin for i := 0 to high(lines) do - AppendPath(Result, GrowClosedLine(lines[i], - lineWidth, joinStyle, miterLimOrRndScale)) + begin + if Length(lines[i]) = 1 then + begin + lwDiv2 := lineWidth/2; + with lines[i][0] do + AppendPath(Result, + Ellipse(RectD(x-lwDiv2, y-lwDiv2, x+lwDiv2, y+lwDiv2))); + end else + begin + p := StripNearDuplicates(lines[i], 0.25, true); + if Length(p) = 2 then AppendToPath(p, p[0]); + AppendPath(Result, + GrowClosedLine(p, lineWidth, joinStyle, miterLimOrRndScale)); + end; + end; + end else for i := 0 to high(lines) do AppendPath(Result, GrowOpenLine(lines[i], lineWidth, @@ -2941,7 +3139,7 @@ function Arc(const rec: TRectD; angle := endAngle - startAngle + angle360 else angle := endAngle - startAngle; //steps = (No. steps for a whole ellipse) * angle/(2*Pi) - steps := Round(CalcRoundingSteps((rec.width + rec.height) * scale)); + steps := Round(CalcRoundingSteps((rec.width + rec.height)/2 * scale)); steps := steps div 2; ///////////////////////////////// if steps < 2 then steps := 2; SetLength(Result, Steps +1); @@ -2992,46 +3190,46 @@ function ArrowHead(const arrowTip, ctrlPt: TPointD; size: double; asSimple: begin setLength(result, 3); - basePt := OffsetPoint(arrowTip, -unitVec.X * size, -unitVec.Y * size); + basePt := TranslatePoint(arrowTip, -unitVec.X * size, -unitVec.Y * size); result[0] := arrowTip; - result[1] := OffsetPoint(basePt, -unitVec.Y * sDiv50, unitVec.X * sDiv50); - result[2] := OffsetPoint(basePt, unitVec.Y * sDiv50, -unitVec.X * sDiv50); + result[1] := TranslatePoint(basePt, -unitVec.Y * sDiv50, unitVec.X * sDiv50); + result[2] := TranslatePoint(basePt, unitVec.Y * sDiv50, -unitVec.X * sDiv50); end; asFancy: begin setLength(result, 4); - basePt := OffsetPoint(arrowTip, + basePt := TranslatePoint(arrowTip, -unitVec.X * sDiv120, -unitVec.Y * sDiv120); - result[0] := OffsetPoint(basePt, -unitVec.Y *sDiv50, unitVec.X *sDiv50); - result[1] := OffsetPoint(arrowTip, -unitVec.X *size, -unitVec.Y *size); - result[2] := OffsetPoint(basePt, unitVec.Y *sDiv50, -unitVec.X *sDiv50); + result[0] := TranslatePoint(basePt, -unitVec.Y *sDiv50, unitVec.X *sDiv50); + result[1] := TranslatePoint(arrowTip, -unitVec.X *size, -unitVec.Y *size); + result[2] := TranslatePoint(basePt, unitVec.Y *sDiv50, -unitVec.X *sDiv50); result[3] := arrowTip; end; asDiamond: begin setLength(result, 4); - basePt := OffsetPoint(arrowTip, -unitVec.X * sDiv60, -unitVec.Y * sDiv60); + basePt := TranslatePoint(arrowTip, -unitVec.X * sDiv60, -unitVec.Y * sDiv60); result[0] := arrowTip; - result[1] := OffsetPoint(basePt, -unitVec.Y * sDiv50, unitVec.X * sDiv50); - result[2] := OffsetPoint(arrowTip, -unitVec.X * sDiv120, -unitVec.Y * sDiv120); - result[3] := OffsetPoint(basePt, unitVec.Y * sDiv50, -unitVec.X * sDiv50); + result[1] := TranslatePoint(basePt, -unitVec.Y * sDiv50, unitVec.X * sDiv50); + result[2] := TranslatePoint(arrowTip, -unitVec.X * sDiv120, -unitVec.Y * sDiv120); + result[3] := TranslatePoint(basePt, unitVec.Y * sDiv50, -unitVec.X * sDiv50); end; asCircle: begin - basePt := OffsetPoint(arrowTip, -unitVec.X * sDiv50, -unitVec.Y * sDiv50); + basePt := TranslatePoint(arrowTip, -unitVec.X * sDiv50, -unitVec.Y * sDiv50); with Point(basePt) do result := Ellipse(RectD(x - sDiv50, y - sDiv50, x + sDiv50, y + sDiv50)); end; asTail: begin setLength(result, 6); - basePt := OffsetPoint(arrowTip, -unitVec.X * sDiv60, -unitVec.Y * sDiv60); - result[0] := OffsetPoint(arrowTip, -unitVec.X * sDiv50, -unitVec.Y * sDiv50); - result[1] := OffsetPoint(arrowTip, -unitVec.Y * sDiv40, unitVec.X * sDiv40); - result[2] := OffsetPoint(basePt, -unitVec.Y * sDiv40, unitVec.X * sDiv40); - result[3] := OffsetPoint(arrowTip, -unitVec.X * sDiv120, -unitVec.Y * sDiv120); - result[4] := OffsetPoint(basePt, unitVec.Y * sDiv40, -unitVec.X * sDiv40); - result[5] := OffsetPoint(arrowTip, unitVec.Y * sDiv40, -unitVec.X * sDiv40); + basePt := TranslatePoint(arrowTip, -unitVec.X * sDiv60, -unitVec.Y * sDiv60); + result[0] := TranslatePoint(arrowTip, -unitVec.X * sDiv50, -unitVec.Y * sDiv50); + result[1] := TranslatePoint(arrowTip, -unitVec.Y * sDiv40, unitVec.X * sDiv40); + result[2] := TranslatePoint(basePt, -unitVec.Y * sDiv40, unitVec.X * sDiv40); + result[3] := TranslatePoint(arrowTip, -unitVec.X * sDiv120, -unitVec.Y * sDiv120); + result[4] := TranslatePoint(basePt, unitVec.Y * sDiv40, -unitVec.X * sDiv40); + result[5] := TranslatePoint(arrowTip, unitVec.Y * sDiv40, -unitVec.X * sDiv40); end; end; end; @@ -3241,8 +3439,9 @@ function GetDashedOutLine(const path: TPathD; if pattern[i] <= 0 then pattern[i] := 1; tmp := GetDashedPath(path, closed, pattern, patternOffset); for i := 0 to high(tmp) do - AppendPath(Result, GrowOpenLine(tmp[i], - lineWidth, joinStyle, endStyle, 2)); +// AppendPath(Result, GrowOpenLine(tmp[i], +// lineWidth, joinStyle, endStyle, 2)); + AppendPath(Result, GrowClosedLine(tmp[i], lineWidth, joinStyle, 2)); end; //------------------------------------------------------------------------------ diff --git a/Ext/SVGIconImageList/Image32/source/Img32.Vectorizer.pas b/Ext/SVGIconImageList/Image32/source/Img32.Vectorizer.pas index 5c10888..b965da5 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.Vectorizer.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.Vectorizer.pas @@ -3,7 +3,7 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 1 May 2023 * +* Date : 17 December 2023 * * Website : http://www.angusj.com * * Copyright : Angus Johnson 2019-2023 * * Purpose : Converts raster images to vector paths * diff --git a/Ext/SVGIconImageList/Image32/source/Img32.inc b/Ext/SVGIconImageList/Image32/source/Img32.inc index 0647f0c..1ea8a27 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.inc +++ b/Ext/SVGIconImageList/Image32/source/Img32.inc @@ -1,21 +1,44 @@ -//NO_STORAGE is experimental -//Allows file system storage of layered objects etc -//Must be disabled to compile the experimental 'CtrlDemo' in Examples +// While "storage" is still technically experimental, +// it does allow file system storage of layered objects etc +// Comment out the following preprocessor define if you do wish to +// use storage (eg to compile the experimental 'CtrlDemo' in Examples). {$DEFINE NO_STORAGE} -//USING_VCL_LCL - using either Delphi or Lazarus Component Libraries -//Adds a few extra library features (eg copying to and from TBitmap objects) -//Enabled is recommended unless you're compiling console applications. -{$IFDEF MSWINDOWS} +// Image downsampling occurs when images are reduced in size, and the default downsampling +// function is 'BoxDownSampling'. When downsampling, this function generally produces much +// clearer images than general purpose resamplers (which are much better at upsampling, +// and doing other affine transformations). However, if for some reason you do wish to use +// a general purpose resampler while downsampling, then disable this define. +{$DEFINE USE_DOWNSAMPLER_AUTOMATICALLY} + +// The SimplifyPath and SimplifyPaths functions have changed. Specifically the last +// parameter has changed from IsOpenPath to IsClosedPath, though the default has also +// changed from false to true which should minimise any inconvenience. This change was +// made to remove an inconsistency with other functions that all contain an IsClosedPath +// parameter. However, if this change is going to create havoc for some reason, then +// the following (somewhat temporary) define can be enabled. +{.$DEFINE USE_OLD_SIMPLIFYPATHS} + +//USING_VCL_LCL - using either Delphi Visual Component Library or Lazarus Component Library +//is required if using the TImage32Panel component +//and adds a few extra library features (eg copying to and from TBitmap objects) +{$IF DEFINED(FPC)} + {$DEFINE USING_LCL} {$DEFINE USING_VCL_LCL} -{$ENDIF} +{$ELSEIF declared(FireMonkeyVersion) OR DEFINED(FRAMEWORK_FMX)} + {$DEFINE USING_FMX} +{$ELSE} + {$DEFINE USING_VCL} + {$DEFINE USING_VCL_LCL} +{$IFEND} {$IFDEF FPC} {$MODE DELPHI} {$DEFINE ABSTRACT_CLASSES} {$DEFINE RECORD_METHODS} {$DEFINE PBYTE} - {$DEFINE UITYPES} + {$DEFINE NEWPOSFUNC} + {.$DEFINE UITYPES} {$DEFINE NESTED_TYPES} {$IFNDEF DEBUG} {$DEFINE INLINE} @@ -54,17 +77,15 @@ {$IF COMPILERVERSION >= 21} //Delphi 2010 {$DEFINE GESTURES} //added screen gesture support {$IF COMPILERVERSION >= 23} //DelphiXE2 - {$IF declared(FireMonkeyVersion)} //defined in FMX.Types - {$DEFINE FMX} - {$IFEND} {$DEFINE USES_NAMESPACES} {$DEFINE FORMATSETTINGS} {$DEFINE TROUNDINGMODE} {$DEFINE UITYPES} //added UITypes unit - {$DEFINE XPLAT_GENERICS} //reasonable cross-platform & generics support + {$DEFINE XPLAT_GENERICS} //cross-platform generics support {$DEFINE STYLESERVICES} //added StyleServices unit {$IF COMPILERVERSION >= 24} //DelphiXE3 {$LEGACYIFEND ON} + {$DEFINE NEWPOSFUNC} {$DEFINE ZEROBASEDSTR} {$IF COMPILERVERSION >= 25} //DelphiXE4 {$LEGACYIFEND ON} //avoids compiler warning diff --git a/Ext/SVGIconImageList/Image32/source/Img32.pas b/Ext/SVGIconImageList/Image32/source/Img32.pas index dd05899..58eddd0 100644 --- a/Ext/SVGIconImageList/Image32/source/Img32.pas +++ b/Ext/SVGIconImageList/Image32/source/Img32.pas @@ -3,9 +3,9 @@ (******************************************************************************* * Author : Angus Johnson * * Version : 4.4 * -* Date : 1 May 2023 * +* Date : 7 May 2024 * * Website : http://www.angusj.com * -* Copyright : Angus Johnson 2019-2023 * +* Copyright : Angus Johnson 2019-2024 * * Purpose : The core module of the Image32 library * * License : http://www.boost.org/LICENSE_1_0.txt * *******************************************************************************) @@ -82,9 +82,7 @@ TPointD = record {$ZEROBASEDSTRINGS OFF} {$ENDIF} -{$IFNDEF MSWINDOWS} - RT_BITMAP = PChar(2); -{$ENDIF} +RT_BITMAP = PChar(2); type TClipboardPriority = (cpLow, cpMedium, cpHigh); @@ -166,7 +164,7 @@ TImageFormat = class TTileFillStyle = (tfsRepeat, tfsMirrorHorz, tfsMirrorVert, tfsRotate180); - TResamplerFunction = function(img: TImage32; x256, y256: integer): TColor32; + TResamplerFunction = function(img: TImage32; x, y: double): TColor32; TImage32 = class(TObject) private @@ -197,6 +195,7 @@ TImage32 = class(TObject) function GetBounds: TRect; function GetMidPoint: TPointD; protected + procedure ResetColorCount; function RectHasTransparency(rec: TRect): Boolean; function CopyPixels(rec: TRect): TArrayOfColor32; //CopyInternal: Internal routine (has no scaling or bounds checking) @@ -220,6 +219,7 @@ TImage32 = class(TObject) procedure Assign(src: TImage32); procedure AssignTo(dst: TImage32); + //SetSize: Erases any current image, and fills with the specified color. procedure SetSize(newWidth, newHeight: Integer; color: TColor32 = 0); //Resize: is very similar to Scale() @@ -254,10 +254,10 @@ TImage32 = class(TObject) procedure CopyToDc(const srcRect, dstRect: TRect; dstDc: HDC; transparent: Boolean = true); overload; {$ENDIF} -{$IFDEF USING_VCL_LCL} +{$IF DEFINED(USING_VCL_LCL)} procedure CopyFromBitmap(bmp: TBitmap); procedure CopyToBitmap(bmp: TBitmap); -{$ENDIF} +{$IFEND} function CopyToClipBoard: Boolean; class function CanPasteFromClipBoard: Boolean; function PasteFromClipBoard: Boolean; @@ -292,6 +292,7 @@ TImage32 = class(TObject) procedure AdjustLuminance(percent: Integer); //ie +/- 100% procedure AdjustSaturation(percent: Integer); //ie +/- 100% + function GetOpaqueBounds: TRect; //CropTransparentPixels: Trims transparent edges until each edge contains //at least one opaque or semi-opaque pixel. function CropTransparentPixels: TRect; @@ -444,6 +445,9 @@ TImageList32 = class function GetByteMask(img: TImage32; reference: TColor32; compareFunc: TCompareFunctionEx): TArrayOfByte; + function GetColorMask(img: TImage32; reference: TColor32; + compareFunc: TCompareFunction; tolerance: Integer): TArrayOfColor32; + {$IFDEF MSWINDOWS} //Color32: Converts a Graphics.TColor value into a TColor32 value. function Color32(rgbColor: Integer): TColor32; overload; @@ -475,7 +479,9 @@ TImageList32 = class function ClampByte(val: Integer): byte; overload; {$IFDEF INLINE} inline; {$ENDIF} function ClampByte(val: double): byte; overload; {$IFDEF INLINE} inline; {$ENDIF} function ClampRange(val, min, max: Integer): Integer; overload; + {$IFDEF INLINE} inline; {$ENDIF} function ClampRange(val, min, max: double): double; overload; + {$IFDEF INLINE} inline; {$ENDIF} function IncPColor32(pc: Pointer; cnt: Integer): PColor32; procedure NormalizeAngle(var angle: double; tolerance: double = Pi/360); @@ -543,7 +549,7 @@ TImageList32 = class rNearestResampler : integer; rBilinearResampler: integer; rBicubicResampler : integer; - + rWeightedBilinear : integer; DefaultResampler: Integer = 0; //Both MulTable and DivTable are used in blend functions @@ -580,7 +586,7 @@ TImageList32 = class implementation uses - Img32.Vector, Img32.Resamplers, Img32.Transform; + Img32.Vector, Img32.Resamplers, Img32.Transform, Img32.Fmt.BMP; resourcestring rsImageTooLarge = 'Image32 error: the image is too large.'; @@ -1069,7 +1075,7 @@ function Get32bitBitmapInfoHeader(width, height: Integer): TBitmapInfoHeader; Result.biHeight := height; Result.biPlanes := 1; Result.biBitCount := 32; - Result.biSizeImage := width * height * SizeOf(TColor32); + Result.biSizeImage := width * Abs(height) * SizeOf(TColor32); Result.biCompression := BI_RGB; end; //------------------------------------------------------------------------------ @@ -1203,6 +1209,29 @@ function GetBoolMask(img: TImage32; reference: TColor32; end; //------------------------------------------------------------------------------ +function GetColorMask(img: TImage32; reference: TColor32; + compareFunc: TCompareFunction; tolerance: Integer): TArrayOfColor32; +var + i: integer; + pDstPxl: PColor32; + pSrcPxl: PColor32; +begin + result := nil; + if not assigned(img) or img.IsEmpty then Exit; + if not Assigned(compareFunc) then compareFunc := CompareRGB; + SetLength(Result, img.Width * img.Height); + pDstPxl := @Result[0]; + pSrcPxl := img.PixelBase; + for i := 0 to img.Width * img.Height -1 do + begin + if compareFunc(reference, pSrcPxl^, tolerance) then + pDstPxl^ := clWhite32 else + pDstPxl^ := clBlack32; + inc(pSrcPxl); inc(pDstPxl); + end; +end; +//------------------------------------------------------------------------------ + function GetAlphaEx(master, current: TColor32): Byte; {$IFDEF INLINE} inline; {$ENDIF} var @@ -1641,7 +1670,7 @@ procedure TImage32.AssignTo(dst: TImage32); dst.fResampler := fResampler; dst.fIsPremultiplied := fIsPremultiplied; dst.fAntiAliased := fAntiAliased; - dst.fColorCount := 0; + dst.ResetColorCount; try dst.SetSize(Width, Height); if (Width > 0) and (Height > 0) then @@ -1658,7 +1687,7 @@ procedure TImage32.AssignTo(dst: TImage32); procedure TImage32.Changed; begin if fUpdateCnt <> 0 then Exit; - fColorCount := 0; + ResetColorCount; if Assigned(fOnChange) then fOnChange(Self); end; //------------------------------------------------------------------------------ @@ -1775,6 +1804,12 @@ procedure TImage32.FillRect(rec: TRect; color: TColor32); end; //------------------------------------------------------------------------------ +procedure TImage32.ResetColorCount; +begin + fColorCount := 0; +end; +//------------------------------------------------------------------------------ + function TImage32.RectHasTransparency(rec: TRect): Boolean; var i,j, rw: Integer; @@ -1947,9 +1982,7 @@ procedure TImage32.Resize(newWidth, newHeight: Integer); BlockNotify; try - if (newWidth < Width) and (newHeight < Height) then - BoxDownSampling(self, newWidth, newHeight) - else if fResampler = 0 then + if fResampler <= rNearestResampler then NearestNeighborResize(newWidth, newHeight) else ResamplerResize(newWidth, newHeight); @@ -1976,16 +2009,15 @@ procedure TImage32.NearestNeighborResize(newWidth, newHeight: Integer); //get scaled X & Y values once only (storing them in lookup arrays) ... SetLength(scaledXi, newWidth); for x := 0 to newWidth -1 do - scaledXi[x] := Floor(x * fWidth / newWidth); + scaledXi[x] := Trunc(x * fWidth / newWidth); SetLength(scaledYi, newHeight); for y := 0 to newHeight -1 do - scaledYi[y] := Floor(y * fHeight / newHeight); + scaledYi[y] := Trunc(y * fHeight / newHeight); pc := @tmp[0]; for y := 0 to newHeight - 1 do begin srcY := scaledYi[y]; - if (srcY < 0) or (srcY >= fHeight) then Continue; for x := 0 to newWidth - 1 do begin pc^ := fPixels[scaledXi[x] + srcY * fWidth]; @@ -2059,7 +2091,7 @@ procedure TImage32.ScaleToFitCentered(width, height: integer); Scale(sx); if height = self.Height then Exit; rec2 := Bounds; - Types.OffsetRect(rec2, 0, (height - self.Height) div 2); + TranslateRect(rec2, 0, (height - self.Height) div 2); tmp := TImage32.Create(self); try SetSize(width, height); @@ -2072,7 +2104,7 @@ procedure TImage32.ScaleToFitCentered(width, height: integer); Scale(sy); if width = self.Width then Exit; rec2 := Bounds; - Types.OffsetRect(rec2, (width - self.Width) div 2, 0); + TranslateRect(rec2, (width - self.Width) div 2, 0); tmp := TImage32.Create(self); try SetSize(width, height); @@ -2219,7 +2251,7 @@ function TImage32.GetHasTransparency: Boolean; pc := PARGB(PixelBase); for i := 0 to Width * Height -1 do begin - if pc.A < 255 then Exit; + if pc.A < 128 then Exit; inc(pc); end; result := false; @@ -2426,7 +2458,7 @@ function TImage32.CopyBlend(src: TImage32; srcRec, dstRec: TRect; RectWidthHeight(srcRecClipped, w, h); RectWidthHeight(srcRec, srcW, srcH); ScaleRect(dstRec, w / srcW, h / srcH); - Types.OffsetRect(dstRec, + TranslateRect(dstRec, srcRecClipped.Left - srcRec.Left, srcRecClipped.Top - srcRec.Top); end; @@ -2456,7 +2488,7 @@ function TImage32.CopyBlend(src: TImage32; srcRec, dstRec: TRect; RectWidthHeight(dstRecClipped, w, h); RectWidthHeight(dstRec, dstW, dstH); ScaleRect(srcRecClipped, w / dstW, h / dstH); - Types.OffsetRect(srcRecClipped, + TranslateRect(srcRecClipped, dstRecClipped.Left - dstRec.Left, dstRecClipped.Top - dstRec.Top); end; @@ -2494,8 +2526,7 @@ function TImage32.LoadFromResource(const resName: string; resType: PChar): Boole end; //------------------------------------------------------------------------------ -{$IFDEF MSWINDOWS} - +{$IF DEFINED (MSWINDOWS)} procedure TImage32.CopyFromDC(srcDc: HDC; const srcRect: TRect); var bi: TBitmapInfoHeader; @@ -2508,7 +2539,7 @@ procedure TImage32.CopyFromDC(srcDc: HDC; const srcRect: TRect); try RectWidthHeight(srcRect, w,h); SetSize(w, h); - bi := Get32bitBitmapInfoHeader(w, h); + bi := Get32bitBitmapInfoHeader(w, -h); // -h => avoids need to flip image dc := GetDC(0); memDc := CreateCompatibleDC(dc); try @@ -2528,7 +2559,7 @@ procedure TImage32.CopyFromDC(srcDc: HDC; const srcRect: TRect); ReleaseDc(0, dc); end; if IsBlank then SetAlpha(255); - FlipVertical; + //FlipVertical; finally EndUpdate; end; @@ -2555,12 +2586,12 @@ procedure TImage32.CopyToDc(const srcRect: TRect; dstDc: HDC; procedure TImage32.CopyToDc(const srcRect, dstRect: TRect; dstDc: HDC; transparent: Boolean = true); var - i, x,y, wSrc ,hSrc, wDest, hDest: integer; + i, x,y, wSrc ,hSrc, wDest, hDest, wBytes: integer; rec: TRect; bi: TBitmapInfoHeader; bm, oldBm: HBitmap; dibBits: Pointer; - pc: PARGB; + pDst, pSrc: PARGB; memDc: HDC; isTransparent: Boolean; bf: BLENDFUNCTION; @@ -2585,11 +2616,15 @@ procedure TImage32.CopyToDc(const srcRect, dstRect: TRect; try //copy Image to dibBits (with vertical flip) - pc := dibBits; + wBytes := wSrc * SizeOf(TColor32); + pDst := dibBits; + pSrc := PARGB(PixelRow[rec.Bottom -1]); + inc(pSrc, rec.Left); for i := rec.Bottom -1 downto rec.Top do begin - Move(Pixels[i * Width + rec.Left], pc^, wSrc * SizeOf(TColor32)); - inc(pc, wSrc); + Move(pSrc^, pDst^, wBytes); + dec(pSrc, Width); + inc(pDst, wSrc); end; oldBm := SelectObject(memDC, bm); @@ -2597,17 +2632,17 @@ procedure TImage32.CopyToDc(const srcRect, dstRect: TRect; begin //premultiplied alphas are required when alpha blending - pc := dibBits; + pDst := dibBits; for i := 0 to wSrc * hSrc -1 do begin - if pc.A > 0 then + if pDst.A > 0 then begin - pc.R := MulTable[pc.R, pc.A]; - pc.G := MulTable[pc.G, pc.A]; - pc.B := MulTable[pc.B, pc.A]; + pDst.R := MulTable[pDst.R, pDst.A]; + pDst.G := MulTable[pDst.G, pDst.A]; + pDst.B := MulTable[pDst.B, pDst.A]; end else - pc.Color := 0; - inc(pc); + pDst.Color := 0; + inc(pDst); end; bf.BlendOp := AC_SRC_OVER; @@ -2617,10 +2652,13 @@ procedure TImage32.CopyToDc(const srcRect, dstRect: TRect; AlphaBlend(dstDc, x,y, wDest,hDest, memDC, 0,0, wSrc,hSrc, bf); end else if (wDest = wSrc) and (hDest = hSrc) then + begin BitBlt(dstDc, x,y, wSrc, hSrc, memDc, 0,0, SRCCOPY) - else + end else + begin + SetStretchBltMode(dstDc, COLORONCOLOR); StretchBlt(dstDc, x,y, wDest, hDest, memDc, 0,0, wSrc,hSrc, SRCCOPY); - + end; SelectObject(memDC, oldBm); finally DeleteObject(bm); @@ -2629,8 +2667,51 @@ procedure TImage32.CopyToDc(const srcRect, dstRect: TRect; DeleteDc(memDc); end; end; +{$IFEND} //------------------------------------------------------------------------------ -{$ENDIF} + +{$IF DEFINED(USING_VCL_LCL)} +procedure TImage32.CopyFromBitmap(bmp: TBitmap); +var + ms: TMemoryStream; + bmpFormat: TImageFormat_BMP; +begin + ms := TMemoryStream.create; + bmpFormat := TImageFormat_BMP.Create; + try + bmp.SaveToStream(ms); + ms.Position := 0; + bmpFormat.LoadFromStream(ms, self); + finally + ms.Free; + bmpFormat.Free; + end; +end; +//------------------------------------------------------------------------------ + +procedure TImage32.CopyToBitmap(bmp: TBitmap); +var + ms: TMemoryStream; + bmpFormat: TImageFormat_BMP; +begin + ms := TMemoryStream.create; + bmpFormat := TImageFormat_BMP.Create; + try + bmpFormat.IncludeFileHeaderInSaveStream := true; + bmpFormat.SaveToStream(ms, self); + ms.Position := 0; + bmp.PixelFormat := pf32bit; + {$IF DEFINED(USING_VCL) AND DEFINED(ALPHAFORMAT)} + bmp.AlphaFormat := afDefined; + {$IFEND} + bmp.LoadFromStream(ms); + finally + ms.Free; + bmpFormat.Free; + end; +end; +//------------------------------------------------------------------------------ +{$IFEND} function TImage32.CopyToClipBoard: Boolean; var @@ -2700,63 +2781,6 @@ function TImage32.PasteFromClipBoard: Boolean; end; //------------------------------------------------------------------------------ -{$IFDEF USING_VCL_LCL} -procedure TImage32.CopyFromBitmap(bmp: TBitmap); -var - savedPF: TPixelFormat; -{$IFNDEF MSWINDOWS} - i: integer; - pxDst, pxSrc: PColor32; -{$ENDIF} -begin - if not Assigned(bmp) then Exit; - savedPF := bmp.PixelFormat; - bmp.PixelFormat := pf32bit; - SetSize(bmp.Width, bmp.Height); -{$IFDEF MSWINDOWS} - GetBitmapBits(bmp.Handle, Width * Height * 4, PixelBase); -{$ELSE} - for i := 0 to bmp.Height -1 do - begin - pxSrc := bmp.ScanLine[i]; - pxDst := PixelRow[i]; - Move(pxSrc^, pxDst^, bmp.Width * SizeOf(TColor32)); - end; -{$ENDIF} - bmp.PixelFormat := savedPF; -end; -//------------------------------------------------------------------------------ - -procedure TImage32.CopyToBitmap(bmp: TBitmap); -{$IFNDEF MSWINDOWS} -var - i: integer; - pxDst, pxSrc: PColor32; -{$ENDIF} -begin - if not Assigned(bmp) then Exit; - bmp.PixelFormat := pf32bit; - bmp.Width := Width; - bmp.Height := Height; -{$IFDEF MSWINDOWS} - {$IFNDEF FPC} - {$IFDEF ALPHAFORMAT} - bmp.AlphaFormat := afDefined; - {$ENDIF} - {$ENDIF} - SetBitmapBits(bmp.Handle, Width * Height * 4, PixelBase); -{$ELSE} - for i := 0 to bmp.Height -1 do - begin - pxDst := bmp.ScanLine[i]; - pxSrc := PixelRow[i]; - Move(pxSrc^, pxDst^, bmp.Width * SizeOf(TColor32)); - end; -{$ENDIF} -end; -//------------------------------------------------------------------------------ -{$ENDIF} - procedure TImage32.ConvertToBoolMask(reference: TColor32; tolerance: integer; colorFunc: TCompareFunction; maskBg: TColor32; maskFg: TColor32); var @@ -3087,13 +3111,14 @@ procedure TImage32.AdjustSaturation(percent: Integer); end; //------------------------------------------------------------------------------ -function TImage32.CropTransparentPixels: TRect; +function TImage32.GetOpaqueBounds: TRect; var x,y, x1,x2,y1,y2: Integer; found: Boolean; begin y1 := 0; y2 := 0; found := false; + Result := NullRect; for y := 0 to Height -1 do begin for x := 0 to Width -1 do @@ -3107,10 +3132,7 @@ function TImage32.CropTransparentPixels: TRect; end; if not found then - begin - SetSize(0, 0); Exit; - end; found := false; for y := Height -1 downto 0 do @@ -3135,13 +3157,20 @@ function TImage32.CropTransparentPixels: TRect; end; Result := Types.Rect(x1, y1, x2+1, y2+1); - Crop(Result); +end; +//------------------------------------------------------------------------------ + +function TImage32.CropTransparentPixels: TRect; +begin + Result := GetOpaqueBounds; + if IsEmptyRect(Result) then + SetSize(0,0) else + Crop(Result); end; //------------------------------------------------------------------------------ procedure TImage32.Rotate(angleRads: double); var - rec: TRectD; mat: TMatrixD; begin if not ClockwiseRotationIsAnglePositive then @@ -3167,11 +3196,10 @@ procedure TImage32.Rotate(angleRads: double); end else begin mat := IdentityMatrix; - MatrixTranslate(mat, Width/2, Height/2); - rec := RectD(Bounds); - rec := GetRotatedRectBounds(rec, angleRads); + // the rotation point isn't important + // because AffineTransformImage() will + // will resize and recenter the image MatrixRotate(mat, NullPointD, angleRads); - MatrixTranslate(mat, rec.Width/2, rec.Height/2); AffineTransformImage(self, mat); end; end; @@ -3471,15 +3499,6 @@ procedure GetScreenScale; {$ENDIF} //------------------------------------------------------------------------------ -{$IFDEF USING_VCL_LCL} -procedure GetScreenScale2; -begin - DpiAwareOne := Screen.PixelsPerInch / 96; - dpiAware1 := Round(DpiAwareOne); -end; -{$ENDIF} -//------------------------------------------------------------------------------ - procedure CleanUpImageFormatClassList; var i: integer; @@ -3565,10 +3584,6 @@ initialization {$IFDEF MSWINDOWS} GetScreenScale; -{$ELSE} - {$IFDEF USING_VCL_LCL} - GetScreenScale2; - {$ENDIF} {$ENDIF} finalization diff --git a/Ext/SVGIconImageList/Packages/D11/SVGIconImageList.res b/Ext/SVGIconImageList/Packages/D11/SVGIconImageList.res deleted file mode 100644 index 93e7e944f20ed0f0e50532c1b7ef56bb8d255d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& diff --git a/Ext/SVGIconImageList/Packages/D11/dclSVGIconImageListFMX.res b/Ext/SVGIconImageList/Packages/D11/dclSVGIconImageListFMX.res deleted file mode 100644 index 743599575b02e97248bade49ed2e3eabafe25a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& diff --git a/Ext/SVGIconImageList/Packages/D12/SVGIconImageList.dproj b/Ext/SVGIconImageList/Packages/D12/SVGIconImageList.dproj index c9dabab..142fa69 100644 --- a/Ext/SVGIconImageList/Packages/D12/SVGIconImageList.dproj +++ b/Ext/SVGIconImageList/Packages/D12/SVGIconImageList.dproj @@ -2,13 +2,14 @@ {B5E8B9F1-C42D-4AFC-AE08-193731C6515B} SVGIconImageList.dpk - 20.0 + 20.1 VCL True Release Win32 3 Package + SVGIconImageList true @@ -23,6 +24,11 @@ Base true + + true + Base + true + true Base @@ -49,7 +55,7 @@ false true true - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;System;Xml;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Shell;$(DCC_Namespace) All SVGIconImageList Ethea SVGIconImageList VCL components @@ -59,13 +65,17 @@ true - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) Debug - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) Debug + + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + DEBUG;$(DCC_Define) true @@ -126,10 +136,13 @@ SVGIconImageList.dpk + + True True + False 12 diff --git a/Ext/SVGIconImageList/Packages/D12/SVGIconImageList.res b/Ext/SVGIconImageList/Packages/D12/SVGIconImageList.res deleted file mode 100644 index 93e7e944f20ed0f0e50532c1b7ef56bb8d255d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e# {45F75DEA-42F2-4C8C-AA3A-0C8FF47BEE1F} SVGIconImageListFMX.dpk - 20.0 + 20.1 FMX True Release Win32 3 Package + SVGIconImageListFMX true @@ -53,6 +54,11 @@ Base true + + true + Base + true + true Base @@ -127,6 +133,11 @@ Debug true + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + DEBUG;$(DCC_Define) true @@ -176,6 +187,8 @@ SVGIconImageListFMX.dpk + + False @@ -187,6 +200,7 @@ False True True + False 12 diff --git a/Ext/SVGIconImageList/Packages/D12/SVGIconImageListFMX.res b/Ext/SVGIconImageList/Packages/D12/SVGIconImageListFMX.res deleted file mode 100644 index 93e7e944f20ed0f0e50532c1b7ef56bb8d255d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e# {D0A69637-2974-4401-9226-4F66893CB5CE} SVGImage32Package.dpk - 20.0 + 20.1 VCL True Release Win32 3 Package + SVGImage32Package true @@ -18,6 +19,16 @@ Base true + + true + Base + true + + + true + Base + true + true Base @@ -56,6 +67,12 @@ Debug + + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + DEBUG;$(DCC_Define) true @@ -81,6 +98,7 @@ + @@ -124,10 +142,13 @@ SVGImage32Package.dpk + + True True + False 12 diff --git a/Ext/SVGIconImageList/Packages/D12/SVGImage32Package.res b/Ext/SVGIconImageList/Packages/D12/SVGImage32Package.res deleted file mode 100644 index 93e7e944f20ed0f0e50532c1b7ef56bb8d255d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e# {265E39DA-3CDF-4D32-A71B-DE971C864350} dclSVGIconImageList.dpk - 20.0 + 20.1 VCL True Release Win32 1 Package + dclSVGIconImageList true @@ -18,6 +19,11 @@ Base true + + true + Base + true + true Base @@ -58,6 +64,13 @@ Debug SVGIconImageList;$(DCC_UsePackage) + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + DEBUG;$(DCC_Define) true @@ -116,6 +129,7 @@ True False + False 12 diff --git a/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageList.res b/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageList.res deleted file mode 100644 index 743599575b02e97248bade49ed2e3eabafe25a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& diff --git a/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.dproj b/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.dproj index 859f41c..c203151 100644 --- a/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.dproj +++ b/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.dproj @@ -2,13 +2,14 @@ {D45ECCFB-40F6-46F7-8BC3-DBFAA3C12B32} dclSVGIconImageListFMX.dpk - 20.0 + 20.1 FMX True Release Win32 1 Package + dclSVGIconImageListFMX true @@ -53,6 +54,11 @@ Base true + + true + Base + true + true Base @@ -125,6 +131,11 @@ rtl;$(DCC_UsePackage) + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + DEBUG;$(DCC_Define) true @@ -189,6 +200,7 @@ False True False + False 12 diff --git a/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.res b/Ext/SVGIconImageList/Packages/D12/dclSVGIconImageListFMX.res deleted file mode 100644 index 743599575b02e97248bade49ed2e3eabafe25a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& diff --git a/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.fmx b/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.fmx new file mode 100644 index 0000000..a3bdfb5 --- /dev/null +++ b/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.fmx @@ -0,0 +1,697 @@ +object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX + Left = 0 + Top = 0 + ActiveControl = OKButton + Caption = + 'FireMonkey SVG Icons ImageList Editor %s - Copyright Ethea S.r.l' + + '.' + ClientHeight = 624 + ClientWidth = 800 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop] + OnCreate = FormCreate + OnDestroy = FormDestroy + OnResize = FormResize + OnShow = FormShow + DesignerMasterStyle = 0 + object ListBoxItemStyleBook: TStyleBook + Styles = < + item + end + item + Platform = 'Windows 10 Desktop' + ResourcesBin = { + 464D585F5354594C4520322E35010616437573746F6D4C697374426F78497465 + 6D5374796C65037010005450463007544C61796F757400095374796C654E616D + 650616437573746F6D4C697374426F784974656D5374796C6505416C69676E07 + 0643656E7465720A53697A652E57696474680500000000000000B406400B5369 + 7A652E48656967687405000000000000008005401453697A652E506C6174666F + 726D44656661756C7408085461624F726465720200000654476C797068000953 + 74796C654E616D65060A676C7970687374796C650C4D617267696E732E4C6566 + 7405000000000000008000400B4D617267696E732E546F700500000000000000 + 80FF3F0D4D617267696E732E526967687405000000000000008000400E4D6172 + 67696E732E426F74746F6D050000000000000080FF3F05416C69676E07044C65 + 66740A53697A652E576964746805000000000000008005400B53697A652E4865 + 6967687405000000000000008005401453697A652E506C6174666F726D446566 + 61756C7408000016544163746976655374796C65546578744F626A6563740009 + 5374796C654E616D6506047465787405416C69676E0706436C69656E740C4D61 + 7267696E732E4C6566740500000000000000C000400B4D617267696E732E546F + 70050000000000000080FF3F0D4D617267696E732E5269676874050000000000 + 0000C000400E4D617267696E732E426F74746F6D050000000000000080FF3F0A + 53697A652E57696474680500000000000000AE06400B53697A652E4865696768 + 740500000000000000F804401453697A652E506C6174666F726D44656661756C + 74080454657874060454657874155465787453657474696E67732E576F726457 + 72617008165465787453657474696E67732E486F727A416C69676E07074C6561 + 64696E670D536861646F7756697369626C65080D416374697665547269676765 + 72070853656C65637465640B416374697665436F6C6F720708636C61426C6163 + 6B00000954436865636B426F7800095374796C654E616D650605636865636B05 + 416C69676E07044C6566740843616E466F637573081244697361626C65466F63 + 7573456666656374090A53697A652E57696474680500000000000000A003400B + 53697A652E48656967687405000000000000009803401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B757006204C697374426F + 784974656D315374796C6531436865636B426F785374796C6531075669736962 + 6C6508000007544C61796F757400095374796C654E616D65060D616363657373 + 6F72796D6F726505416C69676E07094D6F737452696768740A53697A652E5769 + 6474680500000000000000B003400B53697A652E486569676874050000000000 + 0000B004401453697A652E506C6174666F726D44656661756C74080756697369 + 626C65080012544163746976655374796C654F626A6563740005416C69676E07 + 0643656E7465720C536F757263654C6F6F6B7570061B57696E646F7773203130 + 204465736B746F707374796C652E706E670A53697A652E576964746805000000 + 00000000B002400B53697A652E48656967687405000000000000008003401453 + 697A652E506C6174666F726D44656661756C740808577261704D6F6465070643 + 656E7465720D41637469766554726967676572070853656C65637465640A4163 + 746976654C696E6B0E010F536F75726365526563742E4C656674050000000000 + 00008706400E536F75726365526563742E546F700500000000000000B3074010 + 536F75726365526563742E5269676874050000000000000092064011536F7572 + 6365526563742E426F74746F6D0500000000000000BB07400001055363616C65 + 0500000000000000C0FF3F0F536F75726365526563742E4C6566740500000000 + 000000CA06400E536F75726365526563742E546F700500000000000040860840 + 10536F75726365526563742E52696768740500000000000000DA064011536F75 + 726365526563742E426F74746F6D05000000000000408C08400001055363616C + 6505000000000000008000400F536F75726365526563742E4C65667405000000 + 000000008707400E536F75726365526563742E546F700500000000000000B308 + 4010536F75726365526563742E5269676874050000000000000092074011536F + 75726365526563742E426F74746F6D0500000000000000BB084000000A536F75 + 7263654C696E6B0E010F536F75726365526563742E4C65667405000000000000 + 008706400E536F75726365526563742E546F700500000000000000B307401053 + 6F75726365526563742E5269676874050000000000000092064011536F757263 + 65526563742E426F74746F6D0500000000000000BB07400001055363616C6505 + 00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000 + 0000CA06400E536F75726365526563742E546F70050000000000004086084010 + 536F75726365526563742E52696768740500000000000000DA064011536F7572 + 6365526563742E426F74746F6D05000000000000408C08400001055363616C65 + 05000000000000008000400F536F75726365526563742E4C6566740500000000 + 0000008707400E536F75726365526563742E546F700500000000000000B30840 + 10536F75726365526563742E5269676874050000000000000092074011536F75 + 726365526563742E426F74746F6D0500000000000000BB0840000013546F7563 + 68416E696D6174696F6E2E4C696E6B0E0000000007544C61796F757400095374 + 796C654E616D6506126163636573736F7279636865636B6D61726B05416C6967 + 6E07094D6F737452696768740A53697A652E57696474680500000000000000B0 + 03400B53697A652E4865696768740500000000000000B004401453697A652E50 + 6C6174666F726D44656661756C74080756697369626C65080012544163746976 + 655374796C654F626A6563740005416C69676E070643656E7465720C536F7572 + 63654C6F6F6B7570061B57696E646F7773203130204465736B746F707374796C + 652E706E670A53697A652E576964746805000000000000008803400B53697A65 + 2E48656967687405000000000000008803401453697A652E506C6174666F726D + 44656661756C740808577261704D6F6465070643656E7465720D416374697665 + 54726967676572070853656C65637465640A4163746976654C696E6B0E010F53 + 6F75726365526563742E4C65667405000000000000009706400E536F75726365 + 526563742E546F700500000000000080B2074010536F75726365526563742E52 + 696768740500000000000000A8064011536F75726365526563742E426F74746F + 6D0500000000000000BB07400001055363616C650500000000000000C0FF3F0F + 536F75726365526563742E4C6566740500000000000000E206400E536F757263 + 65526563742E546F70050000000000000086084010536F75726365526563742E + 52696768740500000000000000FC064011536F75726365526563742E426F7474 + 6F6D05000000000000808C08400001055363616C650500000000000000800040 + 0F536F75726365526563742E4C65667405000000000000009707400E536F7572 + 6365526563742E546F700500000000000080B2084010536F7572636552656374 + 2E52696768740500000000000000A8074011536F75726365526563742E426F74 + 746F6D0500000000000000BB084000000A536F757263654C696E6B0E010F536F + 75726365526563742E4C65667405000000000000009706400E536F7572636552 + 6563742E546F700500000000000080B2074010536F75726365526563742E5269 + 6768740500000000000000A8064011536F75726365526563742E426F74746F6D + 0500000000000000BB07400001055363616C650500000000000000C0FF3F0F53 + 6F75726365526563742E4C6566740500000000000000E206400E536F75726365 + 526563742E546F70050000000000000086084010536F75726365526563742E52 + 696768740500000000000000FC064011536F75726365526563742E426F74746F + 6D05000000000000808C08400001055363616C6505000000000000008000400F + 536F75726365526563742E4C65667405000000000000009707400E536F757263 + 65526563742E546F700500000000000080B2084010536F75726365526563742E + 52696768740500000000000000A8074011536F75726365526563742E426F7474 + 6F6D0500000000000000BB0840000013546F756368416E696D6174696F6E2E4C + 696E6B0E0000000007544C61796F757400095374796C654E616D65060F616363 + 6573736F727964657461696C05416C69676E07094D6F737452696768740A5369 + 7A652E57696474680500000000000000B003400B53697A652E48656967687405 + 00000000000000B004401453697A652E506C6174666F726D44656661756C7408 + 0756697369626C65080012544163746976655374796C654F626A656374000541 + 6C69676E070643656E7465720C536F757263654C6F6F6B7570061B57696E646F + 7773203130204465736B746F707374796C652E706E670A53697A652E57696474 + 6805000000000000008803400B53697A652E4865696768740500000000000000 + F002401453697A652E506C6174666F726D44656661756C740808577261704D6F + 6465070643656E7465720D41637469766554726967676572070853656C656374 + 65640A4163746976654C696E6B0E010F536F75726365526563742E4C65667405 + 00000000000000AD06400E536F75726365526563742E546F7005000000000000 + 00B3074010536F75726365526563742E52696768740500000000000000BE0640 + 11536F75726365526563742E426F74746F6D0500000000000080BA0740000105 + 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 + 05000000000000008207400E536F75726365526563742E546F70050000000000 + 004086084010536F75726365526563742E526967687405000000000000008F07 + 4011536F75726365526563742E426F74746F6D05000000000000C08B08400001 + 055363616C6505000000000000008000400F536F75726365526563742E4C6566 + 740500000000000000AD07400E536F75726365526563742E546F700500000000 + 000000B3084010536F75726365526563742E52696768740500000000000000BE + 074011536F75726365526563742E426F74746F6D0500000000000080BA084000 + 000A536F757263654C696E6B0E010F536F75726365526563742E4C6566740500 + 000000000000AD06400E536F75726365526563742E546F700500000000000000 + B3074010536F75726365526563742E52696768740500000000000000BE064011 + 536F75726365526563742E426F74746F6D0500000000000080BA074000010553 + 63616C650500000000000000C0FF3F0F536F75726365526563742E4C65667405 + 000000000000008207400E536F75726365526563742E546F7005000000000000 + 4086084010536F75726365526563742E526967687405000000000000008F0740 + 11536F75726365526563742E426F74746F6D05000000000000C08B0840000105 + 5363616C6505000000000000008000400F536F75726365526563742E4C656674 + 0500000000000000AD07400E536F75726365526563742E546F70050000000000 + 0000B3084010536F75726365526563742E52696768740500000000000000BE07 + 4011536F75726365526563742E426F74746F6D0500000000000080BA08400000 + 13546F756368416E696D6174696F6E2E4C696E6B0E0000000000} + end> + Left = 408 + Top = 104 + end + object OpenDialog: TOpenDialog + Filter = 'Scalable Vector Graphics (*.svg)|*.svg' + Options = [ofHideReadOnly, ofAllowMultiSelect, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 324 + Top = 102 + end + object BottomPanel: TPanel + Align = MostBottom + Position.Y = 592.000000000000000000 + Size.Width = 800.000000000000000000 + Size.Height = 32.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + object OKButton: TButton + Anchors = [akTop, akRight] + Default = True + ModalResult = 1 + Position.X = 558.000000000000000000 + Position.Y = 5.000000000000000000 + Size.Width = 75.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'OK' + TextSettings.Trimming = None + end + object CancelButton: TButton + Anchors = [akTop, akRight] + Cancel = True + ModalResult = 2 + Position.X = 638.000000000000000000 + Position.Y = 5.000000000000000000 + Size.Width = 75.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'Cancel' + TextSettings.Trimming = None + end + object HelpButton: TButton + Anchors = [akTop, akRight] + Position.X = 718.000000000000000000 + Position.Y = 5.000000000000000000 + Size.Width = 75.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Help' + TextSettings.Trimming = None + OnClick = HelpButtonClick + end + end + object TopPanel: TPanel + Align = Client + Size.Width = 800.000000000000000000 + Size.Height = 346.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + object ButtonsPanel: TPanel + Align = Right + Position.X = 688.000000000000000000 + Size.Width = 112.000000000000000000 + Size.Height = 346.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + object AddButton: TButton + Position.X = 3.000000000000000000 + Position.Y = 30.000000000000000000 + Size.Width = 106.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'Add...' + TextSettings.Trimming = None + OnClick = AddButtonClick + end + object DeleteButton: TButton + Position.X = 3.000000000000000000 + Position.Y = 56.000000000000000000 + Size.Width = 106.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Delete' + TextSettings.Trimming = None + OnClick = DeleteButtonClick + end + object ClearAllButton: TButton + Position.X = 3.000000000000000000 + Position.Y = 82.000000000000000000 + Size.Width = 106.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Clear all' + TextSettings.Trimming = None + OnClick = ClearAllButtonClick + end + object NewButton: TButton + Position.X = 3.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 106.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'New' + TextSettings.Trimming = None + OnClick = NewButtonClick + end + end + object paClient: TPanel + Align = Client + Size.Width = 688.000000000000000000 + Size.Height = 346.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + object ImageListGroupBox: TGroupBox + Align = Left + Size.Width = 217.000000000000000000 + Size.Height = 346.000000000000000000 + Size.PlatformDefault = False + Text = 'Properties of ImageList' + TabOrder = 1 + object AutoSizeCheckBox: TCheckBox + Position.X = 94.000000000000000000 + Position.Y = 25.000000000000000000 + TabOrder = 14 + Text = 'AutoSizeBitmaps' + OnChange = AutoSizeCheckBoxClick + end + object DefaultOpacitySpinBox: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 12 + Cursor = crIBeam + DecimalDigits = 1 + Value = 100.000000000000000000 + Position.X = 94.000000000000000000 + Position.Y = 120.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = DefaultOpacitySpinBoxChange + end + object DefaultOpacityLabel: TLabel + Position.X = 94.000000000000000000 + Position.Y = 103.000000000000000000 + Size.Width = 107.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = '% Opacity (default)' + TabOrder = 3 + end + object SizeSpinBox: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 1 + Cursor = crIBeam + DecimalDigits = 0 + Max = 256.000000000000000000 + Value = 128.000000000000000000 + Position.X = 6.000000000000000000 + Position.Y = 34.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = SizeChange + end + object SizeLabel: TLabel + Position.X = 6.000000000000000000 + Position.Y = 17.000000000000000000 + Size.Width = 88.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Size (in pixel)' + TabOrder = 0 + end + object FixedColorLabel: TLabel + Position.X = 6.000000000000000000 + Position.Y = 144.000000000000000000 + Size.Width = 107.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Fixed Color' + TabOrder = 13 + end + object GrayScaleCheckBox: TCheckBox + Position.X = 94.000000000000000000 + Position.Y = 44.000000000000000000 + TabOrder = 15 + Text = 'GrayScale' + OnChange = GrayScaleCheckBoxChange + end + object WidthLabel: TLabel + Position.X = 6.000000000000000000 + Position.Y = 62.000000000000000000 + Size.Width = 88.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Width (in pixel)' + TabOrder = 4 + TabStop = False + end + object WidthSpinBox: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 6 + Cursor = crIBeam + DecimalDigits = 0 + Max = 256.000000000000000000 + Position.X = 6.000000000000000000 + Position.Y = 80.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = SizeChange + end + object HeightLabel: TLabel + Position.X = 94.000000000000000000 + Position.Y = 62.000000000000000000 + Size.Width = 88.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Height (in pixel)' + TabOrder = 7 + TabStop = False + end + object HeightSpinBox: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 9 + Cursor = crIBeam + DecimalDigits = 0 + Max = 256.000000000000000000 + Value = 128.000000000000000000 + Position.X = 94.000000000000000000 + Position.Y = 80.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = SizeChange + end + object ZoomLabel: TLabel + Position.X = 6.000000000000000000 + Position.Y = 102.000000000000000000 + Size.Width = 83.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Zoom %' + TabOrder = 10 + TabStop = False + end + object ZoomSpinBox: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 11 + Cursor = crIBeam + DecimalDigits = 0 + Min = 10.000000000000000000 + Value = 100.000000000000000000 + Position.X = 6.000000000000000000 + Position.Y = 120.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = ZoomChange + end + object ApplyToRootOnlyCheckBox: TCheckBox + Position.X = 8.000000000000000000 + Position.Y = 194.000000000000000000 + Size.Width = 166.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'Fixed Color for Root only' + OnChange = ApplyToRootOnlyCheckBoxChange + end + object FixedColorComboColorBox: TComboColorBox + Color = claNull + Position.X = 6.000000000000000000 + Position.Y = 161.000000000000000000 + Size.Width = 40.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 5 + UseAlpha = False + OnChange = FixedColorComboColorBoxChange + end + object FixedColorEdit: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 8 + Position.X = 50.000000000000000000 + Position.Y = 161.000000000000000000 + Size.Width = 124.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = FixedColorEditChange + end + end + object IconsGroupBox: TGroupBox + Align = Client + Size.Width = 471.000000000000000000 + Size.Height = 346.000000000000000000 + Size.PlatformDefault = False + Text = '%d Icons of Imagelist' + TabOrder = 2 + object ImageView: TListBox + Align = Client + Margins.Left = 4.000000000000000000 + Margins.Top = 16.000000000000000000 + Margins.Right = 4.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Size.Width = 463.000000000000000000 + Size.Height = 326.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + OnDragOver = ImageViewDragOver + OnDragDrop = ImageViewDragDrop + AllowDrag = True + Columns = 2 + DisableFocusEffect = True + ItemHeight = 36.000000000000000000 + ItemWidth = 200.000000000000000000 + DefaultItemStyles.ItemStyle = '' + DefaultItemStyles.GroupHeaderStyle = '' + DefaultItemStyles.GroupFooterStyle = '' + OnChange = ImageViewSelectItem + OnDragChange = ImageViewDragChange + Viewport.Width = 459.000000000000000000 + Viewport.Height = 322.000000000000000000 + end + end + end + end + object ItemPanel: TPanel + Align = Bottom + Position.Y = 347.000000000000000000 + Size.Width = 800.000000000000000000 + Size.Height = 245.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + object ItemGroupBox: TGroupBox + Align = Client + Padding.Left = 10.000000000000000000 + Padding.Top = 20.000000000000000000 + Padding.Right = 10.000000000000000000 + Padding.Bottom = 10.000000000000000000 + Size.Width = 680.000000000000000000 + Size.Height = 245.000000000000000000 + Size.PlatformDefault = False + Text = 'Properties of Selected Icon n.%d' + TabOrder = 1 + object SVGText: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + Align = Client + Size.Width = 516.000000000000000000 + Size.Height = 157.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + OnExit = SVGTextExit + Viewport.Width = 512.000000000000000000 + Viewport.Height = 153.000000000000000000 + end + object IconControlsPanel: TPanel + Align = Top + Margins.Bottom = 5.000000000000000000 + Position.X = 10.000000000000000000 + Position.Y = 20.000000000000000000 + Size.Width = 660.000000000000000000 + Size.Height = 53.000000000000000000 + Size.PlatformDefault = False + TabOrder = 30 + object FixedColorItemLabel: TLabel + Position.X = 159.000000000000000000 + Position.Y = 5.000000000000000000 + Size.Width = 107.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Fixed Color' + TabOrder = 6 + end + object GrayScaleItemCheckBox: TCheckBox + Position.X = 383.000000000000000000 + Position.Y = 2.000000000000000000 + Size.Width = 78.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'GrayScale' + OnChange = GrayScaleItemCheckBoxChange + end + object IconName: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 5 + Position.X = 8.000000000000000000 + Position.Y = 23.000000000000000000 + Size.Width = 143.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnExit = IconNameExit + end + object IconNameLabel: TLabel + Position.X = 8.000000000000000000 + Position.Y = 5.000000000000000000 + Size.Width = 74.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'IconName' + TabOrder = 4 + end + object OpacityLabel: TLabel + Position.X = 300.000000000000000000 + Position.Y = 2.000000000000000000 + Size.Width = 74.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + TextSettings.Trimming = None + Text = 'Opacity' + TabOrder = 0 + end + object OpacitySpinBox: TSpinBox + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 1 + Cursor = crIBeam + Value = 100.000000000000000000 + Position.X = 298.000000000000000000 + Position.Y = 23.000000000000000000 + Size.Width = 77.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = OpacitySpinBoxChange + end + object ApplyToRootOnlyItemCheckBox: TCheckBox + Position.X = 383.000000000000000000 + Position.Y = 26.000000000000000000 + Size.Width = 162.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = 'FIxed Color for Root only' + OnChange = ApplyToRootOnlyItemCheckBoxChange + end + object FixedColorItemComboColorBox: TComboColorBox + Color = claNull + Position.X = 159.000000000000000000 + Position.Y = 23.000000000000000000 + Size.Width = 40.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + TabOrder = 7 + UseAlpha = False + OnChange = FixedColorItemComboColorBoxChange + end + object FixedColorItemEdit: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 8 + Position.X = 207.000000000000000000 + Position.Y = 23.000000000000000000 + Size.Width = 83.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = FixedColorItemEditChange + end + end + object IconPanel: TPanel + Align = Left + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 18.000000000000000000 + Position.Y = 86.000000000000000000 + Size.Width = 128.000000000000000000 + Size.Height = 141.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + object IconImage: TGlyph + Margins.Left = 4.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 4.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Align = Top + Position.X = 4.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 120.000000000000000000 + Size.Height = 120.000000000000000000 + Size.PlatformDefault = False + ImageIndex = 1 + end + end + end + object IconButtonsPanel: TPanel + Align = Right + Padding.Left = 5.000000000000000000 + Padding.Top = 5.000000000000000000 + Padding.Right = 5.000000000000000000 + Padding.Bottom = 5.000000000000000000 + Margins.Left = 8.000000000000000000 + Margins.Top = 8.000000000000000000 + Margins.Right = 8.000000000000000000 + Margins.Bottom = 8.000000000000000000 + Position.X = 688.000000000000000000 + Position.Y = 8.000000000000000000 + Size.Width = 104.000000000000000000 + Size.Height = 229.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + object ReformatXMLButton: TButton + Align = Bottom + Cancel = True + Position.X = 5.000000000000000000 + Position.Y = 198.000000000000000000 + Size.Width = 94.000000000000000000 + Size.Height = 26.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'Reformat XML' + TextSettings.Trimming = None + OnClick = ReformatXMLButtonClick + end + end + end + object BottomSplitter: TSplitter + Align = Bottom + Cursor = crVSplit + MinSize = 160.000000000000000000 + Position.Y = 346.000000000000000000 + Size.Width = 800.000000000000000000 + Size.Height = 1.000000000000000000 + Size.PlatformDefault = False + end +end diff --git a/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.pas b/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.pas index 3b65ae7..38b253c 100644 --- a/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.pas +++ b/Ext/SVGIconImageList/Packages/FMX.SVGIconImageListEditorUnit.pas @@ -3,7 +3,7 @@ { SVG Icon ImageList: An extended ImageList for Delphi/VLC+FMX } { to simplify use of Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Volodymyr B. } { } @@ -249,7 +249,7 @@ function EditSVGIconImageList(const AImageList: TSVGIconImageList): Boolean; SavedBounds := Bounds; ItemPanelHeight := ItemPanel.Height; finally - DisposeOf; + Free; end; end; end; diff --git a/Ext/SVGIconImageList/Packages/FMX.SVGIconImageRegister.pas b/Ext/SVGIconImageList/Packages/FMX.SVGIconImageRegister.pas index 7c2416b..8ef9178 100644 --- a/Ext/SVGIconImageList/Packages/FMX.SVGIconImageRegister.pas +++ b/Ext/SVGIconImageList/Packages/FMX.SVGIconImageRegister.pas @@ -3,7 +3,7 @@ { SVG Icon ImageList: An extended ImageList for Delphi } { to simplify use of Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Contributors: } { Carlo Barazzetta } { } diff --git a/Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.fmx b/Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.fmx new file mode 100644 index 0000000..68324e0 --- /dev/null +++ b/Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.fmx @@ -0,0 +1,225 @@ +object SVGTextPropertyEditorFormFMX: TSVGTextPropertyEditorFormFMX + Left = 916 + Top = 169 + Caption = + 'SVGText Property Editor %s - Copyright (c) Ethea S.r.l. - Apache' + + ' 2.0 Open Source License' + ClientHeight = 246 + ClientWidth = 739 + FormFactor.Width = 320 + FormFactor.Height = 480 + FormFactor.Devices = [Desktop, iPhone, iPad] + FormFamily = 'Segoe UI' + OnCreate = FormCreate + OnResize = FormResize + OnShow = FormShow + Left = 916 + Top = 169 + DesignerMasterStyle = 0 + object RightSplitter: TSplitter + Align = Right + Cursor = crHSplit + MinSize = 16.000000000000000000 + Position.X = 550.000000000000000000 + Size.Width = 4.000000000000000000 + Size.Height = 213.000000000000000000 + Size.PlatformDefault = False + Left = 550 + end + object paBottom: TPanel + Align = Bottom + Position.Y = 213.000000000000000000 + Size.Width = 739.000000000000000000 + Size.Height = 33.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Top = 223 + object paButtons: TPanel + Align = Right + Position.X = 246.000000000000000000 + Size.Width = 493.000000000000000000 + Size.Height = 33.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Left = 320 + object CancelButton: TButton + Align = Right + Cancel = True + ModalResult = 2 + Margins.Left = 2.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Position.X = 338.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 75.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 4 + Text = '&Cancel' + Left = 254 + Top = 3 + end + object OKButton: TButton + Align = Right + Default = True + ModalResult = 1 + Margins.Left = 2.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Position.X = 259.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 75.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = '&OK' + Left = 173 + Top = 3 + end + object HelpButton: TButton + Align = Right + Margins.Left = 2.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Position.X = 417.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 74.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 5 + Text = '&Help' + OnClick = HelpButtonClick + Left = 336 + Top = 3 + end + object LoadButton: TButton + Align = Left + Margins.Left = 2.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Position.X = 2.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 74.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = '&Load...' + OnClick = LoadButtonClick + Left = 5 + Top = 3 + end + object SaveButton: TButton + Align = Left + Margins.Left = 2.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Position.X = 80.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 74.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + Text = '&Save...' + OnClick = SaveButtonClick + Left = 85 + Top = 3 + end + object ReformatXMLButton: TButton + Align = Left + Margins.Left = 2.000000000000000000 + Margins.Top = 4.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 4.000000000000000000 + Position.X = 158.000000000000000000 + Position.Y = 4.000000000000000000 + Size.Width = 89.000000000000000000 + Size.Height = 25.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = '&Reformat XML' + OnClick = ReformatXMLButtonClick + Left = 85 + Top = 3 + end + end + end + object SVGTextMemo: TMemo + Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + OnChange = SVGTextMemoChange + OnChangeTracking = SVGTextMemoChangeTracking + Align = Client + Size.Width = 550.000000000000000000 + Size.Height = 213.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Viewport.Width = 546.000000000000000000 + Viewport.Height = 209.000000000000000000 + end + object paImage: TPanel + Align = Right + Position.X = 554.000000000000000000 + Size.Width = 185.000000000000000000 + Size.Height = 213.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + OnResize = paImageResize + Left = 554 + object paTitle: TPanel + Align = Top + Size.Width = 185.000000000000000000 + Size.Height = 24.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Left = 2 + Top = 2 + object SizeLabel: TLabel + Align = Client + Size.Width = 185.000000000000000000 + Size.Height = 24.000000000000000000 + Size.PlatformDefault = False + TextSettings.HorzAlign = Center + Text = 'SizeLabel' + TabOrder = 1 + end + end + object ImagePanel: TPanel + Align = Client + Size.Width = 185.000000000000000000 + Size.Height = 189.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Left = 2 + Top = 26 + object SVGIconImage: TSVGIconImage + MultiResBitmap = < + item + end> + Align = Client + DisableInterpolation = True + Size.Width = 185.000000000000000000 + Size.Height = 189.000000000000000000 + Size.PlatformDefault = False + Left = 1 + Top = 1 + end + end + end + object OpenDialog: TOpenDialog + Filter = 'Scalable Vector Graphics (*.svg)|*.svg' + Options = [ofHideReadOnly, ofAllowMultiSelect, ofPathMustExist, ofFileMustExist, ofEnableSizing] + Left = 400 + Top = 24 + end + object SaveDialog: TSaveDialog + DefaultExt = 'svg' + Filter = 'SVG files (*.svg)|*.svg' + Left = 400 + Top = 104 + end +end diff --git a/Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.pas b/Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.pas new file mode 100644 index 0000000..ff6bdba --- /dev/null +++ b/Ext/SVGIconImageList/Packages/FMX.SVGTextPropertyEditorUnit.pas @@ -0,0 +1,216 @@ +{******************************************************************************} +{ } +{ SVGTextPropertyEditorUnit: A property editor for SVGText } +{ to simplify use of setting SVGText value } +{ } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/SVGIconImageList } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit FMX.SVGTextPropertyEditorUnit; + +interface + +{$INCLUDE ..\Source\SVGIconImageList.inc} + +uses + System.SysUtils, System.Types, System.UITypes, FMX.Controls, System.Classes, + System.Actions, FMX.Forms, FMX.Graphics, FMX.ActnList, FMX.StdCtrls, FMX.Colors, FMX.ListBox, + FMX.Controls.Presentation, FMX.ImgList, FMX.Types, FMX.Layouts, + System.ImageList, FMX.SVGIconImageList, FMX.Edit, FMX.EditBox, FMX.SpinBox, + FMX.ScrollBox, FMX.Memo, FMX.Dialogs, FMX.Memo.Types, FMX.Objects, + FMX.SVGIconImage; + +type + TSVGTextPropertyEditorFormFMX = class(TForm) + paBottom: TPanel; + SVGTextMemo: TMemo; + paButtons: TPanel; + CancelButton: TButton; + OKButton: TButton; + HelpButton: TButton; + RightSplitter: TSplitter; + paImage: TPanel; + paTitle: TPanel; + LoadButton: TButton; + SaveButton: TButton; + ImagePanel: TPanel; + SVGIconImage: TSVGIconImage; + OpenDialog: TOpenDialog; + SaveDialog: TSaveDialog; + SizeLabel: TLabel; + ReformatXMLButton: TButton; + procedure FormResize(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure paImageResize(Sender: TObject); + procedure SVGTextMemoChange(Sender: TObject); + procedure LoadButtonClick(Sender: TObject); + procedure SaveButtonClick(Sender: TObject); + procedure HelpButtonClick(Sender: TObject); + procedure FormCreate(Sender: TObject); + procedure ReformatXMLButtonClick(Sender: TObject); + procedure SVGTextMemoChangeTracking(Sender: TObject); + private + procedure UpdateImage; + procedure UpdateGUI; + function GetSVGText: string; + procedure SetSVGText(const Value: string); + public + constructor Create(AOwner: TComponent); override; + property SVGText: string read GetSVGText write SetSVGText; + end; + +function EditSVGTextProperty(var ASVGText: string; + const ACanEdit: Boolean = True): boolean; + +implementation + +{$R *.fmx} + +uses + Winapi.Messages + , Winapi.Windows + , Winapi.shellApi + , System.Math + , Xml.XMLDoc; + +var + SavedBounds: TRect = (Left: 0; Top: 0; Right: 0; Bottom: 0); + + +function EditSVGTextProperty(var ASVGText: string; + const ACanEdit: Boolean = True): boolean; +var + LForm: TSVGTextPropertyEditorFormFMX; +begin + Result := False; + LForm := TSVGTextPropertyEditorFormFMX.Create(nil); + try + LForm.SVGText := ASVGText; + LForm.SVGTextMemo.ReadOnly := not ACanEdit; + LForm.LoadButton.Visible := ACanEdit; + LForm.CancelButton.Visible := ACanEdit; + LForm.ReformatXMLButton.Visible := ACanEdit; + if LForm.ShowModal = mrOk then + begin + Result := True; + ASVGText := LForm.SVGText; + end; + SavedBounds := LForm.Bounds; + finally + LForm.Free; + end; +end; + +constructor TSVGTextPropertyEditorFormFMX.Create(AOwner: TComponent); +begin + inherited; + ; +end; + +procedure TSVGTextPropertyEditorFormFMX.FormCreate(Sender: TObject); +begin + SVGTextMemo.Font.Family := 'Consolas'; + Caption := Format(Caption, [SVGIconImageListVersion]); +end; + +procedure TSVGTextPropertyEditorFormFMX.FormResize(Sender: TObject); +begin + paImage.Width := ClientWidth div 4; +end; + +procedure TSVGTextPropertyEditorFormFMX.FormShow(Sender: TObject); +begin + if SavedBounds.Right - SavedBounds.Left > 0 then + SetBounds(SavedBounds.Left, SavedBounds.Top, SavedBounds.Width, SavedBounds.Height); + + if SVGTextMemo.CanFocus then + SVGTextMemo.SetFocus; + UpdateGUI; +end; + +function TSVGTextPropertyEditorFormFMX.GetSVGText: string; +begin + Result := SVGTextMemo.Lines.Text; +end; + +procedure TSVGTextPropertyEditorFormFMX.HelpButtonClick(Sender: TObject); +begin + ShellExecute(0, 'open', + PChar('https://github.com/EtheaDev/SVGIconImageList/wiki/SVG-TextEditor-FMX'), nil, nil, + SW_SHOWNORMAL) +end; + +procedure TSVGTextPropertyEditorFormFMX.LoadButtonClick(Sender: TObject); +begin + if OpenDialog.Execute then + begin + SVGIconImage.LoadFromFile(OpenDialog.FileName); + SVGText := SVGIconImage.SVGText; + end; +end; + +procedure TSVGTextPropertyEditorFormFMX.paImageResize(Sender: TObject); +begin + SizeLabel.Text := Format('w:%d-h:%d', + [Trunc(SVGIconImage.Width), Trunc(SVGIconImage.Height)]); + SVGIconImage.Hint := SizeLabel.Text; +end; + +procedure TSVGTextPropertyEditorFormFMX.ReformatXMLButtonClick(Sender: TObject); +begin + SVGTextMemo.Lines.Text := Xml.XMLDoc.FormatXMLData(SVGTextMemo.Lines.Text); +end; + +procedure TSVGTextPropertyEditorFormFMX.SaveButtonClick(Sender: TObject); +begin + if SaveDialog.Execute then + SVGIconImage.SaveToFile(SaveDialog.FileName); +end; + +procedure TSVGTextPropertyEditorFormFMX.SetSVGText(const Value: string); +begin + SVGTextMemo.Lines.Text := Value; + UpdateImage; +end; + +procedure TSVGTextPropertyEditorFormFMX.SVGTextMemoChange(Sender: TObject); +begin + UpdateImage; +end; + +procedure TSVGTextPropertyEditorFormFMX.SVGTextMemoChangeTracking( + Sender: TObject); +begin + UpdateImage; +end; + +procedure TSVGTextPropertyEditorFormFMX.updateGUI; +begin + SVGIconImage.Repaint; +end; + +procedure TSVGTextPropertyEditorFormFMX.UpdateImage; +begin + SVGIconImage.SVGText := SVGTextMemo.Lines.Text; + SVGIconImage.Repaint; +end; + +end. diff --git a/Ext/SVGIconImageList/Packages/GetItLogo.png b/Ext/SVGIconImageList/Packages/GetItLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..6bdef4df842e460c024e6d94c6a4d1434e78233d GIT binary patch literal 7405 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 KnMx_s;Qs-rfFbDs literal 0 HcmV?d00001 diff --git a/Ext/SVGIconImageList/Packages/SVGIconImageCollectionComponentIcon.png b/Ext/SVGIconImageList/Packages/SVGIconImageCollectionComponentIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..22e4e2dc35b0f48fe2ad6d876da6b71527fbe3d7 GIT binary patch literal 4157 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 Y40CuGTbHqT_ALM~F)-J!(RGRaKT@!H>;M1& literal 0 HcmV?d00001 diff --git a/Ext/SVGIconImageList/Packages/SVGIconImageComponentIcon.png b/Ext/SVGIconImageList/Packages/SVGIconImageComponentIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..27d6f3d3b91bc9f7c182c500cb98e2acddae7471 GIT binary patch literal 4155 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 T)l~WKDFDz?(^IWfwhI0q0%WBp literal 0 HcmV?d00001 diff --git a/Ext/SVGIconImageList/Packages/SVGIconImageListEditorUnit.pas b/Ext/SVGIconImageList/Packages/SVGIconImageListEditorUnit.pas index 554944c..b0924e1 100644 --- a/Ext/SVGIconImageList/Packages/SVGIconImageListEditorUnit.pas +++ b/Ext/SVGIconImageList/Packages/SVGIconImageListEditorUnit.pas @@ -2,7 +2,7 @@ { } { SVGIconImageList Component Editor } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Vincent Parrett, Kiriakos Vlahos } { } diff --git a/Ext/SVGIconImageList/Packages/SVGIconImageRegister.pas b/Ext/SVGIconImageList/Packages/SVGIconImageRegister.pas index 771b947..1f83cef 100644 --- a/Ext/SVGIconImageList/Packages/SVGIconImageRegister.pas +++ b/Ext/SVGIconImageList/Packages/SVGIconImageRegister.pas @@ -2,7 +2,7 @@ { } { SVGIconImage Registration for Components and Editors } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Vincent Parrett, Kiriakos Vlahos } { } diff --git a/Ext/SVGIconImageList/Packages/SVGIconVirtualImageListComponentIcon.png b/Ext/SVGIconImageList/Packages/SVGIconVirtualImageListComponentIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..e55af4e8f08aee78a9f923026b1e1a37523739ea GIT binary patch literal 4005 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 literal 0 HcmV?d00001 diff --git a/Ext/SVGIconImageList/Packages/SVGTextPropertyEditorUnit.pas b/Ext/SVGIconImageList/Packages/SVGTextPropertyEditorUnit.pas index a7ac355..fffea74 100644 --- a/Ext/SVGIconImageList/Packages/SVGTextPropertyEditorUnit.pas +++ b/Ext/SVGIconImageList/Packages/SVGTextPropertyEditorUnit.pas @@ -3,7 +3,7 @@ { SVGTextPropertyEditorUnit: A property editor for SVGText } { to simplify use of setting SVGText value } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/SVGIconImageList } diff --git a/Ext/SVGIconImageList/Source/FMX.Image32SVG.pas b/Ext/SVGIconImageList/Source/FMX.Image32SVG.pas index 27dfc02..4e5e181 100644 --- a/Ext/SVGIconImageList/Source/FMX.Image32SVG.pas +++ b/Ext/SVGIconImageList/Source/FMX.Image32SVG.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/FMX } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: } { } diff --git a/Ext/SVGIconImageList/Source/FMX.ImageSVG.pas b/Ext/SVGIconImageList/Source/FMX.ImageSVG.pas index 176676a..0614876 100644 --- a/Ext/SVGIconImageList/Source/FMX.ImageSVG.pas +++ b/Ext/SVGIconImageList/Source/FMX.ImageSVG.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/FMX } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: } { } diff --git a/Ext/SVGIconImageList/Source/FMX.ImageSkiaSVG.pas b/Ext/SVGIconImageList/Source/FMX.ImageSkiaSVG.pas index 9c36e79..c96baa1 100644 --- a/Ext/SVGIconImageList/Source/FMX.ImageSkiaSVG.pas +++ b/Ext/SVGIconImageList/Source/FMX.ImageSkiaSVG.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/FMX } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: } { } @@ -41,8 +41,8 @@ interface , FMX.Graphics , FMX.Objects , FMX.ImageSVG - , Skia //You must add those search path: SVGIconImageList\skia4delphi\Source - , Skia.FMX; //and SVGIconImageList\skia4delphi\Source\FMX + , System.Skia + , Skia.FMX; type TFmxImageSkiaSVG = class(TFmxImageSVG) diff --git a/Ext/SVGIconImageList/Source/FMX.SVGIconImage.pas b/Ext/SVGIconImageList/Source/FMX.SVGIconImage.pas index 984dd19..da82369 100644 --- a/Ext/SVGIconImageList/Source/FMX.SVGIconImage.pas +++ b/Ext/SVGIconImageList/Source/FMX.SVGIconImage.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/FMX } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: } { } @@ -101,7 +101,7 @@ TSVGIconFixedMultiResBitmap = class(TFixedMultiResBitmap) end; {$IF CompilerVersion > 34} - [ComponentPlatforms(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator32 or pidiOSDevice32 or pidAndroidArm32)] + [ComponentPlatforms(pidWin32 or pidWin64 or pidOSX32 or pidOSX64 or pidiOSSimulator32 or pidiOSDevice32 or pidiOSDevice64 or pidAndroidArm32 or pidAndroidArm64)] {$ELSE} [ComponentPlatforms(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator32 or pidiOSDevice32 or pidAndroid32Arm)] {$ENDIF} @@ -226,7 +226,7 @@ constructor TSVGIconFixedBitmapItem.Create(Collection: TCollection); destructor TSVGIconFixedBitmapItem.Destroy; begin - FSVG.DisposeOf; + FSVG.Free; inherited; end; diff --git a/Ext/SVGIconImageList/Source/FMX.SVGIconImageList.pas b/Ext/SVGIconImageList/Source/FMX.SVGIconImageList.pas index 6bd1b87..18718db 100644 --- a/Ext/SVGIconImageList/Source/FMX.SVGIconImageList.pas +++ b/Ext/SVGIconImageList/Source/FMX.SVGIconImageList.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/FMX } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: } { } @@ -47,7 +47,7 @@ interface ; const - SVGIconImageListVersion = '4.1.0'; + SVGIconImageListVersion = '4.1.5'; DEFAULT_SIZE = 32; ZOOM_DEFAULT = 100; SVG_INHERIT_COLOR = TAlphaColors.Null; @@ -163,7 +163,7 @@ TSVGIconSourceItem = class(TCustomSourceItem) {TSVGIconImageList} {$IF CompilerVersion > 34} - [ComponentPlatforms(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator32 or pidiOSDevice32 or pidAndroidArm32)] + [ComponentPlatforms(pidWin32 or pidWin64 or pidOSX32 or pidOSX64 or pidiOSSimulator32 or pidiOSDevice32 or pidiOSDevice64 or pidAndroidArm32 or pidAndroidArm64)] {$ELSE} [ComponentPlatforms(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator32 or pidiOSDevice32 or pidAndroid32Arm)] {$ENDIF} @@ -500,7 +500,7 @@ function TSVGIconSourceItem.CreateMultiResBitmap: TMultiResBitmap; destructor TSVGIconSourceItem.Destroy; begin - FSVG.DisposeOf; + FSVG.Free; inherited; end; diff --git a/Ext/SVGIconImageList/Source/Image32SVGFactory.pas b/Ext/SVGIconImageList/Source/Image32SVGFactory.pas index bf24c5f..a0fe84d 100644 --- a/Ext/SVGIconImageList/Source/Image32SVGFactory.pas +++ b/Ext/SVGIconImageList/Source/Image32SVGFactory.pas @@ -166,7 +166,7 @@ procedure TImage32SVG.UpdateSizeInfo(defaultWidth, defaultHeight: integer); //nb: default widths should be the target image's dimensions //since these values will be used for SVG images that simply //specify their widths and heights as percentages - vbox := fSvgReader.GetViewbox(defaultWidth, defaultHeight); + vbox := fSvgReader.RootElement.GetViewbox; FWidth := vbox.Width; FHeight := vbox.Height; end; diff --git a/Ext/SVGIconImageList/Source/SVGIconImage.pas b/Ext/SVGIconImageList/Source/SVGIconImage.pas index 952c352..d5f0c87 100644 --- a/Ext/SVGIconImageList/Source/SVGIconImage.pas +++ b/Ext/SVGIconImageList/Source/SVGIconImage.pas @@ -2,7 +2,7 @@ { } { SVG Image in TPicture: useful to show a Scalable Vector Graphic } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: } { } @@ -303,11 +303,12 @@ destructor TSVGIconImage.Destroy; end; procedure TSVGIconImage.CheckAutoSize; +var + LSVG: ISVG; begin - if FAutoSize and (FSVG.Width > 0) and (FSVG.Height > 0) then - begin - SetBounds(Left, Top, Round(FSVG.Width), Round(FSVG.Height)); - end; + LSVG := GetSVG; + if FAutoSize and (LSVG.Width > 0) and (LSVG.Height > 0) then + SetBounds(Left, Top, Round(LSVG.Width), Round(LSVG.Height)); end; {$IFDEF D10_4+} @@ -321,14 +322,14 @@ procedure TSVGIconImage.CheckImageIndexes; procedure TSVGIconImage.Clear; begin - FSVG.Clear; + SVG.Clear; FFileName := ''; Repaint; end; function TSVGIconImage.Empty: Boolean; begin - Empty := FSVG.IsEmpty; + Empty := SVG.IsEmpty; end; function TSVGIconImage.IsImageIndexAvail: Boolean; diff --git a/Ext/SVGIconImageList/Source/SVGIconImageCollection.pas b/Ext/SVGIconImageList/Source/SVGIconImageCollection.pas index 3482adc..6c6b0d3 100644 --- a/Ext/SVGIconImageList/Source/SVGIconImageCollection.pas +++ b/Ext/SVGIconImageList/Source/SVGIconImageCollection.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Vincent Parrett } { Contributors: Carlo Barazzetta, Kiriakos Vlahos } { } @@ -139,6 +139,7 @@ implementation uses System.SysUtils + , VCL.Controls , {$IFDEF DXE4+}System.Messaging{$ELSE}SVGMessaging{$ENDIF}; { TSVGIconImageCollection } @@ -281,13 +282,13 @@ function TSVGIconImageCollection.LoadFromFiles(const AFileNames: TStrings; function TSVGIconImageCollection.LoadFromResource(const hInstance: THandle; const ResourceName, IconName: string) : integer; var ResStream: TResourceStream; - Svg : ISVG; + LSvg: ISVG; begin resStream := TResourceStream.Create(hInstance, ResourceName, RT_RCDATA); try - Svg := GlobalSVGFactory.NewSvg; - Svg.LoadFromStream(ResStream); - result := Add(Svg, IconName); + LSvg := GlobalSVGFactory.NewSvg; + LSvg.LoadFromStream(ResStream); + result := Add(LSvg, IconName); finally ResStream.Free; end; @@ -295,11 +296,11 @@ function TSVGIconImageCollection.LoadFromResource(const hInstance: THandle; cons function TSVGIconImageCollection.LoadFromString(const Source, IconName: string): integer; var - Svg : ISVG; + LSvg: ISVG; begin - Svg := GlobalSVGFactory.NewSvg; - Svg.Source := Source; - result := Add(Svg, IconName); + LSvg := GlobalSVGFactory.NewSvg; + LSvg.Source := Source; + result := Add(LSvg, IconName); end; procedure TSVGIconImageCollection.ReadLeft(Reader: TReader); @@ -527,4 +528,13 @@ procedure TSVGIconImageCollection.Draw(ACanvas: TCanvas; ARect: TRect; AIndex: I LSVG.PaintTo(ACanvas.Handle, TRectF.Create(ARect), AProportional); end; +initialization + +{$IF NOT DEFINED(CLR)} + StartClassGroup(VCL.Controls.TControl); + ActivateClassGroup(VCL.Controls.TControl); + GroupDescendentsWith(TSVGIconImageCollection, VCL.Controls.TControl); +{$ENDIF} + + end. diff --git a/Ext/SVGIconImageList/Source/SVGIconImageList.inc b/Ext/SVGIconImageList/Source/SVGIconImageList.inc index b3fa609..33f095f 100644 --- a/Ext/SVGIconImageList/Source/SVGIconImageList.inc +++ b/Ext/SVGIconImageList/Source/SVGIconImageList.inc @@ -1,3 +1,6 @@ +//To silent Hint messege of engine used +{.$DEFINE SvgDisableEngineHint} + //Prefer Engine Direct2D by Kiriakos Vlahos //if supported by Windows Platform (from Windows Creators update) {.$DEFINE PreferNativeSvgSupport} diff --git a/Ext/SVGIconImageList/Source/SVGIconImageList.pas b/Ext/SVGIconImageList/Source/SVGIconImageList.pas index 117220f..6ec8ffb 100644 --- a/Ext/SVGIconImageList/Source/SVGIconImageList.pas +++ b/Ext/SVGIconImageList/Source/SVGIconImageList.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Vincent Parrett, Kiriakos Vlahos } { } diff --git a/Ext/SVGIconImageList/Source/SVGIconImageListBase.pas b/Ext/SVGIconImageList/Source/SVGIconImageListBase.pas index f2ead03..9b0ed36 100644 --- a/Ext/SVGIconImageList/Source/SVGIconImageListBase.pas +++ b/Ext/SVGIconImageList/Source/SVGIconImageListBase.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Vincent Parrett, Kiriakos Vlahos } { } @@ -48,7 +48,7 @@ interface SvgInterfaces; const - SVGIconImageListVersion = '4.1.0'; + SVGIconImageListVersion = '4.1.5'; DEFAULT_SIZE = 16; type @@ -186,6 +186,15 @@ procedure TSVGIconImageListBase.Assign(Source: TPersistent); FFixedColor := TSVGIconImageListBase(Source).FFixedColor; FAntiAliasColor := TSVGIconImageListBase(Source).FAntiAliasColor; FGrayScale := TSVGIconImageListBase(Source).FGrayScale; + FApplyFixedColorToRootOnly := TSVGIconImageListBase(Source).FApplyFixedColorToRootOnly; + FAntiAliasColor := TSVGIconImageListBase(Source).FAntiAliasColor; + FDisabledGrayScale := TSVGIconImageListBase(Source).FDisabledGrayScale; + FDisabledOpacity := TSVGIconImageListBase(Source).FDisabledOpacity; + {$IFDEF HiDPISupport} + {$IFNDEF D10_4+} + FScaled := TSVGIconImageListBase(Source).FScaled; + {$ENDIF} + {$ENDIF} DoAssign(Source); finally EndUpdate; diff --git a/Ext/SVGIconImageList/Source/SVGIconItems.pas b/Ext/SVGIconImageList/Source/SVGIconItems.pas index 95f2d5b..18689a8 100644 --- a/Ext/SVGIconImageList/Source/SVGIconItems.pas +++ b/Ext/SVGIconImageList/Source/SVGIconItems.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Vincent Parrett, Kiriakos Vlahos } { } diff --git a/Ext/SVGIconImageList/Source/SVGIconUtils.pas b/Ext/SVGIconImageList/Source/SVGIconUtils.pas index e45600d..b5c00fc 100644 --- a/Ext/SVGIconImageList/Source/SVGIconUtils.pas +++ b/Ext/SVGIconImageList/Source/SVGIconUtils.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { Contributors: Vincent Parrett, Kiriakos Vlahos } { } @@ -66,6 +66,7 @@ procedure SVGExportToPng(const AWidth, AHeight: Integer; FSVG: ISVG; const AOutFolder: string; const AFileName: string = ''); function PNG4TransparentBitMap(aBitmap: TBitmap): TPNGImage; +procedure SVGCopyToClipboardAsPng(const AWidth, AHeight: Integer; FSVG: ISVG); implementation @@ -74,6 +75,7 @@ implementation , System.Types , Vcl.Themes , SVGIconImageCollection + , Vcl.Clipbrd {$IFDEF D10_3} , VirtualImageList {$ENDIF} @@ -125,6 +127,41 @@ function PNG4TransparentBitMap(aBitmap: TBitmap): TPNGImage; end; end; +procedure SVGCopyToClipboardAsPng(const AWidth, AHeight: Integer; + FSVG: ISVG); +var + LImagePng: TPngImage; + LBitmap: TBitmap; + iFormat: Word; + iData: THandle; + iPalette: HPALETTE; +begin + LBitmap := nil; + LImagePng := nil; + try + LBitmap := TBitmap.Create; + LBitmap.PixelFormat := TPixelFormat.pf32bit; // 32bit bitmap + LBitmap.AlphaFormat := TAlphaFormat.afDefined; // Enable alpha channel + + LBitmap.SetSize(AWidth, AHeight); + + // Fill background with transparent + LBitmap.Canvas.Brush.Color := clNone; + LBitmap.Canvas.FillRect(Rect(0, 0, AWidth, AHeight)); + + FSVG.PaintTo(LBitmap.Canvas.Handle, TRectF.Create(0, 0, AWidth, AHeight)); + + LImagePng := PNG4TransparentBitMap(LBitmap); + + iFormat := RegisterClipboardFormat('PNG'); + LImagePng.SaveToClipBoardFormat(iFormat, iData, iPalette); + ClipBoard.SetAsHandle(iFormat, iData); + finally + LBitmap.Free; + LImagePng.Free; + end; +end; + procedure SVGExportToPng(const AWidth, AHeight: Integer; FSVG: ISVG; const AOutFolder: string; const AFileName: string = ''); diff --git a/Ext/SVGIconImageList/Source/SVGIconVirtualImageList.pas b/Ext/SVGIconImageList/Source/SVGIconVirtualImageList.pas index a4e4e1f..4d63682 100644 --- a/Ext/SVGIconImageList/Source/SVGIconVirtualImageList.pas +++ b/Ext/SVGIconImageList/Source/SVGIconVirtualImageList.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Vincent Parrett } { Contributors: Carlo Barazzetta, Kiriakos Vlahos } { } @@ -379,9 +379,6 @@ constructor TSVGIconVirtualImageList.Create(AOwner: TComponent); FAntiAliasColor := clBtnFace; FGrayScale := False; FOpacity := 255; - {$IFDEF HiDPISupport} - FScaled := True; - {$ENDIF} inherited; end; {$ENDIF} diff --git a/Ext/SVGIconImageList/Source/SVGInterfaces.pas b/Ext/SVGIconImageList/Source/SVGInterfaces.pas index dd3b51a..6a9f095 100644 --- a/Ext/SVGIconImageList/Source/SVGInterfaces.pas +++ b/Ext/SVGIconImageList/Source/SVGInterfaces.pas @@ -74,25 +74,31 @@ implementation {$INCLUDE SVGIconImageList.inc} Uses -{$IF NOT DEFINED(Image32_SVGEngine) and NOT DEFINED(Skia_SVGEngine)} - {$MESSAGE FATAL 'You must define at least one engine (Image32_SVGEngine or Skia_Engine) into SVGIconImageList.inc)'} -{$ENDIF} - -{$IF DEFINED(Image32_SVGEngine) and DEFINED(Skia_SVGEngine)} - {$MESSAGE FATAL 'You must define only one engine (Image32_SVGEngine or Skia_Engine) into SVGIconImageList.inc)'} -{$ENDIF} - -{$IF DEFINED(Image32_SVGEngine)} - {$MESSAGE HINT 'Use Delphi native Image32 SVG-Engine for SVGIconImageList'} - Image32SVGFactory -{$ELSEIF DEFINED(Skia_SVGEngine)} - {$MESSAGE HINT 'Use Skia4Delphi "wrapper" SVG-Engine for SVGIconImageList'} - SkiaSVGFactory -{$ENDIF} -{$IFDEF PreferNativeSvgSupport} - {$MESSAGE HINT 'but Prefer Windows Direct-2D SVG-Engine if available'} - , D2DSVGFactory -{$ENDIF} + {$IF NOT DEFINED(Image32_SVGEngine) and NOT DEFINED(Skia_SVGEngine)} + {$MESSAGE FATAL 'You must define at least one engine (Image32_SVGEngine or Skia_Engine) into SVGIconImageList.inc)'} + {$ENDIF} + + {$IF DEFINED(Image32_SVGEngine) and DEFINED(Skia_SVGEngine)} + {$MESSAGE FATAL 'You must define only one engine (Image32_SVGEngine or Skia_Engine) into SVGIconImageList.inc)'} + {$ENDIF} + + {$IF DEFINED(Image32_SVGEngine)} + {$IFNDEF SvgDisableEngineHint} + {$MESSAGE HINT 'Use Delphi native Image32 SVG-Engine for SVGIconImageList'} + {$ENDIF} + Image32SVGFactory + {$ELSEIF DEFINED(Skia_SVGEngine)} + {$IFNDEF SvgDisableEngineHint} + {$MESSAGE HINT 'Use Skia4Delphi "wrapper" SVG-Engine for SVGIconImageList'} + {$ENDIF} + SkiaSVGFactory + {$ENDIF} + {$IFDEF PreferNativeSvgSupport} + {$IFNDEF SvgDisableEngineHint} + {$MESSAGE HINT 'but Prefer Windows Direct-2D SVG-Engine if available'} + {$ENDIF} + , D2DSVGFactory + {$ENDIF} ; Var diff --git a/Ext/SVGIconImageList/Source/SVGMessaging.pas b/Ext/SVGIconImageList/Source/SVGMessaging.pas index 72ffa87..243bcb6 100644 --- a/Ext/SVGIconImageList/Source/SVGMessaging.pas +++ b/Ext/SVGIconImageList/Source/SVGMessaging.pas @@ -2,7 +2,7 @@ { } { SVGMessaging: Messaging unit for older Delphi version } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/SVGIconImageList } diff --git a/Ext/SVGIconImageList/Source/SkiaSVGFactory.pas b/Ext/SVGIconImageList/Source/SkiaSVGFactory.pas index 1208168..68fb4b5 100644 --- a/Ext/SVGIconImageList/Source/SkiaSVGFactory.pas +++ b/Ext/SVGIconImageList/Source/SkiaSVGFactory.pas @@ -9,8 +9,7 @@ interface Uses - SVGInterfaces - , Vcl.Skia; + SVGInterfaces; // Factory Methods function GetSkiaSVGFactory: ISVGFactory; @@ -31,6 +30,7 @@ implementation System.Classes, System.Math.Vectors, //Skia engine + Vcl.Skia, System.Skia; type diff --git a/Ext/SVGIconImageList/Source/dlgExportPNG.dfm b/Ext/SVGIconImageList/Source/dlgExportPNG.dfm index a83e976..3c6de2a 100644 --- a/Ext/SVGIconImageList/Source/dlgExportPNG.dfm +++ b/Ext/SVGIconImageList/Source/dlgExportPNG.dfm @@ -19,7 +19,7 @@ object ExportToPNGDialog: TExportToPNGDialog TextHeight = 13 object OutputFileNameLabel: TLabel Left = 247 - Top = 159 + Top = 187 Width = 125 Height = 13 Caption = 'Output filename format:' @@ -169,7 +169,7 @@ object ExportToPNGDialog: TExportToPNGDialog Caption = 'OK' Default = True ModalResult = 1 - TabOrder = 1 + TabOrder = 4 OnClick = btnOKClick end object btnCancel: TButton @@ -180,15 +180,15 @@ object ExportToPNGDialog: TExportToPNGDialog Cancel = True Caption = 'Cancel' ModalResult = 2 - TabOrder = 2 + TabOrder = 5 OnClick = btnCancelClick end object FormatEdit: TEdit Left = 247 - Top = 174 - Width = 204 + Top = 204 + Width = 201 Height = 21 - TabOrder = 4 + TabOrder = 2 Text = '%FileName%_%size%' OnChange = FormatEditChange end @@ -201,6 +201,15 @@ object ExportToPNGDialog: TExportToPNGDialog TabOrder = 3 OnClick = OutputButtonClick end + object BtnCopyToClipboard: TButton + Left = 317 + Top = 159 + Width = 131 + Height = 25 + Caption = 'Copy to clipboard...' + TabOrder = 1 + OnClick = BtnCopyToClipboardClick + end object SavePNGDialog: TSaveDialog Filter = 'PNG Image files (.png)|*.png' Left = 92 diff --git a/Ext/SVGIconImageList/Source/dlgExportPNG.pas b/Ext/SVGIconImageList/Source/dlgExportPNG.pas index 86cb539..2379f56 100644 --- a/Ext/SVGIconImageList/Source/dlgExportPNG.pas +++ b/Ext/SVGIconImageList/Source/dlgExportPNG.pas @@ -3,7 +3,7 @@ { SVGIconImageList: An extended ImageList for Delphi/VCL } { to simplify use of SVG Icons (resize, opacity and more...) } { } -{ Copyright (c) 2019-2023 (Ethea S.r.l.) } +{ Copyright (c) 2019-2024 (Ethea S.r.l.) } { Author: Vincent Parrett } { Contributors: Carlo Barazzetta, Kiriakos Vlahos } { } @@ -63,6 +63,7 @@ TExportToPNGDialog = class(TForm) ExampleFileName: TLabel; SavePNGDialog: TSaveDialog; OutputButton: TButton; + BtnCopyToClipboard: TButton; procedure btnOKClick(Sender: TObject); procedure FormatEditChange(Sender: TObject); procedure FormShow(Sender: TObject); @@ -70,6 +71,7 @@ TExportToPNGDialog = class(TForm) procedure OutputButtonClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure btnCancelClick(Sender: TObject); + procedure BtnCopyToClipboardClick(Sender: TObject); private FFileName: TFileName; FIconName: string; @@ -175,6 +177,13 @@ procedure TExportToPNGDialog.btnCancelClick(Sender: TObject); Close; end; +procedure TExportToPNGDialog.BtnCopyToClipboardClick(Sender: TObject); +begin + SVGCopyToClipboardAsPng(StrToInt(CustomSizeEdit.Text), + StrToInt(CustomSizeEdit.Text), + SVGIconImage.SVG); +end; + procedure TExportToPNGDialog.btnOKClick(Sender: TObject); begin ExportToPNG; @@ -193,6 +202,7 @@ procedure TExportToPNGDialog.CheckBoxClick(Sender: TObject); Export192x192.Checked or Export256x256.Checked or (ExportCustom.Checked and (CustomSizeValue > 0 )); + BtnCopyToClipboard.Enabled := (ExportCustom.Checked and (CustomSizeValue > 0 )); end; procedure TExportToPNGDialog.ExportToPNG; diff --git a/Ext/StyledComponents/packages/D11/StyledComponents.dpk b/Ext/StyledComponents/packages/D11/StyledComponents.dpk new file mode 100644 index 0000000..7d32502 --- /dev/null +++ b/Ext/StyledComponents/packages/D11/StyledComponents.dpk @@ -0,0 +1,90 @@ +{******************************************************************************} +{ } +{ StyledComponents: a set of Styled VCL Component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +package StyledComponents; + +{$R *.res} +{$R '..\StyledButton.dcr'} +{$R '..\StyledTaskDialog.dcr'} +{$R '..\StyledToolbar.dcr'} +{$R '..\StyledDbNavigator.dcr'} +{$R '..\StyledButtonGroup.dcr'} +{$R '..\StyledCategoryButtons.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE RELEASE} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'Ethea Styled Components'} +{$LIBSUFFIX AUTO} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + vclimg, + dbrtl, + vcldb, + bindcomp; + +contains + Vcl.StyledButton in '..\..\source\Vcl.StyledButton.pas', + Vcl.ButtonStylesAttributes in '..\..\source\Vcl.ButtonStylesAttributes.pas', + Vcl.StandardButtonStyles in '..\..\source\Vcl.StandardButtonStyles.pas', + Vcl.ColorButtonStyles in '..\..\source\Vcl.ColorButtonStyles.pas', + Vcl.BootstrapButtonStyles in '..\..\source\Vcl.BootstrapButtonStyles.pas', + Vcl.AngularButtonStyles in '..\..\source\Vcl.AngularButtonStyles.pas', + Vcl.StyledTaskDialog in '..\..\source\Vcl.StyledTaskDialog.pas', + Vcl.StyledCmpMessages in '..\..\source\Vcl.StyledCmpMessages.pas', + Vcl.StyledCmpStrUtils in '..\..\source\Vcl.StyledCmpStrUtils.pas', + Vcl.StyledTaskDialogStdUnit in '..\..\source\Vcl.StyledTaskDialogStdUnit.pas', + Vcl.StyledTaskDialogFormUnit in '..\..\source\Vcl.StyledTaskDialogFormUnit.pas' {StyledTaskDialogForm}, + Vcl.StyledToolbar in '..\..\source\Vcl.StyledToolbar.pas', + Vcl.StyledDbNavigator in '..\..\source\Vcl.StyledDbNavigator.pas', + Vcl.StyledButtonGroup in '..\..\source\Vcl.StyledButtonGroup.pas', + Vcl.StyledCategoryButtons in '..\..\source\Vcl.StyledCategoryButtons.pas'; + +end. + diff --git a/Ext/StyledComponents/packages/D11/StyledComponents.dproj b/Ext/StyledComponents/packages/D11/StyledComponents.dproj new file mode 100644 index 0000000..f1078fc --- /dev/null +++ b/Ext/StyledComponents/packages/D11/StyledComponents.dproj @@ -0,0 +1,154 @@ + + + {10AD02FB-9DC1-47B6-A510-EE8D85DD1944} + StyledComponents.dpk + 19.5 + VCL + True + Release + Win32 + 3 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..\..\Lib\D11\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + All + StyledComponents + true + 1033 + CompanyName=Ethea S.r.l.;FileDescription=Styled Components;FileVersion=1.0.0.0;InternalName=;LegalCopyright=Copyright (c) Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=Styled Components;ProductVersion=1.0;Comments= + Ethea Styled Components + true + $(Auto) + true + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + +
StyledTaskDialogForm
+
+ + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Package + + + + StyledComponents.dpk + + + + + True + True + + + 12 + + + +
diff --git a/Ext/StyledComponents/packages/D11/StyledComponents.res b/Ext/StyledComponents/packages/D11/StyledComponents.res new file mode 100644 index 0000000000000000000000000000000000000000..c476f8a7c8d086a172fc309546965dc68884ecb9 GIT binary patch literal 736 zcma))%}T>i5QR@_7FH0%t(z`fC`gHrjUq^~RSNNkTDov!gRQkt+tS8G-^Euc_%QB$ z1LJpZyryv>UYKO={G2&+XC$eDq-iFoh0`rL{}wTx^#v;XE~r}yQ9HWTJ>P~}XiZ(~ zihGmqIl4JZ|Kn3K`5A`$pIWbE0G;RCq&Ey6c!_2jYODchLygo2d8|iG2z<3MfkFj3 zLP9tgM#tJD_l%flO%)TrfKAM;Z{ZuDKB32|P@zhND#%sqi?mIyt5qjzt_RCuO4bm} zv5hm#7M4#B6j#f5`$$5TV6?u1)xk5vo?{$RGx!ndPCLX$#0}s!vZzz4m=_qpI04gC zD%vXAgW*0b{_3l4`?>*ZqMlyJND6QApMDOQl&2!b@2;|*q&i$Zwj!pYd(C`u(ypC) w8?TwqoNi+nV!Z literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/D11/dclStyledComponents.dpk b/Ext/StyledComponents/packages/D11/dclStyledComponents.dpk new file mode 100644 index 0000000..6beeec2 --- /dev/null +++ b/Ext/StyledComponents/packages/D11/dclStyledComponents.dpk @@ -0,0 +1,52 @@ +{******************************************************************************} +{ } +{ StyledComponents: a set of Styled VCL Component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +package dclStyledComponents; + +{$R *.res} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS ON} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION OFF} +{$OVERFLOWCHECKS ON} +{$RANGECHECKS ON} +{$REFERENCEINFO ON} +{$SAFEDIVIDE OFF} +{$STACKFRAMES ON} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE DEBUG} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'Ethea - Styled Components'} +{$LIBSUFFIX AUTO} +{$DESIGNONLY} +{$IMPLICITBUILD ON} + +requires + DesignIDE, + StyledComponents; + +contains + Vcl.StyledComponentsRegister in '..\Vcl.StyledComponentsRegister.pas', + Vcl.StyledButtonEditorUnit in '..\Vcl.StyledButtonEditorUnit.pas' {StyledButtonEditor}; + +end. diff --git a/Ext/StyledComponents/packages/D11/dclStyledComponents.dproj b/Ext/StyledComponents/packages/D11/dclStyledComponents.dproj new file mode 100644 index 0000000..0a41db9 --- /dev/null +++ b/Ext/StyledComponents/packages/D11/dclStyledComponents.dproj @@ -0,0 +1,132 @@ + + + {1F493CDE-04AB-46B1-B3B2-09FFE3F4F76E} + dclStyledComponents.dpk + 19.5 + VCL + True + Release + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..\..\Lib\D11\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + All + dclStyledComponents + true + 1033 + CompanyName=Ethea S.r.l.;FileDescription=Styled Components;FileVersion=1.0.0.0;InternalName=;LegalCopyright=Copyright (c) Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=Styled Components;ProductVersion=1.0;Comments= + Ethea Styled Components + $(Auto) + ..\..\Source;..\;$(DCC_UnitSearchPath) + true + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + StyledComponents;$(DCC_UsePackage) + + + StyledComponents;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + +
StyledButtonEditor
+ dfm +
+ + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Package + + + + dclStyledComponents.dpk + + + + + True + False + + + 12 + + + +
diff --git a/Ext/StyledComponents/packages/D11/dclStyledComponents.res b/Ext/StyledComponents/packages/D11/dclStyledComponents.res new file mode 100644 index 0000000000000000000000000000000000000000..9042aa214c2a6f093f16a95659f64a068bbdb3a7 GIT binary patch literal 736 zcma))&q~8U5XQfh9IPOSS1&zyP>>R#7e$a_s}$-VYU#m?4K~I?Z9^LmeHULv@L|0B z2FBlRT+?_E7bcnA`R1E%c1MzGSeE66TUx`4i*JJQY%EaKcc5XVfjiKR?)bLV!|Uiu zm+U)y&+yH9^*=r(lb>_A|A~!ChR{X6kMzcY2VbhW#+oXIZLEnRn5TNs4B(5!1ZpVI zA=W^HQFNpYa!uQT!SE~hTp?j+#A!`ih z)Z&b?rPVWn#nm#=2usNliq=-R21MqZ7aRxF41P?y)i(GpxEO5{%bHNd+(3-t6i!pA zd{)yg3inX)S6?mL*EL)-jr2@LTDp_}^s~=Pc`9@K?kev|YN6F*Dncr{+bmvA+Oe^(FV=T+osoGUjeLGV#^M?6aolQnVUpq2p%K!iX literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/D12/StyledComponents.dpk b/Ext/StyledComponents/packages/D12/StyledComponents.dpk new file mode 100644 index 0000000..7d32502 --- /dev/null +++ b/Ext/StyledComponents/packages/D12/StyledComponents.dpk @@ -0,0 +1,90 @@ +{******************************************************************************} +{ } +{ StyledComponents: a set of Styled VCL Component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +package StyledComponents; + +{$R *.res} +{$R '..\StyledButton.dcr'} +{$R '..\StyledTaskDialog.dcr'} +{$R '..\StyledToolbar.dcr'} +{$R '..\StyledDbNavigator.dcr'} +{$R '..\StyledButtonGroup.dcr'} +{$R '..\StyledCategoryButtons.dcr'} +{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} +{$ALIGN 8} +{$ASSERTIONS ON} +{$BOOLEVAL OFF} +{$DEBUGINFO OFF} +{$EXTENDEDSYNTAX ON} +{$IMPORTEDDATA ON} +{$IOCHECKS ON} +{$LOCALSYMBOLS OFF} +{$LONGSTRINGS ON} +{$OPENSTRINGS ON} +{$OPTIMIZATION ON} +{$OVERFLOWCHECKS OFF} +{$RANGECHECKS OFF} +{$REFERENCEINFO OFF} +{$SAFEDIVIDE OFF} +{$STACKFRAMES OFF} +{$TYPEDADDRESS OFF} +{$VARSTRINGCHECKS ON} +{$WRITEABLECONST OFF} +{$MINENUMSIZE 1} +{$IMAGEBASE $400000} +{$DEFINE RELEASE} +{$ENDIF IMPLICITBUILDING} +{$DESCRIPTION 'Ethea Styled Components'} +{$LIBSUFFIX AUTO} +{$RUNONLY} +{$IMPLICITBUILD OFF} + +requires + rtl, + vcl, + vclimg, + dbrtl, + vcldb, + bindcomp; + +contains + Vcl.StyledButton in '..\..\source\Vcl.StyledButton.pas', + Vcl.ButtonStylesAttributes in '..\..\source\Vcl.ButtonStylesAttributes.pas', + Vcl.StandardButtonStyles in '..\..\source\Vcl.StandardButtonStyles.pas', + Vcl.ColorButtonStyles in '..\..\source\Vcl.ColorButtonStyles.pas', + Vcl.BootstrapButtonStyles in '..\..\source\Vcl.BootstrapButtonStyles.pas', + Vcl.AngularButtonStyles in '..\..\source\Vcl.AngularButtonStyles.pas', + Vcl.StyledTaskDialog in '..\..\source\Vcl.StyledTaskDialog.pas', + Vcl.StyledCmpMessages in '..\..\source\Vcl.StyledCmpMessages.pas', + Vcl.StyledCmpStrUtils in '..\..\source\Vcl.StyledCmpStrUtils.pas', + Vcl.StyledTaskDialogStdUnit in '..\..\source\Vcl.StyledTaskDialogStdUnit.pas', + Vcl.StyledTaskDialogFormUnit in '..\..\source\Vcl.StyledTaskDialogFormUnit.pas' {StyledTaskDialogForm}, + Vcl.StyledToolbar in '..\..\source\Vcl.StyledToolbar.pas', + Vcl.StyledDbNavigator in '..\..\source\Vcl.StyledDbNavigator.pas', + Vcl.StyledButtonGroup in '..\..\source\Vcl.StyledButtonGroup.pas', + Vcl.StyledCategoryButtons in '..\..\source\Vcl.StyledCategoryButtons.pas'; + +end. + diff --git a/Ext/StyledComponents/packages/D12/StyledComponents.dproj b/Ext/StyledComponents/packages/D12/StyledComponents.dproj new file mode 100644 index 0000000..5585493 --- /dev/null +++ b/Ext/StyledComponents/packages/D12/StyledComponents.dproj @@ -0,0 +1,166 @@ + + + {F870FD7C-4984-4784-8B29-4CDB55E64524} + StyledComponents.dpk + 20.1 + VCL + True + Release + Win32 + 3 + Package + StyledComponents + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..\..\Lib\D12\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + All + StyledComponents + true + 1033 + CompanyName=Ethea S.r.l.;FileDescription=Styled Components;FileVersion=1.0.0.0;InternalName=;LegalCopyright=Copyright (c) Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=Styled Components;ProductVersion=1.0;Comments= + Ethea Styled Components + true + $(Auto) + true + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + + + Debug + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + + + + + + + + + + + + + + + + + + + + +
StyledTaskDialogForm
+
+ + + + + + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Package + + + + StyledComponents.dpk + + + + + + + True + True + False + + + 12 + + + +
diff --git a/Ext/StyledComponents/packages/D12/StyledComponents.res b/Ext/StyledComponents/packages/D12/StyledComponents.res new file mode 100644 index 0000000000000000000000000000000000000000..e9a26b398e9a1c6afdc93bd1d2cabf9bbb95847d GIT binary patch literal 736 zcma))%}T>i5QR@_7FH0%t(z`fC`gHrjUq^~RSNNkTDov!gRQkt+tS8G-^Euc_%QB$ z1LJpZyryv>UYKO={G2&+XC$eDq-iFoh0`rL{}wTx^#v;XE~r}yQ9HWTJ>P~}XiZ(~ zihGmqIl4JZ|Kn3K`5A`$pIWbE0G;RCq&Ey6c!_2jYODchLygo2d8|iG2z<3MfkFj3 zLP9tgM#tJD_l%flO%)TrfKAM;Z{ZuDKB32|P@zhND#%sqi?mIyt5qjzt_RCuO4bm} zv5hm#7M4#B6j#f5`$$5TV6?u1)xk5vo?{$RGx!ndPCLX$#0}s!vZzz4m=_qpI04gC zD%vXAgW*0b{_3l4`?>*ZqMlyJND6QApMDOQl&2!b@2;|*q&i$Zwj!pYd(C`u(ypC) w8?TwqoNi+n + + {03F938E4-4CBD-4FD4-86A2-084115D91AA9} + dclStyledComponents.dpk + 20.1 + VCL + True + Release + Win32 + 1 + Package + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + ..\..\Lib\D12\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + true + true + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + All + dclStyledComponents + true + 1033 + CompanyName=Ethea S.r.l.;FileDescription=Styled Components;FileVersion=1.0.0.0;InternalName=;LegalCopyright=Copyright (c) Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProgramID=;ProductName=Styled Components;ProductVersion=1.0;Comments= + Ethea Styled Components + $(Auto) + ..\..\Source;..\;$(DCC_UnitSearchPath) + true + + + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + StyledComponents;$(DCC_UsePackage) + + + StyledComponents;$(DCC_UsePackage) + + + Debug + + + DEBUG;$(DCC_Define) + true + false + true + true + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + +
StyledButtonEditor
+ dfm +
+ + Base + + + Cfg_1 + Base + + + Cfg_2 + Base + +
+ + Delphi.Personality.12 + Package + + + + dclStyledComponents.dpk + + + + + True + False + False + + + 12 + + + +
diff --git a/Ext/StyledComponents/packages/D12/dclStyledComponents.res b/Ext/StyledComponents/packages/D12/dclStyledComponents.res new file mode 100644 index 0000000000000000000000000000000000000000..a955af76dc6331eb1733b0e19fa53bed30d0460d GIT binary patch literal 736 zcma))&q~8U5XQfh9IPOSS1&zyP>>R#7e$a_s}$-VYU#m?4K~I?Z9^LmeHULv@L|0B z2FBlRT+?_E7bcnA`R1E%c1MzGSeE66TUx`4i*JJQY%EaKcc5XVfjiKR?)bLV!|Uiu zm+U)y&+yH9^*=r(lb>_A|A~!ChR{X6kMzcY2VbhW#+oXIZLEnRn5TNs4B(5!1ZpVI zA=W^HQFNpYa!uQT!SE~hTp?j+#A!`ih z)Z&b?rPVWn#nm#=2usNliq=-R21MqZ7aRxF41P?y)i(GpxEO5{%bHNd+(3-t6i!pA zd{)yg3inX)S6?mL*EL)-jr2@LTDp_}^s~=Pc`9@K?kev|YN6F*Dncr{+bmvA+Oe#^M?6aolQnVUpum9%>V!Z literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/StyledAnimatedButton.dcr b/Ext/StyledComponents/packages/StyledAnimatedButton.dcr new file mode 100644 index 0000000000000000000000000000000000000000..c16624253eb7c0dfbe776fba750d34f298a50f77 GIT binary patch literal 78308 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 literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/StyledAnimatedTaskDialog.dcr b/Ext/StyledComponents/packages/StyledAnimatedTaskDialog.dcr new file mode 100644 index 0000000000000000000000000000000000000000..6826add4f3074fa0e1ec53210676b302a2482d07 GIT binary patch literal 79476 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 literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/StyledButton.dcr b/Ext/StyledComponents/packages/StyledButton.dcr new file mode 100644 index 0000000000000000000000000000000000000000..0bc9af25a00b3ae3d3b26967303f269d9e3fe4db GIT binary patch literal 317392 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 literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/StyledCategoryButtons.dcr b/Ext/StyledComponents/packages/StyledCategoryButtons.dcr new file mode 100644 index 0000000000000000000000000000000000000000..1ba609f7c72ffacc7e34b7ed6237ba61ffb6c390 GIT binary patch literal 78988 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 Nm}Zgjqkm6u{{umO5zYVr literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/packages/StyledToolBar.dcr b/Ext/StyledComponents/packages/StyledToolBar.dcr new file mode 100644 index 0000000000000000000000000000000000000000..e7fe993f2a3791a1652b3fe4c051361c8b09bf27 GIT binary patch literal 154512 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 Xapi6 nil + else + Result := False; +end; + +procedure TAnimatedImageSourcePropertyEditor.Edit; +var + LData: TBytes; + LComponent: TPersistent; +begin + LComponent := GetComponent(0); + if LComponent is TStyledAnimatedButton then + begin + LData := TStyledAnimatedButton(LComponent).AnimationSource.Data; + TStyledAnimatedButton(LComponent).AnimatedImage.Visible := False; + if TryEdit(LData) then + begin + TStyledAnimatedButton(LComponent).AnimationSource.Data := LData; + Modified; + TStyledAnimatedButton(LComponent).AnimatedImage.Visible := True; + end; + end; +end; + +function TAnimatedImageSourcePropertyEditor.GetValue: string; +begin + Result := 'TSkAnimatedImage.TSource'; +end; + +class function TAnimatedImageSourcePropertyEditor.TryEdit( + var AData: TBytes): Boolean; +var + LAnimatedImageEditorForm: TSkAnimatedImageEditorForm; +begin + LAnimatedImageEditorForm := TSkAnimatedImageEditorForm.Create(Application); + try + Result := LAnimatedImageEditorForm.ShowModal(AData) = mrOk; + finally + LAnimatedImageEditorForm.Free; + end; +end; + +procedure Register; +begin + Classes.RegisterClass(TStyledAnimatedToolButton); + + RegisterComponents('Styled Animated Components', + [TStyledAnimatedButton + //,TStyledAnimatedToolbar + ,TStyledAnimatedTaskDialog + //,TStyledAnimatedDbNavigator + ]); + + RegisterPropertyEditor(TypeInfo(TSkAnimatedImage.TSource), + TStyledAnimatedButton, 'AnimationSource', TAnimatedImageSourcePropertyEditor); + + RegisterComponentEditor(TStyledAnimatedButton, TStyledAnimatedButtonComponentEditor); + RegisterComponentEditor(TStyledAnimatedToolButton, TStyledAnimatedButtonComponentEditor); + RegisterComponentEditor(TStyledAnimatedToolbar, TStyledAnimatedToolbarComponentEditor); + //RegisterComponentEditor(TStyledAnimatedDbNavigator, TStyledAnimatedDbNavigatorComponentEditor); +end; + +end. diff --git a/Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.dfm b/Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.dfm new file mode 100644 index 0000000..4c2c112 --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.dfm @@ -0,0 +1,343 @@ +object AttributesFrame: TAttributesFrame + Left = 0 + Top = 0 + Width = 364 + Height = 334 + TabOrder = 0 + object TopPanel: TPanel + Left = 0 + Top = 0 + Width = 364 + Height = 50 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + object ButtonStyleLabel: TLabel + AlignWithMargins = True + Left = 10 + Top = 10 + Width = 60 + Height = 37 + Margins.Left = 10 + Margins.Top = 10 + Align = alLeft + Caption = 'Style Normal' + ExplicitHeight = 13 + end + object StyledButton: TStyledButton + Left = 162 + Top = 7 + Width = 129 + Height = 41 + Caption = 'StyledButton' + TabOrder = 0 + end + end + object ButtonDrawingStyleGroupBox: TGroupBox + Left = 0 + Top = 117 + Width = 364 + Height = 65 + Align = alTop + Caption = 'Button Drawing Style' + TabOrder = 2 + object ButtonDrawTypePanel: TPanel + Left = 2 + Top = 15 + Width = 150 + Height = 48 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object StyleDrawTypeLabel: TLabel + AlignWithMargins = True + Left = 10 + Top = 0 + Width = 130 + Height = 13 + Margins.Left = 10 + Margins.Top = 0 + Margins.Right = 10 + Margins.Bottom = 0 + Align = alTop + Caption = 'DrawType:' + ExplicitWidth = 53 + end + object StyleDrawTypeComboBox: TComboBox + AlignWithMargins = True + Left = 3 + Top = 16 + Width = 144 + Height = 21 + Align = alClient + Style = csDropDownList + TabOrder = 0 + end + end + object RadiusPanel: TPanel + Left = 152 + Top = 15 + Width = 210 + Height = 48 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object StyleRadiusLabel: TLabel + AlignWithMargins = True + Left = 10 + Top = 0 + Width = 190 + Height = 13 + Margins.Left = 10 + Margins.Top = 0 + Margins.Right = 10 + Margins.Bottom = 0 + Align = alTop + Caption = 'Radius:' + ExplicitWidth = 36 + end + object RadiusTrackBar: TTrackBar + Left = 0 + Top = 13 + Width = 210 + Height = 35 + Align = alClient + Max = 30 + Min = 1 + Position = 1 + TabOrder = 0 + end + end + end + object BorderGroupBox: TGroupBox + Left = 0 + Top = 182 + Width = 364 + Height = 67 + Align = alTop + Caption = 'Border' + TabOrder = 3 + object BorderColorPanel: TPanel + Left = 155 + Top = 15 + Width = 207 + Height = 50 + Align = alClient + BevelOuter = bvNone + TabOrder = 2 + object BorderColorLabel: TLabel + AlignWithMargins = True + Left = 6 + Top = 6 + Width = 195 + Height = 13 + Margins.Left = 6 + Margins.Top = 6 + Margins.Right = 6 + Margins.Bottom = 0 + Align = alTop + Caption = 'Color' + FocusControl = BorderColorBox + ExplicitWidth = 25 + end + object BorderColorBox: TColorBox + AlignWithMargins = True + Left = 3 + Top = 22 + Width = 201 + Height = 22 + Align = alClient + TabOrder = 0 + end + end + object BorderDrawStyleRadioGroup: TRadioGroup + AlignWithMargins = True + Left = 58 + Top = 18 + Width = 94 + Height = 44 + Align = alLeft + Caption = 'Draw Style' + Columns = 2 + Items.Strings = ( + 'Solid' + 'Clear') + TabOrder = 0 + end + object BorderWidthPanel: TPanel + Left = 2 + Top = 15 + Width = 53 + Height = 50 + Align = alLeft + BevelOuter = bvNone + TabOrder = 1 + object BorderDrawWidthLabel: TLabel + AlignWithMargins = True + Left = 6 + Top = 3 + Width = 41 + Height = 13 + Margins.Left = 6 + Margins.Right = 6 + Margins.Bottom = 0 + Align = alTop + Caption = 'Width' + FocusControl = BorderColorBox + ExplicitTop = 6 + ExplicitWidth = 28 + end + object BorderWidthSpinEdit: TSpinEdit + Left = 3 + Top = 18 + Width = 45 + Height = 22 + MaxValue = 0 + MinValue = 0 + TabOrder = 0 + Value = 0 + end + end + end + object FontGroupBox: TGroupBox + Left = 0 + Top = 249 + Width = 364 + Height = 75 + Align = alTop + Caption = 'Font' + TabOrder = 4 + object FontColorPanel: TPanel + Left = 152 + Top = 15 + Width = 210 + Height = 58 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + ExplicitLeft = 2 + ExplicitWidth = 360 + object FontColorLabel: TLabel + AlignWithMargins = True + Left = 6 + Top = 6 + Width = 198 + Height = 13 + Margins.Left = 6 + Margins.Top = 6 + Margins.Right = 6 + Margins.Bottom = 0 + Align = alTop + Caption = 'Color' + FocusControl = FontColorBox + ExplicitWidth = 25 + end + object FontColorBox: TColorBox + AlignWithMargins = True + Left = 3 + Top = 22 + Width = 204 + Height = 22 + Align = alTop + TabOrder = 0 + ExplicitWidth = 354 + end + end + object FontStyleGroupBox: TGroupBox + Left = 2 + Top = 15 + Width = 150 + Height = 58 + Align = alLeft + Caption = 'Style' + TabOrder = 0 + object FontBoldCheckBox: TCheckBox + Left = 6 + Top = 16 + Width = 70 + Height = 17 + Caption = 'Bold' + TabOrder = 0 + end + object UnderlineCheckBox: TCheckBox + Left = 6 + Top = 33 + Width = 70 + Height = 17 + Caption = 'Underline' + TabOrder = 1 + end + object ItalicCheckBox: TCheckBox + Left = 78 + Top = 16 + Width = 70 + Height = 17 + Caption = 'Italic' + TabOrder = 2 + end + object StrikeoutCheckBox: TCheckBox + Left = 78 + Top = 33 + Width = 70 + Height = 17 + Caption = 'Strikeout' + TabOrder = 3 + end + end + end + object ButtonFaceGroupBox: TGroupBox + Left = 0 + Top = 50 + Width = 364 + Height = 67 + Align = alTop + Caption = 'Button Face' + TabOrder = 1 + object ButtonColorPanel: TPanel + Left = 155 + Top = 15 + Width = 207 + Height = 50 + Align = alClient + BevelOuter = bvNone + TabOrder = 1 + object ButtonColorLabel: TLabel + AlignWithMargins = True + Left = 6 + Top = 6 + Width = 195 + Height = 13 + Margins.Left = 6 + Margins.Top = 6 + Margins.Right = 6 + Margins.Bottom = 0 + Align = alTop + Caption = 'Button Color' + ExplicitWidth = 60 + end + object ButtonColorBox: TColorBox + AlignWithMargins = True + Left = 3 + Top = 22 + Width = 201 + Height = 22 + Align = alTop + TabOrder = 0 + end + end + object ButtonDrawStyleRadioGroup: TRadioGroup + AlignWithMargins = True + Left = 5 + Top = 18 + Width = 147 + Height = 44 + Align = alLeft + Caption = 'Draw Style' + Columns = 2 + Items.Strings = ( + 'Solid' + 'Clear') + TabOrder = 0 + end + end +end diff --git a/Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.pas b/Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.pas new file mode 100644 index 0000000..4af338d --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledAttributesFrameUnit.pas @@ -0,0 +1,142 @@ +unit Vcl.StyledAttributesFrameUnit; + +interface + +uses + Winapi.Windows + , Winapi.Messages + , System.SysUtils + , System.Variants + , System.Classes + , Vcl.Graphics + , Vcl.Controls + , Vcl.Forms + , Vcl.Dialogs + , Vcl.ComCtrls + , Vcl.StdCtrls + , Vcl.ExtCtrls + , Vcl.StyledButton + , Vcl.Samples.Spin + , Vcl.ButtonStylesAttributes + ; + +type + TAttributesFrame = class(TFrame) + TopPanel: TPanel; + StyledButton: TStyledButton; + ButtonDrawingStyleGroupBox: TGroupBox; + BorderGroupBox: TGroupBox; + BorderColorPanel: TPanel; + BorderColorLabel: TLabel; + BorderColorBox: TColorBox; + BorderDrawStyleRadioGroup: TRadioGroup; + BorderWidthPanel: TPanel; + BorderDrawWidthLabel: TLabel; + BorderWidthSpinEdit: TSpinEdit; + FontGroupBox: TGroupBox; + FontColorPanel: TPanel; + FontColorLabel: TLabel; + FontColorBox: TColorBox; + FontStyleGroupBox: TGroupBox; + FontBoldCheckBox: TCheckBox; + UnderlineCheckBox: TCheckBox; + ItalicCheckBox: TCheckBox; + StrikeoutCheckBox: TCheckBox; + ButtonFaceGroupBox: TGroupBox; + ButtonColorPanel: TPanel; + ButtonDrawStyleRadioGroup: TRadioGroup; + ButtonColorBox: TColorBox; + ButtonColorLabel: TLabel; + ButtonDrawTypePanel: TPanel; + StyleDrawTypeLabel: TLabel; + StyleDrawTypeComboBox: TComboBox; + RadiusPanel: TPanel; + StyleRadiusLabel: TLabel; + RadiusTrackBar: TTrackBar; + ButtonStyleLabel: TLabel; + private + FStyledButtonAttributes: TStyledButtonAttributes; + procedure UpdateGUIFromAttributes; + procedure UpdateAttributesFromGUI; + procedure SetStyledButtonAttributes(const Value: TStyledButtonAttributes); + { Private declarations } + public + procedure Setup; + property StyledButtonAttributes: TStyledButtonAttributes read FStyledButtonAttributes write SetStyledButtonAttributes; + end; + +implementation + +{$R *.dfm} + +uses + System.TypInfo; + +{ TAttributesFrame } + +procedure TAttributesFrame.SetStyledButtonAttributes( + const Value: TStyledButtonAttributes); +begin + if FStyledButtonAttributes <> Value then + UpdateGUIFromAttributes; +end; + +procedure TAttributesFrame.Setup; +var + I: TStyledButtonDrawType; + LPos: Integer; + LDrawName: string; +begin + for I := Low(TStyledButtonDrawType) to High(TStyledButtonDrawType) do + begin + LDrawName := GetEnumName(TypeInfo(TStyledButtonDrawType), Ord(I)); + LPos := StyleDrawTypeComboBox.Items.Add(LDrawName); + if I = FStyledButtonAttributes.DrawType then + StyleDrawTypeComboBox.ItemIndex := LPos; + end; + //Font size and bold for Label + ButtonStyleLabel.Font.Height := ButtonStyleLabel.Font.Height * 2; + ButtonStyleLabel.Font.Style := [fsBold]; +end; + +procedure TAttributesFrame.UpdateAttributesFromGUI; +var + LFontStyle: TFontStyles; +begin + FStyledButtonAttributes.BorderColor := BorderColorBox.Selected; + FStyledButtonAttributes.BorderDrawStyle := TBorderDrawStyle(BorderDrawStyleRadioGroup.ItemIndex); + FStyledButtonAttributes.BorderWidth := BorderWidthSpinEdit.Value; + FStyledButtonAttributes.FontColor := FontColorBox.Selected; + LFontStyle := []; + if FontBoldCheckBox.Checked then + LFontStyle := LFontStyle + [fsBold]; + if UnderlineCheckBox.Checked then + LFontStyle := LFontStyle + [fsUnderline]; + if ItalicCheckBox.Checked then + LFontStyle := LFontStyle + [fsItalic]; + if StrikeoutCheckBox.Checked then + LFontStyle := LFontStyle + [fsStrikeOut]; + FStyledButtonAttributes.FontStyle := LFontStyle; + FStyledButtonAttributes.ButtonDrawStyle := TButtonDrawStyle(ButtonDrawStyleRadioGroup.ItemIndex); + FStyledButtonAttributes.ButtonColor := ButtonColorBox.Selected; + FStyledButtonAttributes.DrawType := TStyledButtonDrawType(StyleDrawTypeComboBox.ItemIndex); + FStyledButtonAttributes.Radius := RadiusTrackBar.Position; +end; + +procedure TAttributesFrame.UpdateGUIFromAttributes; +begin + BorderColorBox.Selected := FStyledButtonAttributes.BorderColor; + BorderDrawStyleRadioGroup.ItemIndex := Ord(FStyledButtonAttributes.BorderDrawStyle); + BorderWidthSpinEdit.Value := FStyledButtonAttributes.BorderWidth; + FontColorBox.Selected := FStyledButtonAttributes.FontColor; + FontBoldCheckBox.Checked := fsBold in FStyledButtonAttributes.FontStyle; + UnderlineCheckBox.Checked := fsUnderline in FStyledButtonAttributes.FontStyle; + ItalicCheckBox.Checked := fsItalic in FStyledButtonAttributes.FontStyle; + StrikeoutCheckBox.Checked := fsStrikeOut in FStyledButtonAttributes.FontStyle; + ButtonDrawStyleRadioGroup.ItemIndex := Ord(FStyledButtonAttributes.ButtonDrawStyle); + ButtonColorBox.Selected := FStyledButtonAttributes.ButtonColor; + StyleDrawTypeComboBox.ItemIndex := Ord(FStyledButtonAttributes.DrawType); + RadiusTrackBar.Position := FStyledButtonAttributes.Radius; +end; + +end. diff --git a/Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.dfm b/Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.dfm new file mode 100644 index 0000000..03075ef --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.dfm @@ -0,0 +1,225 @@ +object StyledButtonCustomEditor: TStyledButtonCustomEditor + Left = 0 + Top = 0 + Caption = 'Styled Button Attributes Editor %s - Copyright Ethea S.r.l.' + ClientHeight = 531 + ClientWidth = 850 + Color = clBtnFace + Constraints.MinHeight = 300 + Constraints.MinWidth = 400 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Segoe UI' + Font.Style = [] + ShowHint = True + OnCreate = FormCreate + OnShow = FormShow + TextHeight = 13 + object BottomPanel: TPanel + Left = 0 + Top = 493 + Width = 850 + Height = 38 + Align = alBottom + BevelOuter = bvNone + TabOrder = 2 + DesignSize = ( + 850 + 38) + object OKButton: TStyledButton + Left = 553 + Top = 6 + Width = 85 + Height = 25 + Anchors = [akTop, akRight] + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + OnClick = OKButtonClick + end + object ApplyButton: TStyledButton + Left = 736 + Top = 6 + Width = 85 + Height = 25 + Anchors = [akTop, akRight] + Caption = '&Apply' + TabOrder = 2 + OnClick = ApplyButtonClick + end + object CancelButton: TStyledButton + Left = 645 + Top = 6 + Width = 85 + Height = 25 + Anchors = [akTop, akRight] + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object HelpButton: TStyledButton + Left = 828 + Top = 6 + Width = 85 + Height = 25 + Anchors = [akTop, akRight] + Caption = '&Help' + TabOrder = 3 + OnClick = HelpButtonClick + end + end + object paTop: TPanel + Left = 0 + Top = 0 + Width = 850 + Height = 101 + Align = alTop + TabOrder = 0 + OnResize = paTopResize + object ActualGroupBox: TGroupBox + AlignWithMargins = True + Left = 4 + Top = 4 + Width = 413 + Height = 93 + Align = alLeft + Caption = 'ACTUAL' + TabOrder = 0 + object SourceButton: TStyledGraphicButton + AlignWithMargins = True + Left = 8 + Top = 24 + Width = 120 + Height = 34 + StyleElements = [seFont, seBorder] + Caption = 'Source Button' + StyleClass = 'Windows10' + end + end + object NewGroupBox: TGroupBox + AlignWithMargins = True + Left = 423 + Top = 4 + Width = 508 + Height = 93 + Align = alClient + Caption = 'NEW' + TabOrder = 1 + object DestButton: TStyledGraphicButton + AlignWithMargins = True + Left = 12 + Top = 24 + Width = 120 + Height = 34 + OnClick = DestButtonClick + StyleElements = [seFont, seBorder] + Caption = 'Dest Button' + StyleClass = 'Windows10' + end + end + end + object AttributesPanel: TPanel + AlignWithMargins = True + Left = 3 + Top = 104 + Width = 844 + Height = 59 + Align = alTop + BevelOuter = bvNone + TabOrder = 1 + object AttributesGroupBox: TGroupBox + Left = 0 + Top = 0 + Width = 929 + Height = 59 + Align = alClient + Caption = 'Button Attributes' + TabOrder = 0 + object StyleDrawTypeLabel: TLabel + Left = 19 + Top = 26 + Width = 77 + Height = 13 + Alignment = taRightJustify + Caption = 'StyleDrawType:' + end + object StyleRadiusLabel: TLabel + Left = 386 + Top = 26 + Width = 69 + Height = 13 + Alignment = taRightJustify + Caption = 'StyledRadius:' + end + object EnabledCheckBox: TCheckBox + Left = 253 + Top = 25 + Width = 106 + Height = 17 + Caption = 'Button Enabled' + TabOrder = 1 + OnClick = EnabledCheckBoxClick + end + object StyleDrawTypeComboBox: TComboBox + Left = 102 + Top = 23 + Width = 145 + Height = 21 + Style = csDropDownList + TabOrder = 0 + OnSelect = StyleDrawTypeComboBoxSelect + end + object RadiusTrackBar: TTrackBar + Left = 464 + Top = 20 + Width = 225 + Height = 32 + Max = 30 + Min = 1 + Position = 1 + TabOrder = 2 + OnChange = RadiusTrackBarChange + end + object FlatButtonCheckBox: TCheckBox + Left = 695 + Top = 25 + Width = 106 + Height = 17 + Caption = 'Flat button' + TabOrder = 3 + OnClick = FlatButtonCheckBoxClick + end + end + end + object TabControl: TTabControl + Left = 0 + Top = 166 + Width = 850 + Height = 327 + Align = alClient + TabHeight = 32 + TabOrder = 3 + Tabs.Strings = ( + 'Normal' + 'Pressed' + 'Selected' + 'Hot' + 'Disabled') + TabIndex = 0 + object ScrollBox: TScrollBox + AlignWithMargins = True + Left = 7 + Top = 41 + Width = 836 + Height = 279 + Align = alClient + BevelOuter = bvNone + BorderStyle = bsNone + ParentBackground = True + TabOrder = 0 + end + end +end diff --git a/Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.pas b/Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.pas new file mode 100644 index 0000000..daad680 --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledButtonCustomEditorUnit.pas @@ -0,0 +1,357 @@ +{******************************************************************************} +{ } +{ StyledButton Attributes Editor: Component editor for Styled Button } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledButtonCustomEditorUnit; + +interface + +{$INCLUDE ..\Source\StyledComponents.inc} + +uses + Winapi.Windows, + Winapi.Messages, + System.SysUtils, + System.Variants, + System.Classes, + System.Actions, + Vcl.ActnList, + Vcl.ComCtrls, + Vcl.ExtCtrls, + Vcl.Controls, + Vcl.Forms, + Vcl.StdCtrls, + Vcl.StyledButton, + Vcl.ButtonStylesAttributes, + Vcl.StandardButtonStyles, + Vcl.BootstrapButtonStyles, + Vcl.AngularButtonStyles, + Vcl.ColorButtonStyles, + Vcl.ImgList, + Vcl.StyledAttributesFrameUnit; + +type + TStyledButtonCustomEditor = class(TForm) + BottomPanel: TPanel; + OKButton: TStyledButton; + ApplyButton: TStyledButton; + CancelButton: TStyledButton; + HelpButton: TStyledButton; + paTop: TPanel; + ActualGroupBox: TGroupBox; + NewGroupBox: TGroupBox; + SourceButton: TStyledGraphicButton; + DestButton: TStyledGraphicButton; + AttributesPanel: TPanel; + AttributesGroupBox: TGroupBox; + StyleDrawTypeLabel: TLabel; + StyleRadiusLabel: TLabel; + EnabledCheckBox: TCheckBox; + StyleDrawTypeComboBox: TComboBox; + RadiusTrackBar: TTrackBar; + FlatButtonCheckBox: TCheckBox; + TabControl: TTabControl; + ScrollBox: TScrollBox; + procedure FormCreate(Sender: TObject); + procedure OKButtonClick(Sender: TObject); + procedure ApplyButtonClick(Sender: TObject); + procedure HelpButtonClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure paTopResize(Sender: TObject); + procedure StyleDrawTypeComboBoxSelect(Sender: TObject); + procedure EnabledCheckBoxClick(Sender: TObject); + procedure DestButtonClick(Sender: TObject); + procedure RadiusTrackBarChange(Sender: TObject); + procedure FlatButtonCheckBoxClick(Sender: TObject); + private + FUpdating: Boolean; + FStyledButtonRender: TStyledButtonRender; + FStyledButton: TControl; + FCustomStyleDrawType: Boolean; + procedure ApplyStyle; + procedure InitGUI; + procedure UpdateDestFromGUI; + procedure UpdateSizeGUI; + protected + procedure Loaded; override; + public + property CustomStyleDrawType: Boolean read FCustomStyleDrawType; + end; + +var + StyledButtonCustomEditor: TStyledButtonCustomEditor; + +function EditStyledButtonAttributes(const AButton: TControl): Boolean; overload; +function EditStyledButtonAttributes(const AButton: TStyledGraphicButton): Boolean; overload; +function EditStyledButtonAttributes(const AButton: TStyledButton): Boolean; overload; +function EditStyledButtonAttributes(const AButtonRender: TStyledButtonRender): Boolean; overload; + +implementation + +{$R *.dfm} + +uses + Vcl.Themes + , Vcl.Graphics + //WARNING: you must define this directive to use this unit outside the IDE +{$IFNDEF UseStyledCompEditorsAtRunTime} + , ToolsAPI + , BrandingAPI + {$IF (CompilerVersion >= 32.0)}, IDETheme.Utils{$IFEND} +{$ENDIF} + , Winapi.ShellAPI + , System.Contnrs + , Vcl.StyledCmpStrUtils + , System.TypInfo + ; + +var + SavedBounds: TRect = (Left: 0; Top: 0; Right: 0; Bottom: 0); + +function EditStyledButtonAttributes(const AButton: TControl): Boolean; +begin + if AButton is TStyledGraphicButton then + Result := EditStyledButtonAttributes(TStyledGraphicButton(AButton)) + else if AButton is TStyledButton then + Result := EditStyledButtonAttributes(TStyledButton(AButton)) + else + raise Exception.CreateFmt('Cannot Edit Control "%s"', [AButton.Name]); +end; + +function EditStyledButtonAttributes(const AButton: TStyledGraphicButton): Boolean; +begin + Result := EditStyledButtonAttributes(AButton.Render); +end; + +function EditStyledButtonAttributes(const AButton: TStyledButton): Boolean; +begin + Result := EditStyledButtonAttributes(AButton.Render); +end; + +function EditStyledButtonAttributes(const AButtonRender: TStyledButtonRender): Boolean; +var + LEditor: TStyledButtonCustomEditor; +begin + LEditor := TStyledButtonCustomEditor.Create(nil); + with LEditor do + begin + try + FStyledButtonRender := AButtonRender; + FStyledButton := FStyledButtonRender.OwnerControl; + paTop.Height := SourceButton.Top + AButtonRender.Height + SourceButton.Top; + AButtonRender.AssignStyleTo(SourceButton.Render); + SourceButton.Enabled := AButtonRender.Enabled; + SourceButton.Caption := AButtonRender.Caption; + SourceButton.Hint := AButtonRender.Hint; + SourceButton.Width := AButtonRender.Width; + SourceButton.Height := AButtonRender.Height; + SourceButton.Flat := AButtonRender.Flat; + SourceButton.Style := AButtonRender.Style; + + AButtonRender.AssignStyleTo(DestButton.Render); + DestButton.Enabled := AButtonRender.Enabled; + DestButton.Width := AButtonRender.Width; + DestButton.Height := AButtonRender.Height; + DestButton.Caption := AButtonRender.Caption; + DestButton.Hint := AButtonRender.Hint; + DestButton.Flat := AButtonRender.Flat; + DestButton.Style := AButtonRender.Style; + + Result := ShowModal = mrOk; + SavedBounds := BoundsRect; + finally + Free; + end; + end; +end; + +{ TStyledButtonCustomEditor } + +procedure TStyledButtonCustomEditor.ApplyStyle; +begin + Screen.Cursor := crHourglass; + try + DestButton.Render.SetCustomStyleDrawType(FCustomStyleDrawType); + DestButton.AssignStyleTo(FStyledButtonRender); + FStyledButton.Enabled := DestButton.Enabled; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TStyledButtonCustomEditor.ApplyButtonClick(Sender: TObject); +begin + ApplyStyle; + UpdateDestFromGUI; +end; + +procedure TStyledButtonCustomEditor.DestButtonClick(Sender: TObject); +begin + ; //Do nothing +end; + +procedure TStyledButtonCustomEditor.EnabledCheckBoxClick(Sender: TObject); +begin + UpdateDestFromGUI; +end; + +procedure TStyledButtonCustomEditor.FormCreate(Sender: TObject); +{$IFNDEF UseStyledCompEditorsAtRunTime} + {$IF (CompilerVersion >= 32.0)} + var + LStyle: TCustomStyleServices; + {$IFEND} +{$ENDIF} +begin +{$IFNDEF UseStyledCompEditorsAtRunTime} + {$IF (CompilerVersion >= 32.0)} + {$IF (CompilerVersion <= 34.0)} + if UseThemeFont then + Self.Font.Assign(GetThemeFont); + {$IFEND} + {$IF CompilerVersion > 34.0} + if TIDEThemeMetrics.Font.Enabled then + Self.Font.Assign(TIDEThemeMetrics.Font.GetFont); + {$IFEND} + + if ThemeProperties <> nil then + begin + LStyle := ThemeProperties.StyleServices; + StyleElements := StyleElements - [seClient]; + Color := LStyle.GetSystemColor(clWindow); + BottomPanel.StyleElements := BottomPanel.StyleElements - [seClient]; + BottomPanel.ParentBackground := False; + BottomPanel.Color := LStyle.GetSystemColor(clBtnFace); + IDEThemeManager.RegisterFormClass(TStyledButtonEditor); + ThemeProperties.ApplyTheme(Self); + end; + {$IFEND} +{$ENDIF} +end; + +procedure TStyledButtonCustomEditor.InitGUI; +var + I: TStyledButtonDrawType; + LPos: Integer; + LDrawName: string; +begin + Caption := Format(Caption, [StyledButtonsVersion]); +(* + for I := Low(TStyledButtonDrawType) to High(TStyledButtonDrawType) do + begin + LDrawName := GetEnumName(TypeInfo(TStyledButtonDrawType), Ord(I)); + LPos := StyleDrawTypeComboBox.Items.Add(LDrawName); + if I = SourceButton.StyleDrawType then + StyleDrawTypeComboBox.ItemIndex := LPos; + end; + EnabledCheckBox.Checked := SourceButton.Enabled; + RadiusTrackBar.Position := SourceButton.StyleRadius; + FlatButtonCheckBox.Checked := SourceButton.Flat; +*) + UpdateDestFromGUI; +end; + +procedure TStyledButtonCustomEditor.UpdateSizeGUI; +begin + FUpdating := True; + try + Screen.Cursor := crHourGlass; + InitGUI; + finally + FUpdating := False; + Screen.Cursor := crDefault; + end; +end; + +procedure TStyledButtonCustomEditor.FormShow(Sender: TObject); +begin + UpdateSizeGUI; + + if SavedBounds.Right - SavedBounds.Left > 0 then + SetBounds(SavedBounds.Left, SavedBounds.Top, SavedBounds.Width, SavedBounds.Height); +end; + +procedure TStyledButtonCustomEditor.HelpButtonClick(Sender: TObject); +begin + ShellExecute(handle, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL) +end; + +procedure TStyledButtonCustomEditor.Loaded; +begin + inherited; +end; + +procedure TStyledButtonCustomEditor.OKButtonClick(Sender: TObject); +begin + ApplyStyle; +end; + +procedure TStyledButtonCustomEditor.paTopResize(Sender: TObject); +begin + ActualGroupBox.Width := paTop.Width div 2; +end; + +procedure TStyledButtonCustomEditor.RadiusTrackBarChange(Sender: TObject); +begin + DestButton.StyleRadius := RadiusTrackBar.Position; + UpdateDestFromGUI; + //FFamilyBuilt := ''; + //TabControlChange(TabControl); +end; + +procedure TStyledButtonCustomEditor.StyleDrawTypeComboBoxSelect(Sender: TObject); +begin + FCustomStyleDrawType := True; + UpdateDestFromGUI; + //FFamilyBuilt := ''; + //TabControlChange(TabControl); +end; + +procedure TStyledButtonCustomEditor.UpdateDestFromGUI; +var + LRoundRect: Boolean; +begin + DestButton.StyleDrawType := TStyledButtonDrawType(StyleDrawTypeComboBox.ItemIndex); + LRoundRect := DestButton.StyleDrawType = btRoundRect; + DestButton.StyleRadius := RadiusTrackBar.Position; + StyleRadiusLabel.Visible := LRoundRect; + RadiusTrackBar.Visible := LRoundRect; + StyleRadiusLabel.Caption := Format('StyleRadius: %d', [DestButton.StyleRadius]); + DestButton.Enabled := EnabledCheckBox.Checked; + ActualGroupBox.Caption := Format('ACTUAL: %s/%s/%s', + [SourceButton.StyleFamily, SourceButton.StyleClass, SourceButton.StyleAppearance]); + SourceButton.Hint := ActualGroupBox.Caption; + NewGroupBox.Caption := Format('NEW: %s/%s/%s', + [DestButton.StyleFamily, DestButton.StyleClass, DestButton.StyleAppearance]); + DestButton.Hint := NewGroupBox.Caption; + DestButton.Flat := FlatButtonCheckBox.Checked; +end; + +procedure TStyledButtonCustomEditor.FlatButtonCheckBoxClick(Sender: TObject); +begin + UpdateDestFromGUI; +end; + +end. diff --git a/Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.dfm b/Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.dfm new file mode 100644 index 0000000..6402f29 --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.dfm @@ -0,0 +1,1382 @@ +object StyledButtonEditor: TStyledButtonEditor + Left = 0 + Top = 0 + ActiveControl = TabControl + Caption = 'Styled Button Editor %s - Copyright Ethea S.r.l.' + ClientHeight = 543 + ClientWidth = 935 + Color = clBtnFace + Constraints.MinHeight = 300 + Constraints.MinWidth = 400 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Segoe UI' + Font.Style = [] + OldCreateOrder = True + ShowHint = True + OnCreate = FormCreate + OnShow = FormShow + PixelsPerInch = 96 + TextHeight = 13 + object SplitterTop: TSplitter + Left = 0 + Top = 166 + Width = 935 + Height = 3 + Cursor = crVSplit + Align = alTop + end + object BottomPanel: TPanel + Left = 0 + Top = 505 + Width = 935 + Height = 38 + Align = alBottom + BevelOuter = bvNone + TabOrder = 2 + DesignSize = ( + 935 + 38) + object OKButton: TStyledButton + Left = 565 + Top = 4 + Width = 85 + Height = 29 + Anchors = [akTop, akRight] + Caption = 'OK' + Default = True + ModalResult = 1 + TabOrder = 0 + OnClick = OKButtonClick + end + object ApplyButton: TStyledButton + Left = 747 + Top = 4 + Width = 85 + Height = 29 + Anchors = [akTop, akRight] + Caption = '&Apply' + TabOrder = 2 + OnClick = ApplyButtonClick + end + object CancelButton: TStyledButton + Left = 656 + Top = 4 + Width = 85 + Height = 29 + Anchors = [akTop, akRight] + Cancel = True + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 1 + end + object HelpButton: TStyledButton + Left = 839 + Top = 4 + Width = 85 + Height = 29 + Anchors = [akTop, akRight] + Caption = '&Help' + TabOrder = 3 + OnClick = HelpButtonClick + end + end + object paTop: TPanel + Left = 0 + Top = 0 + Width = 935 + Height = 101 + Align = alTop + TabOrder = 1 + OnResize = paTopResize + object ActualGroupBox: TGroupBox + AlignWithMargins = True + Left = 4 + Top = 4 + Width = 413 + Height = 93 + Align = alLeft + Caption = 'ACTUAL' + TabOrder = 0 + object SourceButton: TStyledGraphicButton + AlignWithMargins = True + Left = 3 + Top = 24 + Width = 120 + Height = 34 + StyleElements = [seFont, seBorder] + Caption = 'Source Button' + StyleClass = 'Windows10' + end + end + object NewGroupBox: TGroupBox + AlignWithMargins = True + Left = 423 + Top = 4 + Width = 508 + Height = 93 + Align = alClient + Caption = 'NEW' + TabOrder = 1 + object DestButton: TStyledGraphicButton + AlignWithMargins = True + Left = 12 + Top = 24 + Width = 120 + Height = 34 + OnClick = DestButtonClick + StyleElements = [seFont, seBorder] + Caption = 'Dest Button' + StyleClass = 'Windows10' + end + end + end + object TabControl: TTabControl + Left = 0 + Top = 177 + Width = 935 + Height = 328 + Align = alClient + Images = ImageList + TabHeight = 32 + TabOrder = 0 + Tabs.Strings = ( + 'Classic') + TabIndex = 0 + OnChange = TabControlChange + OnGetImageIndex = TabControlGetImageIndex + object ScrollBox: TScrollBox + AlignWithMargins = True + Left = 7 + Top = 41 + Width = 921 + Height = 280 + Align = alClient + BevelOuter = bvNone + BorderStyle = bsNone + ParentBackground = True + TabOrder = 0 + end + end + object AttributesPanel: TPanel + AlignWithMargins = True + Left = 3 + Top = 104 + Width = 929 + Height = 67 + Align = alTop + BevelOuter = bvNone + TabOrder = 3 + object AttributesGroupBox: TGroupBox + Left = 0 + Top = 0 + Width = 449 + Height = 67 + Align = alLeft + Caption = 'Button Attributes' + TabOrder = 0 + object StyleDrawTypeLabel: TLabel + Left = 294 + Top = 21 + Width = 56 + Height = 13 + Caption = 'Draw Type:' + end + object StyleLabel: TLabel + Left = 143 + Top = 21 + Width = 27 + Height = 13 + Caption = 'Style:' + end + object EnabledCheckBox: TCheckBox + Left = 62 + Top = 23 + Width = 80 + Height = 17 + Caption = 'Enabled' + TabOrder = 1 + OnClick = EnabledCheckBoxClick + end + object StyleDrawTypeComboBox: TComboBox + Left = 294 + Top = 36 + Width = 145 + Height = 21 + Style = csDropDownList + TabOrder = 4 + OnSelect = StyleComboBoxSelect + end + object FlatButtonCheckBox: TCheckBox + Left = 9 + Top = 23 + Width = 50 + Height = 17 + Caption = 'Flat' + TabOrder = 0 + OnClick = CheckBoxClick + end + object AsVCLComponentCheckBox: TCheckBox + Left = 9 + Top = 46 + Width = 131 + Height = 17 + Caption = 'As VCL Component' + TabOrder = 2 + OnClick = AsVCLComponentCheckBoxClick + end + object StyleComboBox: TComboBox + Left = 143 + Top = 36 + Width = 145 + Height = 21 + Style = csDropDownList + TabOrder = 3 + OnSelect = StyleComboBoxSelect + end + end + object RoundedCornersGroupBox: TGroupBox + Left = 690 + Top = 0 + Width = 239 + Height = 67 + Align = alClient + Caption = 'Rounded Corners' + TabOrder = 2 + object TopRightCheckBox: TCheckBox + Left = 112 + Top = 23 + Width = 100 + Height = 17 + Caption = 'Top Right' + TabOrder = 1 + OnClick = RoundedCheckBoxClick + end + object TopLeftCheckBox: TCheckBox + Left = 9 + Top = 23 + Width = 100 + Height = 17 + Caption = 'Top Left' + TabOrder = 0 + OnClick = RoundedCheckBoxClick + end + object BottomLeftCheckBox: TCheckBox + Left = 9 + Top = 46 + Width = 100 + Height = 17 + Caption = 'Bottom Left' + TabOrder = 2 + OnClick = RoundedCheckBoxClick + end + object BottomRightCheckBox: TCheckBox + Left = 112 + Top = 46 + Width = 100 + Height = 17 + Caption = 'Bottom Right' + TabOrder = 3 + OnClick = RoundedCheckBoxClick + end + end + object CornerRadiusGroupBox: TGroupBox + Left = 449 + Top = 0 + Width = 241 + Height = 67 + Align = alLeft + Caption = 'Border Radius' + TabOrder = 1 + object StyleRadiusLabel: TLabel + Left = 14 + Top = 21 + Width = 38 + Height = 13 + Caption = 'Radius:' + end + object RadiusTrackBar: TTrackBar + Left = 5 + Top = 35 + Width = 225 + Height = 24 + Max = 30 + Min = 1 + Position = 1 + TabOrder = 0 + OnChange = RadiusTrackBarChange + end + end + end + object ImageList: TImageList + ColorDepth = cd32Bit + Height = 32 + Width = 32 + Left = 432 + Top = 280 + Bitmap = { + 494C010107000800040020002000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000800000004000000001002000000000000080 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000111010 + 106F303030C0535353FD545454FE545454FE545454FE545454FE545454FE4949 + 49EE242424A70202022E00000000000000000000000000000000000000000000 + 000000000000000000000000000000000000311000FC872D00FE872D00FE290D + 00FC323200FD878700FE878700FE292900FC321010FD872D2DFE872D2DFE290D + 0DFC323210FD87872DFE87872DFE29290DFC321021FD872D5AFE872D5AFE290D + 1CFC323221FD87875AFE87875AFE29291CFC321032FD872D87FE872D87FE290D + 29FC323232FD878787FE878787FE313131FC0000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000C090039BF8E + 00DDFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD + 00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD + 00FEFDBD00FEFDBD00FEC69300E1100C00400000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000202022D313131C3545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE08080852000000000000000000000000000000000000 + 000000000000000000000000000000000000872D00FEFD5400FEFD5400FE7426 + 00FE878700FEFDFD00FEFDFD00FE747400FE872D2DFEFD5454FEFD5454FE7426 + 26FE87872DFEFDFD54FEFDFD54FE747426FE872D5AFEFD54A8FEFD54A8FE7426 + 4CFE87875AFEFDFDA8FEFDFDA8FE74744CFE872D87FEFD54FDFEFD54FDFE7426 + 74FE878787FEFDFDFDFEFDFDFDFE878787FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000B28400D5FAAB + 02FDFE8F07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E + 07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E + 07FFFE8E07FFFE8E07FFFBA902FDC49200E00000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000A272727AD545454FE545454FE545454FE5454 + 54FE545454FE545454FE747474FED4D4D4FFDBDBDBFF717171FE545454FE5454 + 54FE545454FE545454FE2E2E2EBD000000000000000000000000000000000000 + 000000000000000000000000000000000000872D00FEFD5400FEFD5400FE7426 + 00FE878700FEFDFD00FEFDFD00FE747400FE872D2DFEFD5454FEFD5454FE7426 + 26FE87872DFEFDFD54FEFDFD54FE747426FE872D5AFEFD54A8FEFD54A8FE7426 + 4CFE87875AFEFDFDA8FEFDFDA8FE74744CFE872D87FEFD54FDFEFD54FDFE7426 + 74FE878787FEFDFDFDFEFDFDFDFE878787FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6F0FFFFD6E + 0EFFFD6D0CFFFD6D0CFFFD7012FFFD6D0CFFFD7012FFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000202022C545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE595959FEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF545454FE5454 + 54FE545454FE545454FE16161685000000000000000000000000000000000000 + 000000000000000000000000000000000000321000FD872D00FE872D00FE2A0D + 00FD313100FD878700FE878700FE2A2A00FD311010FD872D2DFE872D2DFE2A0D + 0DFD313110FD87872DFE87872DFE2A2A0DFD311020FD872D5AFE872D5AFE2A0D + 1CFD313120FD87875AFE87875AFE2A2A1CFD311031FD872D87FE872D87FE2A0D + 2AFD313131FD878787FE878787FE323232FD0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000E9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFE9C59FFFFF6F0FFFFF4 + ECFFFE954DFFFD7A21FFFFE9DAFFFD8E41FFFFE7D6FFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000404043C545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE636363FEFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFF6B6B6BFE5454 + 54FE545454FE545454FE0000000E000000000000000000000000000000000000 + 0000000000000000000000000000000000001C0D00FC4C2600FE4C2600FE180B + 00FC1C2A00FD4C7400FE4C7400FE182400FC1C0D0DFD4C2626FE4C2626FE180B + 0BFC1C2A0DFD4C7426FE4C7426FE18240BFC1C0D1CFD4C264CFE4C264CFE180B + 18FC1C2A1CFD4C744CFE4C744CFE182418FC1C0D2AFD4C2674FE4C2674FE180B + 24FC1C2A2AFD4C7474FE4C7474FE1C2929FC00010117085474AF11A7E3F512B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF0000000CE9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFFE8D8FFFE934AFFFE9C + 59FFFEDFC9FFFD8430FFFFF9F5FFFFE6D6FFFEA263FFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000202 + 022C545454FE545454FE5C5A56FE867864FE7A6F5FFE545454FE545454FE5454 + 54FE545454FE565656FEF7F7F7FFFEFEFEFFFEFEFEFFFCFCFCFF545454FE5454 + 54FE545454FE0F0F0F6E00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005A2D00FEA85400FEA85400FE4C26 + 00FE5A8700FEA8FD00FEA8FD00FE4C7400FE5A2D2DFEA85454FEA85454FE4C26 + 26FE5A872DFEA8FD54FEA8FD54FE4C7426FE5A2D5AFEA854A8FEA854A8FE4C26 + 4CFE5A875AFEA8FDA8FEA8FDA8FE4C744CFE5A2D87FEA854FDFEA854FDFE4C26 + 74FE5A8787FEA8FDFDFEA8FDFDFE5A8787FE085474AF12B5F7FF12B5F7FF12B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF0000000CE9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFFF1E8FFFD7D28FFFD87 + 36FFFFE9DAFFFD8029FFFFFCFAFFFFEADBFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000A5454 + 54FE545454FE595755FEF8C786FFFECB87FFFECB87FFB29670FF545454FE5454 + 54FE545454FE545454FE646464FEB0B0B0FFB6B6B6FF5D5D5DFE545454FE5454 + 54FE393939D10000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000005A2D00FEA85400FEA85400FE4C26 + 00FE5A8700FEA8FD00FEA8FD00FE4C7400FE5A2D2DFEA85454FEA85454FE4C26 + 26FE5A872DFEA8FD54FEA8FD54FE4C7426FE5A2D5AFEA854A8FEA854A8FE4C26 + 4CFE5A875AFEA8FDA8FEA8FDA8FE4C744CFE5A2D87FEA854FDFEA854FDFE4C26 + 74FE5A8787FEA8FDFDFEA8FDFDFE5A8787FE11A7E3F512B5F7FF0D83B2D90641 + 5999064159990641599906415999064159990641599900000007E9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFFE8D9FFFE9249FFFE9B + 58FFFEDFCAFFFD7E28FFFFF2E9FFFFEFE4FFFE9B57FFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000272727AD5454 + 54FE545454FE8A7A64FEFECB87FFFECB87FFFECB87FFFECB87FF545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE000000130000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000211000FD5A2D00FE5A2D00FE1C0D + 00FD203100FD5A8700FE5A8700FE1C2A00FD201010FD5A2D2DFE5A2D2DFE1C0D + 0DFD203110FD5A872DFE5A872DFE1C2A0DFD201020FD5A2D5AFE5A2D5AFE1C0D + 1CFD203120FD5A875AFE5A875AFE1C2A1CFD201031FD5A2D87FE5A2D87FE1C0D + 2AFD203131FD5A8787FE5A8787FE213232FD12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000E9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFE9D5BFFFFF6F1FFFFF5 + EEFFFE964EFFFD7A21FFFFE9DAFFFE9249FFFFE6D5FFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000202022D545454FE5454 + 54FE545454FE7C7060FEFECB87FFFECB87FFFECB87FFF6C686FF545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE0909 + 0957000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000D0D00FC262600FE262600FE0B0B + 00FC0D2A00FD267400FE267400FE0B2400FC0D0D0DFD262626FE262626FE0B0B + 0BFC0D2A0DFD267426FE267426FE0B240BFC0D0D1CFD26264CFE26264CFE0B0B + 18FC0D2A1CFD26744CFE26744CFE0B2418FC0D0D2AFD262674FE262674FE0B0B + 24FC0D2A2AFD267474FE267474FE0D2929FC12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000E9AD00F4FE94 + 06FFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6D0CFFFD6F0FFFFD6E + 0EFFFD6D0CFFFD6D0CFFFD7012FFFD6D0CFFFD7012FFFD6D0CFFFD6D0CFFFD6D + 0CFFFD6D0CFFFD6D0CFFFE8F07FFFDBD00FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000313131C3545454FE5454 + 54FE545454FE545454FEB19570FFFECB87FFFBC987FF7C7060FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE434343E30000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002D2D00FE545400FE545400FE2626 + 00FE2D8700FE54FD00FE54FD00FE267400FE2D2D2DFE545454FE545454FE2626 + 26FE2D872DFE54FD54FE54FD54FE267426FE2D2D5AFE5454A8FE5454A8FE2626 + 4CFE2D875AFE54FDA8FE54FDA8FE26744CFE2D2D87FE5454FDFE5454FDFE2626 + 74FE2D8787FE54FDFDFE54FDFDFE2D8787FE12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000B28400D5FAAA + 02FDFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E + 07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E07FFFE8E + 07FFFE8E07FFFE8E07FFFBA902FDC69300E10000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000011545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE161616830000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002D2D00FE545400FE545400FE2626 + 00FE2D8700FE54FD00FE54FD00FE267400FE2D2D2DFE545454FE545454FE2626 + 26FE2D872DFE54FD54FE54FD54FE267426FE2D2D5AFE5454A8FE5454A8FE2626 + 4CFE2D875AFE54FDA8FE54FDA8FE26744CFE2D2D87FE5454FDFE5454FDFE2626 + 74FE2D8787FE54FDFDFE54FDFDFE2D8787FE12B5F7FF12B5F7FF0746609F0000 + 00000000000000000000000000000000000000000000000000000D09003AC18F + 00DEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD + 00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD00FEFDBD + 00FEFDBD00FEFDBD00FEC89400E2100C00410000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001010106F545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE3D3D3DD90000000B2E2E2EBE545454FE545454FE434343E30000 + 000C000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000101000FD2D2D00FE2D2D00FE0D0D + 00FD103100FD2D8700FE2D8700FE0D2A00FD101010FD2D2D2DFE2D2D2DFE0D0D + 0DFD103110FD2D872DFE2D872DFE0D2A0DFD101020FD2D2D5AFE2D2D5AFE0D0D + 1CFD103120FD2D875AFE2D875AFE0D2A1CFD101031FD2D2D87FE2D2D87FE0D0D + 2AFD103131FD2D8787FE2D8787FE103232FD12B5F7FF12B5F7FF0746609F0000 + 0112042533750427357700060831000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000303030C0545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE0000001100000000323232C5545454FE545454FE545454FE5454 + 54FE292929B31313137B0C0C0C610A0A0A5A0B0B0B5C0C0C0C610D0D0D650B0B + 0B5E06060645000000110000000000000000000D00FC002600FE002600FE000B + 00FC002A00FD007400FE007400FE002400FC000D0DFD002626FE002626FE000B + 0BFC002A0DFD007426FE007426FE00240BFC000D1CFD00264CFE00264CFE000B + 18FC002A1CFD00744CFE00744CFE002418FC000D2AFD002674FE002674FE000B + 24FC002A2AFD007474FE007474FE002929FC12B5F7FF12B5F7FF0746609F010F + 144A12B5F7FF12B5F7FF063A4F910000000003222F7012B5F7FF12B5F7FF12B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B2F3FD000A0D3C0746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000535353FD545454FE545454FE5454 + 54FE675E52FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE454545E6000000000000000008080851545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE393939D200000014002D00FE005400FE005400FE0026 + 00FE008700FE00FD00FE00FD00FE007400FE002D2DFE005454FE005454FE0026 + 26FE00872DFE00FD54FE00FD54FE007426FE002D5AFE0054A8FE0054A8FE0026 + 4CFE00875AFE00FDA8FE00FDA8FE00744CFE002D87FE0054FDFE0054FDFE0026 + 74FE008787FE00FDFDFE00FDFDFE008787FE12B5F7FF12B5F7FF0746609F010F + 144A12B5F7FF12B5F7FF063A4F9100000000031F2A6A109ED7EE109ED7EE109E + D7EE109ED7EE109ED7EE109ED7EE109ED7EE109BD4EC00080C390746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000545454FE545454FE6A6051FEEDA9 + 43FFEDA943FFE6A544FF625C52FE545454FE545454FE545454FE545454FE5454 + 54FE4E4E4EF50000000000000000000000000101011D0A0A0A5A161616845454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5355 + 53FE545454FE545454FE545454FE373737CF002D00FE005400FE005400FE0026 + 00FE008700FE00FD00FE00FD00FE007400FE002D2DFE005454FE005454FE0026 + 26FE00872DFE00FD54FE00FD54FE007426FE002D5AFE0054A8FE0054A8FE0026 + 4CFE00875AFE00FDA8FE00FDA8FE00744CFE002D87FE0054FDFE0054FDFE0026 + 74FE008787FE00FDFDFE00FDFDFE008787FE12B5F7FF12B5F7FF0746609F0000 + 0010031C2665031C27660004062A000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000545454FE545454FECD9746FFEDA9 + 43FFEDA943FFEDA943FFA8834BFF545454FE545454FE545454FE545454FE5454 + 54FE545454FE0404043900000000000000000000000000000000080808505454 + 54FE545454FE545454FE545454FE545454FE545454FE525552FE0B810BFF0087 + 00FF048604FF475C47FE545454FE545454FE001000FD002D00FE002D00FE000D + 00FD003100FD008700FE008700FE002A00FD001010FD002D2DFE002D2DFE000D + 0DFD003110FD00872DFE00872DFE002A0DFD001020FD002D5AFE002D5AFE000D + 1CFD003120FD00875AFE00875AFE002A1CFD001031FD002D87FE002D87FE000D + 2AFD003131FD008787FE008787FE003232FD12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000545454FE545454FECD9746FFEDA9 + 43FFEDA943FFEDA943FFA8834BFF545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE0808085200000000000000010C0C0C60545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE266F26FF008700FF0087 + 00FF008700FF187918FF545454FE545454FE290000FC740000FE740000FE2400 + 00FC2A1C00FD744C00FE744C00FE241800FC2A000DFD740026FE740026FE2400 + 0BFC2A1C0DFD744C26FE744C26FE24180BFC2A001CFD74004CFE74004CFE2400 + 18FC2A1C1CFD744C4CFE744C4CFE241818FC2A002AFD740074FE740074FE2400 + 24FC2A1C2AFD744C74FE744C74FE291C29FC12B5F7FF12B5F7FF0746609F0003 + 0423084F6CA908506EAA01121952000000000000000E00070933000709330007 + 09330007093300070933000709330007093300060932000000040746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000545454FE545454FE6A6051FEEDA9 + 43FFEDA943FFE6A544FF625C52FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE227322FF008700FF0087 + 00FF008700FF107D10FF545454FE545454FE870000FEFD0000FEFD0000FE7400 + 00FE875A00FEFDA800FEFDA800FE744C00FE87002DFEFD0054FEFD0054FE7400 + 26FE875A2DFEFDA854FEFDA854FE744C26FE87005AFEFD00A8FEFD00A8FE7400 + 4CFE875A5AFEFDA8A8FEFDA8A8FE744C4CFE870087FEFD00FDFEFD00FDFE7400 + 74FE875A87FEFDA8FDFEFDA8FDFE875A87FE12B5F7FF12B5F7FF0746609F010F + 144A12B5F7FF12B5F7FF063A4F9100000000052D3E8012B5F7FF12B5F7FF12B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF010F144A0746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000505050F8545454FE545454FE5454 + 54FE675E52FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE4C594CFE008700FF0087 + 00FF008700FF3E623EFE545454FE505050F8870000FEFD0000FEFD0000FE7400 + 00FE875A00FEFDA800FEFDA800FE744C00FE87002DFEFD0054FEFD0054FE7400 + 26FE875A2DFEFDA854FEFDA854FE744C26FE87005AFEFD00A8FEFD00A8FE7400 + 4CFE875A5AFEFDA8A8FEFDA8A8FE744C4CFE870087FEFD00FDFEFD00FDFE7400 + 74FE875A87FEFDA8FDFEFDA8FDFE875A87FE12B5F7FF12B5F7FF0746609F010D + 124512B5F7FF12B5F7FF06374C8D000000000110154C0A6184BB0A6184BB0A61 + 84BB0A6184BB0A6184BB0A6184BB0A6184BB0A5E80B8000405270746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002E2E2EBE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE515551FE4060 + 40FE4E574EFE545454FE545454FE2E2E2EBE320000FD870000FE870000FE2A00 + 00FD312000FD875A00FE875A00FE2A1C00FD310010FD87002DFE87002DFE2A00 + 0DFD312010FD875A2DFE875A2DFE2A1C0DFD310020FD87005AFE87005AFE2A00 + 1CFD312020FD875A5AFE875A5AFE2A1C1CFD310031FD870087FE870087FE2A00 + 2AFD312031FD875A87FE875A87FE322132FD12B5F7FF12B5F7FF0746609F0000 + 000300060830000709330000000F000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000F0F0F6C545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE0F0F0F6C1C0000FC4C0000FE4C0000FE1800 + 00FC1C1C00FD4C4C00FE4C4C00FE181800FC1C000DFD4C0026FE4C0026FE1800 + 0BFC1C1C0DFD4C4C26FE4C4C26FE18180BFC1C001CFD4C004CFE4C004CFE1800 + 18FC1C1C1CFD4C4C4CFE4C4C4CFE181818FC1C002AFD4C0074FE4C0074FE1800 + 24FC1C1C2AFD4C4C74FE4C4C74FE1C1C29FC12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000F545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE545454FE0000000F5A0000FEA80000FEA80000FE4C00 + 00FE5A5A00FEA8A800FEA8A800FE4C4C00FE5A002DFEA80054FEA80054FE4C00 + 26FE5A5A2DFEA8A854FEA8A854FE4C4C26FE5A005AFEA800A8FEA800A8FE4C00 + 4CFE5A5A5AFEA8A8A8FEA8A8A8FE4C4C4CFE5A0087FEA800FDFEA800FDFE4C00 + 74FE5A5A87FEA8A8FDFEA8A8FDFE5A5A87FE12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000746609F12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000303030C0545454FE5454 + 54FE545454FE545454FE424295FF3232CBFF3333C9FF4C4C70FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE496C77FE22CAFCFF21CBFEFF3A93ADFF545454FE545454FE5454 + 54FE545454FE545454FE303030C0000000005A0000FEA80000FEA80000FE4C00 + 00FE5A5A00FEA8A800FEA8A800FE4C4C00FE5A002DFEA80054FEA80054FE4C00 + 26FE5A5A2DFEA8A854FEA8A854FE4C4C26FE5A005AFEA800A8FEA800A8FE4C00 + 4CFE5A5A5AFEA8A8A8FEA8A8A8FE4C4C4CFE5A0087FEA800FDFEA800FDFE4C00 + 74FE5A5A87FEA8A8FDFEA8A8FDFE5A5A87FE12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000001 + 021906384E8F06415999064159990641599906415999064159990D83B2D912B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000202022C545454FE5454 + 54FE545454FE4C4C70FE3232CBFF3232CBFF3232CBFF3434C6FF545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE21CBFEFF21CBFEFF21CBFEFF21CBFEFF4C676FFE545454FE5454 + 54FE545454FE545454FE0202022C00000000210000FD5A0000FE5A0000FE1C00 + 00FD202000FD5A5A00FE5A5A00FE1C1C00FD200010FD5A002DFE5A002DFE1C00 + 0DFD202010FD5A5A2DFE5A5A2DFE1C1C0DFD200020FD5A005AFE5A005AFE1C00 + 1CFD202020FD5A5A5AFE5A5A5AFE1C1C1CFD200031FD5A0087FE5A0087FE1C00 + 2AFD202031FD5A5A87FE5A5A87FE212132FD12B5F7FF12B5F7FF0746609F0000 + 000000000000000000000000000000000000000000000000000000000000063B + 509212B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5 + F7FF12B5F7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000252525AA5454 + 54FE545454FE49497AFE3232CBFF3232CBFF3232CBFF3232CBFF545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE21CBFEFF21CBFEFF21CBFEFF21CBFEFF457988FE545454FE5454 + 54FE545454FE252525AA00000000000000000D0000FC260000FE260000FE0B00 + 00FC0D1C00FD264C00FE264C00FE0B1800FC0D000DFD260026FE260026FE0B00 + 0BFC0D1C0DFD264C26FE264C26FE0B180BFC0D001CFD26004CFE26004CFE0B00 + 18FC0D1C1CFD264C4CFE264C4CFE0B1818FC0D002AFD260074FE260074FE0B00 + 24FC0D1C2AFD264C74FE264C74FE0D1C29FC12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000746 + 609F12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5 + F7FF12B3F5FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000095454 + 54FE545454FE535357FE3434C7FF3232CBFF3232CBFF414196FF545454FE5454 + 54FE545454FE545454FE4C5A64FE2779B0FF237BB6FF50585DFE545454FE5454 + 54FE545454FE3895B1FF21CBFEFF21CBFEFF22CAFCFF535555FE545454FE5454 + 54FE545454FE0000000900000000000000002D0000FE540000FE540000FE2600 + 00FE2D5A00FE54A800FE54A800FE264C00FE2D002DFE540054FE540054FE2600 + 26FE2D5A2DFE54A854FE54A854FE264C26FE2D005AFE5400A8FE5400A8FE2600 + 4CFE2D5A5AFE54A8A8FE54A8A8FE264C4CFE2D0087FE5400FDFE5400FDFE2600 + 74FE2D5A87FE54A8FDFE54A8FDFE2D5A87FE12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000746 + 609F12B5F7FF12B5F7FF00000000000000000000000002161E5A12B1F1FC12B5 + F7FF0D81B1D80000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000202 + 022B545454FE545454FE52525AFE4A4A78FE4C4C6FFE545454FE545454FE5454 + 54FE545454FE535556FE0396F7FF0098FEFF0098FEFF0198FCFF545454FE5454 + 54FE545454FE545454FE496E79FE437D8EFE535555FE545454FE545454FE5454 + 54FE0202022B0000000000000000000000002D0000FE540000FE540000FE2600 + 00FE2D5A00FE54A800FE54A800FE264C00FE2D002DFE540054FE540054FE2600 + 26FE2D5A2DFE54A854FE54A854FE264C26FE2D005AFE5400A8FE5400A8FE2600 + 4CFE2D5A5AFE54A8A8FE54A8A8FE264C4CFE2D0087FE5400FDFE5400FDFE2600 + 74FE2D5A87FE54A8FDFE54A8FDFE2D5A87FE12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000746 + 609F12B5F7FF12B5F7FF000000000000000002161E5A12B1F1FC12B5F7FF12B2 + F3FD0111174F0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000404043A545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE4D5A63FE0098FEFF0098FEFF0098FEFF0098FEFF485D6BFE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE0404 + 043A00000000000000000000000000000000100000FD2D0000FE2D0000FE0D00 + 00FD102000FD2D5A00FE2D5A00FE0D1C00FD100010FD2D002DFE2D002DFE0D00 + 0DFD102010FD2D5A2DFE2D5A2DFE0D1C0DFD100020FD2D005AFE2D005AFE0D00 + 1CFD102020FD2D5A5AFE2D5A5AFE0D1C1CFD100031FD2D0087FE2D0087FE0D00 + 2AFD102031FD2D5A87FE2D5A87FE102132FD12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000746 + 609F12B5F7FF12B5F7FF0000000001131B5512AFEFFB12B5F7FF12B3F5FE031E + 2968000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000202022B545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE515659FE0098FEFF0098FEFF0098FEFF0098FEFF545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE0202022B0000 + 000000000000000000000000000000000000000000FC000000FE000000FE0000 + 00FC001C00FD004C00FE004C00FE001800FC00000DFD000026FE000026FE0000 + 0BFC001C0DFD004C26FE004C26FE00180BFC00001CFD00004CFE00004CFE0000 + 18FC001C1CFD004C4CFE004C4CFE001818FC00002AFD000074FE000074FE0000 + 24FC001C2AFD004C74FE004C74FE001C29FC12B5F7FF12B5F7FF0746609F0000 + 0000000000000000000000000000000000000000000000000000000000000746 + 609F12B5F7FF12B5F7FF01131B5512AFEFFB12B5F7FF12B3F5FE031E29680000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000009252525AA545454FE545454FE545454FE5454 + 54FE545454FE545454FE446174FE1488D4FF118BDBFF466071FE545454FE5454 + 54FE545454FE545454FE545454FE545454FE252525AA00000009000000000000 + 000000000000000000000000000000000000000000FE000000FE000000FE0000 + 00FE005A00FE00A800FE00A800FE004C00FE00002DFE000054FE000054FE0000 + 26FE005A2DFE00A854FE00A854FE004C26FE00005AFE0000A8FE0000A8FE0000 + 4CFE005A5AFE00A8A8FE00A8A8FE004C4CFE000087FE0000FDFE0000FDFE0000 + 74FE005A87FE00A8FDFE00A8FDFE005A87FE11A7E3F512B5F7FF0D83B2D90641 + 5999064159990641599906415999064159990641599906415999064159990D83 + B2D912B5F7FF12B5F7FF12B1F1FC12B5F7FF12B2F3FD02192260000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000202022C303030C0545454FE5454 + 54FE545454FE545454FE545454FE545454FE545454FE545454FE545454FE5454 + 54FE545454FE545454FE303030C00202022C0000000000000000000000000000 + 000000000000000000000000000000000000000000FE000000FE000000FE0000 + 00FE005A00FE00A800FE00A800FE004C00FE00002DFE000054FE000054FE0000 + 26FE005A2DFE00A854FE00A854FE004C26FE00005AFE0000A8FE0000A8FE0000 + 4CFE005A5AFE00A8A8FE00A8A8FE004C4CFE000087FE0000FDFE0000FDFE0000 + 74FE005A87FE00A8FDFE00A8FDFE005A87FE085776B112B5F7FF12B5F7FF12B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B2F3FD0219226000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000F0F0F + 0F6C2E2E2EBE505050F8545454FE545454FE545454FE545454FE505050F82E2E + 2EBE0F0F0F6C0000000F00000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000FC000000FE000000FE0000 + 00FC002100FD005A00FE005A00FE001C00FC000010FD00002DFE00002DFE0000 + 0DFC002110FD005A2DFE005A2DFE001C0DFC000021FD00005AFE00005AFE0000 + 1CFC002121FD005A5AFE005A5AFE001C1CFC000032FD000087FE000087FE0000 + 29FC002132FD005A87FE005A87FE002131FC00010218085575B011A7E3F512B5 + F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5F7FF12B5 + F7FF12B5F7FF12B3F5FE0D81B1D80111174F0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000080A05 + 2F831D108BE22110A1FD1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0F9DFB1B0E + 82DC0C073D920000000E00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000060304395228 + 38D07B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE522838D00603043900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000010108361D108DE41F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1A0D82DC0100052D0000000000000000000000000000 + 00000000000000000000000000000000000000000000160A0F6C7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE160A0F6C000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000005160C6BC71F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF2817 + A2FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF190E7DD400000006000000000000 + 000000000000000000000000000000000000060304397B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE060304390000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000020009360200093600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000360000003600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000002010A3C1F0F9EFE1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF3A2BAAFFFEFE + FFFF9E97D5FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0F9FFE0100052D0000 + 000000000000000000000000000000000000522838D07B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE522838D00000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000031E1B007DC03000DBFE2E00C3FF2A00AFEF020009380000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000001E000000C0000000FE000000FE000000C00000001E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000010004261F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF5F53BAFF3D2E + ABFF3727A8FF483AB0FF675BBDFF9289CFFF7066C1FF1F0E9EFFB5AFDFFFFEFE + FFFFFEFEFFFF695EBEFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF0302 + 114E000000000000000000000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000D1200559E3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2200 + 94DA000001190000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000D0000009E000000FE000000FE000000FE000000FE000000FE000000FE0000 + 009E0000000D0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 01113426F1FE291AC7FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFFCBC7E8FFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFF3B2CAAFFFEFEFFFFFEFE + FFFFFEFEFFFF4739AFFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF010007320000000000000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00000000000000000000000000000000000000000000000000020B00337C3000 + DBFE3000DBFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2E00 + C3FF2E00C3FF19006EBC00000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000020000007C0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE0000007C00000002000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000032E22 + D5EF3426F1FE3426F1FE291AC6FF1F0E9EFF1F0E9EFF1F0E9EFF5548B6FFF2F1 + F9FFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFA29BD6FFFEFEFFFFFEFE + FFFFEFEEF8FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0F9EFE0000000500000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE98697CFEE1D2D8FFE1D2D8FFE1D2 + D8FFE1D2D8FFE1D2D8FFE1D2D8FFE1D2D8FFE1D2D8FFE0D1D7FFD7C4CCFFC1A3 + AFFF956477FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00000000000000000000000000000000000005001A593000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF0F0044930000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000059000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000590000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000C09397C3426 + F1FE3426F1FE3426F1FE6459F4FE5448D1FF1F0E9EFF1F0E9EFF2212A0FFA9A3 + DAFFEDEBF7FFFEFEFFFFFEFEFFFFFEFEFFFFA29BD7FFFEFEFFFFFEFEFFFFFEFE + FFFF5A4DB7FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF170C71CC00000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFF7F4F5FF956478FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000000000000002000B3A2700B5E73000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C1FD07002167000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000003A000000E7000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000E70000003A000000000000 + 000000000000000000000000000000000000000000000000000D3426F1FE3426 + F1FE3426F1FE3426F1FEF4F3FEFFFEFEFFFFCECBF2FF3E30ACFFD0CCEAFFFEFE + FFFFB5AFDFFFA7A1D9FFA7A0D9FFB6B0DFFF9D96D4FFFEFEFFFFFEFEFFFFA199 + D6FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF02010939000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFF956477FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000000000000010005273000DBFE3000DBFE5229E1FE8E74EBFE8E74EBFE552D + E1FE3000DBFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2E00 + C3FF5630CFFF8E74DFFF8E74DFFF4E26CCFF2E00C3FF2E00C3FF030010480000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000027000000FE000000FE000000FE000000C6000000C60000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000C6000000C6000000FE000000FE000000FE000000270000 + 00000000000000000000000000000000000000000000130E5B9C3426F1FE3426 + F1FE3426F1FE382AF1FEADA8FAFFEAE8FEFFFEFEFFFFADA6E8FFDFDCF1FFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFA098D6FF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1B0E84DD000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF81465EFE81465EFE81465EFE81465EFE81465EFE81475EFE8E596EFEC6AB + B5FFFEFEFEFFFEFEFEFFFEFEFEFFF2EBEEFF7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000000400144F3000DBFE3000DBFE461ADFFEFEFEFFFFFEFEFFFFDED6 + FAFF3000DBFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2E00 + C3FFE4DEF7FFFEFEFFFFFEFEFFFF4015C8FF2E00C3FF2E00C3FF0D0038860000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000004F000000FE000000FE000000FE00000009000000000000 + 0061000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000610000000000000009000000FE000000FE000000FE0000004F0000 + 000000000000000000000000000000000000000000013426F1FE3426F1FE3426 + F1FE3426F1FE7C73F5FEB2ADFAFFB1ABFAFF8981F6FEFEFEFFFF877DDEFFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFB1ABDDFFFEFEFFFF786EC5FF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF000000087B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FEC9AEB9FFFEFEFEFFFEFEFEFFFEFEFEFF81465EFE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00000000000009002D743000DBFE3000DBFE3000DBFECEC2F7FFFEFEFFFFFEFE + FFFF471CDFFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF4B22 + CBFFFEFEFFFFFEFEFFFFC8BBEFFF2E00C3FF2E00C3FF2E00C3FF170064B30000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000074000000FE000000FE000000FE0000007D000000000000 + 0003000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE00000003000000000000007D000000FE000000FE000000FE000000740000 + 00000000000000000000000000000000000002020C3B3426F1FE3426F1FE3426 + F1FE3426F1FEEEEDFEFFFEFEFFFFFEFEFFFFA8A2F8FEFEFEFFFFCFCCFCFFFEFE + FFFFFEFEFFFFFEFEFFFFE0DDF1FF8980CBFF7066C1FF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF0C073A8F7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE956478FEFEFEFEFFFEFEFEFFFEFEFEFF8F5B70FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000000000000110050993000DBFE3000DBFE3000DBFE5B34E2FEFEFEFFFFFEFE + FFFFAB97F1FF3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FFB19F + E8FFFEFEFFFFFEFEFFFF542ECEFF2E00C3FF2E00C3FF2E00C3FF21008ED60000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000099000000FE000000FE000000FE000000FE000000000000 + 0000000000A0000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00A00000000000000000000000FE000000FE000000FE000000FE000000990000 + 0000000000000000000000000000000000000F0C4A8D3426F1FE3426F1FE3426 + F1FE3426F1FE766CF5FE5F54F4FE9790F7FEA59FF7FEC6C2FCFFFEFEFFFFFEFE + FFFFFEFEFFFFE4E2F3FFE4E2F3FFB8B3E0FF8176C8FF4A3CB1FF21109FFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1D108AE27B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE956478FEFEFEFEFFFEFEFEFFFEFEFEFF854D64FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000001A0079BD3000DBFE3000DBFE3000DBFE3000DBFEE9E4FBFFFEFE + FFFFFEFEFFFFD3C8F8FFD3C8F8FFD3C8F8FFD2C8F2FFD2C8F2FFD2C8F2FFFEFE + FFFFFEFEFFFFE4DEF7FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2800AEEE0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000BD000000FE000000FE000000FE000000FE0000005A0000 + 00000000001A0000007300000073000000730000007300000073000000730000 + 001A000000000000005A000000FE000000FE000000FE000000FE000000BD0000 + 000000000000000000000000000000000000281DBADF3426F1FE3426F1FE3426 + F1FE3426F1FEE7E6FEFFFEFEFFFFFEFEFFFFBCB8FBFFB0AAFAFFFEFEFFFFFEFE + FFFFFEFEFFFFFEFEFFFFB6B1DFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFF5F4 + FAFFBEB9E3FF887ECBFF5043B3FF2212A0FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0F9DFB7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FECBB2BCFFFEFEFEFFFEFEFEFFFEFEFEFF7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000002500ADE23000DBFE3000DBFE3000DBFE3000DBFE7555E6FEFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFE + FFFFFEFEFFFF7050D6FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2D00C1FC0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000E2000000FE000000FE000000FE000000FE000000E70000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000E7000000FE000000FE000000FE000000FE000000E20000 + 0000000000000000000000000000000000003426F1FE3426F1FE3426F1FE3426 + F1FE3527F1FEFEFEFFFFFEFEFFFFE6E5FEFF9992F7FEC4BFFBFFFEFEFFFFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFABA4DAFFFEFEFFFFFEFEFFFFFEFEFFFFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFF8A81CCFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF8C576DFE8C576DFE8C576DFE8C576DFE8C576DFE8D586EFE97677BFECEB7 + C0FFFEFEFEFFFEFEFEFFFEFEFEFFBA9AA7FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000003000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFEFEFE + FFFFFEFEFFFFFEFEFFFFDBD3F9FFDBD3F9FFDBD3F5FFDBD3F5FFFEFEFFFFFEFE + FFFFFEFEFFFF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000FE000000FE000000FE000000FE000000FE000000FE0000 + 0038000000000000000A000000680000006800000068000000680000000A0000 + 000000000038000000FE000000FE000000FE000000FE000000FE000000FE0000 + 0000000000000000000000000000000000003426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FEFEFEFFFF847CF6FEBDB9FBFFBEB9FBFFFEFEFFFFE5E3FDFFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFE8E7F5FFC0BBE4FFFEFEFFFFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFF5C50B9FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFD1BBC3FF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000003000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE9178 + EBFEFEFEFFFFFEFEFFFF5B34E2FE3000DBFE2E00C3FF5934CFFFFEFEFFFFFEFE + FFFF8E73DEFF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00C50000000000000000000000FE000000FE000000FE000000FE000000000000 + 0000000000C5000000FE000000FE000000FE000000FE000000FE000000FE0000 + 0000000000000000000000000000000000003426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3F32F1FED9D6FDFFFEFEFFFFD4D1FCFFF5F5FEFFBAB5FBFFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFA7A0D9FFFEFE + FFFFFEFEFFFFFEFEFFFFFEFEFFFF3020A5FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFA27787FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000001123000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3607 + DCFEFEFEFFFFFEFEFFFFC6B9F6FF3000DBFE2E00C3FFC6B9EFFFFEFEFFFFFEFE + FFFF3305C4FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 000000000012000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE0000001D0000000000000082000000FE000000FE00000082000000000000 + 001D000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 0012000000000000000000000000000000003426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FEB7B2FBFFFEFEFFFFFEFEFFFF958EF7FEA9A4F8FEFEFEFFFFE2E0 + FDFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFDCD9 + F0FFCDC9E9FFFEFEFFFFFEFEFFFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF9E7283FE9E7283FE9E7283FE9E7283FE9E7283FEA27788FEC8AEB8FFFEFE + FEFFFEFEFEFFFEFEFEFF9E7283FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000002000A373000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFEAE9BF2FFFEFEFFFFFEFEFFFF3C0EDDFE3A0EC7FFFEFEFFFFFEFEFFFFAA97 + E7FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF0600 + 1E62000000000000000000000000000000000000000000000000000000000000 + 000000000037000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000A2000000000000000F000000FE000000FE0000000F000000000000 + 00A2000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 003700000000000000000000000000000000281DBADF3426F1FE3426F1FE3426 + F1FE3426F1FE827BF6FEFEFEFFFF746AF5FEFEFEFFFFFEFEFFFFB8B2FBFFFEFE + FFFFFDFDFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFE + FFFFFEFEFFFFA099D6FFD2CFECFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0F9DFB7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEA87F + 90FEFEFEFEFFFEFEFEFFFEFEFEFF7C3E56FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000006001C5C3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE4317DEFEFEFEFFFFFEFEFFFF9B83EEFF9A83E2FFFEFEFFFFFEFEFFFF4015 + C8FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF1000 + 4797000000000000000000000000000000000000000000000000000000000000 + 00000000005C000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE0000000A00000000000000B8000000B8000000000000000A0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 005C000000000000000000000000000000000F0C4A8D3426F1FE3426F1FE3426 + F1FE3426F1FE3A2CF1FE9F99F9FF8880F6FEFEFEFFFFFEFEFFFF8C83F6FEB3AE + FBFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFE + FFFFF7F7FCFF3F31ACFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF1D108AE27B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7C3D + 56FEFEFEFEFFFEFEFEFFFEFEFEFF9C6E80FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00000C0037803000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFECABDF6FFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFC8BBEFFF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF1A00 + 74C0000000000000000000000000000000000000000000000000000000000000 + 000000000080000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE0000007F000000000000003500000035000000000000007F0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00800000000000000000000000000000000002020C3B3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE3527F1FEFEFEFFFFFEFEFFFFFEFEFFFFA9A4FAFFFEFE + FFFFB5B0FAFFD1CEFCFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFF9F9FFFFADA7 + F8FE968FDEFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF0C073A8F7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7F43 + 5BFEFEFEFEFFFEFEFEFFFEFEFEFFAA8392FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000014005CA53000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFE5830E2FEFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFF542ECEFF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2400 + 9BDF000000000000000000000000000000000000000000000000000000000000 + 0000000000A5000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE00000000000000000000000000000000000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00A500000000000000000000000000000000000000013426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE3A2DF1FEFEFEFFFFFEFEFFFFE5E3FDFFBEBAFBFFFEFE + FFFFFEFEFFFF857EF6FEE2E0FDFFC5C1FCFFBAB6FBFF5145F3FEFEFEFFFFFEFE + FFFFFEFEFFFFD3D0F1FF2616A1FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1F0E9EFF000000087B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFF7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEC3A6 + B1FFFEFEFEFFFEFEFEFFFEFEFEFF9B6D7EFE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00001E008ACA3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFEE6E0FBFFFEFEFFFFFEFEFFFFE4DEF7FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2A00 + B6F4000000000000000000000000000000000000000000000000000000000000 + 0000000000CA000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE0000005C00000000000000000000005C000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00CA0000000000000000000000000000000000000000130E5B9C3426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE695FF4FEFEFEFFFFACA6FAFFD3D0FCFFFEFE + FFFFFEFEFFFFABA5FAFFFEFEFFFFFEFEFFFFFEFEFFFF8A82F6FEB1ACFAFFFEFE + FFFFFEFEFFFFFEFEFFFFF7F6FCFF3727A8FF1F0E9EFF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF1B0E84DD000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFE0D1D7FFE0D1D7FFE0D1D7FFE0D1D7FFE0D1D7FFE2D4D9FFFBFAFAFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFF7D3E57FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00002A00C0EE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFE7251E6FEFEFEFFFFFEFEFFFF7050D6FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00 + C3FE000000000000000000000000000000000000000000000000000000000000 + 0000000000EE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000EA0000000000000000000000EA000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00EE00000000000000000000000000000000000000000000000D3426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE8B83F6FE7066F5FEE9E7FEFFFEFE + FFFFFEFEFFFFD7D4FDFFBAB5FBFFFEFEFFFFFEFEFFFFFEFEFFFF3C2EF1FEFBFB + FFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFF4F42B3FF1F0E9EFF1F0E9EFF1F0E + 9EFF1F0E9EFF1F0E9EFF01010938000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFA27788FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 00003000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFE3000DBFEFEFEFFFFFEFEFFFF2E00C3FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00 + C3FF000000000000000000000000000000000000000000000000000000000000 + 0000000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000FE0000003A0000003A000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE0000000000000000000000000000000000000000000000000C09397C3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FEFDFCFFFFFEFE + FFFFFEFEFFFFFEFEFFFF766CF5FEFEFEFFFFFEFEFFFFFEFEFFFF9F99F9FF5A4F + F3FEFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFF7066C1FF1F0E9EFF1F0E + 9EFF1F0E9EFF170C71CC00000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FEAB8393FEFEFEFEFFFEFEFEFFFEFE + FEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFEFEFFFEFE + FEFFDAC8CFFF8D586EFE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000001180C003A832C00CAF43000DBFE3000DBFE3000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFE3000DBFE8D73EAFE8E73DEFF2E00C3FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C3FF2E00C5FF1C0077C30100 + 062E000000000000000000000000000000000000000000000000000000000000 + 00000000001800000083000000F4000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000C7000000C7000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000F4000000830000 + 0018000000000000000000000000000000000000000000000000000000032E22 + D7F03426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE6459F4FEFEFE + FFFFFEFEFFFFFEFEFFFF3F32F1FEFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFF4033 + F2FEA099F9FFFEFEFFFFFEFEFFFFFEFEFFFFFEFEFFFFFCFBFEFF2919A3FF1F0E + 9EFF1F0F9FFE0000000500000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7D3E57FE81465EFE81465EFE8146 + 5EFE81465EFE81465EFE81465EFE81465EFE81465EFE81465EFE7C3D56FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000000000000000000000000000001000529110050993000DBFE3000DBFE3000 + DBFE3000DBFE3000DBFE3000DBFE3505DCFE3305C4FF2E00C3FF2E00C3FF2E00 + C3FF2E00C3FF2E00C3FF2E00C3FF21008ED60400114B00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000002900000099000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000FE000000FE000000FE000000990000002900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 01113426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3729 + F1FE958EF7FEFEFEFFFF5D52F3FEEBEAFEFFFEFEFFFFFEFEFFFFFEFEFFFFB2AD + FAFF3426F1FEEDECFEFFFEFEFFFFFEFEFFFF9089F7FE3628F1FE2515B6FF1F0E + 9EFF010007320000000000000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 000000000000000000000000000000000000000000000000000002000D3E1700 + 68AF3000DBFE3000DBFE3000DBFE3000DBFE2E00C3FF2E00C3FF2E00C3FF2E00 + C3FF2600A3E60800256D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000003E0000 + 00AF000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 + 00FE000000AF0000003E00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000002183426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE392BF1FE7970F5FED9D6FDFFF8F7FFFFFEFEFFFFEAE9 + FEFF392BF1FE4C3FF2FE6358F4FE3426F1FE3426F1FE3426F1FE3426F1FE0201 + 0C3F000000000000000000000000000000007B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000002050017541D0084C53000DBFE2E00C3FF2A00B4F20E003D8C0000 + 0004000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000200000054000000C5000000FE000000FE000000C5000000540000 + 0002000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000031F291FC2E43426F1FE3426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE251BAED80000000D0000 + 000000000000000000000000000000000000522838D07B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE522838D00000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000A0000000A00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000A0000000A00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000A072F713426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE110C4F9200000001000000000000 + 000000000000000000000000000000000000060304397B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE060304390000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000117161068A73426F1FE3426 + F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426F1FE3426 + F1FE3426F1FE3426F1FE0F0B488B0000000D0000000000000000000000000000 + 00000000000000000000000000000000000000000000160A0F6C7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE160A0F6C000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000202 + 0C3A140F60A1281DBADF3023DFF43426F1FE3426F1FE3426F1FE211899CB100C + 4B8E050318510000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000060304395228 + 38D07B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C55FE7B3C + 55FE522838D00603043900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000080000000400000000100010000000000000400000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.pas b/Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.pas new file mode 100644 index 0000000..59d143e --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledButtonEditorUnit.pas @@ -0,0 +1,626 @@ +{******************************************************************************} +{ } +{ StyledButton Editor: Component editor for Styled Button } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledButtonEditorUnit; + +interface + +{$INCLUDE ..\Source\StyledComponents.inc} + +uses + Winapi.Windows, + Winapi.Messages, + System.SysUtils, + System.Variants, + System.Classes, + System.Actions, + Vcl.ActnList, + Vcl.ComCtrls, + Vcl.ExtCtrls, + Vcl.Controls, + Vcl.Forms, + Vcl.StdCtrls, + Vcl.StyledButton, + Vcl.ButtonStylesAttributes, + Vcl.StandardButtonStyles, + Vcl.BootstrapButtonStyles, + Vcl.AngularButtonStyles, + Vcl.ColorButtonStyles, + Vcl.ImgList; + +const + BUTTON_WIDTH = 100; + BUTTON_HEIGHT = 34; + BUTTON_MARGIN = 10; +type + TStyledButtonEditor = class(TForm) + BottomPanel: TPanel; + OKButton: TStyledButton; + ApplyButton: TStyledButton; + CancelButton: TStyledButton; + HelpButton: TStyledButton; + paTop: TPanel; + ActualGroupBox: TGroupBox; + NewGroupBox: TGroupBox; + SplitterTop: TSplitter; + SourceButton: TStyledGraphicButton; + DestButton: TStyledGraphicButton; + TabControl: TTabControl; + AttributesPanel: TPanel; + AttributesGroupBox: TGroupBox; + StyleDrawTypeLabel: TLabel; + EnabledCheckBox: TCheckBox; + StyleDrawTypeComboBox: TComboBox; + ImageList: TImageList; + ScrollBox: TScrollBox; + FlatButtonCheckBox: TCheckBox; + AsVCLComponentCheckBox: TCheckBox; + StyleLabel: TLabel; + StyleComboBox: TComboBox; + RoundedCornersGroupBox: TGroupBox; + TopRightCheckBox: TCheckBox; + TopLeftCheckBox: TCheckBox; + BottomLeftCheckBox: TCheckBox; + BottomRightCheckBox: TCheckBox; + CornerRadiusGroupBox: TGroupBox; + RadiusTrackBar: TTrackBar; + StyleRadiusLabel: TLabel; + procedure FormCreate(Sender: TObject); + procedure OKButtonClick(Sender: TObject); + procedure ApplyButtonClick(Sender: TObject); + procedure HelpButtonClick(Sender: TObject); + procedure FormShow(Sender: TObject); + procedure TabControlChange(Sender: TObject); + procedure paTopResize(Sender: TObject); + procedure StyleComboBoxSelect(Sender: TObject); + procedure EnabledCheckBoxClick(Sender: TObject); + procedure DestButtonClick(Sender: TObject); + procedure RadiusTrackBarChange(Sender: TObject); + procedure CheckBoxClick(Sender: TObject); + procedure AsVCLComponentCheckBoxClick(Sender: TObject); + procedure RoundedCheckBoxClick(Sender: TObject); + procedure TabControlGetImageIndex(Sender: TObject; TabIndex: Integer; + var ImageIndex: Integer); + private + FUpdating: Boolean; + FFamilyBuilt: TStyledButtonFamily; + FStyledButtonRender: TStyledButtonRender; + FStyledButton: TControl; + FCustomStyleDrawType: Boolean; + procedure BuildTabControls; + procedure BuildFamilyPreview(const AFamily: TStyledButtonFamily); + procedure BuildButtonsPreview(const AFamily: TStyledButtonFamily; + const AAppearance: TStyledButtonAppearance; const AFlowPanel: TFlowPanel); + procedure ApplyStyle; + procedure InitGUI; + procedure UpdateDestFromGUI; + procedure SelectButtonClick(Sender: TObject); + //procedure ButtonEnter(Sender: TObject); + procedure UpdateSizeGUI; + procedure FlowPanelResize(Sender: TObject); + function GetRoundedCorners: TRoundedCorners; + procedure SetRoundedCorners(const AValue: TRoundedCorners); + protected + procedure Loaded; override; + public + property CustomStyleDrawType: Boolean read FCustomStyleDrawType; + property RoundedCorners: TRoundedCorners read GetRoundedCorners write SetRoundedCorners; + end; + +function EditStyledButton(const AButton: TControl): Boolean; overload; +function EditStyledGraphicButton(const AButton: TCustomStyledGraphicButton): Boolean; overload; +function EditStyledButton(const AButton: TCustomStyledButton): Boolean; overload; +function EditStyledButtonRender(const AButtonRender: TStyledButtonRender): Boolean; overload; + +implementation + +{$R *.dfm} + +uses + Vcl.Themes + , Vcl.Graphics + //WARNING: you must define this directive to use this unit outside the IDE +{$IFNDEF UseStyledCompEditorsAtRunTime} + , ToolsAPI + , BrandingAPI + {$IF (CompilerVersion >= 32.0)}, IDETheme.Utils{$IFEND} +{$ENDIF} + , Winapi.ShellAPI + , System.Contnrs + , Vcl.StyledCmpStrUtils + , System.TypInfo + ; + +var + SavedBounds: TRect = (Left: 0; Top: 0; Right: 0; Bottom: 0); + +function EditStyledButton(const AButton: TControl): Boolean; +begin + if AButton is TCustomStyledGraphicButton then + Result := EditStyledGraphicButton(TCustomStyledGraphicButton(AButton)) + else if AButton is TCustomStyledButton then + Result := EditStyledButton(TCustomStyledButton(AButton)) + else + raise Exception.CreateFmt('Cannot Edit Control "%s"', [AButton.Name]); +end; + +function EditStyledGraphicButton(const AButton: TCustomStyledGraphicButton): Boolean; +begin + Result := EditStyledButtonRender(AButton.Render); +end; + +function EditStyledButton(const AButton: TCustomStyledButton): Boolean; +begin + Result := EditStyledButtonRender(AButton.Render); +end; + +function EditStyledButtonRender(const AButtonRender: TStyledButtonRender): Boolean; +var + LEditor: TStyledButtonEditor; +begin + LEditor := TStyledButtonEditor.Create(nil); + with LEditor do + begin + try + FStyledButtonRender := AButtonRender; + FStyledButton := FStyledButtonRender.OwnerControl; + paTop.Height := SourceButton.Top + AButtonRender.Height + SourceButton.Top; + AButtonRender.AssignStyleTo(SourceButton.Render); + SourceButton.Enabled := AButtonRender.Enabled; + SourceButton.Width := AButtonRender.Width; + SourceButton.Height := AButtonRender.Height; + SourceButton.Caption := AButtonRender.Caption; + SourceButton.Hint := AButtonRender.Hint; + + AButtonRender.AssignStyleTo(DestButton.Render); + DestButton.Enabled := AButtonRender.Enabled; + DestButton.Width := AButtonRender.Width; + DestButton.Height := AButtonRender.Height; + DestButton.Caption := AButtonRender.Caption; + DestButton.Hint := AButtonRender.Hint; + + Result := ShowModal = mrOk; + SavedBounds := BoundsRect; + finally + Free; + end; + end; +end; + +{ TStyledButtonEditorForm } + +procedure TStyledButtonEditor.SelectButtonClick(Sender: TObject); +var + LStyledButton: TStyledGraphicButton; +begin + LStyledButton := Sender as TStyledGraphicButton; + FCustomStyleDrawType := False; + LStyledButton.Render.SetCustomStyleDrawType(FCustomStyleDrawType); + LStyledButton.AssignStyleTo(DestButton.Render); + StyleDrawTypeComboBox.ItemIndex := Ord(LStyledButton.StyleDrawType); + StyleComboBox.ItemIndex := Ord(LStyledButton.Style); + AsVCLComponentCheckBox.Checked := LStyledButton.AsVCLComponent; + UpdateDestFromGUI; +end; + +(* +procedure TStyledButtonEditor.ButtonEnter(Sender: TObject); +begin + SelectButtonClick(Sender); +end; +*) + +procedure TStyledButtonEditor.ApplyStyle; +begin + Screen.Cursor := crHourglass; + try + DestButton.Render.SetCustomStyleDrawType(FCustomStyleDrawType); + DestButton.AssignStyleTo(FStyledButtonRender); + FStyledButton.Enabled := DestButton.Enabled; + finally + Screen.Cursor := crDefault; + end; +end; + +procedure TStyledButtonEditor.AsVCLComponentCheckBoxClick(Sender: TObject); +begin + if AsVCLComponentCheckBox.Checked then + begin + TabControl.TabIndex := 0; + TabControlChange(TabControl); + end; + UpdateDestFromGUI; +end; + +procedure TStyledButtonEditor.ApplyButtonClick(Sender: TObject); +begin + ApplyStyle; + UpdateDestFromGUI; +end; + +procedure TStyledButtonEditor.BuildFamilyPreview( + const AFamily: TStyledButtonFamily); +var + I: Integer; + LAppearances: TButtonAppearances; + LAppearance: TStyledButtonAppearance; + LGroupBox: TGroupBox; + LFlowPanel: TFlowPanel; + LGroupBoxHeight: Integer; +begin + //Clear components + while ScrollBox.ControlCount > 0 do + begin + LGroupBox := ScrollBox.Controls[0] as TGroupBox; + while LGroupBox.ControlCount > 0 do + LGroupBox.Controls[0].Free; + LGroupBox.Free; + end; + //Build a GroupBox for any Appearance + LAppearances := GetButtonFamilyAppearances(AFamily); + LGroupBoxHeight := BUTTON_HEIGHT + BUTTON_MARGIN; + for I := 0 to Length(LAppearances)-1 do + begin + LAppearance := LAppearances[I]; + LGroupBox := TGroupBox.Create(Self); + LGroupBox.AlignWithMargins := True; + LGroupBox.Caption := LAppearances[I]; + LGroupBox.Parent := ScrollBox; + LGroupBox.Top := LGroupBoxHeight * (I); + LGroupBox.Align := alTop; + LGroupBox.Caption := + Format('StyleFamily: "%s" - StyleAppearance: "%s": List of StyleClass', + [AFamily, LAppearance]); + + //Create a FlowPanel inside the GroupBox + LFlowPanel := TFlowPanel.Create(Self); + LFlowPanel.AlignWithMargins := True; + LFlowPanel.Margins.Top := 6; + LFlowPanel.Margins.Bottom := 6; + LFlowPanel.Align := alTop; + LFlowPanel.AutoSize := True; + LFlowPanel.BevelOuter := bvNone; + LFlowPanel.OnResize := FlowPanelResize; + LFlowPanel.DoubleBuffered := True; + LFlowPanel.Parent := LGroupBox; + + BuildButtonsPreview(AFamily, LAppearance, LFlowPanel); + end; + FFamilyBuilt := AFamily; +end; + +procedure TStyledButtonEditor.BuildTabControls; +var + LFamilies: TObjectList; + LFamily: TStyledButtonFamily; + I: Integer; +begin + TabControl.Tabs.Clear; + LFamilies := GetButtonFamilies; + if Assigned(LFamilies) then + begin + for I := 0 to LFamilies.Count -1 do + begin + LFamily := GetButtonFamilyName(I); + TabControl.Tabs.Add(LFamily); + if SameText(LFamily, FStyledButtonRender.StyleFamily) then + TabControl.TabIndex := I; + end; + end; + TabControlChange(TabControl); +end; + +procedure TStyledButtonEditor.DestButtonClick(Sender: TObject); +begin + ; //Do nothing +end; + +procedure TStyledButtonEditor.EnabledCheckBoxClick(Sender: TObject); +begin + UpdateDestFromGUI; +end; + +procedure TStyledButtonEditor.FormCreate(Sender: TObject); +{$IFNDEF UseStyledCompEditorsAtRunTime} + {$IF (CompilerVersion >= 32.0)} + var + LStyle: TCustomStyleServices; + {$IFEND} +{$ENDIF} +begin +{$IFNDEF UseStyledCompEditorsAtRunTime} + {$IF (CompilerVersion >= 32.0)} + {$IF (CompilerVersion <= 34.0)} + if UseThemeFont then + Self.Font.Assign(GetThemeFont); + {$IFEND} + {$IF CompilerVersion > 34.0} + if TIDEThemeMetrics.Font.Enabled then + Self.Font.Assign(TIDEThemeMetrics.Font.GetFont); + {$IFEND} + + if ThemeProperties <> nil then + begin + LStyle := ThemeProperties.StyleServices; + StyleElements := StyleElements - [seClient]; + Color := LStyle.GetSystemColor(clWindow); + BottomPanel.StyleElements := BottomPanel.StyleElements - [seClient]; + BottomPanel.ParentBackground := False; + BottomPanel.Color := LStyle.GetSystemColor(clBtnFace); + + OKButton.StyleClass := LStyle.Name; + CancelButton.StyleClass := LStyle.Name; + ApplyButton.StyleClass := LStyle.Name; + HelpButton.StyleClass := LStyle.Name; + + IDEThemeManager.RegisterFormClass(TStyledButtonEditor); + ThemeProperties.ApplyTheme(Self); + end; + {$IFEND} +{$ENDIF} +end; + +procedure TStyledButtonEditor.InitGUI; +var + I: TStyledButtonDrawType; + J: TCustomButton.TButtonStyle; + LPos: Integer; + LDrawName, LStyleName: string; +begin + TabControl.OnChange := nil; + try + Caption := Format(Caption, [StyledButtonsVersion]); + for I := Low(TStyledButtonDrawType) to High(TStyledButtonDrawType) do + begin + LDrawName := GetEnumName(TypeInfo(TStyledButtonDrawType), Ord(I)); + LPos := StyleDrawTypeComboBox.Items.Add(LDrawName); + if I = SourceButton.StyleDrawType then + StyleDrawTypeComboBox.ItemIndex := LPos; + end; + + AsVCLComponentCheckBox.Checked := SourceButton.AsVCLComponent; + for J := Low(TCustomButton.TButtonStyle) to High(TCustomButton.TButtonStyle) do + begin + LStyleName := GetEnumName(TypeInfo(TCustomButton.TButtonStyle), Ord(J)); + LPos := StyleComboBox.Items.Add(LStyleName); + if J = SourceButton.Style then + StyleComboBox.ItemIndex := LPos; + end; + + EnabledCheckBox.Checked := SourceButton.Enabled; + AsVCLComponentCheckBox.Checked := SourceButton.AsVCLComponent; + RadiusTrackBar.Position := SourceButton.StyleRadius; + RoundedCorners := SourceButton.StyleRoundedCorners; + FlatButtonCheckBox.Checked := SourceButton.Flat; + + + UpdateDestFromGUI; + finally + TabControl.OnChange := TabControlChange; + end; + BuildTabControls; +end; + +procedure TStyledButtonEditor.UpdateSizeGUI; +begin + FUpdating := True; + try + Screen.Cursor := crHourGlass; + InitGUI; + finally + FUpdating := False; + Screen.Cursor := crDefault; + end; +end; + +procedure TStyledButtonEditor.FormShow(Sender: TObject); +begin + UpdateSizeGUI; + + if SavedBounds.Right - SavedBounds.Left > 0 then + SetBounds(SavedBounds.Left, SavedBounds.Top, SavedBounds.Width, SavedBounds.Height); +end; + +function TStyledButtonEditor.GetRoundedCorners: TRoundedCorners; +begin + Result := []; + if TopLeftCheckBox.Checked then + Result := Result + [TRoundedCorner.rcTopLeft]; + if TopRightCheckBox.Checked then + Result := Result + [TRoundedCorner.rcTopRight]; + if BottomRightCheckBox.Checked then + Result := Result + [TRoundedCorner.rcBottomRight]; + if BottomLeftCheckBox.Checked then + Result := Result + [TRoundedCorner.rcBottomLeft]; +end; + +procedure TStyledButtonEditor.SetRoundedCorners(const AValue: TRoundedCorners); +begin + TopLeftCheckBox.Checked := TRoundedCorner.rcTopLeft in AValue; + TopRightCheckBox.Checked := TRoundedCorner.rcTopRight in AValue; + BottomRightCheckBox.Checked := TRoundedCorner.rcBottomRight in AValue; + BottomLeftCheckBox.Checked := TRoundedCorner.rcBottomLeft in AValue; +end; + +procedure TStyledButtonEditor.HelpButtonClick(Sender: TObject); +begin + ShellExecute(handle, 'open', + PChar(GetProjectWikiURL), nil, nil, SW_SHOWNORMAL) +end; + +procedure TStyledButtonEditor.Loaded; +begin + inherited; +end; + +procedure TStyledButtonEditor.OKButtonClick(Sender: TObject); +begin + ApplyStyle; +end; + +procedure TStyledButtonEditor.paTopResize(Sender: TObject); +begin + ActualGroupBox.Width := paTop.Width div 2; +end; + +procedure TStyledButtonEditor.RadiusTrackBarChange(Sender: TObject); +begin + DestButton.StyleRadius := RadiusTrackBar.Position; + DestButton.StyleRoundedCorners := RoundedCorners; + UpdateDestFromGUI; + FFamilyBuilt := ''; + TabControlChange(TabControl); +end; + +procedure TStyledButtonEditor.RoundedCheckBoxClick(Sender: TObject); +begin + UpdateDestFromGUI; + FFamilyBuilt := ''; + TabControlChange(TabControl); +end; + +procedure TStyledButtonEditor.StyleComboBoxSelect(Sender: TObject); +begin + FCustomStyleDrawType := True; + UpdateDestFromGUI; + FFamilyBuilt := ''; + TabControlChange(TabControl); +end; + +procedure TStyledButtonEditor.TabControlChange(Sender: TObject); +var + LFamily: TStyledButtonFamily; +begin + LFamily := TabControl.Tabs[TabControl.TabIndex]; + if FFamilyBuilt <> LFamily then + BuildFamilyPreview(LFamily); +end; + +procedure TStyledButtonEditor.TabControlGetImageIndex(Sender: TObject; + TabIndex: Integer; var ImageIndex: Integer); +begin + //Use always Image n.6 for custom Families + if TabIndex <= 5 then + ImageIndex := TabIndex + else + ImageIndex := 6; +end; + +procedure TStyledButtonEditor.UpdateDestFromGUI; +begin + DestButton.Style := TCustomButton.TButtonStyle(StyleComboBox.ItemIndex); + DestButton.StyleDrawType := TStyledButtonDrawType(StyleDrawTypeComboBox.ItemIndex); + DestButton.StyleRadius := RadiusTrackBar.Position; + CornerRadiusGroupBox.Visible := DestButton.StyleDrawType = btRoundRect; + RoundedCornersGroupBox.Visible := DestButton.StyleDrawType in [btRoundRect, btRounded]; + DestButton.StyleRoundedCorners := RoundedCorners; + DestButton.Enabled := EnabledCheckBox.Checked; + SourceButton.Hint := ActualGroupBox.Caption; + DestButton.Hint := NewGroupBox.Caption; + DestButton.Flat := FlatButtonCheckBox.Checked; + DestButton.AsVCLComponent := AsVCLComponentCheckBox.Checked; + + StyleRadiusLabel.Caption := Format('StyleRadius: %d', [DestButton.StyleRadius]); + ActualGroupBox.Caption := Format('ACTUAL: %s/%s/%s', + [SourceButton.StyleFamily, SourceButton.StyleClass, SourceButton.StyleAppearance]); + NewGroupBox.Caption := Format('NEW: %s/%s/%s', + [DestButton.StyleFamily, DestButton.StyleClass, DestButton.StyleAppearance]); +end; + +procedure TStyledButtonEditor.BuildButtonsPreview( + const AFamily: TStyledButtonFamily; + const AAppearance: TStyledButtonAppearance; + const AFlowPanel: TFlowPanel); +var + J: Integer; + LClasses: TButtonClasses; + LDefaultClass: TStyledButtonClass; + + function NormalizedName(const AName: string): string; + begin + Result := StringReplace(AName,' ','_',[rfReplaceAll]); + Result := StringReplace(Result,'-','_',[rfReplaceAll]); + end; + + procedure CreateButton( + const AParent: TFlowPanel; + const AClass: TStyledButtonClass); + var + LStyledButton: TStyledGraphicButton; + begin + LStyledButton := TStyledGraphicButton.Create(Self); + LStyledButton.Width := BUTTON_WIDTH; + LStyledButton.Height := BUTTON_HEIGHT; + LStyledButton.AlignWithMargins := True; + LStyledButton.Caption := AClass; + LStyledButton.Hint := Format('StyleFamily: "%s" - StyleClass: "%s" - StyleAppearance: "%s"', + [AFamily, AClass, AAppearance]); + LStyledButton.StyleFamily := AFamily; + LStyledButton.StyleClass := AClass; + LStyledButton.StyleAppearance := AAppearance; + LStyledButton.OnClick := SelectButtonClick; + //LStyledButton.OnEnter := ButtonEnter; + LStyledButton.Style := TCustomButton.TButtonStyle(StyleComboBox.ItemIndex); + LStyledButton.StyleDrawType := TStyledButtonDrawType(StyleDrawTypeComboBox.ItemIndex); + LStyledButton.StyleRadius := RadiusTrackBar.Position; + LStyledButton.StyleRoundedCorners := RoundedCorners; + LStyledButton.AsVCLComponent := False; + LStyledButton.Parent := AParent; + end; + +begin + if AFlowPanel.ControlCount > 0 then + Exit; + + Screen.Cursor := crHourGlass; + Try + AFlowPanel.OnResize := nil; + AFlowPanel.DisableAlign; + + LClasses := GetButtonFamilyClasses(AFamily); + LDefaultClass := LClasses[0]; + + //Build Buttons for Family/Class/Appearance + for J := 0 to Length(LClasses)-1 do + CreateButton(AFlowPanel, LClasses[J]); + Finally + AFlowPanel.OnResize := FlowPanelResize; + AFlowPanel.EnableAlign; + Screen.Cursor := crDefault; + End; +end; + +procedure TStyledButtonEditor.CheckBoxClick(Sender: TObject); +begin + UpdateDestFromGUI; +end; + +procedure TStyledButtonEditor.FlowPanelResize(Sender: TObject); +begin + TFlowPanel(Sender).Parent.Height := TFlowPanel(Sender).Height + + SourceButton.Top; +end; + +end. diff --git a/Ext/StyledComponents/packages/Vcl.StyledComponentsRegister.pas b/Ext/StyledComponents/packages/Vcl.StyledComponentsRegister.pas new file mode 100644 index 0000000..f53e473 --- /dev/null +++ b/Ext/StyledComponents/packages/Vcl.StyledComponentsRegister.pas @@ -0,0 +1,1004 @@ +{******************************************************************************} +{ } +{ StyledComponents: a set of Styled VCL Component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledComponentsRegister; + +interface + +{$INCLUDE ..\Source\StyledComponents.inc} + +uses + Classes + , DesignIntf + , Designer + , DesignEditors + , VCLEditors + , Vcl.ImgList + , Vcl.Graphics + , Vcl.Controls + , Vcl.ComCtrls + , System.Types + , Vcl.StyledButton + , Vcl.StyledToolbar + , Vcl.StyledDbNavigator + , Vcl.StyledButtonGroup + , Vcl.StyledCategoryButtons + , Vcl.ButtonStylesAttributes + , Vcl.StyledTaskDialog + ; + +Type + TStyledFamilyPropertyEditor = class(TStringProperty) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TStyledClassPropertyEditor = class(TStringProperty) + protected + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TStyledAppearancePropertyEditor = class(TStringProperty) + protected + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + end; + + TStyledButtonComponentEditor = class(TComponentEditor) + private + function GetButton: TControl; + public + function GetVerbCount: Integer; override; + function GetVerb(Index: Integer): string; override; + procedure ExecuteVerb(Index: Integer); override; + procedure Edit; override; + end; + + TStyledToolbarComponentEditor = class(TComponentEditor) + private + function GetToolbar: TStyledToolbar; + public + function GetVerbCount: Integer; override; + function GetVerb(Index: Integer): string; override; + procedure ExecuteVerb(Index: Integer); override; + end; + + TStyledNavigatorComponentEditor = class(TComponentEditor) + private + function GetDbNavigator: TCustomStyledDbNavigator; + public + function GetVerbCount: Integer; override; + function GetVerb(Index: Integer): string; override; + procedure ExecuteVerb(Index: Integer); override; + end; + + TStyledButtonGroupComponentEditor = class(TComponentEditor) + private + function GetButtonGroup: TStyledButtonGroup; + public + function GetVerbCount: Integer; override; + function GetVerb(Index: Integer): string; override; + procedure ExecuteVerb(Index: Integer); override; + end; + + TStyledCategoryButtonsComponentEditor = class(TComponentEditor) + private + function GetCategoryButtons: TStyledCategoryButtons; + public + function GetVerbCount: Integer; override; + function GetVerb(Index: Integer): string; override; + procedure ExecuteVerb(Index: Integer); override; + end; + + TStyledTaskDialogComponentEditor = class(TComponentEditor) + private + function GetTaskDialog: TStyledTaskDialog; + public + function GetVerbCount: Integer; override; + function GetVerb(Index: Integer): string; override; + procedure ExecuteVerb(Index: Integer); override; + end; + + TStyledComponentSelection = class (TSelectionEditor, ISelectionEditor) + public + procedure RequiresUnits(Proc: TGetStrProc); override; + end; + + TImageIndexPropertyEditor = class(TIntegerProperty, ICustomPropertyListDrawing) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function GetImageListAt(Index: Integer): TCustomImageList; virtual; + // ICustomPropertyListDrawing + procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas; + var AHeight: Integer); + procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas; + var AWidth: Integer); + procedure ListDrawValue(const Value: string; ACanvas: TCanvas; + const ARect: TRect; ASelected: Boolean); + end; + + {$IFDEF D10_4} + TImageNamePropertyEditor = class(TStringProperty, ICustomPropertyListDrawing) + public + function GetAttributes: TPropertyAttributes; override; + procedure GetValues(Proc: TGetStrProc); override; + function GetImageListAt(Index: Integer): TCustomImageList; virtual; + // ICustomPropertyListDrawing + procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas; + var AHeight: Integer); + procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas; + var AWidth: Integer); + procedure ListDrawValue(const Value: string; ACanvas: TCanvas; + const ARect: TRect; ASelected: Boolean); + end; + {$ENDIF} + +procedure Register; + +implementation + +uses + Vcl.StandardButtonStyles + , Vcl.BootstrapButtonStyles + , Vcl.AngularButtonStyles + , Vcl.StyledButtonEditorUnit + , Vcl.StyledCmpStrUtils + , Vcl.DbCtrls + , Vcl.ButtonGroup + , Vcl.CategoryButtons + , System.SysUtils + , System.Contnrs + , System.UITypes + , Winapi.ShellAPI + , Winapi.Windows + ; + + +function GetComponentFamilyClass(const AComponent: TPersistent; + out AButtonFamily: TButtonFamily): boolean; +var + LFamily: TStyledButtonFamily; +begin + LFamily := ''; + if AComponent is TCustomStyledGraphicButton then + LFamily := TCustomStyledGraphicButton(AComponent).StyleFamily + else if AComponent is TCustomStyledButton then + LFamily := TCustomStyledButton(AComponent).StyleFamily + else if AComponent is TStyledToolbar then + LFamily := TStyledToolbar(AComponent).StyleFamily + else if AComponent is TStyledToolButton then + LFamily := TStyledToolButton(AComponent).StyleFamily + else if AComponent is TCustomStyledDbNavigator then + LFamily := TCustomStyledDbNavigator(AComponent).StyleFamily + else if AComponent is TStyledButtonGroup then + LFamily := TStyledButtonGroup(AComponent).StyleFamily + else if AComponent is TStyledGrpButtonItem then + LFamily := TStyledGrpButtonItem(AComponent).StyleFamily + else if AComponent is TStyledCategoryButtons then + LFamily := TStyledCategoryButtons(AComponent).StyleFamily + else if AComponent is TStyledButtonItem then + LFamily := TStyledButtonItem(AComponent).StyleFamily; + if LFamily <> '' then + begin + Result := True; + AButtonFamily := GetButtonFamilyClass(LFamily); + end + else + begin + AButtonFamily := nil; + Result := False; + end; + +end; + +{ TStyledFamilyPropertyEditor } + +function TStyledFamilyPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList, paMultiSelect]; +end; + +procedure TStyledFamilyPropertyEditor.GetValues(Proc: TGetStrProc); +var + LFamilies: TObjectList; + I: Integer; +begin + LFamilies := GetButtonFamilies; + if Assigned(LFamilies) then + begin + for I := 0 to LFamilies.Count -1 do + Proc(GetButtonFamilyName(I)); + end; +end; + + +{ TStyledClassPropertyEditor } + +function TStyledClassPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList, paMultiSelect]; +end; + +procedure TStyledClassPropertyEditor.GetValues(Proc: TGetStrProc); +var + LClasses: TButtonClasses; + I: Integer; + LFamilyClass: TButtonFamily; +begin + if GetComponentFamilyClass(GetComponent(0), LFamilyClass) then + begin + LClasses := GetButtonClasses(LFamilyClass); + if Assigned(LClasses) then + begin + for I := Low(LClasses) to High(LClasses) do + Proc(LClasses[I]); + end; + end; +end; + +{ TStyledAppearancePropertyEditor } + +function TStyledAppearancePropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paValueList, paMultiSelect]; +end; + +procedure TStyledAppearancePropertyEditor.GetValues(Proc: TGetStrProc); +var + LAppearances: TButtonAppearances; + I: Integer; + LFamilyClass: TButtonFamily; +begin + if GetComponentFamilyClass(GetComponent(0), LFamilyClass) then + begin + LAppearances := GetButtonAppearances(LFamilyClass); + if Assigned(LAppearances) then + begin + for I := Low(LAppearances) to High(LAppearances) do + Proc(LAppearances[I]); + end; + end; +end; + +{ TStyledButtonComponentEditor } + +function TStyledButtonComponentEditor.GetButton: TControl; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent; + if LComponent is TCustomStyledGraphicButton then + Result := TCustomStyledGraphicButton(LComponent) + else if LComponent is TCustomStyledButton then + Result := TCustomStyledButton(LComponent); +end; + +procedure TStyledButtonComponentEditor.Edit; +begin + inherited; +end; + +procedure TStyledButtonComponentEditor.ExecuteVerb(Index: Integer); +begin + inherited; + if Index = 0 then + begin + if EditStyledButton(GetButton) then + Designer.Modified; + end + else if Index = 1 then + ShellExecute(0, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL); +end; + +function TStyledButtonComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Styled Button Editor...' + else if Index = 1 then + Result := 'Project page on GitHub...'; +end; + +function TStyledButtonComponentEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +{ TStyledComponentSelection } +procedure TStyledComponentSelection.RequiresUnits(Proc: TGetStrProc); +begin + inherited RequiresUnits(Proc); + Proc('Vcl.ButtonStylesAttributes'); +end; + +{ TStyledToolbarComponentEditor } + +procedure TStyledToolbarComponentEditor.ExecuteVerb(Index: Integer); +var + LToolbar: TStyledToolbar; + LNewButton: TStyledToolButton; +begin + inherited; + if Index = 0 then //Show Styled Toolbar Editor... + begin + LToolbar := GetToolbar; + LNewButton := TStyledToolButton.CreateStyled(LToolbar.Owner, + LToolbar.StyleFamily, LToolbar.StyleClass, LToolbar.StyleAppearance); + try + LNewButton.StyleDrawType := LToolbar.StyleDrawType; + LNewButton.StyleRadius := LToolbar.StyleRadius; + LNewButton.SetBounds(0, 0, LToolbar.ButtonWidth, LToolbar.ButtonHeight); + if LToolbar.ShowCaptions then + begin + LNewButton.Name := Designer.UniqueName('Button'); + LNewButton.Caption := 'Button'; + end; + if EditStyledButton(LNewButton) then + begin + LToolbar.SetToolbarStyle(LNewButton.StyleFamily, + LNewButton.StyleClass, LNewButton.StyleAppearance); + LToolbar.StyleRadius := LNewButton.StyleRadius; + LToolbar.StyleDrawType := LNewButton.StyleDrawType; + Designer.Modified; + end; + finally + LNewButton.Free; + end; + end + else if Index = 1 then //Add a StyledToolButton + begin + LToolbar := GetToolbar; + if LToolbar.NewButton(LNewButton, tbsButton) then + begin + //Set unique Name to the Button created + LNewButton.Name := Designer.UniqueName('StyledToolButton'); + LNewButton.Caption := LNewButton.Name; + + //Select the button into Designer + Designer.SelectComponent(LNewButton); + Designer.Modified; + end; + end + else if Index = 2 then //Add a StyledToolButton as Separator + begin + if GetToolbar.NewButton(LNewButton, tbsSeparator) then + begin + //Set unique Name to the Button created + LNewButton.Name := Designer.UniqueName('StyledToolButton'); + LNewButton.Caption := LNewButton.Name; + //Select the button into Designer + Designer.SelectComponent(LNewButton); + Designer.Modified; + end; + end + else if Index = 3 then //Open Project page on GitHub... + ShellExecute(0, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL); +end; + +function TStyledToolbarComponentEditor.GetToolbar: TStyledToolbar; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent; + if LComponent is TStyledToolbar then + Result := TStyledToolbar(LComponent); +end; + +function TStyledToolbarComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Styled Toolbar Editor...' + else if Index = 1 then + Result := 'Add StyledToolbar Button' + else if Index = 2 then + Result := 'Add StyledToolbar Separator' + else if Index = 3 then + Result := 'Project page on GitHub...'; +end; + +function TStyledToolbarComponentEditor.GetVerbCount: Integer; +begin + Result := 4; +end; + +{ TStyledNavigatorComponentEditor } + +procedure TStyledNavigatorComponentEditor.ExecuteVerb(Index: Integer); +var + LDbNavigator: TCustomStyledDbNavigator; + LNavButton: TStyledNavButton; +begin + inherited; + if Index = 0 then + begin + LDbNavigator := GetDbNavigator; + LNavButton := TStyledNavButton.CreateStyled(LDbNavigator, + LDbNavigator.StyleFamily, LDbNavigator.StyleClass, LDbNavigator.StyleAppearance, + LDbNavigator.StyleDrawType, LDbNavigator.Cursor, False); + try + LNavButton.StyleDrawType := LDbNavigator.StyleDrawType; + LNavButton.StyleRadius := LDbNavigator.StyleRadius; + LNavButton.SetBounds(0, 0, LDbNavigator.ButtonWidth, LDbNavigator.ButtonHeight); + if LDbNavigator.ShowCaptions then + begin + LNavButton.Name := Designer.UniqueName('Button'); + LNavButton.Caption := 'Button'; + end; + if EditStyledButton(LNavButton) then + begin + LDbNavigator.SetDbNavigatorStyle(LNavButton.StyleFamily, + LNavButton.StyleClass, LNavButton.StyleAppearance); + LDbNavigator.StyleRadius := LNavButton.StyleRadius; + LDbNavigator.StyleDrawType := LNavButton.StyleDrawType; + Designer.Modified; + end; + finally + LNavButton.Free; + end; + end + else if Index = 1 then + ShellExecute(0, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL); +end; + +function TStyledNavigatorComponentEditor.GetDbNavigator: TCustomStyledDbNavigator; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent; + if LComponent is TCustomStyledDbNavigator then + Result := TCustomStyledDbNavigator(LComponent); +end; + +function TStyledNavigatorComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Styled DbNavigator Editor...' + else if Index = 1 then + Result := 'Project page on GitHub...'; +end; + +function TStyledNavigatorComponentEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +{ TStyledButtonGroupComponentEditor } + +procedure TStyledButtonGroupComponentEditor.ExecuteVerb(Index: Integer); +var + LButtonGroup: TStyledbuttonGroup; + LButton: TStyledButton; + LButtonWidth: Integer; +begin + if Index = 0 then + begin + LButtonGroup := GetButtonGroup; + LButton := TStyledButton.CreateStyled(LButtonGroup, + LButtonGroup.StyleFamily, LButtonGroup.StyleClass, LButtonGroup.StyleAppearance, + LButtonGroup.StyleDrawType, LButtonGroup.ButtonsCursor, False); + try + LButton.StyleRadius := LButtonGroup.StyleRadius; + LButton.StyleRoundedCorners := LButtonGroup.StyleRoundedCorners; + LButton.StyleDrawType := LButtonGroup.StyleDrawType; + if gboFullSize in LButtonGroup.ButtonOptions then + LButtonWidth := LButtonGroup.Width + else + LButtonWidth := LButtonGroup.ButtonWidth; + LButton.SetBounds(0, 0, LButtonWidth, LButtonGroup.ButtonHeight); + if gboShowCaptions in LButtonGroup.ButtonOptions then + begin + LButton.Name := Designer.UniqueName('Button'); + LButton.Caption := 'Button'; + end; + if EditStyledButton(LButton) then + begin + LButtonGroup.SetButtonGroupStyle(LButton.StyleFamily, + LButton.StyleClass, LButton.StyleAppearance); + LButtonGroup.StyleRadius := LButton.StyleRadius; + LButtonGroup.StyleRoundedCorners := LButton.StyleRoundedCorners; + LButtonGroup.StyleDrawType := LButton.StyleDrawType; + LButtonGroup.Invalidate; + Designer.Modified; + end; + finally + LButton.Free; + end; + end + else if Index = 1 then + ShellExecute(0, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL); +end; + +function TStyledButtonGroupComponentEditor.GetButtonGroup: TStyledButtonGroup; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent; + if LComponent is TStyledButtonGroup then + Result := TStyledButtonGroup(LComponent); +end; + +function TStyledButtonGroupComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Styled ButtonGroup Editor...' + else if Index = 1 then + Result := 'Project page on GitHub...'; +end; + +function TStyledButtonGroupComponentEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +{ TStyledCategoryButtonsComponentEditor } + +procedure TStyledCategoryButtonsComponentEditor.ExecuteVerb(Index: Integer); +var + LCategoryButtons: TStyledCategoryButtons; + LButton: TStyledButton; + LButtonWidth: Integer; +begin + if Index = 0 then + begin + LCategoryButtons := GetCategoryButtons; + LButton := TStyledButton.CreateStyled(LCategoryButtons, + LCategoryButtons.StyleFamily, LCategoryButtons.StyleClass, LCategoryButtons.StyleAppearance, + LCategoryButtons.StyleDrawType, LCategoryButtons.ButtonsCursor, False); + try + LButton.StyleRadius := LCategoryButtons.StyleRadius; + LButton.StyleRoundedCorners := LCategoryButtons.StyleRoundedCorners; + LButton.StyleDrawType := LCategoryButtons.StyleDrawType; + if boFullSize in LCategoryButtons.ButtonOptions then + LButtonWidth := LCategoryButtons.Width + else + LButtonWidth := LCategoryButtons.ButtonWidth; + LButton.SetBounds(0, 0, LButtonWidth, LCategoryButtons.ButtonHeight); + if boShowCaptions in LCategoryButtons.ButtonOptions then + begin + LButton.Name := Designer.UniqueName('Button'); + LButton.Caption := 'Button'; + end; + if EditStyledButton(LButton) then + begin + LCategoryButtons.SetCategoryButtonsStyle(LButton.StyleFamily, + LButton.StyleClass, LButton.StyleAppearance); + LCategoryButtons.StyleRadius := LButton.StyleRadius; + LCategoryButtons.StyleRoundedCorners := LButton.StyleRoundedCorners; + LCategoryButtons.StyleDrawType := LButton.StyleDrawType; + LCategoryButtons.Invalidate; + Designer.Modified; + end; + finally + LButton.Free; + end; + end + else if Index = 1 then + ShellExecute(0, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL); +end; + +function TStyledCategoryButtonsComponentEditor.GetCategoryButtons: TStyledCategoryButtons; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent; + if LComponent is TStyledCategoryButtons then + Result := TStyledCategoryButtons(LComponent); +end; + +function TStyledCategoryButtonsComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Styled CategoryButtons Editor...' + else if Index = 1 then + Result := 'Project page on GitHub...'; +end; + +function TStyledCategoryButtonsComponentEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +{ TStyledTaskDialogComponentEditor } + +procedure TStyledTaskDialogComponentEditor.ExecuteVerb(Index: Integer); +var + LTaskDialog: TStyledTaskDialog; +begin + if Index = 0 then + begin + LTaskDialog := GetTaskDialog; + if Assigned(LTaskDialog) then + LTaskDialog.Execute; + end + else if Index = 1 then + ShellExecute(0, 'open', + PChar(GetProjectURL), nil, nil, SW_SHOWNORMAL); +end; + +function TStyledTaskDialogComponentEditor.GetTaskDialog: TStyledTaskDialog; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent; + if LComponent is TStyledTaskDialog then + Result := TStyledTaskDialog(LComponent); +end; + +function TStyledTaskDialogComponentEditor.GetVerb(Index: Integer): string; +begin + if Index = 0 then + Result := 'Test Dialog...' + else if Index = 1 then + Result := 'Project page on GitHub...'; +end; + +function TStyledTaskDialogComponentEditor.GetVerbCount: Integer; +begin + Result := 2; +end; + +{ TImageIndexPropertyEditor } + +function TImageIndexPropertyEditor.GetImageListAt(Index: Integer): TCustomImageList; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent(Index); + if LComponent is TCustomStyledButton then + Result := TCustomStyledButton(LComponent).Images + else if LComponent is TCustomStyledGraphicButton then + Result := TCustomStyledGraphicButton(LComponent).Images; +end; + +function TImageIndexPropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paRevertable]; +end; + +procedure TImageIndexPropertyEditor.GetValues(Proc: TGetStrProc); +var + ImgList: TCustomImageList; + I: Integer; +begin + ImgList := GetImageListAt(0); + if Assigned(ImgList) then + for I := 0 to ImgList.Count -1 do + Proc(IntToStr(I)); +end; + +procedure TImageIndexPropertyEditor.ListDrawValue(const Value: string; + ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +var + ImgList: TCustomImageList; + X: Integer; +begin + ImgList := GetImageListAt(0); + ACanvas.FillRect(ARect); + X := ARect.Left + 2; + if Assigned(ImgList) then + begin + ImgList.Draw(ACanvas, X, ARect.Top + 2, StrToInt(Value)); + Inc(X, ImgList.Width); + end; + ACanvas.TextOut(X + 3, ARect.Top + 1, Value); +end; + +procedure TImageIndexPropertyEditor.ListMeasureHeight(const Value: string; + ACanvas: TCanvas; var AHeight: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AHeight := ACanvas.TextHeight(Value) + 2; + if Assigned(ImgList) and (ImgList.Height + 4 > AHeight) then + AHeight := ImgList.Height + 4; +end; + +procedure TImageIndexPropertyEditor.ListMeasureWidth(const Value: string; + ACanvas: TCanvas; var AWidth: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AWidth := ACanvas.TextWidth(Value) + 4; + if Assigned(ImgList) then + Inc(AWidth, ImgList.Width); +end; + +{$IFDEF D10_4} +{ TImageNamePropertyEditor } + +function TImageNamePropertyEditor.GetImageListAt(Index: Integer): TCustomImageList; +var + LComponent: TPersistent; +begin + Result := nil; + LComponent := GetComponent(Index); + if LComponent is TCustomStyledButton then + Result := TCustomStyledButton(LComponent).Images + else if LComponent is TCustomStyledGraphicButton then + Result := TCustomStyledGraphicButton(LComponent).Images; +end; + +function TImageNamePropertyEditor.GetAttributes: TPropertyAttributes; +begin + Result := [paMultiSelect, paValueList, paRevertable]; +end; + +procedure TImageNamePropertyEditor.GetValues(Proc: TGetStrProc); +var + ImgList: TCustomImageList; + I: Integer; + LImageName: TImageName; + LImageIndex: TImageIndex; +begin + ImgList := GetImageListAt(0); + if Assigned(ImgList) and ImgList.IsImageNameAvailable then + begin + for I := 0 to ImgList.Count -1 do + begin + LImageName := ''; + LImageIndex := I; + ImgList.CheckIndexAndName(LImageIndex, LImageName); + Proc(LImageName); + end; + end; +end; + +procedure TImageNamePropertyEditor.ListDrawValue(const Value: string; + ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean); +var + ImgList: TCustomImageList; + X: Integer; + LImageIndex: TImageIndex; +begin + ImgList := GetImageListAt(0); + ACanvas.FillRect(ARect); + X := ARect.Left + 2; + if Assigned(ImgList) then + begin + LImageIndex := ImgList.GetIndexByName(Value); + ImgList.Draw(ACanvas, X, ARect.Top + 2, LImageIndex); + Inc(X, ImgList.Width); + end; + ACanvas.TextOut(X + 3, ARect.Top + 1, Value); +end; + +procedure TImageNamePropertyEditor.ListMeasureHeight(const Value: string; + ACanvas: TCanvas; var AHeight: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AHeight := ACanvas.TextHeight(Value) + 2; + if Assigned(ImgList) and (ImgList.Height + 4 > AHeight) then + AHeight := ImgList.Height + 4; +end; + +procedure TImageNamePropertyEditor.ListMeasureWidth(const Value: string; + ACanvas: TCanvas; var AWidth: Integer); +var + ImgList: TCustomImageList; +begin + ImgList := GetImageListAt(0); + AWidth := ACanvas.TextWidth(Value) + 4; + if Assigned(ImgList) then + Inc(AWidth, ImgList.Width); +end; +{$ENDIF} + +procedure Register; +begin + Classes.RegisterClasses( + [TStyledToolButton]); + + RegisterComponents('Styled Components', + [TStyledGraphicButton, + TStyledSpeedButton, + TStyledButton, + TStyledBitBtn, + TStyledToolbar, + TStyledTaskDialog, + TStyledDbNavigator, + TStyledBindNavigator, + TStyledButtonGroup, + TStyledCategoryButtons]); + + RegisterPropertyEditor(TypeInfo(string), + TStyledTaskDialog, 'Caption', TStringProperty); + + //Property Editor for StyleFamily + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledGraphicButton, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledSpeedButton, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledButton, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledBitBtn, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledToolbar, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledToolbutton, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledDbNavigator, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledBindNavigator, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledButtonGroup, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledGrpButtonItem, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledCategoryButtons, 'StyleFamily', TStyledFamilyPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonFamily), + TStyledButtonItem, 'StyleFamily', TStyledFamilyPropertyEditor); + + //Property Editor for StyleClass + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledGraphicButton, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledSpeedButton, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledButton, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledBitBtn, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledToolbar, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledToolButton, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledDbNavigator, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledBindNavigator, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledButtonGroup, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledGrpButtonItem, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledCategoryButtons, 'StyleClass', TStyledClassPropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonClass), + TStyledButtonItem, 'StyleClass', TStyledClassPropertyEditor); + + //Property Editor for StyleAppearance + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledGraphicButton, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledSpeedButton, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledButton, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledBitBtn, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledToolbar, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledToolButton, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledDbNavigator, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledBindNavigator, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledButtonGroup, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledGrpButtonItem, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledCategoryButtons, 'StyleAppearance', TStyledAppearancePropertyEditor); + RegisterPropertyEditor(TypeInfo(TStyledButtonAppearance), + TStyledButtonItem, 'StyleAppearance', TStyledAppearancePropertyEditor); + + //Property Editor for ImageIndex + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledGraphicButton, 'ImageIndex', TImageIndexPropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledSpeedButton, 'ImageIndex', TImageIndexPropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledButton, 'ImageIndex', TImageIndexPropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledBitBtn, 'ImageIndex', TImageIndexPropertyEditor); + + //Property Editor for StylusImageIndex + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledButton, 'StylusImageIndex', TImageIndexPropertyEditor); + + //Property Editor for HotImageIndex + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledGraphicButton, 'HotImageIndex', TImageIndexPropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledSpeedButton, 'HotImageIndex', TImageIndexPropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledButton, 'HotImageIndex', TImageIndexPropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageIndex), + TStyledBitBtn, 'HotImageIndex', TImageIndexPropertyEditor); + +{$IFDEF D10_4} + //Property Editor for ImageName + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledGraphicButton, 'ImageName', TImageNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledSpeedButton, 'ImageName', TImageNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledButton, 'ImageName', TImageNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledBitBtn, 'ImageName', TImageNamePropertyEditor); + + //Property Editor for HotImageName + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledGraphicButton, 'HotImageName', TImageNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledSpeedButton, 'HotImageName', TImageNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledButton, 'HotImageName', TImageNamePropertyEditor); + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledBitBtn, 'HotImageName', TImageNamePropertyEditor); + + //Property Editor for StylusHotImageName + RegisterPropertyEditor(TypeInfo(System.UITypes.TImageName), + TStyledButton, 'StylusHotImageName', TImageNamePropertyEditor); +{$ENDIF} + + //TStyledButtonComponentEditor is shared by every Styled Component + RegisterComponentEditor(TStyledGraphicButton, TStyledButtonComponentEditor); + RegisterComponentEditor(TStyledSpeedButton, TStyledButtonComponentEditor); + RegisterComponentEditor(TStyledButton, TStyledButtonComponentEditor); + RegisterComponentEditor(TStyledBitBtn, TStyledButtonComponentEditor); + RegisterComponentEditor(TStyledToolButton, TStyledButtonComponentEditor); + + //Register custom Components editors + RegisterComponentEditor(TStyledToolbar, TStyledToolbarComponentEditor); + RegisterComponentEditor(TStyledDbNavigator, TStyledNavigatorComponentEditor); + RegisterComponentEditor(TStyledBindNavigator, TStyledNavigatorComponentEditor); + RegisterComponentEditor(TStyledButtonGroup, TStyledButtonGroupComponentEditor); + RegisterComponentEditor(TStyledCategoryButtons, TStyledCategoryButtonsComponentEditor); + RegisterComponentEditor(TStyledTaskDialog, TStyledTaskDialogComponentEditor); + + //To auto add units + RegisterSelectionEditor(TStyledGraphicButton, TStyledComponentSelection); + RegisterSelectionEditor(TStyledSpeedButton, TStyledComponentSelection); + RegisterSelectionEditor(TStyledButton, TStyledComponentSelection); + RegisterSelectionEditor(TStyledBitBtn, TStyledComponentSelection); + RegisterSelectionEditor(TStyledToolbar, TStyledComponentSelection); + RegisterSelectionEditor(TStyledTaskDialog, TStyledComponentSelection); + RegisterSelectionEditor(TStyledDbNavigator, TStyledComponentSelection); + RegisterSelectionEditor(TStyledBindNavigator, TStyledComponentSelection); + RegisterSelectionEditor(TStyledButtonGroup, TStyledComponentSelection); + RegisterSelectionEditor(TStyledCategoryButtons, TStyledComponentSelection); +end; + +end. diff --git a/Ext/StyledComponents/source/Animations.RES b/Ext/StyledComponents/source/Animations.RES new file mode 100644 index 0000000000000000000000000000000000000000..e937de41e7629d36d7cbb3bc2d1faed0cd743716 GIT binary patch literal 173612 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 literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/source/Animations.rc b/Ext/StyledComponents/source/Animations.rc new file mode 100644 index 0000000..5ffc582 --- /dev/null +++ b/Ext/StyledComponents/source/Animations.rc @@ -0,0 +1,7 @@ +LOTTIE_INFORMATION RCDATA "..\Animations\information.json" +LOTTIE_CUSTOM RCDATA "..\Animations\custom.json" +LOTTIE_ERROR RCDATA "..\Animations\error.json" +LOTTIE_WARNING RCDATA "..\Animations\warning.json" +LOTTIE_SHIELD RCDATA "..\Animations\shield.json" +LOTTIE_NOTIFY RCDATA "..\Animations\notify.json" +LOTTIE_QUESTION RCDATA "..\Animations\question.json" \ No newline at end of file diff --git a/Ext/StyledComponents/source/BuildResFileOfAnimations.cmd b/Ext/StyledComponents/source/BuildResFileOfAnimations.cmd new file mode 100644 index 0000000..2a9246f --- /dev/null +++ b/Ext/StyledComponents/source/BuildResFileOfAnimations.cmd @@ -0,0 +1,3 @@ +@echo Buid Animations.res file from Animations.rc +BRCC32.EXE Animations.rc +pause \ No newline at end of file diff --git a/Ext/StyledComponents/source/CommandLinkBMP.RES b/Ext/StyledComponents/source/CommandLinkBMP.RES new file mode 100644 index 0000000000000000000000000000000000000000..5f05e70ac1212f41329e4ee604e6c7afe948bb70 GIT binary patch literal 9368 zcmeI1U1%It6o7A2Q4j?!;zNC~_=DAopoG3C*z^Z$Q`b^ciXiksq*{;)KA4JVu!(StCncB*(RZJXD3Z@vzgg6yR(~YGPB!myV>KpvwOq6^S3+OY1qO} zIXQRk%$)DsbAR`g5JFa<0F(ub!nN`iLe^sqKnqz*wvi6}_cRHS9po9ZkvvH@kj?mf z2Wi84S62%pqg}|nyuhYDEbuFS80srDKJ{{(zJpZcCXDqF zfop3&ivwz1=>|={*~ymQI+%?tLvGlKtz+XMb#mAi0~!-U{SLD6TmAC*_sw=|@+lj8 zX6(`j8PIMRfD-iGmw+>Gj)DP3aWk^Rmt?Uxao_}Bj3XCoAsUOE5kHhrvkj;mj`cf@S z_6{UR9zu3O;9p8+R$16KKK0=k`jC~xI2bC9$%zM<{c0My{Q^5PTHG`S2H$R0UWh;I z2deu!{(~Gc`MGH%zNyBg&vD*_1UAmI&$EzZJgau(Qy-%5MFqY&Cnle$<^!_-=J}UF zpS%&rxs}WAUHN_YtB?s>#)8`G#RpA#glE(8P6e`z<)mHtGzJ4Z&)H&-OFZo61M)uP z`EHcSs$VleTB2Y;03f9lciHSuW-BJavV3=HL{6CcOja-L1gkIIl| z95?ORe#$?wX=^9y_{!8$|h|}YZ za3T9ufj|CJ!Hvn+Gme)&U4)YYe@=Npfa49W^?L>W*{}0F$F1zeWzP=jAnuX*#LG6m zChr&c(gDMb$=5T6mp+hzh|qprdCSI6M-K}8$o|0i`_dqZeD$4%=Sv3zYyZd7@UQRo zPYo0yyn6;tY|-H8s!6`j`LbKTX5r`7 z^KSfQgHYI|LM%+@+l8r90+Zj1^&0x0=ksN{E=93#eqC+)LEC@(5M2C(#@M>f@Jzn! z#7{*(62?EzbSfu@=i$uWx!0#)tO$C)Yg>6PE9>gpw(+mYZOEtR>_1SBq5Otx@;TJ= zDCOTePMX!eftv6Ltj8n=|O!M=Hic8`EK`>GdMjH9YVQi^To~`z_b58FqDl~ zdj7ZiWbTnE=_|npo}W*=4|(Md>vuulLt0voz9daQDBn3+p>33B{2ZMnzU>B-et4}x5;oP54k>uUdPwcY%G z-44gyijYR%uQ0>gjdG>uSF@YZP6(w`k)Uk$G;NwOU9@;|@n(JLN89`i+Mb^^1=)d( YpQbH8k*9g7tFj&hwqE&bO=G|PKTom&2LJ#7 literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/source/CommandLinkPNG.RES b/Ext/StyledComponents/source/CommandLinkPNG.RES new file mode 100644 index 0000000000000000000000000000000000000000..27fd5f3ab40837760021b5ad62ffa09d06cf7eeb GIT binary patch literal 3400 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 HLn`ne7PO5; literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.dfm b/Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.dfm new file mode 100644 index 0000000..a2d73e3 --- /dev/null +++ b/Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.dfm @@ -0,0 +1,28 @@ +inherited StyledTaskDialogAnimatedForm: TStyledTaskDialogAnimatedForm + Caption = 'StyledTaskDialogAnimatedForm' + TextHeight = 15 + inherited FooterPanel: TPanel + inherited FooterIconPanel: TPanel + object SkFooterAnimatedImage: TSkAnimatedImage + Left = 0 + Top = 0 + Width = 25 + Height = 25 + Align = alTop + end + end + end + inherited CenterPanel: TPanel + inherited ImagePanel: TPanel + inherited IconContainer: TPanel + object SkAnimatedImage: TSkAnimatedImage + Left = 0 + Top = 0 + Width = 64 + Height = 64 + Align = alClient + end + end + end + end +end diff --git a/Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.pas b/Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.pas new file mode 100644 index 0000000..3e0aba9 --- /dev/null +++ b/Ext/StyledComponents/source/Skia.Vcl.StyledTaskDialogAnimatedUnit.pas @@ -0,0 +1,154 @@ +{******************************************************************************} +{ } +{ StyledTaskDialogAnimated: an example of Task Dialog Form } +{ using a TSkAnimatedImage with Lottie Animations } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Skia.Vcl.StyledTaskDialogAnimatedUnit; + +interface + +{$R Animations.RES} +{$INCLUDE StyledComponents.inc} + +uses + Winapi.Windows + , Winapi.Messages + , System.SysUtils + , System.Variants + , System.Classes + , Vcl.Graphics + , Vcl.Controls + , Vcl.Forms + , Vcl.Dialogs + , Vcl.StyledButton + , Vcl.StandardButtonStyles + , Vcl.BootstrapButtonStyles + , Vcl.ButtonStylesAttributes + , Vcl.AngularButtonStyles + , Vcl.ColorButtonStyles + , Vcl.StyledTaskDialog + , Vcl.StyledTaskDialogFormUnit + , Vcl.ExtCtrls + , Vcl.StdCtrls + , System.UITypes + , Vcl.Skia + , System.Skia + ; + +type + TStyledTaskDialogAnimatedForm = class(TStyledTaskDialogForm) + SkFooterAnimatedImage: TSkAnimatedImage; + SkAnimatedImage: TSkAnimatedImage; + private + procedure InternalLoadImage(const AAnimatedImage: TSkAnimatedImage; + const AImageIndex: TImageIndex; AImageName: string); + function TaskDialogIconToIconName( + const ATaskDialogIcon: TTaskDialogIcon): string; + protected + class function CanUseAnimations: Boolean; override; + procedure LoadImage(const AImageIndex: TImageIndex; AImageName: string); override; + procedure LoadCustomMainIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); override; + procedure LoadCustomFooterIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); override; + public + end; + +implementation + +{$R *.dfm} + +uses + Vcl.Themes; + +class function TStyledTaskDialogAnimatedForm.CanUseAnimations: Boolean; +begin + Result := True; +end; + +function TStyledTaskDialogAnimatedForm.TaskDialogIconToIconName( + const ATaskDialogIcon: TTaskDialogIcon): string; +begin + case ATaskDialogIcon of + tdiWarning: Result := 'Warning'; + tdiError: Result := 'Error'; + tdiInformation: Result := 'Information'; + tdiShield: Result := 'Shield'; + else + Result := 'Custom'; + end; +end; + +procedure TStyledTaskDialogAnimatedForm.LoadCustomFooterIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); +var + LImageName: string; +begin + inherited; + //A Custom FooterIcon is not animated so ignore It + LImageName := TaskDialogIconToIconName(ATaskDialogIcon); + if LImageName <> '' then + InternalLoadImage(SkFooterAnimatedImage, -1, LImageName); +end; + +procedure TStyledTaskDialogAnimatedForm.LoadCustomMainIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); +var + LImageName: string; +begin + //A Custom MainIcon is not animated so ignore it + LImageName := TaskDialogIconToIconName(ATaskDialogIcon); + if LImageName <> '' then + InternalLoadImage(SkAnimatedImage, -1, LImageName); +end; + +procedure TStyledTaskDialogAnimatedForm.LoadImage( + const AImageIndex: TImageIndex; AImageName: string); +begin + InternalLoadImage(SkAnimatedImage, AImageIndex, AImageName); +end; + +procedure TStyledTaskDialogAnimatedForm.InternalLoadImage( + const AAnimatedImage: TSkAnimatedImage; + const AImageIndex: TImageIndex; AImageName: string); +var + LStream: TResourceStream; + LImageName: string; +begin + //Using ..\Animations\Animations.rc file compiled into Animations.RES file + LImageName := UpperCase('LOTTIE_'+AImageName); + LStream := TResourceStream.Create(HInstance, LImageName, RT_RCDATA); + try + AAnimatedImage.LoadFromStream(LStream); + AAnimatedImage.Animation.Loop := False; + AAnimatedImage.Animation.Start; + finally + LStream.Free; + end; +end; + +initialization + RegisterTaskDialogFormClass(TStyledTaskDialogAnimatedForm); + +end. diff --git a/Ext/StyledComponents/source/StyledComponents.inc b/Ext/StyledComponents/source/StyledComponents.inc new file mode 100644 index 0000000..e1727d6 --- /dev/null +++ b/Ext/StyledComponents/source/StyledComponents.inc @@ -0,0 +1,180 @@ +{$Define ItaMessages} +{.$Define FraMessages} + +{$DEFINE INCLUDE_AngularButtonStyles} +{$DEFINE INCLUDE_BootstrapButtonStyles} +{$DEFINE INCLUDE_ColorButtonStyles} + +// Delphi XE3 +{$IFDEF VER240} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} +{$ENDIF} + +// Delphi XE6 +{$IFDEF VER270} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} +{$ENDIF} + +// Delphi XE7 +{$IFDEF VER280} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} +{$ENDIF} + +// Delphi XE8 +{$IFDEF VER290} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} +{$ENDIF} + +// Delphi 10 Seattle +{$IFDEF VER300} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} +{$ENDIF} + +// Delphi 10.1 Berlin +{$IFDEF VER310} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} + {$DEFINE D10_1+} +{$ENDIF} + +// Delphi 10.2 Tokyo +{$IFDEF VER320} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} + {$DEFINE D10_1+} + {$DEFINE D10_2+} +{$ENDIF} + +// Delphi 10.3 Rio +{$IFDEF VER330} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} + {$DEFINE D10_1+} + {$DEFINE D10_2+} + {$DEFINE D10_3+} +{$ENDIF} + +// Delphi 10.4 Sydney +{$IFDEF VER340} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} + {$DEFINE D10_1+} + {$DEFINE D10_2+} + {$DEFINE D10_3+} + {$DEFINE D10_4+} +{$ENDIF} + +// Delphi 11 Alexandria +{$IFDEF VER350} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} + {$DEFINE D10_1+} + {$DEFINE D10_2+} + {$DEFINE D10_3+} + {$DEFINE D10_4+} + {$DEFINE D11+} +{$ENDIF} + +// Delphi 12 +{$IFDEF VER360} + {$DEFINE D2010+} + {$DEFINE DXE+} + {$DEFINE DXE2+} + {$DEFINE DXE3+} + {$DEFINE DXE4+} + {$DEFINE DXE5+} + {$DEFINE DXE6+} + {$DEFINE DXE7+} + {$DEFINE DXE8+} + {$DEFINE D10_0+} + {$DEFINE D10_1+} + {$DEFINE D10_2+} + {$DEFINE D10_3+} + {$DEFINE D10_4+} + {$DEFINE D11+} + {$DEFINE D12+} +{$ENDIF} + +{$IFDEF DXE6+} + {$Define GDIPlusSupport} + {.$Define DrawTextWithGDIPlus} + {.$Define DrawRectWithGDIPlus} +{$ENDIF} + +{$IFDEF D10_3+} + {$Define HiDPISupport} +{$ENDIF} + diff --git a/Ext/StyledComponents/source/StyledNavButtonsBMP.RES b/Ext/StyledComponents/source/StyledNavButtonsBMP.RES new file mode 100644 index 0000000000000000000000000000000000000000..b1e61e2fd110ee19a14f86c301c80eb6741fe7ab GIT binary patch literal 14240 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 Q;D=Ylf;_C_~$>u9hv+an@6se%^z4uEw;=l~Z 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 KD%n39`~L^DkchVc literal 0 HcmV?d00001 diff --git a/Ext/StyledComponents/source/Vcl.AngularButtonStyles.pas b/Ext/StyledComponents/source/Vcl.AngularButtonStyles.pas new file mode 100644 index 0000000..116ccd6 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.AngularButtonStyles.pas @@ -0,0 +1,532 @@ +{******************************************************************************} +{ } +{ AngulaButtonStyles: Button Styles inspired to Material/angular } +{ https://material.angular.io/components/button/overview } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.AngularButtonStyles; + +interface + +uses + Vcl.Graphics + , System.UITypes + , Vcl.ButtonStylesAttributes; + +const + ANGULAR_STROKED_WIDTH = 2; + ANGULAR_RAISED_WIDTH = 3; + + //Button Family as Angular Themes + ANGULAR_LIGHT_FAMILY = 'Angular-Light'; + ANGULAR_DARK_FAMILY = 'Angular-Dark'; + + //Button Class as Angular Styling + btn_Basic = 'Basic'; + btn_Warn = 'Warn'; + btn_Link = 'Link'; + + //DeepPurple & Amber Light Theme + btn_PrimaryDeepPurple = 'DeepPurple'; + btn_AccentAmber = 'Amber'; + //Indigo & Pink Light Theme + btn_PrimaryIndigo = 'Indigo'; + btn_AccentPink = 'Pink'; + + //Pink & BlueGray Dark Theme + btn_PrimaryPink = 'Pink'; + btn_AccentBlueGray = 'Blue-gray'; + //Purple & Green Dark Theme + btn_PrimaryPurple = 'Purple'; + btn_AccentGreen = 'Green'; + + //Button Appearance as Angular Attributes + FlatAttr = 'Flat'; + RaisedAttr = 'Raised'; + BasicAttr = 'Basic'; + StrokedAttr = 'Stroked'; + +Type + //Base class for light styles + TAngularButtonStyleLight = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure AngularClassToLightColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; var AFontColor, + AButtonColor: TColor); + //Implementation of IStyledButtonAttributes interface + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + end; + + //Base class for dark styles + TAngularButtonStyleDark = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure AngularClassToDarkColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; var AFontColor, + AButtonColor: TColor); + //Implementation of IStyledButtonAttributes interface + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + end; + +implementation + +uses + System.SysUtils + , WinApi.Windows; + +var + LightButtonClasses: TButtonClasses; + DarkButtonClasses: TButtonClasses; + ButtonAppearances: TButtonAppearances; + +{ TAngularButtonStyleLight } + +procedure TAngularButtonStyleLight.AngularClassToLightColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var AFontColor, AButtonColor: TColor); +begin + //Button and Font Colors for Light Themes (DeepPurpleAndAmber) + if SameText(AClass, btn_Basic) then + begin + AButtonColor := htmlToColor('#FFFFFF'); + AFontColor := htmlToColor('#212121'); + end + else if SameText(AClass, btn_PrimaryDeepPurple) then + begin + AButtonColor := htmlToColor('#673AB7'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_AccentAmber) then + begin + AButtonColor := htmlToColor('#FFD740'); + AFontColor := htmlToColor('#211C08'); + end + else if SameText(AClass, btn_PrimaryIndigo) then + begin + AButtonColor := htmlToColor('#3F51B5'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_AccentPink) then + begin + AButtonColor := htmlToColor('#FF4081'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_Warn) then + begin + AButtonColor := htmlToColor('#F44336'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_Link) then + begin + AButtonColor := htmlToColor('#FFFFFF'); + AFontColor := htmlToColor('#212121'); + end; +end; + +function TAngularButtonStyleLight.ButtonFamilyName: string; +begin + Result := ANGULAR_LIGHT_FAMILY; +end; + +function TAngularButtonStyleLight.GetButtonAppearances: TButtonAppearances; +begin + Result := ButtonAppearances; +end; + +function TAngularButtonStyleLight.GetButtonClasses: TButtonClasses; +begin + Result := LightButtonClasses; +end; + +procedure TAngularButtonStyleLight.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + //if AModalResult is mrNone, define the defaults of Family + case AModalResult of + mrNone : begin AStyleClass := btn_Basic; AStyleAppearance := FlatAttr; end; + mrYes : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := FlatAttr; end; + mrNo : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + mrOk : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := FlatAttr; end; + mrCancel : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + mrAbort : begin AStyleClass := btn_Warn; AStyleAppearance := RaisedAttr; end; + mrRetry : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := RaisedAttr; end; + mrIgnore : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := RaisedAttr; end; + mrAll : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := RaisedAttr; end; + mrNoToAll : begin AStyleClass := btn_Warn; AStyleAppearance := RaisedAttr; end; + mrYesToAll : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := RaisedAttr; end; + mrClose : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + mrTryAgain : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := FlatAttr; end; + mrContinue : begin AStyleClass := btn_PrimaryDeepPurple; AStyleAppearance := FlatAttr; end; + mrHelp : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + end; +end; + +procedure TAngularButtonStyleLight.UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, AHotStyle, + ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LButtonColor: TColor; + LRaised, LStroked, LBasic: Boolean; + LPrimaryAccentWarn: Boolean; +begin + AngularClassToLightColors(AClass, AAppearance, LFontColor, LButtonColor); + + //Default Style Attributes for Angular Buttons: Flat + //using Flat Style as base style + ANormalStyle.DrawType := btRoundRect; + ANormalStyle.BorderWidth := 0; + ANormalStyle.BorderDrawStyle := brdClear; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.FontColor := LFontColor; + + LStroked := SameText(AAppearance, StrokedAttr); + LRaised := SameText(AAppearance, RaisedAttr); + LPrimaryAccentWarn := + SameText(AClass, btn_PrimaryDeepPurple) or + SameText(AClass, btn_PrimaryIndigo) or + SameText(AClass, btn_AccentAmber) or + SameText(AClass, btn_AccentPink) or + SameText(AClass, btn_Warn); + LBasic := SameText(AAppearance, BasicAttr); + + if LStroked then + begin + //Every stroked Buttons has thin border and + //and no color for the Button + ANormalStyle.BorderWidth := ANGULAR_STROKED_WIDTH; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.ButtonDrawStyle := btnClear; + //Only for Primary, Accent and Warn, Stroked FontColor as Button Color + if LPrimaryAccentWarn then + ANormalStyle.FontColor := LButtonColor + else + ANormalStyle.FontColor := LFontColor; + end + else if LRaised then + begin + //Raised Button can be showed with a darker border color + //from button color, because we don't have "shadow" effect + ANormalStyle.BorderWidth := ANGULAR_RAISED_WIDTH; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.BorderColor := DarkenColor(ANormalStyle.ButtonColor, 20); + end + else if LBasic then + begin + //Basic Buttons has FontColor as Flat button Color + //But no Color for the Button + ANormalStyle.ButtonDrawStyle := btnClear; + //Only for Primary, Accent and Warn, Stroked FontColor as Button Color + if LPrimaryAccentWarn then + ANormalStyle.FontColor := LButtonColor + else + ANormalStyle.FontColor := LFontColor; + end; + + //Clone Normal Style to Other Styles + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + if LStroked or LBasic then + begin + //Button Hot: Button Color 50% ligthen of Font Color + AHotStyle.ButtonDrawStyle := btnSolid; + AHotStyle.ButtonColor := LightenColor(AHotStyle.FontColor, 50); + + //Button Pressed: Button Color 40% ligthen of Font Color + APressedStyle.ButtonDrawStyle := btnSolid; + APressedStyle.ButtonColor := LightenColor(ASelectedStyle.FontColor, 40); + + //Button Selected: Button Color 60% ligthen of Font Color + ASelectedStyle.ButtonDrawStyle := btnSolid; + ASelectedStyle.ButtonColor := LightenColor(ASelectedStyle.FontColor, 60); + + //Button Disabled + ADisabledStyle.FontColor := htmlToColor('#A3A3A3'); + end + else + begin + //Flat and Raised Appearance + AHotStyle.ButtonColor := DarkenColor(AHotStyle.ButtonColor, 10); + + //Button Focused: botton color Darken + ASelectedStyle.ButtonColor := DarkenColor(ASelectedStyle.ButtonColor, 10); + + //Button Down: botton color Darken then Focused + APressedStyle.ButtonColor := DarkenColor(APressedStyle.ButtonColor, 20); + + //Button Disabled: Gray Button and Font + ADisabledStyle.BorderWidth := 0; + ADisabledStyle.ButtonColor := htmlToColor('#DCDCDC'); + ADisabledStyle.FontColor := htmlToColor('#A3A3A3'); + end; +end; + +{ TAngularButtonStyleDark } + +procedure TAngularButtonStyleDark.AngularClassToDarkColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var AFontColor, AButtonColor: TColor); +begin + //Button and Font Colors for Light Themes (DeepPurpleAndAmber) + if SameText(AClass, btn_Basic) then + begin + AButtonColor := htmlToColor('#424242'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_PrimaryPink) then + begin + AButtonColor := htmlToColor('#E91E63'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_AccentBlueGray) then + begin + AButtonColor := htmlToColor('#607D8B'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_PrimaryPurple) then + begin + AButtonColor := htmlToColor('#9C27B0'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_AccentGreen) then + begin + AButtonColor := htmlToColor('#69F0AE'); + AFontColor := htmlToColor('#0E1F17'); + end + else if SameText(AClass, btn_Warn) then + begin + AButtonColor := htmlToColor('#F44336'); + AFontColor := htmlToColor('#FFFFFF'); + end + else if SameText(AClass, btn_Link) then + begin + AButtonColor := htmlToColor('#424242'); + AFontColor := htmlToColor('#FFFFFF'); + end; +end; + +function TAngularButtonStyleDark.ButtonFamilyName: string; +begin + Result := ANGULAR_DARK_FAMILY; +end; + +function TAngularButtonStyleDark.GetButtonAppearances: TButtonAppearances; +begin + Result := ButtonAppearances; +end; + +function TAngularButtonStyleDark.GetButtonClasses: TButtonClasses; +begin + Result := DarkButtonClasses; +end; + +procedure TAngularButtonStyleDark.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + //if AModalResult is mrNone, define the defaults of Family + case AModalResult of + mrNone : begin AStyleClass := btn_Basic; AStyleAppearance := FlatAttr; end; + mrYes : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := FlatAttr; end; + mrNo : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + mrOk : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := FlatAttr; end; + mrCancel : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + mrAbort : begin AStyleClass := btn_Warn; AStyleAppearance := RaisedAttr; end; + mrRetry : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := RaisedAttr; end; + mrIgnore : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := RaisedAttr; end; + mrAll : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := RaisedAttr; end; + mrNoToAll : begin AStyleClass := btn_Warn; AStyleAppearance := RaisedAttr; end; + mrYesToAll : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := RaisedAttr; end; + mrClose : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + mrTryAgain : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := FlatAttr; end; + mrContinue : begin AStyleClass := btn_PrimaryPurple; AStyleAppearance := FlatAttr; end; + mrHelp : begin AStyleClass := btn_Warn; AStyleAppearance := FlatAttr; end; + end; +end; + +procedure TAngularButtonStyleDark.UpdateAttributes( + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; var ANormalStyle, APressedStyle, + ASelectedStyle, AHotStyle, ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LButtonColor: TColor; + LRaised, LStroked, LBasic: Boolean; + LPrimaryAccentWarn: Boolean; +begin + AngularClassToDarkColors(AClass, AAppearance, LFontColor, LButtonColor); + + //Default Style Attributes for Angular Buttons: Flat + //using Flat Style as base style + ANormalStyle.DrawType := btRoundRect; + ANormalStyle.BorderWidth := 0; + ANormalStyle.BorderDrawStyle := brdClear; + ANormalStyle.ButtonDrawStyle := btnSolid; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.FontColor := LFontColor; + + LStroked := SameText(AAppearance, StrokedAttr); + LRaised := SameText(AAppearance, RaisedAttr); + LPrimaryAccentWarn := + SameText(AClass, btn_PrimaryPink) or + SameText(AClass, btn_PrimaryPurple) or + SameText(AClass, btn_AccentBlueGray) or + SameText(AClass, btn_AccentGreen) or + SameText(AClass, btn_Warn); + LBasic := SameText(AAppearance, BasicAttr); + + if LStroked then + begin + //Every stroked Buttons has thin border and + //and no color for the Button + ANormalStyle.BorderWidth := ANGULAR_STROKED_WIDTH; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.ButtonDrawStyle := btnClear; + //Only for Primary, Accent and Warn, Stroked FontColor as Button Color + if LPrimaryAccentWarn then + ANormalStyle.FontColor := LButtonColor + else + ANormalStyle.FontColor := LFontColor; + end + else if LRaised then + begin + //Raised Button can be showed with a darker border color + //from button color, because we don't have "shadow" effect + ANormalStyle.BorderWidth := ANGULAR_RAISED_WIDTH; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.BorderColor := DarkenColor(ANormalStyle.ButtonColor, 20); + end + else if LBasic then + begin + //Basic Buttons has FontColor as Flat button Color + //But no Color for the Button + ANormalStyle.ButtonDrawStyle := btnClear; + //Only for Primary, Accent and Warn, Stroked FontColor as Button Color + if LPrimaryAccentWarn then + ANormalStyle.FontColor := LButtonColor + else + ANormalStyle.FontColor := LFontColor; + end; + + //Clone Normal Style to Other Styles + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + if LStroked or LBasic then + begin + //Button Hot: Button Color 50% darken of Font + AHotStyle.ButtonDrawStyle := btnSolid; + AHotStyle.ButtonColor := DarkenColor(AHotStyle.FontColor, 50); + + //Button Pressed: Button Color 40% darken of Font + APressedStyle.ButtonDrawStyle := btnSolid; + APressedStyle.ButtonColor := DarkenColor(APressedStyle.FontColor, 40); + + //Button Selected: Button Color 60% darken of Font + ASelectedStyle.ButtonDrawStyle := btnSolid; + ASelectedStyle.ButtonColor := DarkenColor(ASelectedStyle.FontColor, 60); + + //Button Disabled + ADisabledStyle.FontColor := htmlToColor('#6F6F6F'); + end + else + begin + //Flat and Raised Appearance + AHotStyle.ButtonColor := DarkenColor(AHotStyle.ButtonColor, 10); + + //Button Focused: botton color Lighten + ASelectedStyle.ButtonColor := LightenColor(ASelectedStyle.ButtonColor, 10); + + //Button Down: botton color Lighten then Focused + APressedStyle.ButtonColor := LightenColor(APressedStyle.ButtonColor, 20); + + //Button Disabled: Gray Button and Font + ADisabledStyle.BorderWidth := 0; + ADisabledStyle.ButtonColor := htmlToColor('#424242'); + ADisabledStyle.FontColor := htmlToColor('#6F6F6F'); + end; +end; + +initialization + SetLength(LightButtonClasses, 7); + LightButtonClasses[0] := btn_Basic; + LightButtonClasses[1] := btn_PrimaryDeepPurple; + LightButtonClasses[2] := btn_AccentAmber; + LightButtonClasses[3] := btn_PrimaryIndigo; + LightButtonClasses[4] := btn_AccentPink; + LightButtonClasses[5] := btn_Warn; + LightButtonClasses[6] := btn_Link; + + SetLength(DarkButtonClasses, 7); + DarkButtonClasses[0] := btn_Basic; + DarkButtonClasses[1] := btn_PrimaryPink; + DarkButtonClasses[2] := btn_AccentBlueGray; + DarkButtonClasses[3] := btn_PrimaryPurple; + DarkButtonClasses[4] := btn_AccentGreen; + DarkButtonClasses[5] := btn_Warn; + DarkButtonClasses[6] := btn_Link; + + SetLength(ButtonAppearances, 4); + ButtonAppearances[0] := FlatAttr; + ButtonAppearances[1] := RaisedAttr; + ButtonAppearances[2] := BasicAttr; + ButtonAppearances[3] := StrokedAttr; + + RegisterButtonFamily(TAngularButtonStyleLight.Create); + RegisterButtonFamily(TAngularButtonStyleDark.Create); + +end. diff --git a/Ext/StyledComponents/source/Vcl.BootstrapButtonStyles.pas b/Ext/StyledComponents/source/Vcl.BootstrapButtonStyles.pas new file mode 100644 index 0000000..b87cb7b --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.BootstrapButtonStyles.pas @@ -0,0 +1,330 @@ +{******************************************************************************} +{ } +{ BootstrapButtonStyles: Button Styles inspired to Bootstrap } +{ https://getbootstrap.com/docs/4.0/components/buttons/ } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.BootstrapButtonStyles; + +interface + +uses + Vcl.Graphics + , System.UITypes + , Vcl.ButtonStylesAttributes; + +const + BOOTSTRAP_FAMILY = 'Bootstrap'; + + btn_primary = 'Primary'; + btn_secondary = 'Secondary'; + btn_success = 'Success'; + btn_danger = 'Danger'; + btn_warning = 'Warning'; + btn_info = 'Info'; + btn_light = 'Light'; + btn_dark = 'Dark'; + + BOOTSTRAP_NORMAL = 'Normal'; + BOOTSTRAP_OUTLINE = 'Outline'; + BOOTSTRAP_BORDER_WIDTH = 2; + +Type + TBoostrapButtonStyles = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + end; + +implementation + +uses + System.SysUtils + , WinApi.Windows; + +var + ButtonClasses: TButtonClasses; + ButtonAppearances: TButtonAppearances; + +{ TBoostrapButtonStyles } + +procedure BootstrapClassToColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var AFontColor, AButtonColor: TColor; out AOutLine: Boolean); + +const + //from bootstrap css + bs_blue = '#0d6efd'; + bs_indigo = '#6610f2'; + bs_purple = '#6f42c1'; + bs_pink = '#d63384'; + bs_red = '#dc3545'; + bs_orange = '#fd7e14'; + bs_yellow = '#ffc107'; + bs_green = '#198754'; + bs_teal = '#20c997'; + bs_cyan = '#0dcaf0'; + bs_white = '#fff'; + bs_gray = '#6c757d'; + bs_gray_dark = '#343a40'; + bs_primary = '#0d6efd'; + bs_secondary = '#6c757d'; + bs_success = '#198754'; + bs_info = '#0dcaf0'; + bs_warning = '#ffc107'; + bs_danger = '#dc3545'; + bs_light = '#f8f9fa'; + bs_dark = '#212529'; + +begin + AOutLine := SameText(AAppearance, BOOTSTRAP_OUTLINE); + + + if SameText(AClass, btn_primary) then + begin + AButtonColor := htmlToColor(bs_primary); + AFontColor := clWhite; + end + else if SameText(AClass, btn_secondary) then + begin + AButtonColor := htmlToColor(bs_secondary); + AFontColor := clWhite; + end + else if SameText(AClass, btn_success) then + begin + AButtonColor := htmlToColor(bs_success); + AFontColor := clWhite; + end + else if SameText(AClass, btn_danger) then + begin + AButtonColor := htmlToColor(bs_danger); + AFontColor := clWhite; + end + else if SameText(AClass, btn_warning) then + begin + AButtonColor := htmlToColor(bs_warning); + AFontColor := htmlToColor('#212529'); + end + else if SameText(AClass, btn_info) then + begin + AButtonColor := htmlToColor(bs_info); + AFontColor := htmlToColor('#212529'); + end + else if SameText(AClass, btn_light) then + begin + AButtonColor := htmlToColor(bs_light); + AFontColor := htmlToColor('#212529'); + end + else if SameText(AClass, btn_dark) then + begin + AButtonColor := htmlToColor(bs_dark); + AFontColor := clWhite; + end + else + begin + AOutLine := False; + AButtonColor := clBtnFace; + AFontColor := clBtnText; + end; +end; + +function TBoostrapButtonStyles.ButtonFamilyName: string; +begin + Result := BOOTSTRAP_FAMILY; +end; + +function TBoostrapButtonStyles.GetButtonAppearances: TButtonAppearances; +begin + Result := ButtonAppearances; +end; + +function TBoostrapButtonStyles.GetButtonClasses: TButtonClasses; +begin + Result := ButtonClasses; +end; + +procedure TBoostrapButtonStyles.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + //if AModalResult is mrNone, define the defaults of Family + case AModalResult of + mrNone : begin AStyleClass := btn_primary; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrYes : begin AStyleClass := btn_primary; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrNo : begin AStyleClass := btn_secondary; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrOk : begin AStyleClass := btn_success; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrCancel : begin AStyleClass := btn_danger; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrAbort : begin AStyleClass := btn_danger; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrRetry : begin AStyleClass := btn_warning; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrIgnore : begin AStyleClass := btn_secondary; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrAll : begin AStyleClass := btn_primary; AStyleAppearance := BOOTSTRAP_OUTLINE; end; + mrNoToAll : begin AStyleClass := btn_danger; AStyleAppearance := BOOTSTRAP_OUTLINE; end; + mrYesToAll : begin AStyleClass := btn_success; AStyleAppearance := BOOTSTRAP_OUTLINE; end; + mrClose : begin AStyleClass := btn_secondary; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrTryAgain : begin AStyleClass := btn_warning; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrContinue : begin AStyleClass := btn_secondary; AStyleAppearance := BOOTSTRAP_NORMAL; end; + mrHelp : begin AStyleClass := btn_info; AStyleAppearance := BOOTSTRAP_NORMAL; end; + end; +end; + +procedure TBoostrapButtonStyles.UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, AHotStyle, + ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LButtonColor: TColor; + LOutLine: Boolean; +begin + BootstrapClassToColors(AClass, AAppearance, LFontColor, LButtonColor, LOutLine); + + //Default Style Attributes for Bootstrap Buttons + ANormalStyle.DrawType := btRoundRect; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.BorderWidth := BOOTSTRAP_BORDER_WIDTH; + + //Style for Normal Style of Bootstrap Button + if LOutLine then + begin + //Outline: Border and FontColor same as Button Color + ANormalStyle.ButtonDrawStyle := btnClear; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.BorderWidth := BOOTSTRAP_BORDER_WIDTH; + ANormalStyle.FontColor := LButtonColor; + ANormalStyle.BorderColor := LightenColor(LButtonColor, 50); + end + else + begin + ANormalStyle.ButtonDrawStyle := btnSolid; + ANormalStyle.BorderDrawStyle := brdClear; + ANormalStyle.FontColor := LFontColor; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.BorderColor := LButtonColor; + end; + + //Clone Normal Style to Other Styles + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + if LOutline then + begin + //Button Down: color as Button Color + with APressedStyle do + begin + ButtonColor := LButtonColor; + BorderColor := LightenColor(LButtonColor, 50); + BorderDrawStyle := brdSolid; + BorderWidth := BOOTSTRAP_BORDER_WIDTH+2; + FontColor := LFontColor; + ButtonDrawStyle := btnSolid; + end; + + //Button Hot: color as Button Color + with AHotStyle do + begin + ButtonColor := LButtonColor; + BorderDrawStyle := brdClear; + BorderWidth := BOOTSTRAP_BORDER_WIDTH; + FontColor := LFontColor; + ButtonDrawStyle := btnSolid; + end; + + //Button Focused + with ASelectedStyle do + begin +(* + if SameText(AClass, btn_dark) then + ButtonColor := LightenColor(LButtonColor, 20) + else + ButtonColor := DarkenColor(LButtonColor, 20); +*) + BorderDrawStyle := brdSolid; + BorderWidth := BOOTSTRAP_BORDER_WIDTH+2; + BorderColor := LightenColor(LButtonColor, 50); + //FontColor := LFontColor; + //ButtonDrawStyle := btnSolid; + ButtonDrawStyle := btnClear; + end; + + //Button Disabled + with ADisabledStyle do + begin + ButtonColor := LightenColor(ANormalStyle.ButtonColor, 70); //ColortoGrayscale(LButtonColor); + FontColor := LightenColor(LFontColor, 70); + end; + end + else + begin + //Button Down + APressedStyle.ButtonColor := DarkenColor(LButtonColor, 20); + APressedStyle.BorderColor := LightenColor(LButtonColor, 50); + APressedStyle.BorderDrawStyle := brdSolid; + APressedStyle.BorderWidth := BOOTSTRAP_BORDER_WIDTH; + + //Button Hot: color as Down but no Border + AHotStyle.ButtonColor := APressedStyle.ButtonColor; + + //Button Focused + ASelectedStyle.ButtonColor := DarkenColor(LButtonColor, 20); + ASelectedStyle.BorderDrawStyle := brdSolid; + ASelectedStyle.BorderWidth := BOOTSTRAP_BORDER_WIDTH; + + //Button Disabled + ADisabledStyle.ButtonColor := LightenColor(ANormalStyle.ButtonColor, 70);//ColortoGrayscale(LButtonColor); + ADisabledStyle.FontColor := LightenColor(LFontColor, 70); + end; +end; + +initialization + SetLength(ButtonClasses, 8); + ButtonClasses[0] := btn_primary; + ButtonClasses[1] := btn_secondary; + ButtonClasses[2] := btn_success; + ButtonClasses[3] := btn_danger; + ButtonClasses[4] := btn_warning; + ButtonClasses[5] := btn_info; + ButtonClasses[6] := btn_light; + ButtonClasses[7] := btn_dark; + + SetLength(ButtonAppearances, 2); + ButtonAppearances[0] := BOOTSTRAP_NORMAL; + ButtonAppearances[1] := BOOTSTRAP_OUTLINE; + + RegisterButtonFamily(TBoostrapButtonStyles.Create); + +end. diff --git a/Ext/StyledComponents/source/Vcl.ButtonStylesAttributes.pas b/Ext/StyledComponents/source/Vcl.ButtonStylesAttributes.pas new file mode 100644 index 0000000..1b320fb --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.ButtonStylesAttributes.pas @@ -0,0 +1,2203 @@ +{******************************************************************************} +{ } +{ TStyledButtonAttributes: a collection of Rendering attributes } +{ for Styled Components } +{ TNotificationBadgeAttributes: a set of Rendering attributes for Badge } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.ButtonStylesAttributes; + +interface + +{$INCLUDE StyledComponents.inc} +{$IFDEF D10_4+} + {$R CommandLinkPNG.RES} +{$ELSE} + {$R CommandLinkBMP.RES} +{$ENDIF} + +uses + Winapi.Windows + , System.Classes + , System.Contnrs + , System.UITypes + , System.Types + , Vcl.Graphics + , Vcl.Controls + , Vcl.Buttons + , Vcl.StdCtrls + , Vcl.ImgList + , Vcl.Themes + , Winapi.CommCtrl + ; + +const + DEFAULT_RADIUS = 6; + RESOURCE_SHIELD_ICON = 'BUTTON_SHIELD_ADMIN'; + DEFAULT_MAX_BADGE_VALUE = 99; + +resourcestring + ERROR_FAMILY_NOT_FOUND = 'Styled Button Family "%s" not found'; + ERROR_NEGATIVE_VALUE = 'Error: Notification Count cannot be negative!'; + +Type + //Windows Version + TWindowsVersion = (wvUndefined, wvWindowsXP, wvWindowsVista, wvWindows7, + wvWindows8, wvWindows8_1, wvWindows10, wvWindows11); + + TNotificationBadgePosition = (nbpTopRight, nbpTopLeft, nbpBottomRight, nbpBottomLeft); + TNotificationBadgeSize = (nbsNormal, nbsSmallDot); + + //string typed attributes + TStyledButtonFamily = string; + TStyledButtonClass = string; + TStyledButtonAppearance = string; + + //Type of border + TStyledButtonDrawType = (btRoundRect, btRounded, btRect, btEllipse); + TRoundedCorner = (rcTopLeft, rcTopRight, rcBottomRight, rcBottomLeft); + TRoundedCorners = set of TRoundedCorner; +const + ALL_ROUNDED_CORNERS = [rcTopLeft, rcTopRight, rcBottomLeft, rcBottomRight]; + +Type + //Type of Draw for Border + TBorderDrawStyle = (brdClear, brdSolid); //similar to Pen.psClear and Pen.psSolid + TButtonDrawStyle = (btnClear, btnSolid); //similar to Brush.bsClear and Brush.bsSolid + + //List of available elements + TButtonFamilies = array of TStyledButtonFamily; + TButtonClasses = Array of TStyledButtonClass; + TButtonAppearances = Array of TStyledButtonAppearance; + + TNotificationBadgeAttributes = class(TComponent) + private + FNotificationCount: Integer; + FCustomText: string; + FMaxNotifications: Word; + FPosition: TNotificationBadgePosition; + FSize: TNotificationBadgeSize; + FColor: TColor; + FFontColor: TColor; + + FOwnerControl: TControl; + FOnContentChange: TNotifyEvent; + procedure InvalidateControl; + procedure SetMaxNotifications(const AValue: Word); + procedure SetPosition(const AValue: TNotificationBadgePosition); + procedure SetNotificationCount(const AValue: Integer); + procedure SetColor(const AValue: TColor); + procedure SetFontColor(const AValue: TColor); + function GetBadgeContent: string; + procedure SetCustomText(const AValue: string); + procedure SetSize(const Value: TNotificationBadgeSize); + function GetIsVisible: Boolean; + public + procedure Assign(ASource: TPersistent); override; + constructor Create(AOwner: TComponent); override; + function HasCustomAttributes: Boolean; + property BadgeContent: string read GetBadgeContent; + property IsVisible: Boolean read GetIsVisible; + published + property Color: TColor read FColor write SetColor default clRed; + property CustomText: string read FCustomText write SetCustomText; + property FontColor: TColor read FFontColor write SetFontColor default clWhite; + property NotificationCount: Integer read FNotificationCount write SetNotificationCount default 0; + property MaxNotifications: Word read FMaxNotifications write SetMaxNotifications default DEFAULT_MAX_BADGE_VALUE; + property Position: TNotificationBadgePosition read FPosition write SetPosition default nbpTopRight; + property Size: TNotificationBadgeSize read FSize write SetSize default nbsNormal; + + property OnContentChange: TNotifyEvent read FOnContentChange write FOnContentChange; + end; + + TStyledButtonAttributes = class(TComponent) + private + //Custom values + FCustomDrawType: TStyledButtonDrawType; + FCustomBorderWidth: Integer; + FCustomBorderDrawStyle: TBorderDrawStyle; + FCustomButtonDrawStyle: TButtonDrawStyle; + FCustomBorderColor: TColor; + FCustomFontColor: TColor; + FCustomFontStyle: TFontStyles; + FCustomButtonColor: TColor; + FCustomRadius: Integer; + FCustomRoundedCorners: TRoundedCorners; + + //Default Values retrieved by Family/Class/Appearance + FDrawType: TStyledButtonDrawType; + FBorderWidth: Integer; + FBorderDrawStyle: TBorderDrawStyle; + FButtonDrawStyle: TButtonDrawStyle; + FBorderColor: TColor; + FFontColor: TColor; + FFontStyle: TFontStyles; + FFontName: TFontName; + FButtonColor: TColor; + FRadius: Integer; + FRoundedCorners: TRoundedCorners; + + FOwnerControl: TControl; + FHasCustomDrawType: Boolean; + FHasCustomBorderWidth: Boolean; + FHasCustomBorderDrawStyle: Boolean; + FHasCustomButtonDrawStyle: Boolean; + FHasCustomBorderColor: Boolean; + FHasCustomFontColor: Boolean; + FHasCustomFontStyle: Boolean; + FHasCustomButtonColor: Boolean; + FHasCustomRadius: Boolean; + FHasCustomRoundedCorners: Boolean; + + procedure InvalidateControl; + procedure SetBorderColor(const AValue: TColor); + procedure SetBorderDrawStyle(const AValue: TBorderDrawStyle); + procedure SetButtonDrawStyle(const AValue: TButtonDrawStyle); + procedure SetDrawType(const AValue: TStyledButtonDrawType); + procedure SetBorderWidth(const AValue: Integer); + procedure SetButtonColor(const AValue: TColor); + procedure SetFontColor(const AValue: TColor); + procedure SetFontStyle(const AValue: TFontStyles); + procedure SetRadius(const AValue: Integer); + procedure SetRoundedCorners(const AValue: TRoundedCorners); + function GetBorderColor: TColor; + function GetBorderDrawStyle: TBorderDrawStyle; + function GetBorderWidth: Integer; + function GetButtonColor: TColor; + function GetButtonDrawStyle: TButtonDrawStyle; + function GetDrawType: TStyledButtonDrawType; + function GetFontColor: TColor; + function GetFontStyle: TFontStyles; + function GetRadius: Integer; + function GetRoundedCorners: TRoundedCorners; + procedure SetCustomAttributes(const Value: Boolean); + public + constructor Create(AOwner: TComponent); override; + function HasCustomAttributes: Boolean; + procedure Assign(ASource: TPersistent); override; + function PenStyle: TPenStyle; + function BrushStyle: TBrushStyle; + function AssignStyledAttributes(const ASource: TStyledButtonAttributes): Boolean; + procedure ResetCustomAttributes; + property HasCustomDrawType: Boolean read FHasCustomDrawType; + property HasCustomBorderWidth: Boolean read FHasCustomBorderWidth; + property HasCustomBorderDrawStyle: Boolean read FHasCustomBorderDrawStyle; + property HasCustomButtonDrawStyle: Boolean read FHasCustomButtonDrawStyle; + property HasCustomBorderColor: Boolean read FHasCustomBorderColor; + property HasCustomFontColor: Boolean read FHasCustomFontColor; + property HasCustomFontStyle: Boolean read FHasCustomFontStyle; + property HasCustomButtonColor: Boolean read FHasCustomButtonColor; + property HasCustomRadius: Boolean read FHasCustomRadius; + property HasCustomRoundedCorners: Boolean read FHasCustomRoundedCorners; + published + property DrawType: TStyledButtonDrawType read GetDrawType write SetDrawType stored FHasCustomDrawType; + property BorderWidth: Integer read GetBorderWidth write SetBorderWidth stored FHasCustomBorderWidth; + property BorderDrawStyle: TBorderDrawStyle read GetBorderDrawStyle write SetBorderDrawStyle stored FHasCustomBorderDrawStyle; + property ButtonDrawStyle: TButtonDrawStyle read GetButtonDrawStyle write SetButtonDrawStyle stored FHasCustomButtonDrawStyle; + property BorderColor: TColor read GetBorderColor write SetBorderColor stored FHasCustomBorderColor; + property FontColor: TColor read GetFontColor write SetFontColor stored FHasCustomFontColor; + property FontStyle: TFontStyles read GetFontStyle write SetFontStyle stored FHasCustomFontStyle; + property ButtonColor: TColor read GetButtonColor write SetButtonColor stored FHasCustomButtonColor; + property Radius: Integer read GetRadius write SetRadius stored FHasCustomRadius; + property RoundedCorners: TRoundedCorners read GetRoundedCorners write SetRoundedCorners stored FHasCustomRoundedCorners; + property UseCustomAttributes: Boolean read HasCustomAttributes write SetCustomAttributes stored False; + end; + + // Abstraction of Graphic Button Attributes + IStyledButtonAttributes = interface + ['{C7BC98EE-D513-46B9-881A-2FDE8DE07786}'] + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AStyle: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + end; + + TButtonFamily = class(TObject) + private + FStyleFamily: TStyledButtonFamily; + FCustomAttributes: IStyledButtonAttributes; + public + property StyledAttributes: IStyledButtonAttributes read FCustomAttributes; + end; + +//utilities +function DarkenColor(Color:TColor; Percent:integer):TColor; +function LightenColor(Color:TColor; Percent:integer):TColor; +function HtmlToColor(Color: string): TColor; +function ColortoGrayscale(AColor : TColor): TColor; +function ColorIsLight(Color: TColor): Boolean; +function SameStyledButtonStyle(Style1, Style2: TStyledButtonAttributes): Boolean; +function SameNotificationBadgeAttributes(Attr1, Attr2: TNotificationBadgeAttributes): Boolean; +procedure CloneButtonStyle(const ASource: TStyledButtonAttributes; + var ADest: TStyledButtonAttributes); +function GetActiveStyleName(const AControl: TControl): string; +function GetWindowsVersion: TWindowsVersion; + +//Calculate Image and Text Rect for Drawing using ImageAlignment and ImageMargins +//for StyledButton and StyledGraphicButton +procedure CalcImageAndTextRect(const ASurfaceRect: TRect; + const ACaption: string; + out ATextRect: TRect; out AImageRect: TRect; + const AImageWidth, AImageHeight: Integer; + const AImageAlignment: TImageAlignment; + const AImageMargins: TImageMargins; + const AScale: Single); overload; + +//Calculate Image and Text Rect for Drawing using ButtonLayout, Margin and Spacing +//For StyledSpeedButton and StyledBitBtn +procedure CalcImageAndTextRect(const ACanvas: TCanvas; + const ACaption: string; const AClient: TRect; + const AOffset: TPoint; + var AGlyphPos: TPoint; var ATextBounds: TRect; + const AImageWidth, AImageHeight: Integer; + const ALayout: TButtonLayout; + const AMargin, ASpacing: Integer; + const ABiDiFlags: Cardinal); overload; + +//draw of Glyph +procedure DrawBitBtnGlyph(ACanvas: TCanvas; ARect: TRect; + Kind: Vcl.Buttons.TBitBtnKind; + AState: TButtonState; AEnabled: Boolean; + AOriginal: TBitmap; ANumGlyphs: Integer; const ATransparentColor: TColor); + +//drawing "old-style" with masked bitmap +procedure DrawBitmapTransparent(ACanvas: TCanvas; ARect: TRect; + const AWidth, AHeight: Integer; AOriginal: TBitmap; + AState: TButtonState; ANumGlyphs: Integer; const ATransparentColor: TColor); + +//drawing Command-Link Arrow (white or Black) +procedure DrawIconFromCommandLinkRes(ACanvas: TCanvas; ARect: TRect; + AVCLStyleName: string; AState: TButtonState; AEnabled: Boolean); + +//Draw rectangle and border into Canvas +procedure DrawRect(ACanvas: TCanvas; var ARect: TRect); +//draw Button into Canvas +procedure CanvasDrawShape(const ACanvas: TCanvas; ARect: TRect; + const ADrawType: TStyledButtonDrawType; const ACornerRadius: Single; + const ARoundedCorners: TRoundedCorners; + const APreserveBorderSpace: Boolean = True); +//draw Text into Canvas +procedure CanvasDrawText(const ACanvas: TCanvas; ARect: TRect; + const AText: string; ABiDiModeFlags: LongInt); +//draw bar and triangle for SplitButton into Canvas +procedure CanvasDrawBarAndTriangle(const ACanvas: TCanvas; const ARect: TRect; + const AScaleFactor: Single; ABarColor, ATriangleColor: TColor); +//draw Vertical bar into Canvas +procedure CanvasDrawBar(const ACanvas: TCanvas; const ARect: TRect; + const AScaleFactor: Single; ABarColor: TColor); +//draw a triangle into Canvas +procedure CanvasDrawTriangle(const ACanvas: TCanvas; const ARect: TRect; + const AScaleFactor: Single; ATriangleColor: TColor); + +//ButtonFamily Factory +procedure RegisterButtonFamily( + const AStyledButtonAttributes: IStyledButtonAttributes); +function GetButtonFamilies: TObjectList; +function GetButtonFamilyClass(const AFamilyName: TStyledButtonFamily): TButtonFamily; +function GetButtonFamilyName(const Index: Integer): TStyledButtonFamily; +function GetButtonClasses(const AFamily: TButtonFamily): TButtonClasses; +function GetButtonAppearances(const AFamily: TButtonFamily): TButtonAppearances; +function GetButtonFamilyClasses(const AFamily: TStyledButtonFamily): TButtonClasses; +function GetButtonFamilyAppearances(const AFamily: TStyledButtonFamily): TButtonAppearances; + +function StyleFamilyCheckAttributes( + const AFamily: TStyledButtonFamily; + var AClass: TStyledButtonClass; + var AAppearance: TStyledButtonAppearance; + out AButtonFamily: TButtonFamily): Boolean; + +procedure StyleFamilyUpdateAttributes( + const AFamily: TStyledButtonFamily; + var AClass: TStyledButtonClass; + var AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, + ASelectedStyle, AHotStyle, ADisabledStyle: TStyledButtonAttributes); + +procedure StyleFamilyUpdateAttributesByModalResult( + const AModalResult: TModalResult; + const AFamily: TStyledButtonFamily; + var AClass: TStyledButtonClass; + var AAppearance: TStyledButtonAppearance); + +implementation + +uses + System.Win.Registry +{$ifdef GDIPlusSupport} + , Winapi.GDIPAPI + , Winapi.GDIPOBJ +{$endif} + , System.SysUtils + , System.Math + , Vcl.StandardButtonStyles + ; + +var + _WindowsVersion: TWindowsVersion; + +function SameStyledButtonStyle(Style1, Style2: TStyledButtonAttributes): Boolean; +begin + Result := + (Style1.FDrawType = Style2.FDrawType) and + (Style1.FBorderWidth = Style2.FBorderWidth) and + (Style1.FBorderDrawStyle = Style2.FBorderDrawStyle) and + (Style1.FButtonDrawStyle = Style2.FButtonDrawStyle) and + (Style1.FBorderColor = Style2.FBorderColor) and + (Style1.FFontColor = Style2.FFontColor) and + (Style1.FFontStyle = Style2.FFontStyle) and + (Style1.FFontName = Style2.FFontName) and + (Style1.FButtonColor = Style2.FButtonColor) and + (Style1.FRadius = Style2.FRadius) and + (Style1.FRoundedCorners = Style2.FRoundedCorners); +end; + +function SameNotificationBadgeAttributes(Attr1, Attr2: TNotificationBadgeAttributes): Boolean; +begin + Result := + (Attr1.FNotificationCount = Attr2.FNotificationCount) and + (Attr1.FMaxNotifications = Attr2.FMaxNotifications) and + (Attr1.FPosition = Attr2.FPosition); +end; + +function ColortoGrayscale(AColor : TColor): TColor; +var + LGray : byte; +begin + // Ignore reserved color values : "INHERIT" (TColors.SysDefault) and "none" (TColors.SysNone) . + if (AColor = TColors.SysDefault) or (AColor = TColors.SysNone) then exit(aColor); + + // get the luminance according to https://www.w3.org/TR/AERT/#color-contrast + LGray := round((0.299 * GetRValue(aColor)) + (0.587 * GetGValue(aColor)) + (0.114 * GetBValue(aColor))); + + // set the result to the new grayscale color including the alpha info + Result := (aColor and $FF000000) or rgb(LGray, LGray, LGray); +end; + +function HtmlToColor(Color: string): TColor; +begin + Result := StringToColor('$' + Copy(Color, 6, 2) + Copy(Color, 4, 2) + Copy(Color, 2, 2)); +end; + +function DarkenColor(Color:TColor; Percent:Integer):TColor; +var r,g,b:Byte; +begin + Color:=ColorToRGB(Color); + r:=GetRValue(Color); + g:=GetGValue(Color); + b:=GetBValue(Color); + r:=r-muldiv(r,Percent,100); //Percent% closer to black + g:=g-muldiv(g,Percent,100); + b:=b-muldiv(b,Percent,100); + result:=RGB(r,g,b); +end; + +function LightenColor(Color:TColor; Percent:Integer):TColor; +var r,g,b:Byte; +begin + Color:=ColorToRGB(Color); + r:=GetRValue(Color); + g:=GetGValue(Color); + b:=GetBValue(Color); + r:=r+muldiv(255-r,Percent,100); //Percent% closer to white + g:=g+muldiv(255-g,Percent,100); + b:=b+muldiv(255-b,Percent,100); + result:=RGB(r,g,b); +end; + +function ColorIsLight(Color: TColor): Boolean; +begin + Color := ColorToRGB(Color); + Result := ((Color and $FF) + (Color shr 8 and $FF) + + (Color shr 16 and $FF))>= $180; +end; + +procedure CloneButtonStyle( + const ASource: TStyledButtonAttributes; + var ADest: TStyledButtonAttributes); +begin + ADest.FDrawType := ASource.FDrawType; + ADest.FBorderWidth := ASource.FBorderWidth; + ADest.FBorderDrawStyle := ASource.FBorderDrawStyle; + ADest.FButtonDrawStyle := ASource.FButtonDrawStyle; + ADest.FBorderColor := ASource.FBorderColor; + ADest.FFontStyle := ASource.FFontStyle; + ADest.FFontColor := ASource.FFontColor; + ADest.FButtonColor := ASource.FButtonColor; + ADest.FRadius := ASource.FRadius; + ADest.FRoundedCorners := ASource.FRoundedCorners; + + ADest.FCustomDrawType := ASource.FCustomDrawType; + ADest.FCustomBorderWidth := ASource.FCustomBorderWidth; + ADest.FCustomBorderDrawStyle := ASource.FCustomBorderDrawStyle; + ADest.FCustomButtonDrawStyle := ASource.FCustomButtonDrawStyle; + ADest.FCustomBorderColor := ASource.FCustomBorderColor; + ADest.FCustomFontStyle := ASource.FCustomFontStyle; + ADest.FCustomFontColor := ASource.FCustomFontColor; + ADest.FCustomButtonColor := ASource.FCustomButtonColor; + ADest.FCustomRadius := ASource.FCustomRadius; + ADest.FCustomRoundedCorners := ASource.FCustomRoundedCorners; + + ADest.FHasCustomDrawType := ASource.FHasCustomDrawType; + ADest.FHasCustomBorderWidth := ASource.FHasCustomBorderWidth; + ADest.FHasCustomBorderDrawStyle := ASource.FHasCustomBorderDrawStyle; + ADest.FHasCustomButtonDrawStyle := ASource.FHasCustomButtonDrawStyle; + ADest.FHasCustomBorderColor := ASource.FHasCustomBorderColor; + ADest.FHasCustomFontStyle := ASource.FHasCustomFontStyle; + ADest.FHasCustomFontColor := ASource.FHasCustomFontColor; + ADest.FHasCustomButtonColor := ASource.FHasCustomButtonColor; + ADest.FHasCustomRadius := ASource.FHasCustomRadius; + ADest.FHasCustomRoundedCorners := ASource.FHasCustomRoundedCorners; +end; + +function GetActiveStyleName(const AControl: TControl): string; +begin + {$IFDEF D10_4+} + Result := AControl.GetStyleName; + if Result = '' then + begin + {$IFDEF D11+} + if (csDesigning in AControl.ComponentState) then + Result := TStyleManager.ActiveDesigningStyle.Name + else + Result := TStyleManager.ActiveStyle.Name; + {$ELSE} + Result := TStyleManager.ActiveStyle.Name; + {$ENDIF} + end; + {$ELSE} + Result := TStyleManager.ActiveStyle.Name; + {$ENDIF} + if (csDesigning in AControl.ComponentState) then + begin + if (Result = 'Windows Designer Dark') or + (Result = 'Win10IDE_Dark') or + (Result = 'Win10IDE_Light') or + (Result = 'Mountain_Mist' ) then + Result := 'Windows'; + end; +end; + +function GetWindowsVersion: TWindowsVersion; +var + Reg: TRegistry; + VersionInfo: TOSVersionInfo; + LBuildNumber: Integer; +begin + if _WindowsVersion = wvUndefined then + begin + VersionInfo.dwOSVersionInfoSize := sizeOf(TOSVersionInfo); + Reg := TRegistry.Create; + Try + Reg.RootKey := HKEY_LOCAL_MACHINE; + case VersionInfo.dwPlatformID of + VER_PLATFORM_WIN32_WINDOWS: + Reg.OpenKeyReadOnly('\Software\Microsoft\Windows\CurrentVersion'); + else + Reg.OpenKeyReadOnly('\Software\Microsoft\Windows NT\CurrentVersion'); + end; + LBuildNumber := StrToIntDef(Reg.ReadString('CurrentBuild'), 0); + if LBuildNumber >= 22000 then + _WindowsVersion := wvWindows11 + else if LBuildNumber >= 10240 then + _WindowsVersion := wvWindows10 + else if LBuildNumber >= 9600 then + _WindowsVersion := wvWindows8_1 + else if LBuildNumber >= 9200 then + _WindowsVersion := wvWindows8 + else if LBuildNumber >= 7600 then + _WindowsVersion := wvWindows7 + else if LBuildNumber >= 6000 then + _WindowsVersion := wvWindowsVista + else if LBuildNumber >= 2600 then + _WindowsVersion := wvWindowsXP; + Reg.CloseKey; + Finally + Reg.Free; + End; + end; + Result := _WindowsVersion; +end; + +var + FFamilies: TObjectList; + +function GetButtonFamily(const AFamily: TStyledButtonFamily; + out AButtonFamily: TButtonFamily): Boolean; +var + I: Integer; + LButtonFamily: TButtonFamily; +begin + Result := False; + for I := 0 to FFamilies.Count -1 do + begin + LButtonFamily := FFamilies.Items[I] as TButtonFamily; + if SameText(LButtonFamily.FStyleFamily, AFamily) then + begin + AButtonFamily := LButtonFamily; + Result := True; + Exit; + end; + AButtonFamily := nil; + end; +end; + +function StyleFamilyCheckAttributes( + const AFamily: TStyledButtonFamily; + var AClass: TStyledButtonClass; + var AAppearance: TStyledButtonAppearance; + out AButtonFamily: TButtonFamily): Boolean; +var + I: Integer; + LClasses: TButtonClasses; + LAppearances: TButtonAppearances; + LDefaultClass: TStyledButtonClass; + LDefaultAppearance: TStyledButtonAppearance; + LClassFound, LAppearanceFound: Boolean; +begin + Result := True; + if GetButtonFamily(AFamily, AButtonFamily) then + begin + AButtonFamily.FCustomAttributes.GetStyleByModalResult(mrNone, + LDefaultClass, LDefaultAppearance); + //Check AClass + LClassFound := False; + LClasses := AButtonFamily.FCustomAttributes.GetButtonClasses; + for I := 0 to Length(LClasses)-1 do + begin + if SameText(LClasses[I], AClass) then + begin + AClass := LClasses[I]; + LClassFound := True; + break; + end; + end; + if not LClassFound then + begin + AClass := LDefaultClass; + Result := False; + end; + + //Check AAppearance + LAppearanceFound := False; + LAppearances := AButtonFamily.FCustomAttributes.GetButtonAppearances; + for I := 0 to Length(LAppearances)-1 do + begin + if SameText(LAppearances[I], AAppearance) then + begin + AAppearance := LAppearances[I]; + LAppearanceFound := True; + break; + end; + end; + if not LAppearanceFound then + begin + AAppearance := LDefaultAppearance; + Result := False; + end; + end; +end; + +procedure StyleFamilyUpdateAttributes( + const AFamily: TStyledButtonFamily; + var AClass: TStyledButtonClass; + var AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, + ASelectedStyle, AHotStyle, ADisabledStyle: TStyledButtonAttributes); +var + LButtonFamily: TButtonFamily; + LNormalStyle, LPressedStyle, LSelectedStyle, LHotStyle, LDisabledStyle: TStyledButtonAttributes; +begin + if GetButtonFamily(AFamily, LButtonFamily) then + begin + LNormalStyle := TStyledButtonAttributes.Create(nil); + LPressedStyle := TStyledButtonAttributes.Create(nil); + LSelectedStyle := TStyledButtonAttributes.Create(nil); + LHotStyle := TStyledButtonAttributes.Create(nil); + LDisabledStyle := TStyledButtonAttributes.Create(nil); + try + LButtonFamily.FCustomAttributes.UpdateAttributes( + AFamily, AClass, AAppearance, + LNormalStyle, LPressedStyle, LSelectedStyle, + LHotStyle, LDisabledStyle); + + ANormalStyle.AssignStyledAttributes(LNormalStyle); + APressedStyle.AssignStyledAttributes(LPressedStyle); + ASelectedStyle.AssignStyledAttributes(LSelectedStyle); + AHotStyle.AssignStyledAttributes(LHotStyle); + ADisabledStyle.AssignStyledAttributes(LDisabledStyle); + finally + LNormalStyle.Free; + LPressedStyle.Free; + LSelectedStyle.Free; + LHotStyle.Free; + LDisabledStyle.Free; + end; + //Attributes defined with Family/Class/Appearance reset any changes +(* + ANormalStyle.ResetChanged; + APressedStyle.ResetChanged; + ASelectedStyle.ResetChanged; + AHotStyle.ResetChanged; + ADisabledStyle.ResetChanged; +*) + end; +end; + +procedure StyleFamilyUpdateAttributesByModalResult( + const AModalResult: TModalResult; + const AFamily: TStyledButtonFamily; + var AClass: TStyledButtonClass; + var AAppearance: TStyledButtonAppearance); +var + LButtonFamily: TButtonFamily; +begin + if GetButtonFamily(AFamily, LButtonFamily) then + begin + LButtonFamily.FCustomAttributes.GetStyleByModalResult( + AModalResult, + AClass, AAppearance); + end; +end; + +procedure RegisterButtonFamily( + const AStyledButtonAttributes: IStyledButtonAttributes); +var + LFamily: TButtonFamily; +begin + LFamily := TButtonFamily.Create; + LFamily.FStyleFamily := AStyledButtonAttributes.ButtonFamilyName; + LFamily.FCustomAttributes := AStyledButtonAttributes; + if not Assigned(FFamilies) then + FFamilies := TObjectList.Create(True); + FFamilies.Add(LFamily); +end; + +function GetButtonFamilies: TObjectList; +begin + Result := FFamilies; +end; + +function GetButtonFamilyClass(const AFamilyName: TStyledButtonFamily): TButtonFamily; +begin + if not GetButtonFamily(AFamilyName, Result) then + raise Exception.CreateFmt(ERROR_FAMILY_NOT_FOUND,[AFamilyName]); +end; + +function GetButtonClasses(const AFamily: TButtonFamily): TButtonClasses; +begin + Result := AFamily.FCustomAttributes.GetButtonClasses; +end; + +function GetButtonAppearances(const AFamily: TButtonFamily): TButtonAppearances; +begin + Result := AFamily.FCustomAttributes.GetButtonAppearances; +end; + +function GetButtonFamilyName(const Index: Integer): TStyledButtonFamily; +begin + Result := (FFamilies.Items[Index] as TButtonFamily).FStyleFamily; +end; + +function GetButtonFamilyClasses(const AFamily: TStyledButtonFamily): TButtonClasses; +var + LButtonFamily: TButtonFamily; +begin + if GetButtonFamily(AFamily, LButtonFamily) then + Result := LButtonFamily.FCustomAttributes.GetButtonClasses + else + raise Exception.CreateFmt(ERROR_FAMILY_NOT_FOUND,[AFamily]); +end; + +function GetButtonFamilyAppearances(const AFamily: TStyledButtonFamily): TButtonAppearances; +var + LButtonFamily: TButtonFamily; +begin + if GetButtonFamily(AFamily, LButtonFamily) then + Result := LButtonFamily.FCustomAttributes.GetButtonAppearances + else + raise Exception.CreateFmt(ERROR_FAMILY_NOT_FOUND,[AFamily]); +end; + +{ TNotificationBadgeAttributes } + +procedure TNotificationBadgeAttributes.Assign(ASource: TPersistent); +var + LSource: TNotificationBadgeAttributes; +begin + if ASource is TNotificationBadgeAttributes then + begin + LSource := TNotificationBadgeAttributes(ASource); + NotificationCount := LSource.FNotificationCount; + MaxNotifications := LSource.FMaxNotifications; + Position := LSource.FPosition; + Color := LSource.FColor; + FontColor := LSource.FFontColor; + Size := LSource.FSize; + end + else + inherited Assign(ASource); +end; + +constructor TNotificationBadgeAttributes.Create(AOwner: TComponent); +begin + inherited; + FNotificationCount := 0; + FMaxNotifications := DEFAULT_MAX_BADGE_VALUE; + FPosition := nbpTopRight; + FColor := clRed; + FFontColor := clWhite; + FSize := nbsNormal; + if AOwner is TControl then + begin + FOwnerControl := TControl(AOwner); + SetSubComponent(True); + end; +end; + +function TNotificationBadgeAttributes.GetBadgeContent: string; +begin + if (FCustomText <> '') then + Result := FCustomText + else + begin + if FNotificationCount > MaxNotifications then + Result := IntToStr(MaxNotifications)+'+' + else if FNotificationCount > 0 then + Result := IntToStr(FNotificationCount) + else + Result := ''; + end; +end; + +function TNotificationBadgeAttributes.GetIsVisible: Boolean; +begin + Result := (FCustomText <> '') or (FNotificationCount > 0); +end; + +function TNotificationBadgeAttributes.HasCustomAttributes: Boolean; +begin + Result := (FNotificationCount <> 0) or + (FMaxNotifications <> DEFAULT_MAX_BADGE_VALUE) or + (FPosition <> nbpTopRight) or + (FColor <> clRed) or + (FFontColor <> clWhite) or + (FSize <> nbsNormal) or + (FCustomText <> ''); +end; + +procedure TNotificationBadgeAttributes.InvalidateControl; +begin + if Assigned(FOwnerControl) then + FOwnerControl.Invalidate; +end; + +procedure TNotificationBadgeAttributes.SetMaxNotifications(const AValue: Word); +begin + if FMaxNotifications <> AValue then + begin + FMaxNotifications := AValue; + if IsVisible then + InvalidateControl; + end; +end; + +procedure TNotificationBadgeAttributes.SetPosition(const AValue: TNotificationBadgePosition); +begin + if FPosition <> AValue then + begin + FPosition := AValue; + if IsVisible then + InvalidateControl; + end; +end; + +procedure TNotificationBadgeAttributes.SetSize( + const Value: TNotificationBadgeSize); +begin + if FSize <> Value then + begin + FSize := Value; + InvalidateControl; + end; +end; + +procedure TNotificationBadgeAttributes.SetCustomText(const AValue: string); +begin + if FCustomText <> AValue then + begin + FCustomText := AValue; + if Assigned(FOnContentChange) then + FOnContentChange(Self); + InvalidateControl; + end; +end; + +procedure TNotificationBadgeAttributes.SetColor(const AValue: TColor); +begin + if FColor <> AValue then + begin + FColor := AValue; + if IsVisible then + InvalidateControl; + end; +end; + +procedure TNotificationBadgeAttributes.SetNotificationCount(const AValue: Integer); +begin + if AValue < 0 then + raise Exception.Create(ERROR_NEGATIVE_VALUE); + if FNotificationCount <> AValue then + begin + FNotificationCount := AValue; + if Assigned(FOnContentChange) then + FOnContentChange(Self); + InvalidateControl; + end; +end; + +procedure TNotificationBadgeAttributes.SetFontColor(const AValue: TColor); +begin + if FFontColor <> AValue then + begin + FFontColor := AValue; + if IsVisible then + InvalidateControl; + end; +end; + +{ TStyledButtonAttributes } + +procedure TStyledButtonAttributes.SetCustomAttributes(const Value: Boolean); +begin + if not Value then + begin + ResetCustomAttributes; + InvalidateControl; + end; +end; + +function TStyledButtonAttributes.HasCustomAttributes: Boolean; +begin + Result := FHasCustomDrawType or + FHasCustomBorderWidth or + FHasCustomBorderDrawStyle or + FHasCustomButtonDrawStyle or + FHasCustomBorderColor or + FHasCustomFontColor or + FHasCustomFontStyle or + FHasCustomButtonColor or + FHasCustomRadius or + FHasCustomRoundedCorners; +end; + +function TStyledButtonAttributes.PenStyle: TPenStyle; +begin + case BorderDrawStyle of + brdClear: Result := psClear; + else + Result := psSolid; + end; +end; + +procedure TStyledButtonAttributes.ResetCustomAttributes; +begin + FHasCustomDrawType := False; + FHasCustomBorderWidth := False; + FHasCustomBorderDrawStyle := False; + FHasCustomButtonDrawStyle := False; + FHasCustomBorderColor := False; + FHasCustomFontColor := False; + FHasCustomFontStyle := False; + FHasCustomButtonColor := False; + FHasCustomRadius := False; + FHasCustomRoundedCorners := False; +end; + +procedure TStyledButtonAttributes.Assign(ASource: TPersistent); +var + LSource: TStyledButtonAttributes; +begin + if ASource is TStyledButtonAttributes then + begin + LSource := TStyledButtonAttributes(ASource); + CloneButtonStyle(LSource, Self); + end + else + inherited Assign(ASource); +end; + +function TStyledButtonAttributes.AssignStyledAttributes( + const ASource: TStyledButtonAttributes): Boolean; +begin + //Assign internal "custom" variable +(* + FCustomDrawType := ASource.FCustomDrawType; + FCustomBorderWidth := ASource.FCustomBorderWidth; + FCustomBorderDrawStyle := ASource.FCustomBorderDrawStyle; + FCustomButtonDrawStyle := ASource.FCustomButtonDrawStyle; + FCustomBorderColor := ASource.FCustomBorderColor; + FCustomFontColor := ASource.FCustomFontColor; + FCustomFontStyle := ASource.FCustomFontStyle; + FCustomButtonColor := ASource.FCustomButtonColor; + FCustomRadius := ASource.FCustomRadius; + FCustomRoundedCorners := ASource.FCustomRoundedCorners; +*) + //Assign internal variable + FDrawType := ASource.FDrawType; + FBorderWidth := ASource.FBorderWidth; + FBorderDrawStyle := ASource.FBorderDrawStyle; + FButtonDrawStyle := ASource.FButtonDrawStyle; + FBorderColor := ASource.FBorderColor; + FFontColor := ASource.FFontColor; + FFontStyle := ASource.FFontStyle; + FButtonColor := ASource.FButtonColor; + FRadius := ASource.FRadius; + FRoundedCorners := ASource.FRoundedCorners; + Result := True; +end; + +function TStyledButtonAttributes.BrushStyle: TBrushStyle; +begin + case FButtonDrawStyle of + btnClear: Result := bsClear; + else + Result := bsSolid; + end; +end; + +constructor TStyledButtonAttributes.Create(AOwner: TComponent); +begin + inherited; + FRadius := DEFAULT_RADIUS; + FRoundedCorners := ALL_ROUNDED_CORNERS; + FBorderDrawStyle := brdSolid; + FButtonDrawStyle := btnSolid; + + if AOwner is TControl then + begin + FOwnerControl := TControl(AOwner); + SetSubComponent(True); + end; +end; + +function TStyledButtonAttributes.GetBorderColor: TColor; +begin + if not HasCustomBorderColor then + Result := FBorderColor + else + Result := FCustomBorderColor; +end; + +function TStyledButtonAttributes.GetBorderDrawStyle: TBorderDrawStyle; +begin + if not HasCustomBorderDrawStyle then + Result := FBorderDrawStyle + else + Result := FCustomBorderDrawStyle; +end; + +function TStyledButtonAttributes.GetBorderWidth: Integer; +begin + if not HasCustomBorderWidth then + Result := FBorderWidth + else + Result := FCustomBorderWidth; +end; + +function TStyledButtonAttributes.GetButtonColor: TColor; +begin + if not HasCustomButtonColor then + Result := FButtonColor + else + Result := FCustomButtonColor; +end; + +function TStyledButtonAttributes.GetButtonDrawStyle: TButtonDrawStyle; +begin + if not HasCustomButtonDrawStyle then + Result := FButtonDrawStyle + else + Result := FCustomButtonDrawStyle; +end; + +function TStyledButtonAttributes.GetDrawType: TStyledButtonDrawType; +begin + if not HasCustomDrawType then + Result := FDrawType + else + Result := FCustomDrawType; +end; + +function TStyledButtonAttributes.GetFontColor: TColor; +begin + if not HasCustomFontColor then + Result := FFontColor + else + Result := FCustomFontColor; +end; + +function TStyledButtonAttributes.GetFontStyle: TFontStyles; +begin + if not HasCustomFontStyle then + Result := FFontStyle + else + Result := FCustomFontStyle; +end; + +function TStyledButtonAttributes.GetRadius: Integer; +begin + if not HasCustomRadius then + Result := FRadius + else + Result := FCustomRadius; +end; + +function TStyledButtonAttributes.GetRoundedCorners: TRoundedCorners; +begin + if not HasCustomRoundedCorners then + Result := FRoundedCorners + else + Result := FCustomRoundedCorners; +end; + +procedure TStyledButtonAttributes.InvalidateControl; +begin + if Assigned(FOwnerControl) then + FOwnerControl.Invalidate; +end; + +procedure TStyledButtonAttributes.SetBorderColor(const AValue: TColor); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomBorderColor <> AValue then + begin + FCustomBorderColor := AValue; + FHasCustomBorderColor := FCustomBorderColor <> FBorderColor; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FBorderColor <> AValue then + begin + FBorderColor := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetBorderDrawStyle(const AValue: TBorderDrawStyle); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomBorderDrawStyle <> AValue then + begin + FCustomBorderDrawStyle := AValue; + FHasCustomBorderDrawStyle := FCustomBorderDrawStyle <> FBorderDrawStyle; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FBorderDrawStyle <> AValue then + begin + FBorderDrawStyle := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetButtonDrawStyle(const AValue: TButtonDrawStyle); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomButtonDrawStyle <> AValue then + begin + FCustomButtonDrawStyle := AValue; + FHasCustomButtonDrawStyle := FCustomButtonDrawStyle <> FButtonDrawStyle; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FButtonDrawStyle <> AValue then + begin + FButtonDrawStyle := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetDrawType(const AValue: TStyledButtonDrawType); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomDrawType <> AValue then + begin + FCustomDrawType := AValue; + FHasCustomDrawType := FCustomDrawType <> FDrawType; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FDrawType <> AValue then + begin + FDrawType := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetBorderWidth(const AValue: Integer); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomBorderWidth <> AValue then + begin + FCustomBorderWidth := AValue; + FHasCustomBorderWidth := FCustomBorderWidth <> FBorderWidth; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FBorderWidth <> AValue then + begin + FBorderWidth := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetButtonColor(const AValue: TColor); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomButtonColor <> AValue then + begin + FCustomButtonColor := AValue; + FHasCustomButtonColor := FCustomButtonColor <> FButtonColor; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FButtonColor <> AValue then + begin + FButtonColor := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetFontColor(const AValue: TColor); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomFontColor <> AValue then + begin + FCustomFontColor := AValue; + FHasCustomFontColor := FCustomFontColor <> FFontColor; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FFontColor <> AValue then + begin + FFontColor := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetFontStyle(const AValue: TFontStyles); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomFontStyle <> AValue then + begin + FCustomFontStyle := AValue; + FHasCustomFontStyle := FCustomFontStyle <> FFontStyle; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FFontStyle <> AValue then + begin + FFontStyle := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetRadius(const AValue: Integer); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomRadius <> AValue then + begin + FCustomRadius := AValue; + FHasCustomRadius := FCustomRadius <> FRadius; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FRadius <> AValue then + begin + FRadius := AValue; + InvalidateControl; + end; + end; +end; + +procedure TStyledButtonAttributes.SetRoundedCorners(const AValue: TRoundedCorners); +begin + if Assigned(FOwnerControl) then + begin + //Setting a Custom property value + if FCustomRoundedCorners <> AValue then + begin + FCustomRoundedCorners := AValue; + FHasCustomRoundedCorners := FCustomRoundedCorners <> FRoundedCorners; + InvalidateControl; + end + end + else + begin + //Setting a property using StyleFamily, StyleClass and StyleAppearance + if FRoundedCorners <> AValue then + begin + FRoundedCorners := AValue; + InvalidateControl; + end; + end; +end; + +procedure AdjustCanvasRect(const ACanvas: TCanvas; + var ARect: TRect; ADrawingRect: Boolean); +var + LWidth: Integer; +begin + if not ADrawingRect then + begin + //Drawing RoundRect with border + LWidth := (ACanvas.Pen.Width) div 2; + InflateRect(ARect, -LWidth, -LWidth); + if not Odd(ACanvas.Pen.Width) then + begin + ARect.Width := ARect.Width +1; + ARect.Height := ARect.Height +1; + end; + end + else + begin + if ACanvas.Pen.Style <> psClear then + begin + //Reduce Canvas to draw a Square of Pen.Width + LWidth := ACanvas.Pen.Width div 2; + InflateRect(ARect, -LWidth, -LWidth); + if not Odd(ACanvas.Pen.Width) then + begin + ARect.Width := ARect.Width +1; + ARect.Height := ARect.Height +1; + end; + end; + end; + if ARect.Height < 2 then + ARect.Height := 2; + if ARect.Width < 2 then + ARect.Width := 2; +end; + +{$ifdef GDIPlusSupport} +(* +function GetRoundedPath(ARectangle: TGPRectF; + ARadius: Single): TGPGraphicsPath; +var + LPath : TGPGraphicsPath; + l, t, w, h, d : Single; +begin + LPath := TGPGraphicsPath.Create; + l := ARectangle.X; + t := ARectangle.y; + w := ARectangle.Width; + h := ARectangle.Height; + d := ARadius / 2; + + // the lines beween the arcs are automatically added by the path + LPath.AddArc(l, t, d, d, 180, 90); // topleft + LPath.AddArc(l + w - d, t, d, d, 270, 90); // topright + LPath.AddArc(l + w - d, t + h - d, d, d, 0, 90); // bottomright + LPath.AddArc(l, t + h - d, d, d, 90, 90); // bottomleft + + LPath.CloseFigure(); + result := LPath; +end; +*) +function GetRoundedCornersPath(ARectangle: TGPRectF; + ARadius: Single; ARoundedCorners: TRoundedCorners): TGPGraphicsPath; +const + d0 = 0.0001; +var + LPath : TGPGraphicsPath; + l, t, w, h, d : Single; +begin + LPath := TGPGraphicsPath.Create; + l := ARectangle.X; + t := ARectangle.Y; + w := ARectangle.Width; + h := ARectangle.Height; + d := ARadius / 2; + + // topleft + if rcTopLeft in ARoundedCorners then + LPath.AddArc(l, t, d, d, 180, 90) + else + LPath.AddArc(l, t, d0, d0, 180, 90); + + // topright + if rcTopRight in ARoundedCorners then + LPath.AddArc(l + w - d, t, d, d, 270, 90) + else + LPath.AddArc(l + w - d0, t, d0, d0, 270, 90); + + // bottomright + if rcBottomRight in ARoundedCorners then + LPath.AddArc(l + w - d, t + h - d, d, d, 0, 90) + else + LPath.AddArc(l + w - d0, t + h - d0, d0, d0, 0, 90); + + // bottomleft + if rcBottomLeft in ARoundedCorners then + LPath.AddArc(l, t + h - d, d, d, 90, 90) + else + LPath.AddArc(l, t + h - d0, d0, d0, 90, 90); + + LPath.CloseFigure(); + result := LPath; +end; + +function GPColor(AColor: TColor): TGPColor; +var + ColRef: COLORREF; +begin + ColRef := ColorToRGB(AColor); + Result := MakeColor(GetRValue(ColRef), GetGValue(ColRef), + GetBValue(ColRef)); +end; +{$ifend} + +const //Same as Vcl.Buttons + BitBtnResNames: array[TBitBtnKind] of PChar = ( + nil, 'BBOK', 'BBCANCEL', 'BBHELP', 'BBYES', 'BBNO', 'BBCLOSE', + 'BBABORT', 'BBRETRY', 'BBIGNORE', 'BBALL'); + +procedure CalcImageAndTextRect(const ASurfaceRect: TRect; + const ACaption: string; + out ATextRect: TRect; out AImageRect: TRect; + const AImageWidth, AImageHeight: Integer; + const AImageAlignment: TImageAlignment; + const AImageMargins: TImageMargins; + const AScale: Single); +var + IW, IH, IX, IY: Integer; + LImageAlignment: TImageAlignment; +begin + if ACaption = '' then + LImageAlignment := iaCenter + else + LImageAlignment := AImageAlignment; + //Text Rect as whole surface Rect (if there is no Image) + ATextRect := ASurfaceRect; + + //Calc Image Rect and Change ATextRect + IH := AImageHeight; + IW := AImageWidth; + if (IH > 0) and (IW > 0) then + begin + IX := Round(ATextRect.Left + (2*AScale)); + IY := ATextRect.Top + (ATextRect.Height - IH) div 2; + case LImageAlignment of + iaCenter: + begin + IX := ATextRect.CenterPoint.X - IW div 2; + end; + iaLeft: + begin + IX := Round(ATextRect.Left + (2*AScale)); + Inc(IX, AImageMargins.Left); + Inc(IY, AImageMargins.Top); + Dec(IY, AImageMargins.Bottom); + ATextRect.Left := IX + IW + AImageMargins.Right; + end; + iaRight: + begin + IX := Round(ATextRect.Right - IW - (2*AScale)); + Dec(IX, AImageMargins.Right); + Dec(IX, AImageMargins.Left); + Inc(IY, AImageMargins.Top); + Dec(IY, AImageMargins.Bottom); + ATextRect.Right := IX; + end; + iaTop: + begin + IX := ATextRect.Left + (ATextRect.Width - IW) div 2; + Inc(IX, AImageMargins.Left); + Dec(IX, AImageMargins.Right); + IY := Round(ATextRect.Top + (2*AScale)); + Inc(IY, AImageMargins.Top); + ATextRect.Top := IY + IH + AImageMargins.Bottom; + end; + iaBottom: + begin + IX := ATextRect.Left + (ATextRect.Width - IW) div 2; + Inc(IX, AImageMargins.Left); + Dec(IX, AImageMargins.Right); + IY := Round(ATextRect.Bottom - IH - (2*AScale)); + Dec(IY, AImageMargins.Bottom); + Dec(IY, AImageMargins.Top); + ATextRect.Bottom := IY; + end; + end; + end + else + begin + IX := 0; + IY := 0; + end; + AImageRect.Left := IX; + AImageRect.Top := IY; + AImageRect.Width := IW; + AImageRect.Height := IH; + + if ATextRect.IsEmpty then + ATextRect := ASurfaceRect; +end; + +procedure CalcImageAndTextRect(const ACanvas: TCanvas; + const ACaption: string; const AClient: TRect; + const AOffset: TPoint; + var AGlyphPos: TPoint; var ATextBounds: TRect; + const AImageWidth, AImageHeight: Integer; + const ALayout: TButtonLayout; + const AMargin, ASpacing: Integer; + const ABiDiFlags: Cardinal); +var + LTextPos: TPoint; + LClientSize, LGlyphSize, LTextSize: TPoint; + LTotalSize: TPoint; + LLayout: TButtonLayout; + LMargin, LSpacing: Integer; +begin + LLayout := ALayout; + if (ABiDiFlags and DT_RIGHT) = DT_RIGHT then + begin + if LLayout = blGlyphLeft then LLayout := blGlyphRight + else if LLayout = blGlyphRight then LLayout := blGlyphLeft; + end; + + { calculate the item sizes } + LClientSize := Point( + AClient.Right - AClient.Left, + AClient.Bottom - AClient.Top); + + LGlyphSize := Point(AImageWidth, AImageHeight); + + if Length(ACaption) > 0 then + begin + ATextBounds := Rect(0, 0, AClient.Right - AClient.Left, 0); + DrawText(ACanvas.Handle, ACaption, Length(ACaption), ATextBounds, + DT_CALCRECT or ABiDiFlags); + LTextSize := Point( + ATextBounds.Right - ATextBounds.Left, + ATextBounds.Bottom - ATextBounds.Top); + end + else + begin + ATextBounds := Rect(0, 0, 0, 0); + LTextSize := Point(0,0); + end; + + { If the layout has the glyph on the right or the left, then both the + text and the glyph are centered vertically. If the glyph is on the top + or the bottom, then both the text and the glyph are centered horizontally.} + if LLayout in [blGlyphLeft, blGlyphRight] then + begin + AGlyphPos.Y := (LClientSize.Y - LGlyphSize.Y + 1) div 2; + LTextPos.Y := (LClientSize.Y - LTextSize.Y + 1) div 2; + end + else + begin + AGlyphPos.X := (LClientSize.X - LGlyphSize.X + 1) div 2; + LTextPos.X := (LClientSize.X - LTextSize.X + 1) div 2; + end; + + { if there is no text or no bitmap, then Spacing is irrelevant } + if (LTextSize.X = 0) or (LGlyphSize.X = 0) then + LSpacing := 0 + else + LSpacing := ASpacing; + + { adjust Margin and Spacing } + LMargin := AMargin; + if LMargin = -1 then + begin + if LSpacing < 0 then + begin + LTotalSize := Point(LGlyphSize.X + LTextSize.X, LGlyphSize.Y + LTextSize.Y); + if ALayout in [blGlyphLeft, blGlyphRight] then + LMargin := (LClientSize.X - LTotalSize.X) div 3 + else + LMargin := (LClientSize.Y - LTotalSize.Y) div 3; + LSpacing := LMargin; + end + else + begin + LTotalSize := Point(LGlyphSize.X + LSpacing + LTextSize.X, LGlyphSize.Y + + LSpacing + LTextSize.Y); + if LLayout in [blGlyphLeft, blGlyphRight] then + LMargin := (LClientSize.X - LTotalSize.X + 1) div 2 + else + LMargin := (LClientSize.Y - LTotalSize.Y + 1) div 2; + end; + end + else + begin + if LSpacing < 0 then + begin + LTotalSize := Point( + LClientSize.X - (LMargin + LGlyphSize.X), + LClientSize.Y - (LMargin + LGlyphSize.Y)); + if LLayout in [blGlyphLeft, blGlyphRight] then + LSpacing := (LTotalSize.X - LTextSize.X) div 2 + else + LSpacing := (LTotalSize.Y - LTextSize.Y) div 2; + end; + end; + + case LLayout of + blGlyphLeft: + begin + AGlyphPos.X := LMargin; + LTextPos.X := AGlyphPos.X + LGlyphSize.X + LSpacing; + end; + blGlyphRight: + begin + AGlyphPos.X := LClientSize.X - LMargin - LGlyphSize.X; + LTextPos.X := AGlyphPos.X - LSpacing - LTextSize.X; + end; + blGlyphTop: + begin + AGlyphPos.Y := LMargin; + LTextPos.Y := AGlyphPos.Y + LGlyphSize.Y + LSpacing; + end; + blGlyphBottom: + begin + AGlyphPos.Y := LClientSize.Y - LMargin - LGlyphSize.Y; + LTextPos.Y := AGlyphPos.Y - LSpacing - LTextSize.Y; + end; + end; + + { fixup the result variables } + Inc(AGlyphPos.X, AClient.Left + AOffset.X); + Inc(AGlyphPos.Y, AClient.Top + AOffset.Y); + + OffsetRect(ATextBounds, LTextPos.X + AClient.Left + AOffset.X, LTextPos.Y + AClient.Top + AOffset.Y); +end; + +procedure DrawIconFromCommandLinkRes(ACanvas: TCanvas; ARect: TRect; + AVCLStyleName: string; AState: TButtonState; AEnabled: Boolean); +var + LResName: String; + LThemeAttribute: TThemeAttribute; + {$IFDEF D10_4+} + LImage: TWicImage; + {$ELSE} + LBitmap: TBitmap; + {$ENDIF} +begin + if AVCLStyleName = RESOURCE_SHIELD_ICON then + begin + LResName := RESOURCE_SHIELD_ICON; + end + else if (AVCLStyleName = 'Windows') then + begin + //Load image from resources by Kind + LResName := 'CMD_LINK_ARROW_BLUE'; + end + else + begin + if ACanvas.Font.Color = clWhite then + LResName := 'CMD_LINK_ARROW_WHITE' + else if ACanvas.Font.Color = clBlack then + LResName := 'CMD_LINK_ARROW_BLACK' + else + begin + GetStyleAttributes(AVCLStyleName, LThemeAttribute); + if LThemeAttribute.ThemeType = ttLight then + LResName := 'CMD_LINK_ARROW_BLACK' + else + LResName := 'CMD_LINK_ARROW_WHITE'; + end; + end; + {$IFDEF D10_4+} + LImage := TWicImage.Create; + try + LImage.InterpolationMode := wipmHighQualityCubic; + LImage.LoadFromResourceName(HInstance, LResName); + ACanvas.StretchDraw(ARect, LImage); + Exit; + finally + LImage.Free; + end; + {$ELSE} + LBitmap := TBitmap.Create; + try + LBitmap.PixelFormat := pf32bit; + //LBitmap.TransparentMode := tmFixed; + LBitmap.LoadFromResourceName(HInstance, LResName); + //ACanvas.StretchDraw(ARect, LBitmap); + //LBitmapRect := TRect.Create(ARect.Top, ARect.Left, LBitmap.Width, LBitmap.Height); + DrawBitmapTransparent(ACanvas, ARect, ARect.Width, ARect.Height, LBitmap, bsUp, 1, clBlack); + Exit; + finally + LBitmap.Free; + end; + {$ENDIF} +end; + +procedure DrawBitmapTransparent(ACanvas: TCanvas; ARect: TRect; + const AWidth, AHeight: Integer; AOriginal: TBitmap; + AState: TButtonState; ANumGlyphs: Integer; const ATransparentColor: TColor); +const + ROP_DSPDxax = $00E20746; +var + IL: TImageList; + TmpImage, MonoBmp, DDB: TBitmap; + IRect, ORect: TRect; + I: TButtonState; + DestDC: HDC; + LIndex: Integer; +begin + LIndex := -1; + TmpImage := nil; + IL := nil; + try + TmpImage := TBitmap.Create; + TmpImage.Width := AWidth; + TmpImage.Height := AHeight; + IL := TImageList.CreateSize(TmpImage.Width, TmpImage.Height); + IRect := Rect(0, 0, AWidth, AHeight); + TmpImage.Canvas.Brush.Color := clBtnFace; + TmpImage.Palette := CopyPalette(AOriginal.Palette); + I := AState; + if Ord(I) >= ANumGlyphs then I := bsUp; + ORect := Rect(Ord(I) * AWidth, 0, (Ord(I) + 1) * AWidth, AHeight); + case AState of + bsUp, bsDown, + bsExclusive: + begin + TmpImage.Canvas.CopyRect(IRect, AOriginal.Canvas, ORect); + if AOriginal.TransparentMode = tmFixed then + LIndex := IL.AddMasked(TmpImage, ATransparentColor) + else + LIndex := IL.AddMasked(TmpImage, clDefault); + IL.Masked := True; + end; + bsDisabled: + begin + MonoBmp := nil; + DDB := nil; + try + MonoBmp := TBitmap.Create; + DDB := TBitmap.Create; + DDB.Assign(AOriginal); + DDB.HandleType := bmDDB; + if ANumGlyphs > 1 then + with TmpImage.Canvas do + begin { Change white & gray to clBtnHighlight and clBtnShadow } + CopyRect(IRect, DDB.Canvas, ORect); + MonoBmp.Monochrome := True; + MonoBmp.Width := AWidth; + MonoBmp.Height := AHeight; + + { Convert white to clBtnHighlight } + DDB.Canvas.Brush.Color := clWhite; + MonoBmp.Canvas.CopyRect(IRect, DDB.Canvas, ORect); + Brush.Color := clBtnHighlight; + DestDC := Handle; + SetTextColor(DestDC, clBlack); + SetBkColor(DestDC, clWhite); + BitBlt(DestDC, 0, 0, AWidth, AHeight, + MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + + { Convert gray to clBtnShadow } + DDB.Canvas.Brush.Color := clGray; + MonoBmp.Canvas.CopyRect(IRect, DDB.Canvas, ORect); + Brush.Color := clBtnShadow; + DestDC := Handle; + SetTextColor(DestDC, clBlack); + SetBkColor(DestDC, clWhite); + BitBlt(DestDC, 0, 0, AWidth, AHeight, + MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + + { Convert transparent color to clBtnFace } + DDB.Canvas.Brush.Color := ColorToRGB(ATransparentColor); + MonoBmp.Canvas.CopyRect(IRect, DDB.Canvas, ORect); + Brush.Color := clBtnFace; + DestDC := Handle; + SetTextColor(DestDC, clBlack); + SetBkColor(DestDC, clWhite); + BitBlt(DestDC, 0, 0, AWidth, AHeight, + MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + end + else + begin + { Create a disabled version } + with MonoBmp do + begin + Assign(AOriginal); + HandleType := bmDDB; + Canvas.Brush.Color := clBlack; + Width := AWidth; + if Monochrome then + begin + Canvas.Font.Color := clWhite; + Monochrome := False; + Canvas.Brush.Color := clWhite; + end; + Monochrome := True; + end; + with TmpImage.Canvas do + begin + Brush.Color := clBtnFace; + FillRect(IRect); + Brush.Color := clBtnHighlight; + SetTextColor(Handle, clBlack); + SetBkColor(Handle, clWhite); + BitBlt(Handle, 1, 1, AWidth, AHeight, + MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + Brush.Color := clBtnShadow; + SetTextColor(Handle, clBlack); + SetBkColor(Handle, clWhite); + BitBlt(Handle, 0, 0, AWidth, AHeight, + MonoBmp.Canvas.Handle, 0, 0, ROP_DSPDxax); + end; + end; + finally + DDB.Free; + MonoBmp.Free; + end; + LIndex := IL.AddMasked(TmpImage, clDefault); + end; + end; + ImageList_DrawEx(IL.Handle, LIndex, ACanvas.Handle, ARect.Left, ARect.Top, AWidth, AHeight, + clNone, clNone, ILD_Transparent); + finally + IL.Free; + TmpImage.Free; + end; +end; + +procedure DrawBitBtnGlyph(ACanvas: TCanvas; ARect: TRect; + Kind: Vcl.Buttons.TBitBtnKind; + AState: TButtonState; AEnabled: Boolean; + AOriginal: TBitmap; ANumGlyphs: Integer; const ATransparentColor: TColor); +var + LResName: String; + LOriginal: TBitmap; + LNumGlyphs: Integer; + {$IFDEF D10_4+} + LImage: TWicImage; + {$ENDIF} +begin + if not AEnabled then + AState := bsDisabled; + LOriginal := nil; + try + if Kind = bkCustom then + begin + if ANumGlyphs = 0 then + Exit; + LOriginal := AOriginal; + LNumGlyphs := ANumGlyphs; + end + else + begin + //Load image from resources by Kind + LResName := BitBtnResNames[Kind]; + {$IFDEF D10_4+} + LImage := TWicImage.Create; + try + LImage.InterpolationMode := wipmHighQualityCubic; + LImage.LoadFromResourceName(HInstance, LResName); + ACanvas.StretchDraw(ARect, LImage); + Exit; + finally + LImage.Free; + end; + {$ELSE} + LOriginal := TBitmap.Create; + LNumGlyphs := 2; + LOriginal.PixelFormat := pf32bit; + LOriginal.LoadFromResourceName(HInstance, LResName); + {$ENDIF} + end; + if not Assigned(LOriginal) or ((LOriginal.Width = 0) or (LOriginal.Height = 0)) then + Exit; + DrawBitmapTransparent(ACanvas, ARect, LOriginal.Width div LNumGlyphs, LOriginal.Height, LOriginal, + AState, LNumGlyphs, ATransparentColor); + finally + if Kind <> bkCustom then + LOriginal.Free; + end; +end; + +procedure CanvasDrawBar(const ACanvas: TCanvas; const ARect: TRect; + const AScaleFactor: Single; ABarColor: TColor); +var + Points2: array [0..1] of TPoint; + LRect: TRect; +begin + //Draw vertical bar + ACanvas.Pen.Color := ABarColor; + LRect := Rect(ARect.Left-2,ARect.Top+2,ARect.Right-2,ARect.Bottom-2); + Points2[0] := Point(ARect.Left -1, ARect.Top + ACanvas.Pen.Width); + Points2[1] := Point(ARect.Left -1, ARect.Bottom - ACanvas.Pen.Width); + ACanvas.Polyline(Points2); +end; + +procedure CanvasDrawTriangle(const ACanvas: TCanvas; const ARect: TRect; + const AScaleFactor: Single; ATriangleColor: TColor); +var + LWidth: Integer; + LHeight: Integer; + LMargin: Integer; + Points3: array [0..2] of TPoint; + LRect: TRect; +begin + //Draw triangle + LHeight := Round(4 * AScaleFactor); + LMargin := (ARect.Height - LHeight) div 2; + ACanvas.Pen.Color := ATriangleColor; + LRect := ARect; + LWidth := LRect.Width - 8; + LRect.Left := ARect.Left + 2; + LRect.Right := LRect.Left + LWidth - 2; + LRect.Top := LMargin; + LRect.Bottom := LRect.Top + LHeight; + Points3[0] := Point(LRect.Left + LWidth, LRect.Top); + Points3[1] := Point(LRect.Left, LRect.Top); + Points3[2] := Point(LRect.Left + LWidth div 2, LRect.Bottom); + ACanvas.Brush.Color := ACanvas.Pen.Color; + ACanvas.Pen.Width := 1; + ACanvas.Polygon(Points3); +end; + +procedure CanvasDrawBarAndTriangle(const ACanvas: TCanvas; const ARect: TRect; + const AScaleFactor: Single; ABarColor, ATriangleColor: TColor); +begin + //Draw vertical bar + CanvasDrawBar(ACanvas, ARect, AScaleFactor, ABarColor); + + //Draw triangle + CanvasDrawTriangle(ACanvas, ARect, AScaleFactor, ATriangleColor); +end; + +{$ifdef GDIPlusSupport} +procedure CanvasDrawShape(const ACanvas: TCanvas; ARect: TRect; + const ADrawType: TStyledButtonDrawType; const ACornerRadius: Single; + const ARoundedCorners: TRoundedCorners; + const APreserveBorderSpace: Boolean = True); +var + LGraphics: TGPGraphics; + LPen: TGPPen; + LBrush: TGPBrush; + LButtonColor, LPenColor: TGPColor; + LRect: TGPRectF; + LPath: TGPGraphicsPath; + LBorderWidth: Single; + X, Y, W, H: Single; + LCornerRadius: Single; + + procedure GPInflateRectF(var ARect: TGPRectF; + const AValue: Single); + begin + ARect.X := ARect.X + (AValue / 2); + ARect.Y := ARect.Y + (AValue / 2); + ARect.Width := ARect.width - AValue -1; + ARect.Height := ARect.Height - AValue -1; + end; + +begin + LGraphics := nil; + LPen := nil; + try + X := ARect.Left; + Y := ARect.Top; + W := ARect.Width; + H := ARect.Height; + LRect := Winapi.GDIPAPI.MakeRect(X, Y, W, H); + LBorderWidth := ACanvas.Pen.Width; + LGraphics := TGPGraphics.Create(ACanvas.Handle); + LGraphics.SetSmoothingMode(SmoothingModeAntiAlias); + LPenColor := GPColor(ACanvas.Pen.Color); + LButtonColor := GPColor(ACanvas.Brush.Color); + + if ACanvas.Pen.Style = psClear then + LPen := TGPPen.Create(TAlphaColorRec.Null, LBorderWidth) + else + LPen := TGPPen.Create(LPenColor, LBorderWidth); + + if (ADrawType in [btRect]) then + begin + DrawRect(ACanvas, ARect); + end + else if (ADrawType in [btRounded, btRoundRect]) then + begin + //Reduce canvas to draw a rounded rectangle of Pen Width + if APreserveBorderSpace then + GPInflateRectF(LRect, LBorderWidth) + else + GPInflateRectF(LRect, 1); + if ADrawType = btRoundRect then + LCornerRadius := ACornerRadius //Drawing a Rounded Rect + else + LCornerRadius := LRect.Height - LBorderWidth; //Drawing a Rounded Button + LPath := GetRoundedCornersPath(LRect, LCornerRadius*2, ARoundedCorners); + if ACanvas.Brush.Style = bsSolid then + begin + LBrush := TGPSolidBrush.Create(LButtonColor); + LGraphics.FillPath(LBrush, LPath); + end; + LGraphics.DrawPath(LPen, LPath); + end + else + begin + //Reduce canvas + GPInflateRectF(LRect, LBorderWidth); + //Drawing Circle or Ellipsis + if ACanvas.Brush.Style = bsSolid then + begin + LBrush := TGPSolidBrush.Create(LButtonColor); + LGraphics.FillEllipse(LBrush, LRect); + end; + LGraphics.DrawEllipse(LPen, LRect); + end; + finally + LGraphics.Free; + LPen.Free; + end; +end; +{$else} +procedure CanvasDrawShape(const ACanvas: TCanvas; ARect: TRect; + const ADrawType: TStyledButtonDrawType; const ACornerRadius: Single; + const APreserveBorderSpace: Boolean = True); +var + LCornerRadius, LBorderWidth: Integer; +begin + LBorderWidth := ACanvas.Pen.Width; + if ADrawType in [btRounded, btRoundRect] then + begin + if APreserveBorderSpace then + AdjustCanvasRect(ACanvas, ARect, False); + if ADrawType = btRoundRect then + LCornerRadius := Round(ACornerRadius*2) //Drawing a Rounded Rect + else + LCornerRadius := ARect.Height - LBorderWidth; //Drawing a Rounded Button + ACanvas.RoundRect(ARect, Round(LCornerRadius), LCornerRadius); + end + else if ADrawType in [btRect] then + begin + AdjustCanvasRect(ACanvas, ARect, True); + if ACanvas.Brush.Style = bsSolid then + ACanvas.FillRect(ARect); + ACanvas.Rectangle(ARect); + end + else + begin + //Drawing Circle or Ellipsis + ACanvas.Ellipse(ARect.Left, ARect.Top, + ARect.Left + ARect.Width, ARect.Top + ARect.Height); + end; +end; +{$endif} + +{$ifdef DrawRectWithGDIPlus} +procedure DrawRect(ACanvas: TCanvas; var ARect: TRect); +var + LGraphics: TGPGraphics; + LBrush: TGPBrush; + LPen: TGPPen; + LButtonColor, LPenColor: TGPColor; + LBorderWidth: Integer; + LRect: TGPRectF; + X, Y, W, H: Single; + + procedure GPInflateRectF(var ARect: TGPRectF; + const AValue: Single); + begin + ARect.X := ARect.X + (AValue / 2); + ARect.Y := ARect.Y + (AValue / 2); + ARect.Width := ARect.width - AValue; + ARect.Height := ARect.Height - AValue; + end; + +begin + LGraphics := nil; + LBrush := nil; + LPen := nil; + try + X := ARect.Left; + Y := ARect.Top; + W := ARect.Width; + H := ARect.Height; + LGraphics := TGPGraphics.Create(ACanvas.Handle); + LPenColor := GPColor(ACanvas.Pen.Color); + LButtonColor := GPColor(ACanvas.Brush.Color); + LBrush := TGPSolidBrush.Create(LButtonColor); + LBorderWidth := ACanvas.Pen.Width; + if ACanvas.Pen.Style = psClear then + LPen := TGPPen.Create(TAlphaColorRec.Null, LBorderWidth) + else + LPen := TGPPen.Create(LPenColor, LBorderWidth); + //Reduce canvas to draw a rounded rectangle of Pen Width + LRect := Winapi.GDIPAPI.MakeRect(X, Y, W, H); + GPInflateRectF(LRect, LBorderWidth); + //GDI+ equivalent of FillRect and Rectangle + LGraphics.FillRectangle(LBrush, X, Y, W, H); + LGraphics.DrawRectangle(LPen, LRect); + finally + LBrush.Free; + LGraphics.Free; + LPen.Free; + end; +end; +{$else} +procedure DrawRect(ACanvas: TCanvas; var ARect: TRect); +begin + //Drawing Rectangular button (no need to GDI+) + AdjustCanvasRect(ACanvas, ARect, True); + if ACanvas.Brush.Style = bsSolid then + ACanvas.FillRect(ARect); + ACanvas.Rectangle(ARect); +end; +{$endif} + + +{$ifdef DrawTextWithGDIPlus} +function FontStyleToGDI(AFont: TFont): TFontStyle; +begin + Result := FontStyleRegular; + if fsBold in AFont.Style then + Result := Result + FontStyleBold; + if fsItalic in AFont.Style then + Result := Result + FontStyleItalic; + if fsUnderline in AFont.Style then + Result := Result + FontStyleUnderline; + if fsStrikeOut in AFont.Style then + Result := Result + FontStyleStrikeout; +end; + +procedure CanvasDrawText(const ACanvas: TCanvas; ARect: TRect; + const AText: string; ABiDiModeFlags: LongInt); +var + LGraphics: TGPGraphics; + LFontFamily: TGPFontFamily; + LFont: TGPFont; + LFontStyle: TFontStyle; + LSolidBrush: TGPSolidBrush; + LFontColor: TGPColor; + LPointF: TGPPointF; + X,Y: Single; + R: TRectF; +begin + LGraphics := nil; + LFontFamily := nil; + LFont := nil; + try + LGraphics := TGPGraphics.Create(ACanvas.Handle); + LFontFamily := TGPFontFamily.Create(ACanvas.Font.Name); + LFontStyle := FontStyleToGDI(ACanvas.Font); + LFont := TGPFont.Create(LFontFamily, -ACanvas.Font.Height, + LFontStyle, UnitPixel); + LFontColor := GPColor(ACanvas.Font.Color); + LSolidBrush := TGPSolidBrush.Create(LFontColor); + X := ARect.Left-1; + Y := ARect.Top-1; + LPointF := MakePoint(X, Y); + LGraphics.DrawString(AText, Length(AText), LFont, LPointF, LSolidBrush); + finally + LGraphics.Free; + LFontFamily.Free; + LFont.Free; + end; +end; +{$else} +procedure CanvasDrawText(const ACanvas: TCanvas; ARect: TRect; + const AText: string; ABiDiModeFlags: LongInt); +begin + Winapi.Windows.DrawText(ACanvas.Handle, PChar(AText), + Length(AText), ARect, ABiDiModeFlags); +end; +{$endif} + +initialization + _WindowsVersion := wvUndefined; + +finalization + FFamilies.Free; + +end. diff --git a/Ext/StyledComponents/source/Vcl.ColorButtonStyles.pas b/Ext/StyledComponents/source/Vcl.ColorButtonStyles.pas new file mode 100644 index 0000000..2ebe49f --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.ColorButtonStyles.pas @@ -0,0 +1,453 @@ +{******************************************************************************} +{ } +{ ColorButtonStyles: Button Styles based on VCL color names } +{ Unit System.UIConsts } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.ColorButtonStyles; + +interface + +uses + Vcl.Graphics + , System.UIConsts + , System.UITypes + , Vcl.ButtonStylesAttributes; + +const + //Button Family + BASIC_COLOR_FAMILY = 'Basic-Colors'; + SVG_COLOR_FAMILY = 'SVG-Colors'; + + //Button Class contains the name of the color, for example: + //for 'BasicColors': clBlack, clRed, clYellow (Colors: array[0..51] in UIConsts) + //for 'SvgColors': claAliceblue, claAntiquewhite, claAqua (AlphaColors: array [0..147] in UIConsts) + + //Button Appearance + COLOR_BTN_NORMAL = 'Normal'; + COLOR_BTN_OUTLINE = 'Outline'; + COLOR_BTN_WIDTH = 2; + +Type + TBasicColorButtonStyles = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + procedure GetColorName(const AColorName: string); + + procedure BasicClassToColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; var AFontColor, + AButtonColor, ABorderColor: TColor; out AOutLine: Boolean); + end; + + TSVGColorButtonStyles = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + procedure GetColorName(const AColorName: string); + + procedure SVGClassToColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; var AFontColor, + AButtonColor, ABorderColor: TColor; out AOutLine: Boolean); + end; + +implementation + +uses + System.SysUtils + , WinApi.Windows; + +var + BasicButtonClasses: TButtonClasses; + SvgButtonClasses: TButtonClasses; + ButtonAppearances: TButtonAppearances; + +{ TBasicColorButtonStyles } + +procedure TBasicColorButtonStyles.BasicClassToColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var AFontColor, AButtonColor, ABorderColor: TColor; out AOutLine: Boolean); +var + LColor: Integer; +begin + AOutLine := SameText(AAppearance, COLOR_BTN_OUTLINE); + IdentToColor(AClass, LColor); + AButtonColor := TColor(LColor); + if ColorIsLight(AButtonColor) then + begin + ABorderColor := DarkenColor(AButtonColor, 20); + AFontColor := clBlack; + end + else + begin + ABorderColor := LightenColor(AButtonColor, 20); + AFontColor := clWhite; + end; +end; + +function TBasicColorButtonStyles.ButtonFamilyName: string; +begin + Result := BASIC_COLOR_FAMILY; +end; + +function TBasicColorButtonStyles.GetButtonAppearances: TButtonAppearances; +begin + Result := ButtonAppearances; +end; + +procedure TBasicColorButtonStyles.GetColorName(const AColorName: string); +begin + SetLength(BasicButtonClasses, Length(BasicButtonClasses)+1); + BasicButtonClasses[Length(BasicButtonClasses)-1] := AColorName; +end; + +function TBasicColorButtonStyles.GetButtonClasses: TButtonClasses; +begin + if Length(BasicButtonClasses) = 0 then + GetColorValues(GetColorName); + Result := BasicButtonClasses; +end; + +procedure TBasicColorButtonStyles.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + //if AModalResult is mrNone, define the defaults of Family + case AModalResult of + mrNone : begin AStyleClass := 'clBlue'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrYes : begin AStyleClass := 'clBlue'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrNo : begin AStyleClass := 'clGray'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrOk : begin AStyleClass := 'clGreen'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrCancel : begin AStyleClass := 'clRed'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrAbort : begin AStyleClass := 'clRed'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrRetry : begin AStyleClass := 'clYellow'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrIgnore : begin AStyleClass := 'clGray'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrAll : begin AStyleClass := 'clBlue'; AStyleAppearance := COLOR_BTN_OUTLINE; end; + mrNoToAll : begin AStyleClass := 'clRed'; AStyleAppearance := COLOR_BTN_OUTLINE; end; + mrYesToAll : begin AStyleClass := 'clGreen'; AStyleAppearance := COLOR_BTN_OUTLINE; end; + mrClose : begin AStyleClass := 'clGray'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrTryAgain : begin AStyleClass := 'clYellow'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrContinue : begin AStyleClass := 'clGray'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrHelp : begin AStyleClass := 'clYellow'; AStyleAppearance := COLOR_BTN_NORMAL; end; + end; +end; + +procedure TBasicColorButtonStyles.UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, AHotStyle, + ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LButtonColor, LBorderColor: TColor; + LOutLine: Boolean; +begin + BasicClassToColors(AClass, AAppearance, LFontColor, LButtonColor, LBorderColor, LOutLine); + + //Default Style Attributes for Basic Color Buttons + ANormalStyle.DrawType := btRoundRect; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.BorderWidth := COLOR_BTN_WIDTH; + + //Style for Normal Style of Basic Color Button + if LOutLine then + begin + //Outline: Border and FontColor same as Button Color + ANormalStyle.ButtonDrawStyle := btnClear; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.BorderWidth := COLOR_BTN_WIDTH; + ANormalStyle.BorderColor := LButtonColor; + ANormalStyle.FontColor := LButtonColor; + end + else + begin + ANormalStyle.ButtonDrawStyle := btnSolid; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.FontColor := LFontColor; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.BorderColor := LBorderColor; + end; + + //Clone Normal Style to Other Styles + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + if LOutline then + begin + //Button Down: color as Button Color + APressedStyle.ButtonColor := LButtonColor; + APressedStyle.BorderColor := LBorderColor; + APressedStyle.BorderDrawStyle := brdSolid; + APressedStyle.BorderWidth := COLOR_BTN_WIDTH+2; + APressedStyle.FontColor := LFontColor; + APressedStyle.ButtonDrawStyle := btnSolid; + + //Button Hot: color as Button Color + AHotStyle.ButtonColor := LButtonColor; + AHotStyle.BorderDrawStyle := brdClear; + AHotStyle.BorderWidth := COLOR_BTN_WIDTH; + AHotStyle.FontColor := LFontColor; + AHotStyle.ButtonDrawStyle := btnSolid; + + //Button Focused + ASelectedStyle.BorderDrawStyle := brdSolid; + ASelectedStyle.BorderWidth := COLOR_BTN_WIDTH+1; + ASelectedStyle.BorderColor := LBorderColor; + ASelectedStyle.ButtonDrawStyle := btnClear; + end + else + begin + //Button Down + APressedStyle.ButtonColor := LBorderColor; + APressedStyle.BorderColor := LButtonColor; + APressedStyle.BorderDrawStyle := brdSolid; + APressedStyle.BorderWidth := COLOR_BTN_WIDTH; + + //Button Hot: color as Down but no Border + AHotStyle.ButtonColor := APressedStyle.ButtonColor; + + //Button Focused + ASelectedStyle.ButtonColor := APressedStyle.ButtonColor; + ASelectedStyle.BorderDrawStyle := brdSolid; + ASelectedStyle.BorderWidth := COLOR_BTN_WIDTH; + end; + + //Disabled Button (lighten) + ADisabledStyle.BorderColor := LightenColor(ADisabledStyle.BorderColor, 50); + ADisabledStyle.ButtonColor := LightenColor(ADisabledStyle.ButtonColor, 50); + ADisabledStyle.FontColor := LightenColor(ADisabledStyle.FontColor, 50); +end; + +{ TSVGColorButtonStyles } + +procedure TSVGColorButtonStyles.SVGClassToColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var AFontColor, AButtonColor, ABorderColor: TColor; out AOutLine: Boolean); +var + LColor: TAlphaColor; + + function AlphaColorToColor(const Color: TAlphaColor): TColor; + begin + TColorRec(Result).R := TAlphaColorRec(Color).R; + TColorRec(Result).G := TAlphaColorRec(Color).G; + TColorRec(Result).B := TAlphaColorRec(Color).B; + TColorRec(Result).A := 0; + end; + +begin + AOutLine := SameText(AAppearance, COLOR_BTN_OUTLINE); + LColor := StringToAlphaColor(AClass); + AButtonColor := AlphaColorToColor(LColor); + if ColorIsLight(AButtonColor) then + begin + ABorderColor := DarkenColor(AButtonColor, 20); + AFontColor := clBlack; + end + else + begin + ABorderColor := LightenColor(AButtonColor, 20); + AFontColor := clWhite; + end; +end; + +function TSVGColorButtonStyles.ButtonFamilyName: string; +begin + Result := SVG_COLOR_FAMILY; +end; + +function TSVGColorButtonStyles.GetButtonAppearances: TButtonAppearances; +begin + Result := ButtonAppearances; +end; + +function TSVGColorButtonStyles.GetButtonClasses: TButtonClasses; +begin + if Length(SvgButtonClasses) = 0 then + GetAlphaColorValues(GetColorName); + Result := SvgButtonClasses; +end; + +procedure TSVGColorButtonStyles.GetColorName(const AColorName: string); +begin + SetLength(SvgButtonClasses, Length(SvgButtonClasses)+1); + SvgButtonClasses[Length(SvgButtonClasses)-1] := AColorName; +end; + +procedure TSVGColorButtonStyles.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + //if AModalResult is mrNone, define the defaults of Family + case AModalResult of + mrNone : begin AStyleClass := 'Aliceblue'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrYes : begin AStyleClass := 'Darkblue'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrNo : begin AStyleClass := 'Slateblue'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrOk : begin AStyleClass := 'Forestgreen'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrCancel : begin AStyleClass := 'Darkred'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrAbort : begin AStyleClass := 'Firebrick'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrRetry : begin AStyleClass := 'Gold'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrIgnore : begin AStyleClass := 'Silver'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrAll : begin AStyleClass := 'Midnightblue'; AStyleAppearance := COLOR_BTN_OUTLINE; end; + mrNoToAll : begin AStyleClass := 'Slateblue'; AStyleAppearance := COLOR_BTN_OUTLINE; end; + mrYesToAll : begin AStyleClass := 'Darkblue'; AStyleAppearance := COLOR_BTN_OUTLINE; end; + mrClose : begin AStyleClass := 'Thistle'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrTryAgain : begin AStyleClass := 'Slategray'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrContinue : begin AStyleClass := 'Lightseagreen'; AStyleAppearance := COLOR_BTN_NORMAL; end; + mrHelp : begin AStyleClass := 'Plum'; AStyleAppearance := COLOR_BTN_NORMAL; end; + end; +end; + +procedure TSVGColorButtonStyles.UpdateAttributes( + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; var ANormalStyle, APressedStyle, + ASelectedStyle, AHotStyle, ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LButtonColor, LBorderColor: TColor; + LOutLine: Boolean; +begin + SVGClassToColors(AClass, AAppearance, LFontColor, LButtonColor, LBorderColor, LOutLine); + + //Default Style Attributes for Basic Color Buttons + ANormalStyle.DrawType := btRoundRect; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.BorderWidth := COLOR_BTN_WIDTH; + + //Style for Normal Style of Basic Color Button + if LOutLine then + begin + //Outline: Border and FontColor same as Button Color + ANormalStyle.ButtonDrawStyle := btnClear; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.BorderWidth := COLOR_BTN_WIDTH; + ANormalStyle.BorderColor := LButtonColor; + ANormalStyle.FontColor := LButtonColor; + end + else + begin + ANormalStyle.ButtonDrawStyle := btnSolid; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.FontColor := LFontColor; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.BorderColor := LBorderColor; + end; + + //Clone Normal Style to Other Styles + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + if LOutline then + begin + //Button Down: color as Button Color + with APressedStyle do + begin + ButtonColor := LButtonColor; + BorderColor := LBorderColor; + BorderDrawStyle := brdSolid; + BorderWidth := COLOR_BTN_WIDTH+2; + FontColor := LFontColor; + ButtonDrawStyle := btnSolid; + end; + + //Button Hot: color as Button Color + with AHotStyle do + begin + ButtonColor := LButtonColor; + BorderDrawStyle := brdClear; + BorderWidth := COLOR_BTN_WIDTH; + FontColor := LFontColor; + ButtonDrawStyle := btnSolid; + end; + + //Button Focused + with ASelectedStyle do + begin + BorderDrawStyle := brdSolid; + BorderWidth := COLOR_BTN_WIDTH+1; + BorderColor := LBorderColor; + ButtonDrawStyle := btnClear; + end; + + //Button Disabled + ADisabledStyle.BorderColor := LightenColor(ADisabledStyle.BorderColor, 50); + ADisabledStyle.FontColor := LightenColor(ADisabledStyle.FontColor, 50); + end + else + begin + //Button Down + APressedStyle.ButtonColor := LBorderColor; + APressedStyle.BorderColor := LButtonColor; + APressedStyle.BorderDrawStyle := brdSolid; + APressedStyle.BorderWidth := COLOR_BTN_WIDTH; + + //Button Hot: color as Down but no Border + AHotStyle.ButtonColor := APressedStyle.ButtonColor; + + //Button Focused + ASelectedStyle.ButtonColor := APressedStyle.ButtonColor; + ASelectedStyle.BorderDrawStyle := brdSolid; + ASelectedStyle.BorderWidth := COLOR_BTN_WIDTH; + end; + + //Disabled Button (lighten) + ADisabledStyle.BorderColor := LightenColor(ADisabledStyle.BorderColor, 50); + ADisabledStyle.ButtonColor := LightenColor(ADisabledStyle.ButtonColor, 50); + ADisabledStyle.FontColor := LightenColor(ADisabledStyle.FontColor, 50); +end; + +initialization + SetLength(ButtonAppearances, 2); + ButtonAppearances[0] := COLOR_BTN_NORMAL; + ButtonAppearances[1] := COLOR_BTN_OUTLINE; + + RegisterButtonFamily(TBasicColorButtonStyles.Create); + RegisterButtonFamily(TSvgColorButtonStyles.Create); + +end. diff --git a/Ext/StyledComponents/source/Vcl.SkAnimatedImageHelper.pas b/Ext/StyledComponents/source/Vcl.SkAnimatedImageHelper.pas new file mode 100644 index 0000000..8e7a3fe --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.SkAnimatedImageHelper.pas @@ -0,0 +1,321 @@ +{******************************************************************************} +{ } +{ SkAnimatedImageHelper: an helper class for TSkAnimatedImage } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.SkAnimatedImageHelper; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Winapi.Windows + , Winapi.Messages + , System.Types + , System.Classes +(* + , System.UITypes + , Vcl.Controls + , Vcl.ImgList +*) + , Vcl.Graphics + , Vcl.Skia + ; + +type + TSkAnimatedImageHelper = class helper for TSkAnimatedImage + strict private + function AnimationLoaded: Boolean; + public + //Initialization functions + procedure InitAnimation(ALoop, AInverse: Boolean; + AProgress: Double); + procedure ClearAnimationData; + + function CanPlayAnimation: Boolean; + function CanResumeAnimation: Boolean; + function CanPauseAnimation: Boolean; + function CanStopAnimation: Boolean; + function AnimationRunning: Boolean; + function AnimationRunningInverse: Boolean; + function AnimationRunningNormal: Boolean; + + function GetProgress: Double; + function GetProgressPercentage: SmallInt; + procedure SetProgress(const AValue: Double); + procedure SetProgressPercentage(const AValue: SmallInt); + + function GetLoop: Boolean; + procedure SetLoop(const Value: Boolean); + function GetInverse: Boolean; + procedure SetInverse(const Value: Boolean); + + function GetLottieText: string; + + procedure StopAnimation; + procedure PauseAnimation; + procedure ResumeAnimation; + procedure StartAnimation(const AFromBegin: Boolean = True); + + procedure RenderTo(ACanvas: TCanvas; ARect: TRectF; + AProgress: Double; AOpacity: Single); + end; + +implementation + +uses + System.Skia + , System.SysUtils + , System.math + ; + +{ TSkAnimatedImageHelper } + +function TSkAnimatedImageHelper.AnimationLoaded: Boolean; +begin + Result := (Length(Source.Data) > 0) and Assigned(Codec) and + not Codec.Isstatic; +end; + +procedure TSkAnimatedImageHelper.InitAnimation(ALoop, AInverse: Boolean; + AProgress: Double); +begin + Animation.Loop := ALoop; + Animation.Inverse := AInverse; + Animation.Progress := AProgress; +end; + +function TSkAnimatedImageHelper.AnimationRunning: Boolean; +begin + Result := AnimationLoaded and Animation.Enabled and Animation.Running; +end; + +function TSkAnimatedImageHelper.AnimationRunningInverse: Boolean; +begin + Result := AnimationRunning and Animation.Inverse; +end; + +function TSkAnimatedImageHelper.AnimationRunningNormal: Boolean; +begin + Result := AnimationRunning and not Animation.Inverse; +end; + +function TSkAnimatedImageHelper.CanPlayAnimation: Boolean; +begin + Result := AnimationLoaded and not Animation.Running; +end; + +function TSkAnimatedImageHelper.CanResumeAnimation: Boolean; +begin + Result := AnimationLoaded and not AnimationRunning and + (Animation.Progress <> 0) and + (Animation.Loop or (Animation.Progress <> 1)); +end; + +function TSkAnimatedImageHelper.CanPauseAnimation: Boolean; +begin + Result := AnimationRunning; +end; + +function TSkAnimatedImageHelper.CanStopAnimation: Boolean; +begin + Result := AnimationRunning; +end; + +procedure TSkAnimatedImageHelper.ClearAnimationData; +begin + Source.Data := []; +end; + +function TSkAnimatedImageHelper.GetProgressPercentage: SmallInt; +begin + if AnimationLoaded then + Result := Round(inherited Animation.Progress * 100) + else + Result := 0; +end; + +procedure TSkAnimatedImageHelper.SetProgress(const AValue: Double); +var + LEvent: TNotifyEvent; +begin + if Assigned(Animation) then + begin + if Assigned(OnAnimationProcess) then + LEvent := OnAnimationProcess + else + LEvent := nil; + OnAnimationProcess := nil; + Try + Animation.Stop; + Animation.Progress := AValue; + Finally + if Assigned(LEvent) then + OnAnimationProcess := LEvent; + End; + end; +end; + +function TSkAnimatedImageHelper.GetLottieText: string; +var + LFormat: TFormatInfo; + LStringStream: TStringStream; +begin + Result := ''; + if AnimationLoaded then + begin + if Codec.TryDetectFormat(Source.Data, LFormat) then + begin + if SameText(LFormat.Name, 'Lottie') then + begin + LStringStream := TStringStream.Create('', TEncoding.UTF8); + try + LStringStream.writebuffer(Source.Data[0], length(Source.Data)); + Result := LStringStream.DataString; + finally + LStringStream.Free; + end; + end; + end; + end; +end; + +function TSkAnimatedImageHelper.GetProgress: Double; +begin + if AnimationLoaded then + Result := inherited Animation.Progress + else + Result := 0; +end; + +procedure TSkAnimatedImageHelper.SetProgressPercentage(const AValue: SmallInt); +begin + if Assigned(Animation) then + Animation.Progress := AValue / 100; +end; + +function TSkAnimatedImageHelper.GetLoop: Boolean; +begin + Result := Assigned(Animation) and Animation.Loop; +end; + +procedure TSkAnimatedImageHelper.SetLoop(const Value: Boolean); +begin + Animation.Loop := Value; +end; + +function TSkAnimatedImageHelper.GetInverse: Boolean; +begin + Result := Assigned(Animation) and Animation.Inverse; +end; + +procedure TSkAnimatedImageHelper.SetInverse(const Value: Boolean); +begin + if Assigned(Animation) then + Animation.Inverse := Value; +end; + + +procedure TSkAnimatedImageHelper.StopAnimation; +begin + if Assigned(Animation) then + Animation.Stop; +end; + +procedure TSkAnimatedImageHelper.PauseAnimation; +begin + if Assigned(Animation) then + Animation.StopAtCurrent; +end; + +procedure TSkAnimatedImageHelper.ResumeAnimation; +begin + if Assigned(Animation) then + begin + Animation.StartFromCurrent := Animation.Progress <> 1; + Animation.start; + end; +end; + + +procedure TSkAnimatedImageHelper.StartAnimation(const AFromBegin: Boolean = True); +begin + if Assigned(Animation) then + begin + Animation.StartFromCurrent := not AFromBegin; + if AFromBegin then + begin + if Animation.Inverse then + inherited Animation.Progress := 1 + else + inherited Animation.Progress := 0; + end + else + begin + if not Animation.Inverse and (Animation.Progress = 1) then + inherited Animation.Progress := 0 + else if Animation.Inverse and (Animation.Progress = 0) then + inherited Animation.Progress := 1; + end; + if AnimationLoaded and not Animation.Running then + Animation.Start; + end; +end; + +procedure TSkAnimatedImageHelper.RenderTo(ACanvas: TCanvas; ARect: TRectF; + AProgress: Double; AOpacity: Single); +var + LBitmap: TBitmap; + LRect: TRectF; + LTop, LLeft, LWidth, LHeight: Integer; +begin + ACanvas.Lock; + try + Animation.Progress := AProgress; + LTop := Round(ARect.Top); + LLeft := Round(ARect.Left); + LWidth := Round(ARect.Width); + LHeight := Round(ARect.Height); + LBitmap := TBitmap.Create; + try + LBitmap.PixelFormat := pf32bit; + LBitmap.AlphaFormat := afPremultiplied; + LBitmap.SetSize(LWidth, LHeight); + LRect := TRect.Create(0,0,LWidth, LHeight); + LBitmap.SkiaDraw( + procedure (const ASkCanvas: ISkCanvas) + begin + RenderFrame(ASkCanvas, LRect, AProgress, AOpacity); + end + ); + ACanvas.Draw(LTop, LLeft, LBitmap); + finally + LBitmap.Free; + end; + finally + ACanvas.Unlock; + end; +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StandardButtonStyles.pas b/Ext/StyledComponents/source/Vcl.StandardButtonStyles.pas new file mode 100644 index 0000000..0572e2d --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StandardButtonStyles.pas @@ -0,0 +1,658 @@ +{******************************************************************************} +{ } +{ Standard Button Family: implementation of "standard" Family } +{ attributes for StyledButton similar to VCL Styled Buttons } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: Ariel Montes } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StandardButtonStyles; + +interface + +uses + Vcl.Graphics + , System.UITypes + , Vcl.ButtonStylesAttributes; + +const + DEFAULT_STYLEDRAWTYPE = btRoundRect; + DEFAULT_CLASSIC_FAMILY = 'Classic'; + DEFAULT_WINDOWS_CLASS = 'Windows'; + DEFAULT_APPEARANCE = 'Normal'; + OUTLINE_APPEARANCE = 'Outline'; + DEFAULT_CURSOR = crHandPoint; + STD_BORDER_WIDTH = 2; + +Type + TButtonStandardStyles = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + end; + + //Class to register Theme attributes (like dark or light) + TThemeType = (ttLight, ttDark); + TThemeAttribute = class + StyleName: String; + ThemeType: TThemeType; + ButtonColor: TColor; + BorderColor: TColor; + BorderHotColor: TColor; + HotColor: TColor; + FontColor: TColor; + FontHotColor: TColor; + BorderType: TStyledButtonDrawType; + IDEStyle: Boolean; + end; + +//To add new styles used from your application that are not managed by default +procedure RegisterThemeAttributes(const AVCLStyleName: string; + const AThemeType: TThemeType; + const AFontColor: TColor; + const AFontHotColor: TColor; + const AButtonColor: TColor; + const AHotColor: TColor; + const ABorderColor: TColor; + const ABorderHotColor: TColor; + const ABorderType: TStyledButtonDrawType; + const AIDEStyle: Boolean = False); + +function GetStyleAttributes(const AStyleName: string; + out AThemeAttribute: TThemeAttribute): Boolean; + +implementation + +uses + Winapi.Windows + , Vcl.StyledButton + , Vcl.Controls + , Vcl.StdCtrls + , Vcl.Themes + , System.SysUtils + , System.Math + , System.Generics.Collections; + +var + ButtonClasses: TButtonClasses; + ButtonAppearances: TButtonAppearances; + ThemeAttributes: TList; + +function GetStyleAttributes(const AStyleName: string; + out AThemeAttribute: TThemeAttribute): Boolean; +var + LWindowsThemeAttr, LThemeAttribute: TThemeAttribute; +begin + LWindowsThemeAttr := nil; + for LThemeAttribute in ThemeAttributes do + begin + if LThemeAttribute.StyleName = DEFAULT_WINDOWS_CLASS then + LWindowsThemeAttr := LThemeAttribute; + if SameText(AStyleName, LThemeAttribute.StyleName) then + begin + AThemeAttribute := LThemeAttribute; + Exit(True); //Theme Attributes found: Exit from function + end; + end; + AThemeAttribute := LWindowsThemeAttr; + if AThemeAttribute = nil then + raise Exception.CreateFmt('Attributes for Style "%s" not found!'+sLineBreak+ + 'please call RegThemeAttr in an initialization section to add your custom style',[AStyleName]) + else + Result := True; +end; + +{ TStyledButtonStdStyle } + +function TButtonStandardStyles.ButtonFamilyName: string; +begin + Result := DEFAULT_CLASSIC_FAMILY; +end; + +function TButtonStandardStyles.GetButtonClasses: TButtonClasses; +var + LStylesCount: Integer; + LStyleName: string; + LThemeAttribute: TThemeAttribute; + I: Integer; +begin + if length(ButtonClasses) = 0 then + begin + LStylesCount := ThemeAttributes.Count; + SetLength(ButtonClasses,LStylesCount); + I := 0; + for LThemeAttribute in ThemeAttributes do + begin + LStyleName := LThemeAttribute.StyleName; + ButtonClasses[I] := LStyleName; + Inc(I); + end; + end; + Result := ButtonClasses; +end; + +procedure TButtonStandardStyles.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + AStyleClass := DEFAULT_WINDOWS_CLASS; + + //define Appearance based on AModalResult + case AModalResult of + mrNone : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrYes : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrNo : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrOk : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrCancel : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrAbort : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrRetry : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrIgnore : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrAll : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrNoToAll : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrYesToAll : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrClose : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrTryAgain : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrContinue : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + mrHelp : begin AStyleAppearance := DEFAULT_APPEARANCE; end; + end; +end; + +function TButtonStandardStyles.GetButtonAppearances: TButtonAppearances; +begin + if length(ButtonAppearances) = 0 then + begin + SetLength(ButtonAppearances, 2); + ButtonAppearances[0] := DEFAULT_APPEARANCE; + ButtonAppearances[1] := OUTLINE_APPEARANCE; + end; + Result := ButtonAppearances; +end; + +procedure StandardClassToColors(const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var AFontColor, AFontHotColor, AButtonColor, AHotColor, ABorderColor, ABorderHotColor: TColor; + var ABorderType: TStyledButtonDrawType; + out AOutLine, ADarkStyle: Boolean); +var + LStyleName: string; + LThemeAttribute: TThemeAttribute; +begin + //Default for Windows + ADarkStyle := False; + AButtonColor := clBtnFace; + ABorderColor := clBtnShadow; + AFontColor := clWindowText; + + //mapping VCL Button Styles colors and Dark/Light Style + LStyleName := AClass; + GetStyleAttributes(LStyleName, LThemeAttribute); + AButtonColor := LThemeAttribute.ButtonColor; + AHotColor := LThemeAttribute.HotColor; + ABorderColor := LThemeAttribute.BorderColor; + ABorderHotColor := LThemeAttribute.BorderHotColor; + ADarkStyle := LThemeAttribute.ThemeType = ttDark; + ABorderType := LThemeAttribute.BorderType; + AFontColor := LThemeAttribute.FontColor; + AFontHotColor := LThemeAttribute.FontHotColor; + + AOutLine := SameText(AAppearance, OUTLINE_APPEARANCE); +end; + +procedure TButtonStandardStyles.UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, AHotStyle, + ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LFontHotColor, LButtonColor, LHotColor, LBorderColor, LBorderHotColor: TColor; + LBorderType: TStyledButtonDrawType; + LOutLine: Boolean; + LDarkStyle: Boolean; +begin + StandardClassToColors(AClass, AAppearance, LFontColor, LFontHotColor, + LButtonColor, LHotColor, LBorderColor, LBorderHotColor, LBorderType, LOutLine, LDarkStyle); + + //Default Style Attributes for Classic Buttons + ANormalStyle.DrawType := LBorderType; + + //Outline: Invert Border Color and Button Color + if LOutline then + begin + //Outline: Border and FontColor same as Button Color + ANormalStyle.ButtonDrawStyle := btnClear; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.FontColor := LButtonColor; + ANormalStyle.ButtonColor := LBorderColor; + ANormalStyle.BorderColor := LButtonColor; + ANormalStyle.BorderWidth := STD_BORDER_WIDTH + 1; + end + else + begin + ANormalStyle.ButtonDrawStyle := btnSolid; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.FontStyle := []; + ANormalStyle.FontColor := LFontColor; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.BorderColor := LBorderColor; + ANormalStyle.BorderWidth := STD_BORDER_WIDTH; + end; + + //Clone Normal Style to Other Styles, except Selected + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + //Hot Button + AHotStyle.ButtonColor := LHotColor; + AHotStyle.BorderColor := LBorderHotColor; + AHotStyle.FontColor := LFontHotColor; + + //Selected Button (focused), similar to Hot + //with lighter or darker button color + CloneButtonStyle(AHotStyle, ASelectedStyle); + if LDarkStyle then + ASelectedStyle.ButtonColor := LightenColor(LHotColor, 10) + else + ASelectedStyle.ButtonColor := DarkenColor(LHotColor, 10); + + //Pressed Button, , similar to Hot + //with lighter or darker button and border color + CloneButtonStyle(AHotStyle, APressedStyle); + if LDarkStyle then + begin + APressedStyle.ButtonColor := LightenColor(LButtonColor, 20); + APressedStyle.BorderColor := DarkenColor(LBorderColor, 20); + end + else + begin + APressedStyle.ButtonColor := DarkenColor(LHotColor, 20); + APressedStyle.BorderColor := LightenColor(LHotColor, 20); + end; + + //Disabled Button (lighten) + if LDarkStyle then + begin + ADisabledStyle.BorderColor := LightenColor(ADisabledStyle.BorderColor, 10); + ADisabledStyle.ButtonColor := LightenColor(ADisabledStyle.ButtonColor, 10); + ADisabledStyle.FontColor := DarkenColor(ADisabledStyle.FontColor, 50); + end + else + begin + ADisabledStyle.BorderColor := LightenColor(ADisabledStyle.BorderColor, 50); + ADisabledStyle.ButtonColor := LightenColor(ADisabledStyle.ButtonColor, 50); + ADisabledStyle.FontColor := LightenColor(ADisabledStyle.FontColor, 50); + end; +end; + +procedure RegisterThemeAttributes( + const AVCLStyleName: string; + const AThemeType: TThemeType; + const AFontColor: TColor; + const AFontHotColor: TColor; + const AButtonColor: TColor; + const AHotColor: TColor; + const ABorderColor: TColor; + const ABorderHotColor: TColor; + const ABorderType: TStyledButtonDrawType; + const AIDEStyle: Boolean = False); +var + LThemeAttribute: TThemeAttribute; + + procedure UpdateThemeAttributes; + begin + LThemeAttribute.StyleName := AVCLStyleName; + LThemeAttribute.ThemeType := AThemeType; + LThemeAttribute.ButtonColor := AButtonColor; + LThemeAttribute.BorderColor := ABorderColor; + LThemeAttribute.BorderHotColor := ABorderHotColor; + LThemeAttribute.FontColor := AFontColor; + LThemeAttribute.FontHotColor := AFontHotColor; + LThemeAttribute.HotColor := AHotColor; + LThemeAttribute.BorderType := ABorderType; + LThemeAttribute.IDEStyle := AIDEStyle; + end; + +begin + for LThemeAttribute in ThemeAttributes do + begin + if SameText(LThemeAttribute.StyleName, AVCLStyleName) then + begin + UpdateThemeAttributes; + Exit; //Found: exit + end; + end; + //not found + LThemeAttribute := TThemeAttribute.Create; + ThemeAttributes.Add(LThemeAttribute); + UpdateThemeAttributes; +end; + +procedure InitDefaultThemesAttributes; +var + LButtonBorder: TStyledButtonDrawType; + + function IsWindows11: Boolean; + begin + Result := GetWindowsVersion = wvWindows11; + end; + +begin + ThemeAttributes := TList.Create; + + if IsWindows11 then + LButtonBorder := btRoundRect + else + LButtonBorder := btRect; + + //Non themed Windows Style + RegisterThemeAttributes('Windows',ttLight,clBlack,clBlack, + htmlToColor('#fdfdfd'),htmlToColor('#e0eef9'), + htmlToColor('#d0d0d0'),htmlToColor('#0078d4'),LButtonBorder); + + if StyleServices.Enabled then + begin + RegisterThemeAttributes('Amakrits',ttDark,clWhite,clBlack, + htmlToColor('#292929'),htmlToColor('#6EE4D3'), + htmlToColor('#020202'),htmlToColor('#020202'),btRect); + RegisterThemeAttributes('Amethyst Kamri',ttLight,clBlack,clBlack, + htmlToColor('#cdd1e2'),htmlToColor('#F99369'), + htmlToColor('#868db0'),htmlToColor('#868db0'),btRoundRect); + RegisterThemeAttributes('Aqua Graphite',ttDark,clWhite,clWhite, + htmlToColor('#0070bb'),htmlToColor('#1585cc'), + htmlToColor('#043f5c'),htmlToColor('#043f5c'),btRoundRect); + RegisterThemeAttributes('Aqua Light Slate',ttLight,clBlack,clBlack, + htmlToColor('#f1f1f1'),htmlToColor('#a9d8f2'), + htmlToColor('#9c9c9c'),htmlToColor('#9c9c9c'),btRoundRect); + RegisterThemeAttributes('Auric' ,ttDark,clWhite,clBlack, + htmlToColor('#5e5e5f'),htmlToColor('#fad535'), + clBlack,clBlack,btRoundRect); + RegisterThemeAttributes('Calypso',ttDark,clWhite,clBlack, + htmlToColor('#44617c'),htmlToColor('#80ceb5'), + htmlToColor('#44617c'),htmlToColor('#80ceb5'),btRoundRect); + RegisterThemeAttributes('Calypso LE',ttDark,clWhite,clBlack, + htmlToColor('#44617c'),htmlToColor('#80ceb5'), + htmlToColor('#44617c'),htmlToColor('#80ceb5'),btRoundRect); + RegisterThemeAttributes('Calypso SE',ttDark,clWhite,clBlack, + htmlToColor('#44617c'),htmlToColor('#6bafe2'), + htmlToColor('#44617c'),htmlToColor('#6bafe2'),btRoundRect); + RegisterThemeAttributes('Calypso SLE',ttDark,clWhite,clBlack, + htmlToColor('#44617c'),htmlToColor('#6bafe2'), + htmlToColor('#44617c'),htmlToColor('#6bafe2'),btRoundRect); + RegisterThemeAttributes('Carbon',ttDark,htmlToColor('#c0c0c0'),clWhite, + htmlToColor('#3a3a3a'),htmlToColor('#3e3e3e'), + htmlToColor('#191919'),htmlToColor('#191919'),btRect); + RegisterThemeAttributes('Charcoal Dark Slate',ttDark,htmlToColor('#a3a3a3'),clWhite, + htmlToColor('#3a3a3a'),htmlToColor('#1f1f1f'), + htmlToColor('#191919'),htmlToColor('#191919'),btRoundRect); + RegisterThemeAttributes('Cobalt XEMedia',ttDark,htmlToColor('#c0c0c0'),clWhite, + htmlToColor('#121e32'),htmlToColor('#0f2c54'), + htmlToColor('#a1a5ab'),htmlToColor('#a1a5ab'),btRoundRect); + RegisterThemeAttributes('Copper',ttLight,clBlack,clWhite, + clWhite,htmlToColor('#e46b60'), + clWhite,htmlToColor('#e46b60'),btRoundRect); + RegisterThemeAttributes('CopperDark',ttDark,clWhite,clWhite, + htmlToColor('#2b2b2b'),htmlToColor('#e46b60'), + htmlToColor('#898989'),htmlToColor('#E46B60'),btRoundRect); + RegisterThemeAttributes('Coral',ttDark,clWhite,clWhite, + htmlToColor('#d86d00'),htmlToColor('#d86d00'), + htmlToColor('#d86d00'),htmlToColor('#d1d1d1'),btRoundRect); + RegisterThemeAttributes('Cyan Dusk',ttLight,clBlack,clWhite, + htmlToColor('#b4bac2'),htmlToColor('#324a65'), + htmlToColor('#687e97'),htmlToColor('#687e97'),btRoundRect); + RegisterThemeAttributes('Cyan Night',ttLight,clBlack,clWhite, + htmlToColor('#b0b4bf'),htmlToColor('#323c62'), + htmlToColor('#687297'),htmlToColor('#687297'),btRoundRect); + RegisterThemeAttributes('Diamond',ttLight,clBlack,clBlack, + htmlToColor('#efeff0'),htmlToColor('#f5f5f5'), + htmlToColor('#c4c3c3'),htmlToColor('#c4c3c3'),btRoundRect); + RegisterThemeAttributes('Emerald',ttDark,clWhite,clWhite, + htmlToColor('#00a57d'),htmlToColor('#00a57d'), + htmlToColor('#00a57d'),htmlToColor('#cbcbc7'),btRoundRect); + RegisterThemeAttributes('Emerald Light Slate',ttLight,clBlack,clBlack, + htmlToColor('#e0e0e0'),htmlToColor('#87e168'), + htmlToColor('#9c9c9c'),htmlToColor('#9c9c9c'),btRoundRect); + RegisterThemeAttributes('Flat UI Light',ttLight,clBlack,clWhite, + htmlToColor('#e4e6e7'),htmlToColor('#3498da'), + htmlToColor('#e4e6e7'),htmlToColor('#3498da'),btRoundRect); + RegisterThemeAttributes('Glossy',ttDark,clWhite,clWhite, + htmlToColor('#3d3d3d'),htmlToColor('#2f65a7'), + clBlack,clBlack,btRoundRect); + RegisterThemeAttributes('Glow',ttDark,clWhite,htmlToColor('#37bdbb'), + htmlToColor('#2e343c'),htmlToColor('#2d333b'), + htmlToColor('#1a1c1f'),htmlToColor('#1a1c1f'),btRoundRect); + RegisterThemeAttributes('Golden Graphite',ttDark,htmlToColor('#eaeaea'),clWhite, + htmlToColor('#bb8900'),htmlToColor('#c6920f'), + htmlToColor('#5c3e04'),htmlToColor('#5c3e04'),btRoundRect); + RegisterThemeAttributes('Iceberg Classico',ttLight,clBlack,clBlack, + htmlToColor('#e4eaf1'),htmlToColor('#99c7ea'), + htmlToColor('#91a6c0'),htmlToColor('#91a6c0'),btRoundRect); + RegisterThemeAttributes('Jet',ttDark,clWhite,htmlToColor('#cee9f8'), + htmlToColor('#303030'),htmlToColor('#393939'), + htmlToColor('#585858'),htmlToColor('#585858'),btRoundRect); + RegisterThemeAttributes('Lavender Classico',ttLight,clBlack,clBlack, + htmlToColor('#eaeaee'),htmlToColor('#a9c4e6'), + htmlToColor('#a1a1b4'),htmlToColor('#a1a1b4'),btRoundRect); + RegisterThemeAttributes('Light',ttLight,clBlack,clBlack, + htmlToColor('#fdfdfd'),htmlToColor('#d4e6f3'), + htmlToColor('#ababab'),htmlToColor('#a2c7e4'),btRect); + RegisterThemeAttributes('Lucky Point',ttDark,clWhite,clBlack, + htmlToColor('#3f4c6a'),htmlToColor('#74b9c9'), + htmlToColor('#3f4c6a'),htmlToColor('#74b9c9'),btRoundRect); + RegisterThemeAttributes('Luna',ttLight,clBlack,clBlack, + htmlToColor('#bcd0e9'),htmlToColor('#ffd355'), + htmlToColor('#99b5de'),htmlToColor('#99b5de'),btRoundRect); + RegisterThemeAttributes('Material Oxford Blue',ttDark,clWhite,clWhite, + htmlToColor('#5f6a72'),htmlToColor('#00a1a1'), + htmlToColor('#5f6a72'),htmlToColor('#00a1a1'),btRoundRect); + RegisterThemeAttributes('Material Oxford Blue SE',ttDark,clWhite,clWhite, + htmlToColor('#5f6a72'),htmlToColor('#0a7fbf'), + htmlToColor('#5f6a72'),htmlToColor('#0a7fbf'),btRoundRect); + RegisterThemeAttributes('Material Patterns Blue',ttLight,clBlack,clBlack, + htmlToColor('#e6ecf2'),htmlToColor('#e6ecf2'), + htmlToColor('#c4d3df'),htmlToColor('#18a1e9'),btRoundRect); + { TODO: Old Delphi Styles + RegisterThemeAttributes('Metropolis UI Black',ttDark,clWhite, + clWebLightYellow,clWebLightYellow,clDkGray,btRoundRect); + RegisterThemeAttributes('Metropolis UI Blue',ttDark,clWhite, + clWebDarkSlategray,clWebDarkSlategray,clDkGray,btRoundRect); + RegisterThemeAttributes('Metropolis UI Dark',ttDark,clWhite, + clWebLightYellow,clWebLightYellow,clDkGray,btRoundRect); + RegisterThemeAttributes('Metropolis UI Green',ttDark,clWhite, + clWebLightGreen,clWebLightGreen,clWebLightgrey,btRoundRect); + } + RegisterThemeAttributes('Obsidian',ttLight,clBlack,clBlack, + htmlToColor('#cfd2d7'),htmlToColor('#ffd24e'), + htmlToColor('#2f2f2f'),htmlToColor('#2f2f2f'),btRoundRect); + RegisterThemeAttributes('Onyx Blue',ttLight,clBlack,clWhite, + htmlToColor('#adb0b4'),htmlToColor('#42729a'), + htmlToColor('#adb0b4'),htmlToColor('#42729a'),btRoundRect); + RegisterThemeAttributes('Puerto Rico',ttDark,clWhite,clWhite, + htmlToColor('#44beb0'),htmlToColor('#52cfc0'), + htmlToColor('#44beb0'),htmlToColor('#52cfc0'),btRoundRect); + RegisterThemeAttributes('Radiant',ttDark,clWhite,clWhite, + htmlToColor('#00b8b0'),htmlToColor('#19bfb7'), + htmlToColor('#00b8b0'),htmlToColor('#19bfb7'),btRoundRect); + RegisterThemeAttributes('Ruby Graphite',ttDark,clWhite,clWhite, + htmlToColor('#bb0d00'),htmlToColor('#cc1e15'), + htmlToColor('#5c0404'),htmlToColor('#5c0404'),btRoundRect); + RegisterThemeAttributes('Sapphire Kamri',ttLight,clBlack,clBlack, + htmlToColor('#c1d9e7'),htmlToColor('#fa946b'), + htmlToColor('#6d9dbf'),htmlToColor('#a57b6c'),btRoundRect); + RegisterThemeAttributes('Silver',ttLight,clBlack,clBlack, + htmlToColor('#dce0e6'),htmlToColor('#ffd24e'), + htmlToColor('#b9bec8'),htmlToColor('#b9bec8'),btRoundRect); + RegisterThemeAttributes('Sky',ttLight,clBlack,clBlack, + htmlToColor('#efefef'),htmlToColor('#acdbef'), + htmlToColor('#bebebe'),htmlToColor('#bebebe'),btRoundRect); + RegisterThemeAttributes('Slate Classico',ttLight,clBlack,clBlack, + htmlToColor('#ebebeb'),htmlToColor('#99c7ea'), + htmlToColor('#a8a8a8'),htmlToColor('#6692be'),btRoundRect); + RegisterThemeAttributes('Smokey Quartz Kamri',ttLight,clBlack,clBlack, + htmlToColor('#dbdbdb'),htmlToColor('#f39772'), + htmlToColor('#9f9f9f'),htmlToColor('#9f9f9f'),btRoundRect); + RegisterThemeAttributes('Stellar',ttLight,htmlToColor('#3e629a'),htmlToColor('#3e629a'), + htmlToColor('#fcfcfc'),clWhite, + htmlToColor('#fcfcfc'),htmlToColor('#fcfcfc'),btRoundRect); + RegisterThemeAttributes('Stellar Dark',ttLight,htmlToColor('#3e629a'),htmlToColor('#3e629a'), + htmlToColor('#fcfcfc'),clWhite, + htmlToColor('#fcfcfc'),htmlToColor('#fcfcfc'),btRoundRect); + RegisterThemeAttributes('Sterling',ttLight,clBlack,htmlToColor('#527593'), + htmlToColor('#f9fafc'),htmlToColor('#eef6fb'), + htmlToColor('#dde1e4'),htmlToColor('#dde1e4'),btRoundRect); + RegisterThemeAttributes('Tablet Dark',ttDark,clWhite,clBlack, + htmlToColor('#3d4a79'),htmlToColor('#1abc9c'), + htmlToColor('#3d4a79'),htmlToColor('#1abc9c'),btRoundRect); + RegisterThemeAttributes('Tablet Light',ttLight,clBlack,clWhite, + clWhite,htmlToColor('#3d84dd'), + htmlToColor('#3d84dd'),htmlToColor('#3d84dd'),btRoundRect); + RegisterThemeAttributes('Turquoise Gray',ttLight,clBlack,clWhite, + htmlToColor('#ededed'),htmlToColor('#28c0e9'), + htmlToColor('#d3d3d3'),htmlToColor('#019ac4'),btRoundRect); + RegisterThemeAttributes('Vapor',ttLight,clBlack,clBlack, + htmlToColor('#89dcc8'),htmlToColor('#7cc6b4'), + htmlToColor('#89dcc8'),htmlToColor('#7cc6b4'),btRoundRect); + RegisterThemeAttributes('Wedgewood Light',ttLight,clBlack,clWhite, + htmlToColor('#f5f5f6'),htmlToColor('#5a7390'), + htmlToColor('#dfdfe1'),htmlToColor('#dfdfe1'),btRoundRect); + RegisterThemeAttributes('Windows10',ttLight,clBlack,clBlack, + htmlToColor('#cccccc'),htmlToColor('#cccccc'), + htmlToColor('#cccccc'),htmlToColor('#7a7a7a'),btRect); + RegisterThemeAttributes('Windows10 BlackPearl',ttDark,clWhite,clWhite, + htmlToColor('#36424a'),htmlToColor('#36424a'), + htmlToColor('#36424a'),htmlToColor('#f36638'),btRect); + RegisterThemeAttributes('Windows10 Blue',ttDark,clWhite,clWhite, + htmlToColor('#084f8a'),htmlToColor('#084f8a'), + htmlToColor('#084f8a'),clWhite,btRect); + RegisterThemeAttributes('Windows10 Blue Whale',ttDark,clWhite,clWhite, + htmlToColor('#364762'),htmlToColor('#364762'), + htmlToColor('#364762'),htmlToColor('#0c96f2'),btRect); + RegisterThemeAttributes('Windows10 Blue Whale LE',ttDark,clWhite,clWhite, + htmlToColor('#364762'),htmlToColor('#364762'), + htmlToColor('#364762'),htmlToColor('#0c96f2'),btRect); + RegisterThemeAttributes('Windows10 Charcoal',ttDark,clWhite,clWhite, + htmlToColor('#303030'),htmlToColor('#2a2a2a'), + htmlToColor('#545454'),htmlToColor('#1c68a8'),btRect); + RegisterThemeAttributes('Windows10 Clear Day',ttLight,clBlack,clBlack, + htmlToColor('#e5f0f6'),htmlToColor('#aed8f8'), + htmlToColor('#aed9f8'),htmlToColor('#67baed'),btRect); + RegisterThemeAttributes('Windows10 Dark',ttDark,clWhite,clWhite, + htmlToColor('#262626'),htmlToColor('#262626'), + htmlToColor('#262626'),htmlToColor('#7e7e7e'),btRect); + RegisterThemeAttributes('Windows10 Green',ttDark,clWhite,clWhite, + htmlToColor('#055249'),htmlToColor('#055249'), + htmlToColor('#055249'),clWhite,btRect); + RegisterThemeAttributes('Windows10 Malibu',ttLight,clBlack,clWhite, + htmlToColor('#deecf0'),htmlToColor('#64c6da'), + htmlToColor('#d8e5e9'),htmlToColor('#64c6da'),btRect); + RegisterThemeAttributes('Windows10 Purple',ttDark,clWhite,clWhite, + htmlToColor('#672d63'),htmlToColor('#672d63'), + htmlToColor('#672d63'),clWhite,btRect); + RegisterThemeAttributes('Windows10 SlateGray',ttDark,clWhite, + htmlToColor('#7daca8'),htmlToColor('#2a353b'), + htmlToColor('#2a353b'),htmlToColor('#2a353b'), + htmlToColor('#7daca8'),btRect); + RegisterThemeAttributes('Windows11 MineShaft',ttDark,clWhite,clBlack, + htmlToColor('#373737'),htmlToColor('#47b1e8'), + htmlToColor('#373737'),htmlToColor('#47b1e8'),btRoundRect); + RegisterThemeAttributes('Windows11 Modern Dark',ttDark,clWhite,clWhite, + htmlToColor('#373737'),htmlToColor('#405560'), + htmlToColor('#434343'),htmlToColor('#4ab2e9'),btRoundRect); + RegisterThemeAttributes('Windows11 Modern Light',ttLight,clBlack,clBlack, + htmlToColor('#fdfdfd'),htmlToColor('#eef4f9'), + htmlToColor('#bbbbbb'),htmlToColor('#0067c0'),btRoundRect); + RegisterThemeAttributes('Windows11 Polar Dark',ttDark,clWhite,clWhite, + htmlToColor('#4b5167'),htmlToColor('#0781e0'), + htmlToColor('#4b5167'),htmlToColor('#0781e0'),btRoundRect); + RegisterThemeAttributes('Windows11 Polar Light',ttLight,clBlack,clBlack, + htmlToColor('#c7d4e1'),htmlToColor('#a2d0fe'), + htmlToColor('#c7d4e1'),htmlToColor('#a2d0fe'),btRoundRect); + RegisterThemeAttributes('Windows11 White Smoke',ttLight,clBlack,clWhite, + htmlToColor('#fdfdfd'),htmlToColor('#1975c5'), + htmlToColor('#e9e9e9'),htmlToColor('#1975c5'),btRoundRect); + RegisterThemeAttributes('Zircon',ttLight,clBlack,clBlack, + htmlToColor('#e5e8e9'),htmlToColor('#a0d4de'), + htmlToColor('#e5e8e9'),htmlToColor('#a0d4de'),btRoundRect); + RegisterThemeAttributes('Zircon SE',ttLight,clBlack,clBlack, + htmlToColor('#e5e8e9'),htmlToColor('#a0d4de'), + htmlToColor('#e5e8e9'),htmlToColor('#a0d4de'),btRoundRect); + RegisterThemeAttributes('Windows11 Impressive Dark',ttDark,clWhite,clWhite, + htmlToColor('#3F506D'),htmlToColor('#5172EF'), + htmlToColor('#3F506D'),htmlToColor('#5172EF'),btRoundRect); + RegisterThemeAttributes('Windows11 Impressive Dark SE',ttDark,clWhite,clWhite, + htmlToColor('#3F506D'),htmlToColor('#5172EF'), + htmlToColor('#3F506D'),htmlToColor('#5172EF'),btRoundRect); + RegisterThemeAttributes('Windows11 Impressive Light',ttLight,clBlack,clWhite, + htmlToColor('#CAD4E6'),htmlToColor('#5172EF'), + htmlToColor('#CAD4E6'),htmlToColor('#5172EF'),btRoundRect); + RegisterThemeAttributes('Windows11 Impressive Light SE',ttLight,clBlack,clWhite, + htmlToColor('#CAD4E6'),htmlToColor('#5172EF'), + htmlToColor('#CAD4E6'),htmlToColor('#5172EF'),btRoundRect); + end; + + //IDE Styled + RegisterThemeAttributes('Win10IDE_Dark',ttDark,clWhite,clWhite, + htmlToColor('#373737'),htmlToColor('#405560'), + htmlToColor('#434343'),htmlToColor('#4ab2e9'),btRoundRect, True); + RegisterThemeAttributes('Win10IDE_Light',ttLight,clBlack,clBlack, + htmlToColor('#fdfdfd'),htmlToColor('#eef4f9'), + htmlToColor('#bbbbbb'),htmlToColor('#0067c0'),btRoundRect, True); + RegisterThemeAttributes('Mountain_Mist',ttLight,clBlack,clBlack, + htmlToColor('#fdfdfd'),htmlToColor('#eef4f9'), + htmlToColor('#bbbbbb'),htmlToColor('#0067c0'),btRoundRect, True); +end; + +procedure FreeThemesAttributes; +var + LThemeAttribute: TThemeAttribute; +begin + for LThemeAttribute in ThemeAttributes do + LThemeAttribute.Free; + ThemeAttributes.Free; +end; + +initialization + SetLength(ButtonClasses,0); + SetLength(ButtonAppearances,0); + + InitDefaultThemesAttributes; + + RegisterButtonFamily( + TButtonStandardStyles.Create); + +finalization + FreeThemesAttributes; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledAnimatedButton.pas b/Ext/StyledComponents/source/Vcl.StyledAnimatedButton.pas new file mode 100644 index 0000000..9fdd5c2 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledAnimatedButton.pas @@ -0,0 +1,614 @@ +{******************************************************************************} +{ } +{ TStyledAnimatedButton: a StyledButton with "animated icon" } +{ using a Skia TSkAnimatedImage component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledAnimatedButton; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Winapi.Windows + , Winapi.Messages + , System.SysUtils + , System.Types + , System.Classes + , System.UITypes + , Vcl.Controls + , Vcl.ImgList + , Vcl.Graphics + , Vcl.StyledButton + , Vcl.ButtonStylesAttributes + , Vcl.Skia + , Vcl.SkAnimatedImageHelper + ; + +const + DEFAULT_ANIM_SIZE = 32; + DEFAULT_ANIM_MARGIN = 10; + +type + TAutoAnimationType = (AnimateOnMouseOver, AnimateOnClick, AnimateAlways, AnimateOnFocus); + TAutoAnimationTypes = set of TAutoAnimationType; + + { TStyledAnimatedButtonRender } + TStyledAnimatedButtonRender = class(TStyledButtonRender) + private + FAnimationHeight: Integer; + FAnimationWidth: Integer; + FAutoSizeAnimation: Boolean; + FAutoSizeAnimationMargin: Integer; + procedure SetAutoSizeAnimationMargin(const AValue: Integer); + procedure SetAnimationHeight(const AValue: Integer); + procedure SetAnimationWidth(const AValue: Integer); + procedure SetAutoSizeAnimation(const AValue: Boolean); + public + {$IFDEF HiDPISupport} + procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override; + {$ENDIF} + function GetImageSize(out AWidth: Integer; out AHeight: Integer; out AImageList: TCustomImageList; out AImageIndex: Integer): Boolean; override; + constructor CreateStyled(AOwner: TControl; + const AOnClick: TNotifyEvent; + const AControlFont: TControlFont; + const AGetCaption: TGetCaption; + const ASetCaption: TSetCaption; + const AGetParentFont: TGetParentFont; + const ASetParentFont: TSetParentFont; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; + const AUseCustomDrawType: Boolean); override; + property AnimationHeight: Integer read FAnimationHeight write SetAnimationHeight; + property AnimationWidth: Integer read FAnimationWidth write SetAnimationWidth; + property AutoSizeAnimation: Boolean read FAutoSizeAnimation write SetAutoSizeAnimation; + property AutoSizeAnimationMargin: Integer read FAutoSizeAnimationMargin write SetAutoSizeAnimationMargin; + end; + + { TStyledAnimatedButton } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledAnimatedButton = class(TStyledButton) + strict private + FSkAnimatedImage: TSkAnimatedImage; + procedure AnimatedImageClick(Sender: TObject); + procedure AnimatedImageDblClick(Sender: TObject); + procedure AnimatedImageMouseEnter(Sender: TObject); + procedure AnimatedImageMouseLeave(Sender: TObject); + private + FAutoAnimationTypes: TAutoAnimationTypes; + function GetAnimatedImage: TSkAnimatedImage; + function GetSource: TSkAnimatedImage.TSource; + procedure SetSource(const AValue: TSkAnimatedImage.TSource); + procedure SetAnimationHeight(const AValue: Integer); + procedure SetAnimationWidth(const AValue: Integer); + procedure SetAutoSizeAnimation(const AValue: Boolean); + procedure SetAutoSizeAnimationMargin(const AValue: Integer); + procedure SetAutoAnimationTypes(const AValue: TAutoAnimationTypes); + procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS; + procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS; + procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; + procedure ReadData(AStream: TStream); + procedure WriteData(AStream: TStream); + procedure SetAnimationInverse(const AValue: Boolean); + procedure SetAnimationLoop(const AValue: Boolean); + function GetAnimationInverse: Boolean; + function GetAnimationLoop: Boolean; + function GetAnimationHeight: Integer; + function GetAnimationWidth: Integer; + function GetAutoSizeAnimation: Boolean; + function GetAutoSizeAnimationMargin: Integer; + function GetRender: TStyledAnimatedButtonRender; + strict protected + procedure DefineProperties(AFiler: TFiler); override; + protected + procedure Loaded; override; + procedure SetCursor(const AValue: TCursor); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure Paint; override; + function GetRenderClass: TStyledButtonRenderClass; override; + public + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); override; + destructor Destroy; override; + procedure LoadAnimationFromFile(const AFileName: TFileName); + procedure LoadAnimationFromStream(const AStream: TStream); + procedure LoadAnimationFromResource(const AResourceName: string); + procedure Click; override; + //Animation procedures and functions + function CanPlayAnimation: boolean; + procedure StartAnimation(ALoop: Boolean = False; + AInverse: Boolean = False; AProgress: Double = 0); + procedure PauseAnimation; + procedure StopAnimation; + procedure ResumeAnimation; + function AnimationIsRunning: Boolean; + procedure CreateAnimation; + property AnimatedImage: TSkAnimatedImage read GetAnimatedImage; + property Render: TStyledAnimatedButtonRender read GetRender; + published + property AutoAnimationTypes: TAutoAnimationTypes read FAutoAnimationTypes write SetAutoAnimationTypes default [AnimateOnMouseOver]; + property AutoSizeAnimation: Boolean read GetAutoSizeAnimation write SetAutoSizeAnimation default True; + property AutoSizeAnimationMargin: Integer read GetAutoSizeAnimationMargin write SetAutoSizeAnimationMargin default DEFAULT_ANIM_MARGIN; + property AnimationSource: TSkAnimatedImage.TSource read GetSource write SetSource; + property AnimationWidth: Integer read GetAnimationWidth write SetAnimationWidth default DEFAULT_ANIM_SIZE; + property AnimationHeight: Integer read GetAnimationHeight write SetAnimationHeight default DEFAULT_ANIM_SIZE; + property AnimationLoop: Boolean read GetAnimationLoop write SetAnimationLoop default False; + property AnimationInverse: Boolean read GetAnimationInverse write SetAnimationInverse default False; + end; + +implementation + +uses + System.Skia + , System.math + {$IFDEF D10_3+} + , Vcl.VirtualImageList + {$ENDIF} + ; + +{ TStyledAnimatedButtonRender } + +procedure TStyledAnimatedButtonRender.SetAutoSizeAnimationMargin( + const AValue: Integer); +begin + if FAutoSizeAnimationMargin <> AValue then + begin + FAutoSizeAnimationMargin := AValue; + Invalidate; + end; +end; + +constructor TStyledAnimatedButtonRender.CreateStyled(AOwner: TControl; + const AOnClick: TNotifyEvent; const AControlFont: TControlFont; + const AGetCaption: TGetCaption; const ASetCaption: TSetCaption; + const AGetParentFont: TGetParentFont; const ASetParentFont: TSetParentFont; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; const AUseCustomDrawType: Boolean); +begin + inherited; + AnimationHeight := DEFAULT_ANIM_SIZE; + AnimationWidth := DEFAULT_ANIM_SIZE; + AutoSizeAnimationMargin := DEFAULT_ANIM_MARGIN; + AutoSizeAnimation := True; +end; + +function TStyledAnimatedButtonRender.GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList; out AImageIndex: Integer): Boolean; +var + LStyledAnimatedButton: TStyledAnimatedButton; + LSize: Integer; +begin + Result := inherited GetImageSize(AWidth, AHeight, AImageList, AImageIndex); + if not Result then + begin + if OwnerControl is TStyledAnimatedButton then + begin + LStyledAnimatedButton := TStyledAnimatedButton(OwnerControl); + if LStyledAnimatedButton.AutoSizeAnimation then + begin + LSize := Min(OwnerControl.Width, OwnerControl.Height); + AWidth := LSize - (FAutoSizeAnimationMargin * 2); + AHeight := AWidth; + end + else + begin + AWidth := FAnimationWidth; + AHeight := FAnimationHeight; + end; + end; + end; +end; + +procedure TStyledAnimatedButtonRender.SetAnimationHeight(const AValue: Integer); +begin + if FAnimationHeight <> AValue then + begin + FAnimationHeight := AValue; + FAutoSizeAnimation := False; + Invalidate; + end; +end; + +procedure TStyledAnimatedButtonRender.SetAnimationWidth(const AValue: Integer); +begin + if FAnimationWidth <> AValue then + begin + FAnimationWidth := AValue; + FAutoSizeAnimation := False; + Invalidate; + end; +end; + +procedure TStyledAnimatedButtonRender.SetAutoSizeAnimation( + const AValue: Boolean); +begin + if FAutoSizeAnimation <> AValue then + begin + FAutoSizeAnimation := AValue; + Invalidate; + end; +end; + +{$IFDEF HiDPISupport} +procedure TStyledAnimatedButtonRender.ChangeScale(M, D: Integer; isDpiChange: Boolean); +begin + if isDpiChange then + begin + FAnimationHeight := MulDiv(FAnimationHeight, M, D); + FAnimationWidth := MulDiv(FAnimationWidth, M, D); + FAutoSizeAnimationMargin := MulDiv(FAutoSizeAnimationMargin, M, D); + end; +end; +{$ENDIF} + +{ TStyledAnimatedButton } + +procedure TStyledAnimatedButton.CreateAnimation; +begin + FSkAnimatedImage := TSkAnimatedImage.Create(Self); + //By default the animation is stopped on Progress 1 (last frame) + FSkAnimatedImage.SetProgress(1); + if not (AnimateAlways in AutoAnimationTypes) then + FSkAnimatedImage.Animation.Stop; + FSkAnimatedImage.SetLoop(False); + FSkAnimatedImage.Parent := Self; + FSkAnimatedImage.OnClick := AnimatedImageClick; + FSkAnimatedImage.OnDblClick := AnimatedImageDblClick; + FSkAnimatedImage.OnMouseEnter := AnimatedImageMouseEnter; + FSkAnimatedImage.OnMouseLeave := AnimatedImageMouseLeave; + //FSkAnimatedImage.Visible := False; + FSkAnimatedImage.Cursor := Cursor; +end; + +constructor TStyledAnimatedButton.CreateStyled( + AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + inherited CreateStyled(AOwner, AFamily, AClass, AAppearance); + FAutoAnimationTypes := [AnimateOnMouseOver]; +end; + +procedure TStyledAnimatedButton.ReadData(AStream: TStream); +begin + if (AStream.Size = 0) and Assigned(FSkAnimatedImage) then + FSkAnimatedImage.Source.Data := nil + else + AnimatedImage.LoadFromStream(AStream); +end; + +procedure TStyledAnimatedButton.WriteData(AStream: TStream); +begin + if Assigned(FSkAnimatedImage) and (FSkAnimatedImage.Source.Data <> nil) then + AStream.WriteBuffer(FSkAnimatedImage.Source.Data, + Length(FSkAnimatedImage.Source.Data)); +end; + +procedure TStyledAnimatedButton.DefineProperties(AFiler: TFiler); + + function DoWrite: Boolean; + begin + if AFiler.Ancestor <> nil then + Result := (not (AFiler.Ancestor is TStyledAnimatedButton)) or + not TStyledAnimatedButton(AFiler.Ancestor).AnimationSource.Equals(Self.AnimationSource) + else + Result := AnimatedImage.Source.Data <> nil; + end; + +begin + inherited; + AFiler.DefineBinaryProperty('AnimationData', ReadData, WriteData, DoWrite); +end; + +destructor TStyledAnimatedButton.Destroy; +begin + inherited; +end; + +function TStyledAnimatedButton.GetAnimatedImage: TSkAnimatedImage; +begin + if not Assigned(FSkAnimatedImage) then + CreateAnimation; + Result := FSkAnimatedImage; +end; + +function TStyledAnimatedButton.GetAnimationHeight: Integer; +begin + Result := Render.AnimationHeight; +end; + +function TStyledAnimatedButton.GetAnimationInverse: Boolean; +begin + Result := AnimatedImage.GetInverse; +end; + +function TStyledAnimatedButton.GetAnimationLoop: Boolean; +begin + Result := AnimatedImage.GetLoop; +end; + +function TStyledAnimatedButton.GetAnimationWidth: Integer; +begin + Result := Render.AnimationWidth; +end; + +function TStyledAnimatedButton.GetAutoSizeAnimation: Boolean; +begin + Result := Render.AutoSizeAnimation; +end; + +function TStyledAnimatedButton.GetAutoSizeAnimationMargin: Integer; +begin + Result := Render.AutoSizeAnimationMargin; +end; + +function TStyledAnimatedButton.GetRender: TStyledAnimatedButtonRender; +begin + Result := inherited Render as TStyledAnimatedButtonRender; +end; + +function TStyledAnimatedButton.GetRenderClass: TStyledButtonRenderClass; +begin + Result := TStyledAnimatedButtonRender; +end; + +function TStyledAnimatedButton.GetSource: TSkAnimatedImage.TSource; +begin + Result := AnimatedImage.Source; +end; + +procedure TStyledAnimatedButton.LoadAnimationFromFile(const AFileName: TFileName); +begin + AnimatedImage.LoadFromfile(AFileName); +end; + +procedure TStyledAnimatedButton.LoadAnimationFromStream(const AStream: TStream); +begin + AnimatedImage.LoadFromStream(AStream); +end; + +procedure TStyledAnimatedButton.LoadAnimationFromResource( + const AResourceName: string); +var + LStream: TResourceStream; +begin + LStream := TResourceStream.Create(HInstance, AResourceName, + RT_RCDATA); + try + AnimatedImage.LoadFromStream(LStream); + finally + LStream.Free; + end; +end; + + +procedure TStyledAnimatedButton.Loaded; +begin + inherited; + if csDesigning in ComponentState then + AnimatedImage.StartAnimation; +end; + +procedure TStyledAnimatedButton.Notification(AComponent: TComponent; + Operation: TOperation); +begin +(* + if (Operation = opInsert) and (AComponent = Images) then + StopAnimation; +*) + inherited; +end; + +function TStyledAnimatedButton.CanPlayAnimation: boolean; +begin + if Assigned(AnimatedImage) then + Result := AnimatedImage.CanPlayAnimation + else + Result := False; +end; + +procedure TStyledAnimatedButton.Click; +begin + if AnimateOnClick in FAutoAnimationTypes then + AnimatedImage.StartAnimation; + inherited; +end; + +procedure TStyledAnimatedButton.WMKillFocus(var Message: TMessage); +begin + inherited; + if AnimateOnFocus in FAutoAnimationTypes then + AnimatedImage.StopAnimation; +end; + +procedure TStyledAnimatedButton.WMSetFocus(var Message: TMessage); +begin + if AnimateOnFocus in FAutoAnimationTypes then + AnimatedImage.StartAnimation; + inherited; +end; + +procedure TStyledAnimatedButton.CMMouseEnter(var Message: TMessage); +begin +// if AnimateOnMouseOver in FAutoAnimationTypes then +// AnimatedImage.StartAnimation; + inherited; +end; + +procedure TStyledAnimatedButton.CMMouseLeave(var Message: TMessage); +begin +// if AnimateOnMouseOver in FAutoAnimationTypes then +// AnimatedImage.StopAnimation; + inherited; +end; + +procedure TStyledAnimatedButton.StartAnimation(ALoop: Boolean = False; + AInverse: Boolean = False; AProgress: Double = 0); +begin + AnimatedImage.SetLoop(ALoop); + AnimatedImage.SetInverse(AInverse); + AnimatedImage.InitAnimation(ALoop, AInverse, AProgress); + AnimatedImage.StartAnimation; +end; + +procedure TStyledAnimatedButton.AnimatedImageClick(Sender: TObject); +begin + Self.Click; +end; + +procedure TStyledAnimatedButton.AnimatedImageDblClick(Sender: TObject); +begin + Self.DblClick; +end; + +procedure TStyledAnimatedButton.AnimatedImageMouseEnter(Sender: TObject); +begin + if AnimateOnMouseOver in FAutoAnimationTypes then + AnimatedImage.StartAnimation; +end; + +procedure TStyledAnimatedButton.AnimatedImageMouseLeave(Sender: TObject); +begin + if AnimateOnMouseOver in FAutoAnimationTypes then + AnimatedImage.StopAnimation; +end; + +function TStyledAnimatedButton.AnimationIsRunning: Boolean; +begin + Result := AnimatedImage.Animation.Running; +end; + +procedure TStyledAnimatedButton.StopAnimation; +begin + AnimatedImage.Animation.Stop; + AnimatedImage.Animation.Progress := 1; +end; + +procedure TStyledAnimatedButton.Paint; +var + LImageRect: TRect; + LImageList: TCustomImageList; + LImageIndex: Integer; + LImageWidth, LImageHeight: Integer; +begin + if Assigned(FSkAnimatedImage) then + begin + Render.GetImageSize(LImageWidth, LImageHeight, + LImageList, LImageIndex); + if (LImageWidth=0) or (LImageHeight=0) then + begin + LImageWidth := Render.AnimationWidth; + LImageHeight := Render.AnimationHeight; + end; + LImageRect := ClientRect; + LImageRect := CalcImageRect(LImageRect, LImageWidth, LImageHeight); + if (LImageRect.Width <> 0) and (LImageRect.Height <> 0) then + begin + FSkAnimatedImage.SetBounds(LImageRect.Left, LImageRect.Top, + LImageRect.Width, LImageRect.Height); + if not FSkAnimatedImage.AnimationRunning then + FSkAnimatedImage.Animation.Progress := 1; + end; + end; + inherited; +end; + +procedure TStyledAnimatedButton.PauseAnimation; +begin + AnimatedImage.PauseAnimation; +end; + +procedure TStyledAnimatedButton.ResumeAnimation; +begin + AnimatedImage.ResumeAnimation; +end; + +procedure TStyledAnimatedButton.SetSource( + const AValue: TSkAnimatedImage.TSource); +begin + AnimatedImage.Source.Assign(AValue); +end; + +procedure TStyledAnimatedButton.SetAnimationHeight(const AValue: Integer); +begin + Render.AnimationHeight := AValue; +end; + +procedure TStyledAnimatedButton.SetAnimationInverse(const AValue: Boolean); +begin + AnimatedImage.SetInverse(AValue); +end; + +procedure TStyledAnimatedButton.SetAnimationLoop(const AValue: Boolean); +begin + AnimatedImage.setloop(AValue); +end; + +procedure TStyledAnimatedButton.SetAnimationWidth(const AValue: Integer); +begin + Render.AnimationWidth := AValue; +end; + +procedure TStyledAnimatedButton.SetAutoAnimationTypes( + const AValue: TAutoAnimationTypes); +begin + if FAutoAnimationTypes <> AValue then + begin + AnimatedImage.StopAnimation; + FAutoAnimationTypes := AValue; + if AnimateAlways in AutoAnimationTypes then + begin + AnimationLoop := True; + AnimatedImage.StartAnimation(True); + end; + end; +end; + +procedure TStyledAnimatedButton.SetAutoSizeAnimation(const AValue: Boolean); +begin + Render.AutoSizeAnimation := AValue; +end; + +procedure TStyledAnimatedButton.SetAutoSizeAnimationMargin(const AValue: Integer); +begin + Render.AutoSizeAnimationMargin := AValue; +end; + +procedure TStyledAnimatedButton.SetCursor(const AValue: TCursor); +begin + inherited; + //Same cursor of button for the internal component + AnimatedImage.Cursor := AValue; +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledAnimatedTaskDialog.pas b/Ext/StyledComponents/source/Vcl.StyledAnimatedTaskDialog.pas new file mode 100644 index 0000000..739e8f0 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledAnimatedTaskDialog.pas @@ -0,0 +1,58 @@ +{******************************************************************************} +{ } +{ StyledAnimatedTaskDialog: a Task Dialog Component with StyleButtons } +{ and animations using Skia4Delphi } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledAnimatedTaskDialog; + +{$INCLUDE StyledComponents.inc} + +interface + +uses + System.SysUtils + , System.Classes + , WinApi.Windows + , Vcl.StyledTaskDialog + ; + +//{$WARN SYMBOL_PLATFORM OFF} +type + TStyledAnimatedTaskDialog = class(TStyledTaskDialog) + private + strict protected + public + end; + +implementation + +uses + Skia.Vcl.StyledTaskDialogAnimatedUnit //to register StyledTaskDialogAnimatedUnit + ; + +initialization + +finalization + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledAnimatedToolbar.pas b/Ext/StyledComponents/source/Vcl.StyledAnimatedToolbar.pas new file mode 100644 index 0000000..b2f7148 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledAnimatedToolbar.pas @@ -0,0 +1,421 @@ +{******************************************************************************} +{ } +{ StyledToolbar: a Toolbar with TStyledAnimatedToolButtons inside } +{ Based on TStyledToolbar and animations using Skia4Delphi } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledAnimatedToolbar; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.StyledButton + , Vcl.StyledAnimatedButton + , Vcl.StyledToolbar + , Winapi.Windows + , Winapi.Messages + , System.SysUtils + , System.Types + , System.Classes + , System.UITypes + , Vcl.Controls + , Vcl.ImgList + , Vcl.Graphics + , Vcl.ButtonStylesAttributes + , Vcl.Skia + , Vcl.SkAnimatedImageHelper + ; + +type + TStyledAnimatedToolbar = class; + TStyledAnimatedToolButton = class; + + TAnimatedButtonProc = reference to procedure (Button: TStyledAnimatedToolButton); + TControlProc = reference to procedure (Control: TControl); + + TStyledAnimatedToolButton = class(TStyledToolButton) + strict private + FSkAnimatedImage: TSkAnimatedImage; + FAnimationSource: TSkAnimatedImage.TSource; + procedure AnimatedImageClick(Sender: TObject); + procedure AnimatedImageDblClick(Sender: TObject); + private + FAnimationHeight: Integer; + FAnimationWidth: Integer; + FAutoSizeAnimation: Boolean; + FAutoSizeAnimationMargin: Integer; + FAutoAnimationTypes: TAutoAnimationTypes; + function GetAnimatedImage: TSkAnimatedImage; + function GetSource: TSkAnimatedImage.TSource; + procedure SetSource(const AValue: TSkAnimatedImage.TSource); + procedure SetAnimationHeight(const AValue: Integer); + procedure SetAnimationWidth(const AValue: Integer); + procedure SetAutoSizeAnimation(const AValue: Boolean); + procedure SetAutoSizeAnimationMargin(const AValue: Integer); + procedure SetAutoAnimationTypes(const AValue: TAutoAnimationTypes); + procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS; + procedure CMMouseEnter(var Message: TNotifyEvent); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TNotifyEvent); message CM_MOUSELEAVE; + procedure ReadData(AStream: TStream); + procedure WriteData(AStream: TStream); + strict protected + procedure DefineProperties(AFiler: TFiler); override; + protected + procedure SetCursor(const AValue: TCursor); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure Paint; override; + function GetRenderClass: TStyledButtonRenderClass; override; + public + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); override; + destructor Destroy; override; + procedure LoadAnimationFromFile(const AFileName: TFileName); + procedure LoadAnimationFromStream(const AStream: TStream); + procedure Click; override; + public + //Animation procedures and functions + function CanPlayAnimation: boolean; + procedure StartAnimation(ALoop: Boolean = False; + AInverse: Boolean = False; AProgress: Double = 0); + procedure PauseAnimation; + procedure StopAnimation; + procedure ResumeAnimation; + function AnimationIsRunning: Boolean; + procedure CreateAnimation; + property AnimatedImage: TSkAnimatedImage read GetAnimatedImage; + published + property AutoAnimationTypes: TAutoAnimationTypes read FAutoAnimationTypes write SetAutoAnimationTypes; + property AutoSizeAnimation: Boolean read FAutoSizeAnimation write SetAutoSizeAnimation default True; + property AutoSizeAnimationMargin: Integer read FAutoSizeAnimationMargin write SetAutoSizeAnimationMargin default DEFAULT_ANIM_MARGIN; + property AnimationSource: TSkAnimatedImage.TSource read GetSource write SetSource; + property AnimationWidth: Integer read FAnimationWidth write SetAnimationWidth default DEFAULT_ANIM_SIZE; + property AnimationHeight: Integer read FAnimationHeight write SetAnimationHeight default DEFAULT_ANIM_SIZE; + end; + + TStyledAnimatedToolbar = class(TStyledToolbar) + private + protected + function GetStyledToolButtonClass: TStyledToolButtonClass; override; + public + published + end; + +implementation + +uses + Vcl.Consts + , System.IOUtils + , System.math + {$IFDEF D10_3+} + , Vcl.VirtualImageList + {$ENDIF} + ; + +{ TStyledAnimatedToolbar } + +function TStyledAnimatedToolbar.GetStyledToolButtonClass: TStyledToolButtonClass; +begin + Result := TStyledAnimatedToolButton; +end; + +{ TStyledAnimatedToolButton } + +procedure TStyledAnimatedToolButton.CreateAnimation; +begin + FSkAnimatedImage := TSkAnimatedImage.Create(Self); + //By default the animation is stopped on Progress 1 (last frame) + FSkAnimatedImage.SetProgress(1); + FSkAnimatedImage.Animation.Stop; + FSkAnimatedImage.SetLoop(False); + if Assigned(Self.Parent) then + FSkAnimatedImage.Parent := Self.Parent; + FSkAnimatedImage.OnClick := AnimatedImageClick; + FSkAnimatedImage.OnDblClick := AnimatedImageDblClick; + FSkAnimatedImage.Visible := False; + FSkAnimatedImage.Cursor := Cursor; +end; + +constructor TStyledAnimatedToolButton.CreateStyled( + AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + inherited CreateStyled(AOwner, AFamily, AClass, AAppearance); + FAnimationHeight := DEFAULT_ANIM_SIZE; + FAnimationWidth := DEFAULT_ANIM_SIZE; + FAutoSizeAnimationMargin := DEFAULT_ANIM_MARGIN; + FAutoSizeAnimation := True; +end; + +procedure TStyledAnimatedToolButton.LoadAnimationFromStream( + const AStream: TStream); +var + LBytes: TBytes; +begin + SetLength(LBytes, AStream.Size - AStream.Position); + if Length(LBytes) > 0 then + AStream.ReadBuffer(LBytes, 0, Length(LBytes)); + FAnimationSource.Data := LBytes; +end; + +procedure TStyledAnimatedToolButton.LoadAnimationFromFile( + const AFileName: TFileName); +begin + FAnimationSource.Data := TFile.ReadAllBytes(AFileName); + ; +end; + +procedure TStyledAnimatedToolButton.ReadData(AStream: TStream); +begin + if AStream.Size = 0 then + FAnimationSource.Data := nil + else + LoadAnimationFromStream(AStream); +end; + +procedure TStyledAnimatedToolButton.WriteData(AStream: TStream); +begin + if FAnimationSource.Data <> nil then + AStream.WriteBuffer(FAnimationSource.Data, + Length(FAnimationSource.Data)); +end; + +procedure TStyledAnimatedToolButton.DefineProperties(AFiler: TFiler); + + function DoWrite: Boolean; + begin + if AFiler.Ancestor <> nil then + Result := (not (AFiler.Ancestor is TStyledAnimatedButton)) or + not TStyledAnimatedButton(AFiler.Ancestor).AnimationSource.Equals(FAnimationSource) + else + Result := FAnimationSource.Data <> nil; + end; + +begin + inherited; + AFiler.DefineBinaryProperty('AnimationData', ReadData, WriteData, DoWrite); +end; + +destructor TStyledAnimatedToolButton.Destroy; +begin + inherited; +end; + +function TStyledAnimatedToolButton.GetAnimatedImage: TSkAnimatedImage; +begin + if not Assigned(FSkAnimatedImage) then + CreateAnimation; + Result := FSkAnimatedImage; +end; + +function TStyledAnimatedToolButton.GetRenderClass: TStyledButtonRenderClass; +begin + Result := TStyledAnimatedButtonRender; +end; + +function TStyledAnimatedToolButton.GetSource: TSkAnimatedImage.TSource; +begin + Result := FAnimationSource; +end; + +procedure TStyledAnimatedToolButton.Notification(AComponent: TComponent; Operation: TOperation); +begin +(* + if (Operation = opInsert) and (AComponent = Images) then + StopAnimation; +*) + inherited; +end; + +function TStyledAnimatedToolButton.CanPlayAnimation: boolean; +begin + Result := Length(FAnimationSource.Data) > 0; +end; + +procedure TStyledAnimatedToolButton.Click; +begin + if AnimateOnClick in FAutoAnimationTypes then + AnimatedImage.StartAnimation; + inherited; +end; + +procedure TStyledAnimatedToolButton.WMSetFocus(var Message: TMessage); +begin + if AnimateOnFocus in FAutoAnimationTypes then + AnimatedImage.StartAnimation; + inherited; +end; + +procedure TStyledAnimatedToolButton.CMMouseEnter(var Message: TNotifyEvent); +begin + if AnimateOnMouseOver in FAutoAnimationTypes then + AnimatedImage.StartAnimation; + inherited; +end; + +procedure TStyledAnimatedToolButton.CMMouseLeave(var Message: TNotifyEvent); +begin + if AnimateOnMouseOver in FAutoAnimationTypes then + AnimatedImage.StopAnimation; + inherited; +end; + +procedure TStyledAnimatedToolButton.StartAnimation(ALoop: Boolean = False; + AInverse: Boolean = False; AProgress: Double = 0); +begin + AnimatedImage.SetLoop(ALoop); + AnimatedImage.SetInverse(AInverse); + AnimatedImage.InitAnimation(ALoop, AInverse, AProgress); + AnimatedImage.StartAnimation; +end; + +procedure TStyledAnimatedToolButton.AnimatedImageClick(Sender: TObject); +begin + Self.Click; +end; + +procedure TStyledAnimatedToolButton.AnimatedImageDblClick(Sender: TObject); +begin + Self.DblClick; +end; + +function TStyledAnimatedToolButton.AnimationIsRunning: Boolean; +begin + Result := AnimatedImage.Animation.Running; +end; + +procedure TStyledAnimatedToolButton.StopAnimation; +begin + AnimatedImage.Animation.Stop; + AnimatedImage.Animation.Progress := 1; +end; + +procedure TStyledAnimatedToolButton.Paint; +(* +var + LImageRect: TRect; + LImageList: TCustomImageList; + LImageIndex: Integer; + LImageWidth, LImageHeight: Integer; +*) +begin +(* + if Assigned(FSkAnimatedImage) then + begin + Render.GetImageSize(LImageWidth, LImageHeight, + LImageList, LImageIndex); + if (LImageWidth=0) or (LImageHeight=0) then + begin + LImageWidth := FAnimationWidth; + LImageHeight := FAnimationHeight; + end; + LImageRect := ClientRect; + LImageRect := CalcImageRect(LImageRect, LImageWidth, LImageHeight); + if (LImageRect.Width <> 0) and (LImageRect.Height <> 0) then + begin + FSkAnimatedImage.SetBounds(LImageRect.Left, LImageRect.Top, LImageRect.Width, LImageRect.Height); + if not FSkAnimatedImage.AnimationRunning then + FSkAnimatedImage.Animation.Progress := 1; + end; + end + else +*) + inherited; +end; + +procedure TStyledAnimatedToolButton.PauseAnimation; +begin + AnimatedImage.PauseAnimation; +end; + +procedure TStyledAnimatedToolButton.ResumeAnimation; +begin + AnimatedImage.ResumeAnimation; +end; + +procedure TStyledAnimatedToolButton.SetSource( + const AValue: TSkAnimatedImage.TSource); +begin + FAnimationSource.Assign(AValue); +end; + +procedure TStyledAnimatedToolButton.SetAnimationHeight(const AValue: Integer); +begin + if FAnimationHeight <> AValue then + begin + FAnimationHeight := AValue; + FAutoSizeAnimation := False; + Invalidate; + end; +end; + +procedure TStyledAnimatedToolButton.SetAnimationWidth(const AValue: Integer); +begin + if FAnimationWidth <> AValue then + begin + FAnimationWidth := AValue; + FAutoSizeAnimation := False; + Invalidate; + end; +end; + +procedure TStyledAnimatedToolButton.SetAutoAnimationTypes( + const AValue: TAutoAnimationTypes); +begin + if FAutoAnimationTypes <> AValue then + begin + FAutoAnimationTypes := AValue; + end; +end; + +procedure TStyledAnimatedToolButton.SetAutoSizeAnimation(const AValue: Boolean); +begin + if FAutoSizeAnimation <> AValue then + begin + FAutoSizeAnimation := AValue; + Invalidate; + end; +end; + +procedure TStyledAnimatedToolButton.SetAutoSizeAnimationMargin(const AValue: Integer); +begin + if FAutoSizeAnimationMargin <> AValue then + begin + FAutoSizeAnimationMargin := AValue; + Invalidate; + end; +end; + +procedure TStyledAnimatedToolButton.SetCursor(const AValue: TCursor); +begin + inherited; + //Same cursor of button for the internal component + AnimatedImage.Cursor := AValue; +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledButton.pas b/Ext/StyledComponents/source/Vcl.StyledButton.pas new file mode 100644 index 0000000..ecb414a --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledButton.pas @@ -0,0 +1,6205 @@ +{******************************************************************************} +{ } +{ TStyledGraphicButton: a "styled" Button based on TGraphicControl } +{ TStyledButton: a "styled" Button Component similar to TButton } +{ TStyledSpeedButton: a "styled" Button Component similar to TSpeedButton } +{ TStyledBitBtn: a "styled" Button Component similar to TBitBtn } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledButton; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.ImgList + , System.Math + , System.UITypes + , Winapi.Windows + , Winapi.CommCtrl + , Winapi.Messages + , Vcl.Graphics + , Vcl.buttons + , System.SysUtils + , System.Classes + , Vcl.StdCtrls + , Vcl.Themes + , Vcl.Controls + , Vcl.ActnList + , Vcl.Menus + , Vcl.ButtonStylesAttributes + , Vcl.StandardButtonStyles + ; + +const + StyledButtonsVersion = '3.5.3'; + +resourcestring + ERROR_SETTING_BUTTON_STYLE = 'Error setting Button Style: %s/%s/%s not available'; + ERROR_CANNOT_USE_RENDER = 'Error: cannot use TStyledButtonRender in this context'; + +type + EStyledButtonError = Exception; + + TStyledButtonState = (bsmNormal, bsmPressed, bsmSelected, bsmHot, bsmDisabled); + + TStyledButtonRender = class; + TStyledButtonRenderClass = class of TStyledButtonRender; + + { TGraphicButtonActionLink } + TGraphicButtonActionLink = class(TControlActionLink) + strict private + function ClientRender: TStyledButtonRender; + function AssignedClientRender: Boolean; + strict protected + FClient: TControl; + function IsEnabledLinked: Boolean; override; + function IsImageIndexLinked: Boolean; override; + {$IFDEF D10_4+} + function IsImageNameLinked: Boolean; override; + {$ENDIF} + procedure SetEnabled(Value: Boolean); override; + procedure SetImageIndex(Value: Integer); override; + procedure AssignClient(AClient: TObject); override; + procedure SetGroupIndex(Value: Integer); override; + procedure SetChecked(Value: Boolean); override; + public + function IsCheckedLinked: Boolean; override; + function IsGlyphLinked(Index: TImageIndex): Boolean; virtual; + end; + + TControlFont = procedure (var AFont: TFont) of Object; + + TSetCaption = procedure (const ACaption: TCaption) of Object; + TGetCaption = function : TCaption of Object; + + TSetParentFont = procedure (const AParentFont: Boolean) of Object; + TGetParentFont = function: Boolean of Object; + + { TStyledButtonRender } + TStyledButtonRender = class(TObject) + strict private + FOwnerControl: TControl; + + FUpdateCount: Integer; + FRescalingButton: Boolean; + FButtonStyleNormal: TStyledButtonAttributes; + FButtonStylePressed: TStyledButtonAttributes; + FButtonStyleSelected: TStyledButtonAttributes; + FButtonStyleHot: TStyledButtonAttributes; + FButtonStyleDisabled: TStyledButtonAttributes; + FNotificationBadge: TNotificationBadgeAttributes; + FModalResult: TModalResult; + FMouseInControl: Boolean; + FState: TButtonState; + FImageMargins: TImageMargins; + + FStyleRadius: Integer; + FStyleRoundedCorners: TRoundedCorners; + FStyleDrawType: TStyledButtonDrawType; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + + FStyleApplied: Boolean; + + FDisabledImages: TCustomImageList; + FImages: TCustomImageList; + FImageChangeLink: TChangeLink; + + FDisabledImageIndex: TImageIndex; + FHotImageIndex: TImageIndex; + FStylusHotImageIndex: TImageIndex; + FPressedImageIndex: TImageIndex; + FSelectedImageIndex: TImageIndex; + {$IFDEF D10_4+} + FDisabledImageName: TImageName; + FHotImageName: TImageName; + FStylusHotImageName: TImageName; + FPressedImageName: TImageName; + FSelectedImageName: TImageName; + {$ENDIF} + FSpacing: Integer; + FMargin: Integer; + FImageAlignment: TImageAlignment; + FButtonLayout: TButtonLayout; + FTag: Integer; + FWordWrap: Boolean; + FActive: Boolean; + FDefault: Boolean; + FCancel: Boolean; + FKind: TBitBtnKind; + FStyle: TCustomButton.TButtonStyle; + FDropDownMenu: TPopupMenu; + FDropDownRect: TRect; + FOnDropDownClick: TNotifyEvent; + FMouseOverDropDown: Boolean; + FElevationRequired: Boolean; + FOnClick: TNotifyEvent; + FControlFont: TControlFont; + FSetCaption: TSetCaption; + FGetCaption: TGetCaption; + FSetParentFont: TSetParentFont; + FGetParentFont: TGetParentFont; + FImageIndex: TImageIndex; + {$IFDEF D10_4+} + FImageName: TImageName; + {$ENDIF} + FGlyph: TBitmap; + FNumGlyphs: TNumGlyphs; + FTransparentColor: TColor; + FTransparent: Boolean; + FFlat: Boolean; + FCaptionAlignment: TAlignment; + FCommandLinkHint: string; + + FAllowAllUp: Boolean; + FGroupIndex: Integer; + FDown: Boolean; + FShowCaption: Boolean; + + procedure SetImageMargins(const AValue: TImageMargins); + procedure SetStyleRadius(const AValue: Integer); + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + function ApplyButtonStyle: Boolean; + + procedure SetDisabledImages(const AValue: TCustomImageList); + procedure SetImages(const AValue: TCustomImageList); + + procedure SetDisabledImageIndex(const AValue: TImageIndex); + procedure SetHotImageIndex(const AValue: TImageIndex); + procedure SetStylusHotImageIndex(const AValue: TImageIndex); + function GetImageIndex: TImageIndex; + procedure SetImageIndex(const AValue: TImageIndex); + procedure SetPressedImageIndex(const AValue: TImageIndex); + procedure SetSelectedImageIndex(const AValue: TImageIndex); + + {$IFDEF D10_4+} + procedure UpdateImageIndex(Name: TImageName; var Index: TImageIndex); + procedure UpdateImageName(Index: TImageIndex; var Name: TImageName); + procedure SetDisabledImageName(const AValue: TImageName); + procedure SetHotImageName(const AValue: TImageName); + procedure SetStylusHotImageName(const AValue: TImageName); + function GetImageName: TImageName; + procedure SetImageName(const AValue: TImageName); + procedure SetPressedImageName(const AValue: TImageName); + procedure SetSelectedImageName(const AValue: TImageName); + {$ENDIF} + + function GetAttributes(const AMode: TStyledButtonState): TStyledButtonAttributes; + procedure ImageMarginsChange(Sender: TObject); + procedure SetImageAlignment(const AValue: TImageAlignment); + procedure DrawNotificationBadge( + const ACanvas: TCanvas; const ASurfaceRect: TRect); + procedure DrawBackgroundAndBorder(const ACanvas: TCanvas; + const AStyleAttribute: TStyledButtonAttributes; + const AEraseBackground: Boolean); + procedure DrawText(const ACanvas: TCanvas; + const AText: string; const AAlignment: TAlignment; + const ASpacing: Integer; + var ARect: TRect; AFlags: Cardinal); + function GetDrawingStyle(const ACanvas: TCanvas): TStyledButtonAttributes; + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure ImageListChange(Sender: TObject); + + procedure SetButtonStylePressed(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleSelected(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleHot(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleNormal(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); + procedure SetNotificationBadge(const AValue: TNotificationBadgeAttributes); + + procedure SetWordWrap(const AValue: Boolean); + procedure SetStyleApplied(const AValue: Boolean); + function GetKind: TBitBtnKind; + procedure SetKind(const AValue: TBitBtnKind); + function UpdateStyleUsingModalResult: boolean; + procedure SetDropDownMenu(const AValue: TPopupMenu); + procedure SetStyle(const AValue: TCustomButton.TButtonStyle); + function GetActiveStyleName: string; + function AsVCLStyle: Boolean; + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + //Owner Control access + function GetAction: TCustomAction; + procedure SetAction(const AAction: TCustomAction); + function GetParent: TWinControl; + procedure SetParent(const AValue: TWinControl); + function GetControlEnabled: Boolean; + procedure SetControlEnabled(const AValue: Boolean); + function GetParentFont: Boolean; + procedure SetParentFont(const AValue: Boolean); + function GetFont: TFont; + function GetComponentState: TComponentState; + function GetComponentHeight: Integer; + function GetComponentWidth: Integer; + function GetHint: string; + function GetButtonState: TStyledButtonState; + function GetHandle: HWND; + procedure CalcDefaultImageMargins(const AValue: TImageAlignment); + procedure SetGlyph(const AValue: TBitmap); + function GetGlyph: TBitmap; + function GetNumGlyphs: TNumGlyphs; + procedure SetNumGlyphs(const AValue: TNumGlyphs); + procedure SetFlat(const AValue: Boolean); + procedure SetState(const AValue: TButtonState); + function GetMouseInControl: Boolean; + function GetHasCustomAttributes: Boolean; + procedure SetHasCustomAttributes(const AValue: Boolean); + procedure SetLayout(const AValue: TButtonLayout); + procedure SetMargin(const AValue: Integer); + procedure SetSpacing(const AValue: Integer); + procedure SetTransparent(const AValue: Boolean); + procedure SetCaptionAlignment(const AValue: TAlignment); + procedure SetCommandLinkHint(const AValue: string); + procedure SetElevationRequired(const AValue: Boolean); + procedure SetAllowAllUp(const AValue: Boolean); + procedure SetDown(const AValue: Boolean); + procedure SetGroupIndex(const AValue: Integer); + procedure SetShowCaption(const AValue: Boolean); + procedure UpAllButtons; + function GetCaptionToDraw: string; + protected + FCustomDrawType: Boolean; + FUseButtonLayout: Boolean; + function BitBtnCaptions(Kind: TBitBtnKind): string; + procedure Invalidate; virtual; + function GetOwnerScaleFactor: Single; + function HasTransparentParts: Boolean; + function IsCaptionAlignmentStored: Boolean; + function GetBackGroundColor: TColor; + function IsDefaultImageMargins: Boolean; + function UpdateCount: Integer; + procedure SetModalResult(const AValue: TModalResult); + function IsPressed: Boolean; + function GetFocused: Boolean; + procedure UpdateImageIndexAndName; + {$IFDEF D10_4+} + procedure UpdateImages; + procedure CheckImageIndexes; + {$ENDIF} + function GetName: TComponentName; + function CalcImageRect(const ASurfaceRect: TRect; + const AImageWidth, AImageHeight: Integer): TRect; + procedure InternalCopyImage(Image: TBitmap; ImageList: TCustomImageList; Index: Integer); + function GetInternalImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; + public + function GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList; out AImageIndex: Integer): Boolean; virtual; + function GetRescalingButton: Boolean; + procedure SetRescalingButton(const AValue: Boolean); + function GetSplitButtonWidth: Integer; + procedure ShowDropDownMenu; + function GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); + procedure Loaded; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); + procedure EraseBackground(const ACanvas: TCanvas); + procedure DrawButton(const ACanvas: TCanvas; + const AEraseBackground: Boolean); + procedure DrawCaptionAndImage(const ACanvas: TCanvas; + const ASurfaceRect: TRect); + procedure SetText(const AValue: TCaption); + function GetText: TCaption; + function CanDropDownMenu: boolean; + //Windows messages + procedure WMKeyDown(var Message: TMessage); + procedure WMKeyUp(var Message: TMessage); + procedure CMStyleChanged(var Message: TMessage); + procedure CMEnter(var Message: TCMEnter); + procedure CMMouseEnter(var Message: TNotifyEvent); + procedure CMMouseLeave(var Message: TNotifyEvent); + procedure CMEnabledChanged(var Message: TMessage); + {$IFDEF HiDPISupport} + procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); virtual; + {$ENDIF} + procedure BeginUpdate; + procedure EndUpdate; + function IsCustomDrawType: Boolean; + function IsCustomRadius: Boolean; + function IsStoredStyleFamily: Boolean; + function IsStoredStyleClass: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleElements: Boolean; + function IsStyleSelectedStored: Boolean; + function IsStyleHotStored: Boolean; + function IsStyleNormalStored: Boolean; + function IsStyleDisabledStored: Boolean; + function IsStylePressedStored: Boolean; + function IsNotificationBadgeStored: Boolean; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); overload; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AModalResult: TModalResult); overload; + + procedure SetFocus; + procedure AssignStyleTo(ADest: TStyledButtonRender); + function AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AImageAlignment: TImageAlignment = iaLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TControl; overload; + function AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AButtonLayout: TButtonLayout = blGlyphLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TControl; overload; + + procedure Click(AKeyPressed: Boolean); + procedure DoDropDownMenu; + procedure SetButtonStyles( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); + + constructor CreateStyled(AOwner: TControl; + const AOnClick: TNotifyEvent; + const AControlFont: TControlFont; + const AGetCaption: TGetCaption; + const ASetCaption: TSetCaption; + const AGetParentFont: TGetParentFont; + const ASetParentFont: TSetParentFont; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; + const AUseCustomDrawType: Boolean); virtual; + constructor Create(AOwner: TControl; + const AOnClick: TNotifyEvent; + const AControlFont: TControlFont; + const AGetCaption: TGetCaption; + const ASetCaption: TSetCaption; + const AGetParentFont: TGetParentFont; + const ASetParentFont: TSetParentFont); + destructor Destroy; override; + function IsDefaultAppearance: Boolean; + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent; + property Active: Boolean read FActive write FActive; + property Focused: Boolean read GetFocused; + property ButtonState: TStyledButtonState read GetButtonState; + property StyleApplied: Boolean read FStyleApplied write SetStyleApplied; + property Caption: TCaption read GetText write SetText; + property CaptionAlignment: TAlignment read FCaptionAlignment write SetCaptionAlignment; + property ShowCaption: Boolean read FShowCaption write SetShowCaption default True; + property CommandLinkHint: string read FCommandLinkHint write SetCommandLinkHint; + property Default: Boolean read FDefault write FDefault; + property ElevationRequired: Boolean read FElevationRequired write SetElevationRequired; + property Cancel: Boolean read FCancel write FCancel; + property ActiveStyleName: string read GetActiveStyleName; + property ImageAlignment: TImageAlignment read FImageAlignment write SetImageAlignment; + property DisabledImageIndex: TImageIndex read FDisabledImageIndex write SetDisabledImageIndex; + property DisabledImages: TCustomImageList read FDisabledImages write SetDisabledImages; + property DropDownMenu: TPopupMenu read FDropDownMenu write SetDropDownMenu; + property Flat: Boolean read FFlat write SetFlat; + property SplitButtonWidth: Integer read GetSplitButtonWidth; + property HotImageIndex: TImageIndex read FHotImageIndex write SetHotImageIndex; + property StylusHotImageIndex: TImageIndex read FStylusHotImageIndex write SetStylusHotImageIndex; + property Glyph: TBitmap read GetGlyph write SetGlyph; + property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs; + property Images: TCustomImageList read FImages write SetImages; + property ImageIndex: TImageIndex read GetImageIndex write SetImageIndex; + property Kind: TBitBtnKind read GetKind write SetKind default bkCustom; + property OwnerControl: TControl read FOwnerControl; + property PressedImageIndex: TImageIndex read FPressedImageIndex write SetPressedImageIndex; + property SelectedImageIndex: TImageIndex read FSelectedImageIndex write SetSelectedImageIndex; + property Transparent: Boolean read FTransparent write SetTransparent; + {$IFDEF D10_4+} + property DisabledImageName: TImageName read FDisabledImageName write SetDisabledImageName; + property HotImageName: TImageName read FHotImageName write SetHotImageName; + property StylusHotImageName: TImageName read FStylusHotImageName write SetStylusHotImageName; + property ImageName: TImageName read GetImageName write SetImageName; + property PressedImageName: TImageName read FPressedImageName write SetPressedImageName; + property SelectedImageName: TImageName read FSelectedImageName write SetSelectedImageName; + {$ENDIF} + property ImageMargins: TImageMargins read FImageMargins write SetImageMargins; + property ModalResult: TModalResult read FModalResult write SetModalResult; + property RescalingButton: Boolean read GetRescalingButton write SetRescalingButton; + + //Properties used when UseButtonLayout is true + property Layout: TButtonLayout read FButtonLayout write SetLayout; + property Margin: Integer read FMargin write SetMargin default -1; + property Spacing: Integer read FSpacing write SetSpacing default 4; + + //Property used by TStyledButton, TStyledGraphicButton and TStyledSpeedButton + property AllowAllUp: Boolean read FAllowAllUp write SetAllowAllUp; + property GroupIndex: Integer read FGroupIndex write SetGroupIndex; + property Down: Boolean read FDown write SetDown; + + //Style as TButton + property Style: TCustomButton.TButtonStyle read FStyle write SetStyle; + + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius; + property StyleRoundedCorners: TRoundedCorners read FStyleRoundedCorners write SetStyleRoundedCorners default ALL_ROUNDED_CORNERS; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance; + + property Tag: Integer read FTag write FTag; + property WordWrap: Boolean read FWordWrap write SetWordWrap; + + property ButtonStyleNormal: TStyledButtonAttributes read FButtonStyleNormal write SetButtonStyleNormal; + property ButtonStylePressed: TStyledButtonAttributes read FButtonStylePressed write SetButtonStylePressed; + property ButtonStyleSelected: TStyledButtonAttributes read FButtonStyleSelected write SetButtonStyleSelected; + property ButtonStyleHot: TStyledButtonAttributes read FButtonStyleHot write SetButtonStyleHot; + property ButtonStyleDisabled: TStyledButtonAttributes read FButtonStyleDisabled write SetButtonStyleDisabled; + property NotificationBadge: TNotificationBadgeAttributes read FNotificationBadge write SetNotificationBadge; + + property OnDropDownClick: TNotifyEvent read FOnDropDownClick write FOnDropDownClick; + + //Render property accessible from Components + property State: TButtonState read FState write SetState; + property MouseInControl: Boolean read GetMouseInControl; + + //Owner Control property Access + //property Canvas: TCanvas read GetControlCanvas; + property Enabled: Boolean read GetControlEnabled write SetControlEnabled; + property ParentFont: Boolean read GetParentFont write SetParentFont; + property Font: TFont read GetFont; + property Action: TCustomAction read GetAction write SetAction; + property Name: TComponentName read GetName; // write SetName; + property Parent: TWinControl read GetParent write SetParent; + property ComponentState: TComponentState read GetComponentState; + property Height: Integer read GetComponentHeight; + property Width: Integer read GetComponentWidth; + property Hint: string read GetHint; + + //Owner Control must assign those event-handlers + property OnClick: TNotifyEvent read FOnClick write FOnClick; + property ControlFont: TControlFont read FControlFont write FControlFont; + public + procedure SetCustomStyleDrawType(ACustomStyleDrawType: Boolean); + property HasCustomAttributes: Boolean read GetHasCustomAttributes write SetHasCustomAttributes default False; + end; + + TCustomStyledGraphicButton = class; + TCustomStyledButton = class; + TStyledSpeedButton = class; + TStyledBitBtn = class; + + { TCustomStyledGraphicButton } + TCustomStyledGraphicButton = class(TGraphicControl) + private + FRender: TStyledButtonRender; + FImageIndex: TImageIndex; + {$IFDEF D10_4+} + FImageName: TImageName; + {$ENDIF} + + class var + _DefaultStyleDrawType: TStyledButtonDrawType; + _UseCustomDrawType: Boolean; + _DefaultFamily: TStyledButtonFamily; + _DefaultClass: TStyledButtonClass; + _DefaultAppearance: TStyledButtonAppearance; + _DefaultStyleRadius: Integer; + _DefaultCursor: TCursor; + + //Event Handlers passed to Render + procedure ControlFont(var AValue: TFont); + procedure ControlClick(Sender: TObject); + function GetParentFont: Boolean; + procedure SetParentfont(const AValue: Boolean); + function GetImageMargins: TImageMargins; + procedure SetImageMargins(const AValue: TImageMargins); + function IsCustomRadius: Boolean; + function GetStyleRadius: Integer; + procedure SetStyleRadius(const AValue: Integer); + function GetStyleRoundedCorners: TRoundedCorners; + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + function ImageMarginsStored: Boolean; + function IsStoredStyleFamily: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleElements: Boolean; + function GetStyleFamily: TStyledButtonFamily; + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + function GetStyleClass: TStyledButtonClass; + procedure SetStyleClass(const AValue: TStyledButtonClass); + function GetStyleAppearance: TStyledButtonAppearance; + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + function GetTag: Integer; + procedure SetTag(const AValue: Integer); + function GetDisabledImages: TCustomImageList; + procedure SetDisabledImages(const AValue: TCustomImageList); + function GetImages: TCustomImageList; + procedure SetImages(const AValue: TCustomImageList); + function GetDisabledImageIndex: TImageIndex; + procedure SetDisabledImageIndex(const AValue: TImageIndex); + function GetHotImageIndex: TImageIndex; + procedure SetHotImageIndex(const AValue: TImageIndex); + procedure SetImageIndex(const AValue: TImageIndex); + function GetPressedImageIndex: TImageIndex; + procedure SetPressedImageIndex(const AValue: TImageIndex); + function GetSelectedImageIndex: TImageIndex; + procedure SetSelectedImageIndex(const AValue: TImageIndex); + {$IFDEF D10_4+} + function GetDisabledImageName: TImageName; + procedure SetDisabledImageName(const AValue: TImageName); + function GetHotImageName: TImageName; + procedure SetHotImageName(const AValue: TImageName); + function GetImageName: TImageName; + procedure SetImageName(const AValue: TImageName); + function GetPressedImageName: TImageName; + procedure SetPressedImageName(const AValue: TImageName); + function GetSelectedImageName: TImageName; + procedure SetSelectedImageName(const AValue: TImageName); + {$ENDIF} + function GetImageAlignment: TImageAlignment; + procedure SetImageAlignment(const AValue: TImageAlignment); + function IsCustomDrawType: Boolean; + function GetStyleDrawType: TStyledButtonDrawType; + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetText(const AValue: TCaption); + function GetButtonStylePressed: TStyledButtonAttributes; + procedure SetButtonStylePressed(const AValue: TStyledButtonAttributes); + function GetButtonStyleSelected: TStyledButtonAttributes; + procedure SetButtonStyleSelected(const AValue: TStyledButtonAttributes); + function GetButtonStyleHot: TStyledButtonAttributes; + procedure SetButtonStyleHot(const AValue: TStyledButtonAttributes); + function GetButtonStyleNormal: TStyledButtonAttributes; + procedure SetButtonStyleNormal(const AValue: TStyledButtonAttributes); + function GetButtonStyleDisabled: TStyledButtonAttributes; + procedure SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); + function GetOnDropDownClick: TNotifyEvent; + procedure SetOnDropDownClick(const AValue: TNotifyEvent); + function IsStyleSelectedStored: Boolean; + function IsStyleHotStored: Boolean; + function IsStyleNormalStored: Boolean; + function IsStyleDisabledStored: Boolean; + function IsStylePressedStored: Boolean; + function IsNotificationBadgeStored: Boolean; + function IsImageIndexStored: Boolean; + {$IFDEF D10_4+} + function IsImageNameStored: Boolean; + {$ENDIF} + function GetWordWrap: Boolean; + procedure SetWordWrap(const AValue: Boolean); + function GetStyleApplied: Boolean; + procedure SetStyleApplied(const AValue: Boolean); + function GetKind: TBitBtnKind; + procedure SetKind(const AValue: TBitBtnKind); + function GetDropDownMenu: TPopupMenu; + procedure SetDropDownMenu(const AValue: TPopupMenu); + function GetStyle: TCustomButton.TButtonStyle; + procedure SetStyle(const AValue: TCustomButton.TButtonStyle); + function GetFocused: Boolean; + //Windows messages + procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMMouseEnter(var Message: TNotifyEvent); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TNotifyEvent); message CM_MOUSELEAVE; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + + function GetModalResult: TModalResult; + procedure SetModalResult(const AValue: TModalResult); + function GetFlat: Boolean; + procedure SetFlat(const AValue: Boolean); + + //Glyph Support + function HasCustomGlyph: Boolean; + function GetGlyph: TBitmap; + procedure SetGlyph(const AValue: TBitmap); + function GetNumGlyphs: TNumGlyphs; + procedure SetNumGlyphs(const AValue: TNumGlyphs); + function GetMouseInControl: Boolean; + function GetCursor: TCursor; + function GetTransparent: Boolean; + procedure SetTransparent(const AValue: Boolean); + function GetCaptionAlignment: TAlignment; + procedure SetCaptionAlignment(const AValue: TAlignment); + function GetCommandLinkHint: string; + procedure SetCommandLinkHint(const AValue: string); + function IsCaptionAlignmentStored: Boolean; + function GetSpacing: Integer; + procedure SetSpacing(const AValue: Integer); + function GetLayout: TButtonLayout; + procedure SetLayout(const AValue: TButtonLayout); + function GetMargin: Integer; + procedure SetMargin(const AValue: Integer); + function GetAllowAllUp: Boolean; + function GetDown: Boolean; + function GetGroupIndex: Integer; + procedure SetAllowAllUp(const AValue: Boolean); + procedure SetDown(const AValue: Boolean); + procedure SetGroupIndex(const AValue: Integer); + function IsCheckedStored: Boolean; + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + function GetActiveStyleName: string; + function GetNotificationBadge: TNotificationBadgeAttributes; + procedure SetNotificationBadge(const AValue: TNotificationBadgeAttributes); + function GetShowCaption: Boolean; + procedure SetShowCaption(const AValue: Boolean); + protected + procedure SetCursor(const AValue: TCursor); virtual; + function GetCaption: TCaption; + function GetCaptionToDraw: TCaption; virtual; + procedure SetCaption(const AValue: TCaption); virtual; + function GetButtonState: TStyledButtonState; virtual; + function GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; virtual; + function GetText: TCaption; virtual; + function IsStoredStyleClass: Boolean; virtual; + function IsEnabledStored: Boolean; virtual; + function IsCaptionStored: Boolean; virtual; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure SetName(const AValue: TComponentName); override; + procedure Loaded; override; + procedure Paint; override; + {$IFDEF HiDPISupport} + procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override; + {$ENDIF} + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + {$IFDEF D10_4+} + procedure SetStyleName(const AValue: string); override; + {$ENDIF} + function GetRenderClass: TStyledButtonRenderClass; virtual; + public + class procedure RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; + const AFamily: TStyledButtonFamily = DEFAULT_CLASSIC_FAMILY; + const AClass: TStyledButtonClass = DEFAULT_WINDOWS_CLASS; + const AAppearance: TStyledButtonAppearance = DEFAULT_APPEARANCE; + const AStyleRadius: Integer = DEFAULT_RADIUS; + const ACursor: TCursor = DEFAULT_CURSOR); virtual; + function GetRescalingButton: Boolean; + procedure SetRescalingButton(const AValue: Boolean); + function GetSplitButtonWidth: Integer; + procedure ShowDropDownMenu; + procedure BeginUpdate; + procedure EndUpdate; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); overload; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AModalResult: TModalResult); overload; + procedure AssignStyleTo(ADestRender: TStyledButtonRender); overload; + procedure AssignStyleTo(ADest: TCustomStyledGraphicButton); overload; + procedure AssignTo(ADest: TPersistent); override; + function AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AImageAlignment: TImageAlignment = iaLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TCustomStyledGraphicButton; + procedure Click; override; + procedure DoDropDownMenu; + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); overload; virtual; + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; + const AUseCustomDrawType: Boolean); overload; virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property ActiveStyleName: string read GetActiveStyleName; + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent; + property Focused: Boolean read GetFocused; + property ButtonState: TStyledButtonState read GetButtonState; + property MouseInControl: Boolean read GetMouseInControl; + property Render: TStyledButtonRender read FRender; + property StyleApplied: Boolean read GetStyleApplied write SetStyleApplied; + property RescalingButton: Boolean read GetRescalingButton write SetRescalingButton; + property Enabled stored IsEnabledStored; + property ParentFont default true; + property Layout: TButtonLayout read GetLayout write SetLayout default blGlyphLeft; + property Margin: Integer read GetMargin write SetMargin default -1; + property Spacing: Integer read GetSpacing write SetSpacing default 4; + property StyleElements stored IsStoredStyleElements; + property Caption: TCaption read GetText write SetText stored IsCaptionStored; + property CaptionAlignment: TAlignment read GetCaptionAlignment write SetCaptionAlignment Stored IsCaptionAlignmentStored; + property ShowCaption: Boolean read GetShowCaption write SetShowCaption default True; + property CommandLinkHint: string read GetCommandLinkHint write SetCommandLinkHint; + property Cursor: TCursor read GetCursor write SetCursor default DEFAULT_CURSOR; + property ImageAlignment: TImageAlignment read GetImageAlignment write SetImageAlignment default iaLeft; + property DisabledImageIndex: TImageIndex read GetDisabledImageIndex write SetDisabledImageIndex default -1; + property DisabledImages: TCustomImageList read GetDisabledImages write SetDisabledImages; + property DropDownMenu: TPopupMenu read GetDropDownMenu write SetDropDownMenu; + property Flat: Boolean read GetFlat write SetFlat default False; + property Glyph: TBitmap read GetGlyph write SetGlyph stored HasCustomGlyph; + property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs default 1; + property HotImageIndex: TImageIndex read GetHotImageIndex write SetHotImageIndex default -1; + property Images: TCustomImageList read GetImages write SetImages; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex stored IsImageIndexStored; + property Kind: TBitBtnKind read GetKind write SetKind default bkCustom; + property PressedImageIndex: TImageIndex read GetPressedImageIndex write SetPressedImageIndex default -1; + property SelectedImageIndex: TImageIndex read GetSelectedImageIndex write SetSelectedImageIndex default -1; + {$IFDEF D10_4+} + property DisabledImageName: TImageName read GetDisabledImageName write SetDisabledImageName; + property HotImageName: TImageName read GetHotImageName write SetHotImageName; + property ImageName: TImageName read GetImageName write SetImageName stored IsImageNameStored; + property PressedImageName: TImageName read GetPressedImageName write SetPressedImageName; + property SelectedImageName: TImageName read GetSelectedImageName write SetSelectedImageName; + {$ENDIF} + property ImageMargins: TImageMargins read GetImageMargins write SetImageMargins stored ImageMarginsStored; + property ModalResult: TModalResult read GetModalResult write SetModalResult default mrNone; + //Style as TSpeedButton + property Style: TCustomButton.TButtonStyle read GetStyle write SetStyle default TCustomButton.TButtonStyle.bsPushButton; + //Property used by TStyledButton, TStyledGraphicButton and TStyledSpeedButton + property AllowAllUp: Boolean read GetAllowAllUp write SetAllowAllUp default False; + property GroupIndex: Integer read GetGroupIndex write SetGroupIndex default 0; + property Down: Boolean read GetDown write SetDown stored IsCheckedStored default False; + //StyledComponents Attributes + property StyleRadius: Integer read GetStyleRadius write SetStyleRadius stored IsCustomRadius default DEFAULT_RADIUS; + property StyleRoundedCorners: TRoundedCorners read GetStyleRoundedCorners write SetStyleRoundedCorners default ALL_ROUNDED_CORNERS; + property StyleDrawType: TStyledButtonDrawType read GetStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleFamily: TStyledButtonFamily read GetStyleFamily write SetStyleFamily stored IsStoredStyleFamily; + property StyleClass: TStyledButtonClass read GetStyleClass write SetStyleClass stored IsStoredStyleClass; + property StyleAppearance: TStyledButtonAppearance read GetStyleAppearance write SetStyleAppearance stored IsStoredStyleAppearance; + property Tag: Integer read GetTag write SetTag default 0; + property Transparent: Boolean read GetTransparent write SetTransparent default False; + property WordWrap: Boolean read GetWordWrap write SetWordWrap default False; + property ButtonStyleNormal: TStyledButtonAttributes read GetButtonStyleNormal write SetButtonStyleNormal stored IsStyleNormalStored; + property ButtonStylePressed: TStyledButtonAttributes read GetButtonStylePressed write SetButtonStylePressed stored IsStylePressedStored; + property ButtonStyleSelected: TStyledButtonAttributes read GetButtonStyleSelected write SetButtonStyleSelected stored IsStyleSelectedStored; + property ButtonStyleHot: TStyledButtonAttributes read GetButtonStyleHot write SetButtonStyleHot stored IsStyleHotStored; + property ButtonStyleDisabled: TStyledButtonAttributes read GetButtonStyleDisabled write SetButtonStyleDisabled stored IsStyleDisabledStored; + property NotificationBadge: TNotificationBadgeAttributes read GetNotificationBadge write SetNotificationBadge stored IsNotificationBadgeStored; + property OnDropDownClick: TNotifyEvent read GetOnDropDownClick write SetOnDropDownClick; + end; + + { TStyledGraphicButton } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledGraphicButton = class(TCustomStyledGraphicButton) + published + property ActiveStyleName; + property Action; + property Align; + property AllowAllUp; + property Anchors; + property AsVCLComponent stored False; + property Constraints; + property Cursor default DEFAULT_CURSOR; + property GroupIndex; + property Down; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + property NotificationBadge; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseActivate; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnGesture; + property OnStartDock; + property OnStartDrag; + property OnClick; + property PopUpMenu; + property ParentFont; + property ParentShowHint; + property ShowHint; + {$IFDEF D10_4+} + property StyleName; + {$ENDIF} + property StyleElements; + property Transparent; + property Visible; + property Caption; + property CaptionAlignment; + property ShowCaption; + property CommandLinkHint; + property ImageAlignment; + property DisabledImageIndex; + property DisabledImages; + property DropDownMenu; + property Flat; + property Glyph; + property NumGlyphs; + property HotImageIndex; + property Images; + property ImageIndex; + property Kind; + property PressedImageIndex; + property SelectedImageIndex; + {$IFDEF D10_4+} + property DisabledImageName; + property HotImageName; + property ImageName; + property PressedImageName; + property SelectedImageName; + {$ENDIF} + property ImageMargins; + property ModalResult; + property Style; + property Tag; + //StyledComponents Attributes + property StyleRadius; + property StyleRoundedCorners; + property StyleDrawType; + property StyleFamily; + property StyleClass; + property StyleAppearance; + property WordWrap; + property ButtonStyleNormal; + property ButtonStylePressed; + property ButtonStyleSelected; + property ButtonStyleHot; + property ButtonStyleDisabled; + property OnDropDownClick; + end; + + { TStyledSpeedButton } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledSpeedButton = class(TCustomStyledGraphicButton) + public + constructor Create(AOwner: TComponent); override; + published + property Action; + property Align; + property AllowAllUp; + property Anchors; + property AsVCLComponent stored False; + property BiDiMode; + property Constraints; + property Cursor default DEFAULT_CURSOR; + property GroupIndex; + property Down; + property DisabledImageIndex; + {$IFDEF D10_4+} + property DisabledImageName; + {$ENDIF} + property Caption; + property ShowCaption; + property Enabled; + {$IFDEF D10_4+} + property HotImageIndex; + property HotImageName; + property ImageIndex; + property ImageName; + property Images; + {$ENDIF} + property Flat; + property Font; + property Glyph; + property Layout; + property Margin; + property NotificationBadge; + property NumGlyphs; + property ParentFont; + property ParentShowHint; + property ParentBiDiMode; + property PopupMenu; + property PressedImageIndex; + {$IFDEF D10_4+} + property PressedImageName; + {$ENDIF} + property ShowHint; + property SelectedImageIndex; + {$IFDEF D10_4+} + property SelectedImageName; + {$ENDIF} + property Spacing; + property Transparent default True; + property Visible; + property StyleElements; + {$IFDEF D10_4+} + property StyleName; + {$ENDIF} + property OnClick; + property OnDblClick; + property OnMouseActivate; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + //StyledComponents Attributes + property StyleRadius; + property StyleRoundedCorners; + property StyleDrawType; + property StyleFamily; + property StyleClass; + property StyleAppearance; + property ButtonStyleNormal; + property ButtonStylePressed; + property ButtonStyleSelected; + property ButtonStyleHot; + property ButtonStyleDisabled; + end; + + { TCustomStyledButton } + TCustomStyledButton = class(TCustomControl) + private + FPaintBuffer: TBitmap; + FPaintBufferUsers: Integer; + FRender: TStyledButtonRender; + FImageIndex: TImageIndex; + {$IFDEF D10_4+} + FImageName: TImageName; + {$ENDIF} + class var + _DefaultStyleDrawType: TStyledButtonDrawType; + _UseCustomDrawType: Boolean; + _DefaultFamily: TStyledButtonFamily; + _DefaultClass: TStyledButtonClass; + _DefaultAppearance: TStyledButtonAppearance; + _DefaultStyleRadius: Integer; + _DefaultCursor: TCursor; + + //Event Handlers passed to Render + procedure ControlFont(var AValue: TFont); + procedure ControlClick(Sender: TObject); + function GetParentFont: Boolean; + procedure SetParentfont(const AValue: Boolean); + function GetImageMargins: TImageMargins; + procedure SetImageMargins(const AValue: TImageMargins); + function IsCustomRadius: Boolean; + function GetStyleRadius: Integer; + procedure SetStyleRadius(const AValue: Integer); + function GetStyleRoundedCorners: TRoundedCorners; + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + function ImageMarginsStored: Boolean; + function IsStoredStyleFamily: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleElements: Boolean; + function GetStyleFamily: TStyledButtonFamily; + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + function GetStyleClass: TStyledButtonClass; + procedure SetStyleClass(const AValue: TStyledButtonClass); + function GetStyleAppearance: TStyledButtonAppearance; + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + function GetTag: Integer; + procedure SetTag(const AValue: Integer); + function GetDisabledImages: TCustomImageList; + procedure SetDisabledImages(const AValue: TCustomImageList); + function GetImages: TCustomImageList; + procedure SetImages(const AValue: TCustomImageList); + function GetDisabledImageIndex: TImageIndex; + procedure SetDisabledImageIndex(const AValue: TImageIndex); + function GetHotImageIndex: TImageIndex; + procedure SetHotImageIndex(const AValue: TImageIndex); + function GetStylusHotImageIndex: TImageIndex; + procedure SetStylusHotImageIndex(const AValue: TImageIndex); + procedure SetImageIndex(const AValue: TImageIndex); + function GetPressedImageIndex: TImageIndex; + procedure SetPressedImageIndex(const AValue: TImageIndex); + function GetSelectedImageIndex: TImageIndex; + procedure SetSelectedImageIndex(const AValue: TImageIndex); + {$IFDEF D10_4+} + function GetDisabledImageName: TImageName; + procedure SetDisabledImageName(const AValue: TImageName); + function GetHotImageName: TImageName; + procedure SetHotImageName(const AValue: TImageName); + function GetStylusHotImageName: TImageName; + procedure SetStylusHotImageName(const AValue: TImageName); + function GetImageName: TImageName; + procedure SetImageName(const AValue: TImageName); + function GetPressedImageName: TImageName; + procedure SetPressedImageName(const AValue: TImageName); + function GetSelectedImageName: TImageName; + procedure SetSelectedImageName(const AValue: TImageName); + {$ENDIF} + function GetImageAlignment: TImageAlignment; + procedure SetImageAlignment(const AValue: TImageAlignment); + function IsCustomDrawType: Boolean; + function GetStyleDrawType: TStyledButtonDrawType; + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetText(const AValue: TCaption); + function GetButtonStylePressed: TStyledButtonAttributes; + procedure SetButtonStylePressed(const AValue: TStyledButtonAttributes); + function GetButtonStyleSelected: TStyledButtonAttributes; + procedure SetButtonStyleSelected(const AValue: TStyledButtonAttributes); + function GetButtonStyleHot: TStyledButtonAttributes; + procedure SetButtonStyleHot(const AValue: TStyledButtonAttributes); + function GetButtonStyleNormal: TStyledButtonAttributes; + procedure SetButtonStyleNormal(const AValue: TStyledButtonAttributes); + function GetButtonStyleDisabled: TStyledButtonAttributes; + procedure SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); + function GetOnDropDownClick: TNotifyEvent; + procedure SetOnDropDownClick(const AValue: TNotifyEvent); + function IsStyleSelectedStored: Boolean; + function IsStyleHotStored: Boolean; + function IsStyleNormalStored: Boolean; + function IsStyleDisabledStored: Boolean; + function IsStylePressedStored: Boolean; + function IsNotificationBadgeStored: Boolean; + function IsImageIndexStored: Boolean; + {$IFDEF D10_4+} + function IsImageNameStored: Boolean; + {$ENDIF} + function GetWordWrap: Boolean; + procedure SetWordWrap(const AValue: Boolean); + function GetStyleApplied: Boolean; + procedure SetStyleApplied(const AValue: Boolean); + function GetDefault: Boolean; + procedure SetDefault(const AValue: Boolean); + function GetCancel: Boolean; + procedure SetCancel(const AValue: Boolean); + function GetKind: TBitBtnKind; + procedure SetKind(const AValue: TBitBtnKind); + function GetDropDownMenu: TPopupMenu; + procedure SetDropDownMenu(const AValue: TPopupMenu); + function GetStyle: TCustomButton.TButtonStyle; + procedure SetStyle(const AValue: TCustomButton.TButtonStyle); + function CanDropDownMenu: boolean; + //Windows messages + procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; + procedure CMDialogChar(var Message: TCMDialogChar); message CM_DIALOGCHAR; + procedure CMEnter(var Message: TCMEnter); message CM_ENTER; + procedure CMMouseEnter(var Message: TNotifyEvent); message CM_MOUSEENTER; + procedure CMMouseLeave(var Message: TNotifyEvent); message CM_MOUSELEAVE; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + + function GetModalResult: TModalResult; + procedure SetModalResult(const AValue: TModalResult); + + //Message Handlers for StyledButton + procedure WMSetFocus(var Message: TMessage); message WM_SETFOCUS; + procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS; + procedure WMKeyDown(var Message: TMessage); message WM_KEYDOWN; + procedure WMKeyUp(var Message: TMessage); message WM_KEYUP; + procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN; + procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY; + procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED; + procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND; + procedure WMPaint(var Message: TMessage); message WM_PAINT; + function GetFlat: Boolean; + procedure SetFlat(const AValue: Boolean); + + //Glyph Support + function HasCustomGlyph: Boolean; + function GetGlyph: TBitmap; + procedure SetGlyph(const AValue: TBitmap); + function GetNumGlyphs: TNumGlyphs; + procedure SetNumGlyphs(const AValue: TNumGlyphs); + function GetMouseInControl: Boolean; + function GetCursor: TCursor; + function GetCaptionAlignment: TAlignment; + procedure SetCaptionAlignment(const AValue: TAlignment); + function GetCommandLinkHint: string; + procedure SetCommandLinkHint(const AValue: string); + function GetSpacing: Integer; + procedure SetSpacing(const AValue: Integer); + function GetLayout: TButtonLayout; + procedure SetLayout(const AValue: TButtonLayout); + function GetMargin: Integer; + procedure SetMargin(const AValue: Integer); + function IsCaptionAlignmentStored: Boolean; + function GetElevationRequired: Boolean; + procedure SetElevationRequired(const AValue: Boolean); + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + function GetActiveStyleName: string; + function GetNotificationBadge: TNotificationBadgeAttributes; + procedure SetNotificationBadge(const AValue: TNotificationBadgeAttributes); + function GetShowCaption: Boolean; + procedure SetShowCaption(const AValue: Boolean); + function GetAllowAllUp: Boolean; + function GetDown: Boolean; + function GetGroupIndex: Integer; + function IsCheckedStored: Boolean; + procedure SetAllowAllUp(const AValue: Boolean); + procedure SetDown(const AValue: Boolean); + procedure SetGroupIndex(const AValue: Integer); + protected + procedure SetCursor(const AValue: TCursor); virtual; + function CalcImageRect(var ATextRect: TRect; + const AImageWidth, AImageHeight: Integer): TRect; virtual; + function GetCaption: TCaption; + function GetCaptionToDraw: TCaption; virtual; + procedure SetCaption(const AValue: TCaption); virtual; + function GetButtonState: TStyledButtonState; virtual; + function GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; virtual; + function GetText: TCaption; virtual; + function IsStoredStyleClass: Boolean; virtual; + function IsEnabledStored: Boolean; virtual; + function IsCaptionStored: Boolean; virtual; + procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); override; + function GetActionLinkClass: TControlActionLinkClass; override; + procedure SetName(const AValue: TComponentName); override; + procedure Loaded; override; + {$IFDEF HiDPISupport} + procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override; + {$ENDIF} + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + {$IFDEF D10_4+} + procedure SetStyleName(const AValue: string); override; + {$ENDIF} + //for StyledButton + procedure CreateWnd; override; + function GetRenderClass: TStyledButtonRenderClass; virtual; + public + class procedure RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; + const AFamily: TStyledButtonFamily = DEFAULT_CLASSIC_FAMILY; + const AClass: TStyledButtonClass = DEFAULT_WINDOWS_CLASS; + const AAppearance: TStyledButtonAppearance = DEFAULT_APPEARANCE; + const AStyleRadius: Integer = DEFAULT_RADIUS; + const ACursor: TCursor = DEFAULT_CURSOR); virtual; + function GetRescalingButton: Boolean; + procedure SetRescalingButton(const AValue: Boolean); + function GetSplitButtonWidth: Integer; + procedure ShowDropDownMenu; + procedure BeginUpdate; + procedure EndUpdate; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); overload; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AModalResult: TModalResult); overload; + procedure AssignStyleTo(ADestRender: TStyledButtonRender); overload; + procedure AssignStyleTo(ADest: TCustomStyledButton); overload; + procedure AssignTo(ADest: TPersistent); override; + function AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AImageAlignment: TImageAlignment = iaLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TCustomStyledButton; + procedure DoDropDownMenu; + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); overload; virtual; + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; + const AUseCustomDrawType: Boolean); overload; virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + + property ActiveStyleName: string read GetActiveStyleName; + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent; + property ButtonState: TStyledButtonState read GetButtonState; + property MouseInControl: Boolean read GetMouseInControl; + property StyleApplied: Boolean read GetStyleApplied write SetStyleApplied; + //For StyledButton + procedure ReleasePaintBuffer; + procedure Click; override; + property Render: TStyledButtonRender read FRender; + property RescalingButton: Boolean read GetRescalingButton write SetRescalingButton; + property DoubleBuffered default True; + property Enabled stored IsEnabledStored; + property ParentFont default true; + property Layout: TButtonLayout read GetLayout write SetLayout default blGlyphLeft; + property Margin: Integer read GetMargin write SetMargin default -1; + property Spacing: Integer read GetSpacing write SetSpacing default 4; + property StyleElements stored IsStoredStyleElements; + property TabStop default True; + property Caption: TCaption read GetText write SetText stored IsCaptionStored; + property CaptionAlignment: TAlignment read GetCaptionAlignment write SetCaptionAlignment Stored IsCaptionAlignmentStored; + property ShowCaption: Boolean read GetShowCaption write SetShowCaption default True; + property CommandLinkHint: string read GetCommandLinkHint write SetCommandLinkHint; + property Cursor: TCursor read GetCursor write SetCursor default DEFAULT_CURSOR; + property Default: Boolean read GetDefault write SetDefault default False; + property Cancel: Boolean read GetCancel write SetCancel default False; + property ImageAlignment: TImageAlignment read GetImageAlignment write SetImageAlignment default iaLeft; + property DisabledImageIndex: TImageIndex read GetDisabledImageIndex write SetDisabledImageIndex default -1; + property DisabledImages: TCustomImageList read GetDisabledImages write SetDisabledImages; + property DropDownMenu: TPopupMenu read GetDropDownMenu write SetDropDownMenu; + property ElevationRequired: Boolean read GetElevationRequired write SetElevationRequired default False; + property Flat: Boolean read GetFlat write SetFlat default False; + property Glyph: TBitmap read GetGlyph write SetGlyph stored HasCustomGlyph; + property NumGlyphs: TNumGlyphs read GetNumGlyphs write SetNumGlyphs default 1; + property HotImageIndex: TImageIndex read GetHotImageIndex write SetHotImageIndex default -1; + property StylusHotImageIndex: TImageIndex read GetStylusHotImageIndex write SetStylusHotImageIndex default -1; + property Images: TCustomImageList read GetImages write SetImages; + property ImageIndex: TImageIndex read FImageIndex write SetImageIndex stored IsImageIndexStored; + property Kind: TBitBtnKind read GetKind write SetKind default bkCustom; + property PressedImageIndex: TImageIndex read GetPressedImageIndex write SetPressedImageIndex default -1; + property SelectedImageIndex: TImageIndex read GetSelectedImageIndex write SetSelectedImageIndex default -1; + {$IFDEF D10_4+} + property DisabledImageName: TImageName read GetDisabledImageName write SetDisabledImageName; + property HotImageName: TImageName read GetHotImageName write SetHotImageName; + property StylusHotImageName: TImageName read GetStylusHotImageName write SetStylusHotImageName; + property ImageName: TImageName read GetImageName write SetImageName stored IsImageNameStored; + property PressedImageName: TImageName read GetPressedImageName write SetPressedImageName; + property SelectedImageName: TImageName read GetSelectedImageName write SetSelectedImageName; + {$ENDIF} + property ImageMargins: TImageMargins read GetImageMargins write SetImageMargins stored ImageMarginsStored; + property ModalResult: TModalResult read GetModalResult write SetModalResult default mrNone; + //Style as TButton + property Style: TCustomButton.TButtonStyle read GetStyle write SetStyle default TCustomButton.TButtonStyle.bsPushButton; + //Property used by TStyledButton, TStyledGraphicButton and TStyledSpeedButton + property AllowAllUp: Boolean read GetAllowAllUp write SetAllowAllUp default False; + property GroupIndex: Integer read GetGroupIndex write SetGroupIndex default 0; + property Down: Boolean read GetDown write SetDown stored IsCheckedStored default False; + //StyledComponents Attributes + property StyleRadius: Integer read GetStyleRadius write SetStyleRadius stored IsCustomRadius default DEFAULT_RADIUS; + property StyleRoundedCorners: TRoundedCorners read GetStyleRoundedCorners write SetStyleRoundedCorners default ALL_ROUNDED_CORNERS; + property StyleDrawType: TStyledButtonDrawType read GetStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleFamily: TStyledButtonFamily read GetStyleFamily write SetStyleFamily stored IsStoredStyleFamily; + property StyleClass: TStyledButtonClass read GetStyleClass write SetStyleClass stored IsStoredStyleClass; + property StyleAppearance: TStyledButtonAppearance read GetStyleAppearance write SetStyleAppearance stored IsStoredStyleAppearance; + property Tag: Integer read GetTag write SetTag default 0; + property WordWrap: Boolean read GetWordWrap write SetWordWrap default False; + property ButtonStyleNormal: TStyledButtonAttributes read GetButtonStyleNormal write SetButtonStyleNormal stored IsStyleNormalStored; + property ButtonStylePressed: TStyledButtonAttributes read GetButtonStylePressed write SetButtonStylePressed stored IsStylePressedStored; + property ButtonStyleSelected: TStyledButtonAttributes read GetButtonStyleSelected write SetButtonStyleSelected stored IsStyleSelectedStored; + property ButtonStyleHot: TStyledButtonAttributes read GetButtonStyleHot write SetButtonStyleHot stored IsStyleHotStored; + property ButtonStyleDisabled: TStyledButtonAttributes read GetButtonStyleDisabled write SetButtonStyleDisabled stored IsStyleDisabledStored; + property NotificationBadge: TNotificationBadgeAttributes read GetNotificationBadge write SetNotificationBadge stored IsNotificationBadgeStored; + property OnDropDownClick: TNotifyEvent read GetOnDropDownClick write SetOnDropDownClick; + + //Property for StyledButton + property TabOrder; + property OnKeyDown; + property OnKeyUp; + end; + + { TStyledButton } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledButton = class(TCustomStyledButton) + published + property ActiveStyleName; + property Action; + property Align; + property AllowAllUp; + property GroupIndex; + property Down; + property Anchors; + property AsVCLComponent stored False; + property BiDiMode; + property Cancel; + property Caption; + property CaptionAlignment; + property ShowCaption; + property CommandLinkHint; + property Constraints; + property Cursor default DEFAULT_CURSOR; + property Default; + property DisabledImageIndex; + {$IFDEF D10_4+} + property DisabledImageName; + {$ENDIF} + property DisabledImages; + property DoubleBuffered; + property DragCursor; + property DragKind; + property DragMode; + property DropDownMenu; + property ElevationRequired; + property Enabled; + property Font; + property HotImageIndex; + {$IFDEF D10_4+} + property HotImageName; + {$ENDIF} + property ImageAlignment; + property ImageIndex; + {$IFDEF D10_4+} + property ImageName; + {$ENDIF} + property ImageMargins; + property Images; + property ModalResult; + property NotificationBadge; + property ParentBiDiMode; + property ParentDoubleBuffered default False; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property PressedImageIndex; + {$IFDEF D10_4+} + property PressedImageName; + {$ENDIF} + property SelectedImageIndex; + {$IFDEF D10_4+} + property SelectedImageName; + {$ENDIF} + property ShowHint; + property Spacing; + property Style; + property StylusHotImageIndex; + property TabOrder; + property TabStop; + property Visible; + property WordWrap; + property StyleElements; + {$IFDEF D10_4+} + property StyleName; + property StylusHotImageName; + {$ENDIF} + property OnClick; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnDropDownClick; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnKeyPress; + property OnKeyUp; + property OnMouseActivate; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + + property Flat; + property Glyph; + property NumGlyphs; + property Kind; + property Tag; + + //StyledComponents Attributes + property StyleRadius; + property StyleRoundedCorners; + property StyleDrawType; + property StyleFamily; + property StyleClass; + property StyleAppearance; + property ButtonStyleNormal; + property ButtonStylePressed; + property ButtonStyleSelected; + property ButtonStyleHot; + property ButtonStyleDisabled; + end; + + { TStyledBitBtn } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledBitBtn = class(TCustomStyledButton) + private + FStyle: TButtonStyle; + protected + function IsCaptionStored: Boolean; override; + public + constructor Create(AOwner: TComponent); override; + published + property Action; + property Align; + property Anchors; + property AsVCLComponent stored False; + property BiDiMode; + property Cancel; + property Caption; + property ShowCaption; + property Constraints; + property Cursor default DEFAULT_CURSOR; + property Default; + {$IFDEF D10_4+} + property DisabledImageIndex; + property DisabledImageName; + {$ENDIF} + property DoubleBuffered default True; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Font; + {$IFDEF D10_4+} + property HotImageIndex; + property HotImageName; + property ImageIndex; + property ImageName; + property Images; + {$ENDIF} + property Glyph; + property Kind; + property Layout; + property Margin; + property ModalResult; + property NotificationBadge; + property NumGlyphs; + property Style: TButtonStyle read FStyle write FStyle; + property Spacing; + property TabOrder; + property TabStop; + property Visible; + property WordWrap; + property StyleElements; + {$IFDEF D10_4+} + property StyleName; + {$ENDIF} + property OnClick; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnKeyDown; + property OnMouseActivate; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnStartDock; + property OnStartDrag; + + //StyledComponents Attributes + property StyleRadius; + property StyleRoundedCorners; + property StyleDrawType; + property StyleFamily; + property StyleClass; + property StyleAppearance; + property ButtonStyleNormal; + property ButtonStylePressed; + property ButtonStyleSelected; + property ButtonStyleHot; + property ButtonStyleDisabled; + end; + +//Global function to create a StyledButton +function CreateAndPosStyledButton(const AOwner: TComponent; + const AParent: TWinControl; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ACaption: TCaption; + const ARectPosition: TRect): TCustomStyledButton; + +implementation + +uses + System.Types + , System.RTLConsts + , System.StrUtils + , Vcl.Forms + {$IFDEF INCLUDE_BootstrapButtonStyles} + , Vcl.BootstrapButtonStyles + {$ENDIF} + {$IFDEF INCLUDE_AngularButtonStyles} + , Vcl.AngularButtonStyles + {$ENDIF} + {$IFDEF INCLUDE_ColorButtonStyles} + , Vcl.ColorButtonStyles + {$ENDIF} + , Vcl.StyledCmpMessages + ; + +const + DEFAULT_BTN_WIDTH = 75; + DEFAULT_BTN_HEIGHT = 25; + DEFAULT_IMAGE_HMARGIN = 8; + DEFAULT_IMAGE_VMARGIN = 4; + DefaultBitBtnGlyphSize = 18; + BitBtnModalResults: array[TBitBtnKind] of TModalResult = ( + 0, mrOk, mrCancel, 0, mrYes, mrNo, 0, mrAbort, mrRetry, mrIgnore, + mrAll); + +function CreateAndPosStyledButton(const AOwner: TComponent; + const AParent: TWinControl; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ACaption: TCaption; + const ARectPosition: TRect): TCustomStyledButton; +begin + Result := TCustomStyledButton.CreateStyled(AOwner, AFamily, AClass, AAppearance); + Result.Parent := AParent; + Result.Caption := ACaption; + Result.SetBounds(ARectPosition.Left, ARectPosition.Top, ARectPosition.Right, ARectPosition.Bottom); +end; + +{ TStyledButtonRender } + +procedure TStyledButtonRender.AssignStyleTo(ADest: TStyledButtonRender); +begin + ADest.AsVCLComponent := Self.AsVCLComponent; + if not ParentFont then + ADest.Font.Assign(Self.Font); + ADest.FFlat := Self.FFlat; + ADest.FStyle := Self.FStyle; + ADest.FStyleRadius := Self.FStyleRadius; + ADest.FStyleRoundedCorners := Self.FStyleRoundedCorners; + ADest.FButtonStyleNormal.Assign(Self.FButtonStyleNormal); + ADest.FButtonStylePressed.Assign(Self.FButtonStylePressed); + ADest.FButtonStyleSelected.Assign(Self.FButtonStyleSelected); + ADest.FButtonStyleHot.Assign(Self.FButtonStyleHot); + ADest.FButtonStyleDisabled.Assign(Self.FButtonStyleDisabled); + ADest.FNotificationBadge.Assign(Self.FNotificationBadge); + ADest.SetButtonStyles(Self.FStyleFamily, + Self.FStyleClass, Self.FStyleAppearance); + ADest.FStyleDrawType := Self.FStyleDrawType; + ADest.FCustomDrawType := Self.FCustomDrawType; + ADest.FUseButtonLayout := Self.FUseButtonLayout; + ADest.FButtonLayout := Self.FButtonLayout; + ADest.Transparent := Self.FTransparent; + ADest.FFlat := Self.FFlat; + ADest.FCaptionAlignment := Self.FCaptionAlignment; + ADest.FCommandLinkHint := Self.FCommandLinkHint; + ADest.FNotificationBadge.Assign(Self.FNotificationBadge); + + if Assigned(FImages) then + begin + ADest.FImageMargins.Assign(FImageMargins); + ADest.FImageAlignment := Self.FImageAlignment; + ADest.Images := Images; + ADest.ImageIndex := Self.ImageIndex; + ADest.HotImageIndex := Self.HotImageIndex; + ADest.StylusHotImageIndex := Self.StylusHotImageIndex; + ADest.SelectedImageIndex := Self.SelectedImageIndex; + ADest.PressedImageIndex := Self.PressedImageIndex; + {$IFDEF D10_4+} + ADest.ImageName := Self.ImageName; + ADest.HotImageName := Self.HotImageName; + ADest.StylusHotImageName := Self.StylusHotImageName; + ADest.SelectedImageName := Self.SelectedImageName; + ADest.PressedImageName := Self.PressedImageName; + {$ENDIF} + end; + if Assigned(FDisabledImages) then + begin + ADest.DisabledImages := Self.DisabledImages; + ADest.DisabledImageIndex := Self.DisabledImageIndex; + {$IFDEF D10_4+} + ADest.DisabledImageName := Self.DisabledImageName; + {$ENDIF} + end; + if Assigned(FGlyph) then + begin + ADest.FTransparentColor := FTransparentColor; + ADest.NumGlyphs := FNumGlyphs; + ADest.Glyph := FGlyph; + end; + ADest.FCustomDrawType := Self.FCustomDrawType; +end; + +function TStyledButtonRender.AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AImageAlignment: TImageAlignment = iaLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TControl; +begin + Enabled := AEnabled; + if Assigned(AImageList) then + begin + Images := AImageList; + {$IFDEF D10_4+} + if AImageName <> '' then + ImageName := AImageName + else + ImageIndex := AImageIndex; + {$ELSE} + ImageIndex := AImageIndex; + {$ENDIF} + ImageAlignment := AImageAlignment; + FUseButtonLayout := False; + end; + if Assigned(AAction) then + Action := AAction + else if Assigned(AOnClick) then + FOnClick := AOnClick; + if AName <> '' then + FOwnerControl.Name := AName; + Result := FOwnerControl; +end; + +function TStyledButtonRender.AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AButtonLayout: TButtonLayout = blGlyphLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TControl; +begin + Enabled := AEnabled; + if Assigned(AImageList) then + begin + Images := AImageList; + {$IFDEF D10_4+} + if AImageName <> '' then + ImageName := AImageName + else + ImageIndex := AImageIndex; + {$ELSE} + ImageIndex := AImageIndex; + {$ENDIF} + Layout := AButtonLayout; + FUseButtonLayout := True; + end; + if Assigned(AAction) then + Action := AAction + else if Assigned(AOnClick) then + FOnClick := AOnClick; + if AName <> '' then + FOwnerControl.Name := AName; + Result := FOwnerControl; +end; + +procedure TStyledButtonRender.BeginUpdate; +begin + Inc(FUpdateCount); +end; + +procedure TStyledButtonRender.EndUpdate; +begin + Dec(FUpdateCount); +end; + +function TStyledButtonRender.BitBtnCaptions(Kind: TBitBtnKind): string; +begin + case Kind of + bkOK: Result := STR_OK; + bkCancel: Result := STR_CANCEL; + bkHelp: Result := STR_HELP; + bkYes: Result := STR_YES; + bkNo: Result := STR_NO; + bkClose: Result := STR_CLOSE; + bkAbort: Result := STR_ABORT; + bkRetry: Result := STR_RETRY; + bkIgnore: Result := STR_IGNORE; + bkAll: Result := STR_ALL; + else + Result := ''; + end; +end; + +{$IFDEF HiDPISupport} +procedure TStyledButtonRender.ChangeScale(M, D: Integer; isDpiChange: Boolean); +begin + if isDpiChange then + begin + FImageMargins.Left := MulDiv(FImageMargins.Left, M, D); + FImageMargins.Top := MulDiv(FImageMargins.Top, M, D); + FImageMargins.Right := MulDiv(FImageMargins.Right, M, D); + FImageMargins.Bottom := MulDiv(FImageMargins.Bottom, M, D); + end; +end; +{$ENDIF} + +procedure TStyledButtonRender.CMEnabledChanged(var Message: TMessage); +begin + if (not Enabled) then + State := bsDisabled + else + State := bsUp; + if FMouseInControl then + FMouseInControl := False; + Invalidate; +end; + +procedure TStyledButtonRender.CMEnter(var Message: TCMEnter); +begin + if not(Enabled) or (csDesigning in ComponentState) then + Exit; + FMouseInControl := false; +end; + +procedure TStyledButtonRender.CMMouseEnter(var Message: TNotifyEvent); +begin + if not(Enabled) or (csDesigning in ComponentState) then + Exit; + FMouseInControl := true; + Invalidate; +end; + +procedure TStyledButtonRender.CMMouseLeave(var Message: TNotifyEvent); +begin + if not(Enabled) or (csDesigning in ComponentState) then + Exit; + State := bsUp; + FMouseInControl := false; + Invalidate; +end; + +function TStyledButtonRender.UpdateCount: Integer; +begin + Result := FUpdateCount; +end; + +procedure TStyledButtonRender.CMStyleChanged(var Message: TMessage); +begin + inherited; + ApplyButtonStyle; +end; + +procedure TStyledButtonRender.Click(AKeyPressed: Boolean); +var + Form: TCustomForm; +begin + if not AKeyPressed and FMouseOverDropDown then + begin + State := bsUp; + Invalidate; + DoDropDownMenu; + end + else + begin + Form := GetParentForm(FOwnerControl); + if Form <> nil then + Form.ModalResult := ModalResult; + FMouseInControl := True; + OwnerControl.Repaint; + //State := bsUp; do not "force" state changing + OnClick(FOwnerControl); + end; +end; + +procedure TStyledButtonRender.ImageListChange(Sender: TObject); +begin + UpdateImageIndexAndName; + Invalidate; +end; + +procedure TStyledButtonRender.ImageMarginsChange(Sender: TObject); +begin + Invalidate; +end; + +constructor TStyledButtonRender.CreateStyled(AOwner: TControl; + const AOnClick: TNotifyEvent; + const AControlFont: TControlFont; + const AGetCaption: TGetCaption; + const ASetCaption: TSetCaption; + const AGetParentFont: TGetParentFont; + const ASetParentFont: TSetParentFont; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; + const AUseCustomDrawType: Boolean); +begin + Assert(Assigned(AOwner)); + inherited Create; + FTransparentColor := clOlive; + FTransparent := False; + FImageIndex := -1; + FNumGlyphs := 1; + FCaptionAlignment := TAlignment.taCenter; + FFlat := False; + FShowCaption := True; + //Owner Control "link" + FOwnerControl := AOwner; + if (FOwnerControl is TCustomStyledButton) then + TCustomStyledButton(FOwnerControl).FRender := Self + else if (FOwnerControl is TCustomStyledGraphicButton) then + TCustomStyledGraphicButton(FOwnerControl).FRender := Self + else + raise EStyledButtonError.Create(ERROR_CANNOT_USE_RENDER); + + FOnClick := AOnClick; + FControlFont := AControlFont; + FGetCaption := AGetCaption; + FSetCaption := ASetCaption; + FGetParentFont := AGetParentFont; + FSetParentFont := ASetParentFont; + + FDisabledImageIndex := -1; + FHotImageIndex := -1; + FStylusHotImageIndex := -1; + FImageAlignment := iaLeft; + ImageIndex := -1; + FPressedImageIndex := -1; + FSelectedImageIndex := -1; + FSpacing := 4; + FMargin := -1; + + FStyle := TCustomButton.TButtonStyle.bsPushButton; + FButtonStyleNormal := TStyledButtonAttributes.Create(AOwner); + FButtonStyleNormal.Name := 'Normal'; + FButtonStylePressed := TStyledButtonAttributes.Create(AOwner); + FButtonStylePressed.Name := 'Pressed'; + FButtonStyleSelected := TStyledButtonAttributes.Create(AOwner); + FButtonStyleSelected.Name := 'Selected'; + FButtonStyleHot := TStyledButtonAttributes.Create(AOwner); + FButtonStyleHot.Name := 'Hot'; + FButtonStyleDisabled := TStyledButtonAttributes.Create(AOwner); + FButtonStyleDisabled.Name := 'Disabled'; + FNotificationBadge := TNotificationBadgeAttributes.Create(AOwner); + FNotificationBadge.Name := 'NotificationBadge'; + FOwnerControl.ControlStyle := [csOpaque, csCaptureMouse, csClickEvents, + csSetCaption, csDoubleClicks]; + FImageChangeLink := TChangeLink.Create; + FImageChangeLink.OnChange := ImageListChange; + FImageMargins := TImageMargins.Create; + FImageMargins.Left := DEFAULT_IMAGE_HMARGIN; + FImageMargins.OnChange := ImageMarginsChange; + FImageAlignment := iaLeft; + FCustomDrawType := False; + FOwnerControl.Cursor := ACursor; + ParentFont := true; + FOwnerControl.Width := DEFAULT_BTN_WIDTH; + FOwnerControl.Height := DEFAULT_BTN_HEIGHT; + FMouseInControl := false; + FStyleDrawType := ADrawType; + FCustomDrawType := AUseCustomDrawType; + FStyleRadius := DEFAULT_RADIUS; + FStyleRoundedCorners := ALL_ROUNDED_CORNERS; + FStyleFamily := AFamily; + FStyleAppearance := AAppearance; + //Call the Setter of StyleClass! + StyleClass := AClass; +end; + +constructor TStyledButtonRender.Create(AOwner: TControl; + const AOnClick: TNotifyEvent; + const AControlFont: TControlFont; + const AGetCaption: TGetCaption; + const ASetCaption: TSetCaption; + const AGetParentFont: TGetParentFont; + const ASetParentFont: TSetParentFont); +begin + CreateStyled(AOwner, + AOnClick, + AControlFont, + AGetCaption, + ASetCaption, + AGetParentFont, + ASetParentFont, + DEFAULT_CLASSIC_FAMILY, + DEFAULT_WINDOWS_CLASS, + DEFAULT_APPEARANCE, + DEFAULT_STYLEDRAWTYPE, + DEFAULT_CURSOR, + False); +end; + +procedure TStyledButtonRender.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + if Sender is TCustomAction then + begin + if not CheckDefaults or (ImageIndex = -1) then + ImageIndex := TCustomAction(Sender).ImageIndex; + {$IFDEF D10_4+} + if not CheckDefaults or (ImageName = '') then + ImageName := TCustomAction(Sender).ImageName; + {$ENDIF} + end; +end; + +function TStyledButtonRender.ApplyButtonStyle: Boolean; +var + LButtonFamily: TButtonFamily; + LStyleClass: TStyledButtonClass; + LStyleAppearance: TStyledButtonAppearance; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then use + //VCL Style assigned to Button or Global VCL Style + if seBorder in FOwnerControl.StyleElements then + LStyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + end + else + begin + LStyleClass := FStyleClass; + LStyleAppearance := FStyleAppearance; + end; + Result := StyleFamilyCheckAttributes(FStyleFamily, + LStyleClass, LStyleAppearance, LButtonFamily); + if Result (*or (csDesigning in ComponentState)*) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, + LStyleClass, + LStyleAppearance, + FButtonStyleNormal, + FButtonStylePressed, + FButtonStyleSelected, + FButtonStyleHot, + FButtonStyleDisabled); + + if not FCustomDrawType then + FStyleDrawType := FButtonStyleNormal.DrawType; + end + else + begin + FStyleClass := LStyleClass; + FStyleAppearance := LStyleAppearance; + end; + if Result then + Invalidate; +end; + +function TStyledButtonRender.IsCaptionAlignmentStored: Boolean; +begin + if (Style = TCustomButton.TButtonStyle.bsCommandLink) then + Result := CaptionAlignment <> taLeftJustify + else + Result := CaptionAlignment <> taCenter; +end; + +destructor TStyledButtonRender.Destroy; +begin + Images := nil; + FreeAndNil(FImageChangeLink); + FreeAndNil(FImageMargins); + FreeAndNil(FButtonStyleNormal); + FreeAndNil(FButtonStylePressed); + FreeAndNil(FButtonStyleSelected); + FreeAndNil(FButtonStyleHot); + FreeAndNil(FButtonStyleDisabled); + FreeAndNil(FNotificationBadge); + FreeAndNil(FGlyph); + inherited Destroy; +end; + +function TStyledButtonRender.CanDropDownMenu: boolean; +begin + Result := (FStyle = TCustomButton.TButtonStyle.bsSplitButton) and + (Assigned(DropDownMenu) or Assigned(FOnDropDownClick)); +end; + +procedure TStyledButtonRender.ShowDropDownMenu; +var + Pt: TPoint; + LRect: TRect; +begin + if Assigned(FDropDownMenu) then + begin + LRect := FOwnerControl.ClientRect; + Pt := FOwnerControl.ClientToScreen(Point(LRect.Left, LRect.Bottom)); + FDropDownMenu.PopupComponent := FOwnerControl; + FDropDownMenu.Popup(Pt.X, Pt.Y); + end; +end; + +procedure TStyledButtonRender.DoDropDownMenu; +begin + if Assigned(FOnDropDownClick) then + FOnDropDownClick(Self) + else if Assigned(FDropDownMenu) then + ShowDropDownMenu; +end; + +procedure TStyledButtonRender.WMKeyDown(var Message: TMessage); +begin + if Message.WParam = VK_SPACE then + begin + State := bsDown; + FMouseInControl := True; + Invalidate; + end; +end; + +function TStyledButtonRender.GetHandle: HWND; +begin + if (FOwnerControl is TCustomStyledButton) then + begin + if TCustomStyledButton(FOwnerControl).HandleAllocated then + Result := TCustomStyledButton(FOwnerControl).Handle + else + Result := 0; + end + else + Result := 0; +end; + +procedure TStyledButtonRender.WMKeyUp(var Message: TMessage); +var + P: TPoint; +begin + if Message.WParam = VK_SPACE then + begin + State := bsUp; + P := Mouse.CursorPos; + FMouseInControl := WindowFromPoint(P) = GetHandle; + Invalidate; + Click(True); + end; +end; + +function TStyledButtonRender.GetText: TCaption; +begin + Assert(Assigned(FGetCaption)); + Result := FGetCaption; +end; + +function TStyledButtonRender.HasTransparentParts: Boolean; +begin + Result := (FStyleDrawType <> btRect) or FTransparent; +end; + +function TStyledButtonRender.GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; +begin + if (FOwnerControl is TCustomStyledButton) then + Result := TCustomStyledButton(FOwnerControl).GetImage(AImageList, AImageIndex) + else if (FOwnerControl is TCustomStyledGraphicButton) then + Result := TCustomStyledGraphicButton(FOwnerControl).GetImage(AImageList, AImageIndex) + else + begin + AImageList := nil; + AImageIndex := -1; + Result := False; + end; +end; + +function TStyledButtonRender.GetInternalImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; +begin + case ButtonState of + bsmNormal: + begin + AImageList := FImages; + AImageIndex := ImageIndex; + end; + bsmPressed: + begin + AImageList := FImages; + if FPressedImageIndex <> -1 then + AImageIndex := FPressedImageIndex + else + AImageIndex := ImageIndex; + end; + bsmHot: + begin + AImageList := FImages; + if (FHotImageIndex <> -1) then + AImageIndex := FHotImageIndex + else if (FStylusHotImageIndex <> -1) then + AImageIndex := FStylusHotImageIndex + else + AImageIndex := ImageIndex; + end; + bsmSelected: + begin + AImageList := FImages; + if FSelectedImageIndex <> -1 then + AImageIndex := FSelectedImageIndex + else + AImageIndex := ImageIndex; + end; + bsmDisabled: + begin + if Assigned(FDisabledImages) then + AImageList := FDisabledImages + else + AImageList := FImages; + if FDisabledImageIndex <> -1 then + AImageIndex := FDisabledImageIndex + else + AImageIndex := ImageIndex; + end; + end; + Result := Assigned(AImageList) and (AImageIndex <> -1); +end; + +function TStyledButtonRender.GetKind: TBitBtnKind; +begin + if FKind <> bkCustom then + if ((FKind in [bkOK, bkYes]) xor Default) or + ((FKind in [bkCancel, bkNo]) xor Cancel) or + (ModalResult <> BitBtnModalResults[FKind]) then + FKind := bkCustom; + Result := FKind; +end; + +function TStyledButtonRender.GetMouseInControl: Boolean; +begin + Result := FMouseInControl; +end; + +function TStyledButtonRender.IsCustomDrawType: Boolean; +begin + Result := FCustomDrawType; +end; + +function TStyledButtonRender.IsDefaultAppearance: Boolean; +begin + Result := (FStyleFamily = DEFAULT_APPEARANCE) and + (FStyleClass = DEFAULT_WINDOWS_CLASS) and + (FStyleAppearance = DEFAULT_APPEARANCE); +end; + +function TStyledButtonRender.IsPressed: Boolean; +begin + Result := FState = bsDown; +end; + +function TStyledButtonRender.IsCustomRadius: Boolean; +begin + Result := StyleRadius <> DEFAULT_RADIUS; +end; + +function TStyledButtonRender.IsStoredStyleFamily: Boolean; +begin + Result := FStyleFamily <> DEFAULT_CLASSIC_FAMILY; +end; + +function TStyledButtonRender.AsVCLStyle: Boolean; +begin + Result := (FStyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in FOwnerControl.StyleElements); +end; + +function TStyledButtonRender.GetAsVCLComponent: Boolean; +begin + Result := (FStyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in FOwnerControl.StyleElements); +end; + +procedure TStyledButtonRender.SetAsVCLComponent(const AValue: Boolean); +begin + if AValue <> GetAsVCLComponent then + begin + if AValue then + begin + FStyleFamily := DEFAULT_CLASSIC_FAMILY; + FStyleClass := DEFAULT_WINDOWS_CLASS; + FStyleAppearance := DEFAULT_APPEARANCE; + FOwnerControl.StyleElements := FOwnerControl.StyleElements + [seClient]; + end + else if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + begin + FOwnerControl.StyleElements := FOwnerControl.StyleElements - [seClient]; + end; + ApplyButtonStyle; + end; +end; + +function TStyledButtonRender.IsStoredStyleClass: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + if FModalResult <> mrNone then + LButtonFamily.StyledAttributes.GetStyleByModalResult(FModalResult, LClass, LAppearance); + Result := FStyleClass <> LClass; +end; + +function TStyledButtonRender.IsStoredStyleAppearance: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; + LModalResultAppearance: TStyledButtonAppearance; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + if FModalResult <> mrNone then + begin + LButtonFamily.StyledAttributes.GetStyleByModalResult(FModalResult, + LClass, LModalResultAppearance); + Result := FStyleAppearance <> LModalResultAppearance; + end + else + Result := FStyleAppearance <> LAppearance; +end; + +function TStyledButtonRender.IsStoredStyleElements: Boolean; +begin + if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + Result := FOwnerControl.StyleElements <> [seFont, seClient, seBorder] + else + Result := False; +end; + +function TStyledButtonRender.IsNotificationBadgeStored: Boolean; +begin + Result := FNotificationBadge.HasCustomAttributes; +end; + +function TStyledButtonRender.IsStyleDisabledStored: Boolean; +begin + Result := FButtonStyleDisabled.HasCustomAttributes; +end; + +function TStyledButtonRender.IsStylePressedStored: Boolean; +begin + Result := FButtonStylePressed.HasCustomAttributes; +end; + +function TStyledButtonRender.IsStyleSelectedStored: Boolean; +begin + Result := FButtonStyleSelected.HasCustomAttributes; +end; + +function TStyledButtonRender.IsStyleHotStored: Boolean; +begin + Result := FButtonStyleHot.HasCustomAttributes; +end; + +function TStyledButtonRender.IsStyleNormalStored: Boolean; +begin + Result := FButtonStyleNormal.HasCustomAttributes; +end; + +function TStyledButtonRender.GetAttributes(const AMode: TStyledButtonState): TStyledButtonAttributes; +begin + case Amode of + bsmPressed: Result := FButtonStylePressed; + bsmSelected: Result := FButtonStyleSelected; + bsmHot: Result := FButtonStyleHot; + bsmDisabled: Result := FButtonStyleDisabled; + else + Result := FButtonStyleNormal; + end; +end; + +procedure TStyledButtonRender.DrawText(const ACanvas: TCanvas; + const AText: string; const AAlignment: TAlignment; + const ASpacing: Integer; + var ARect: TRect; AFlags: Cardinal); +var + R: TRect; + OldBKMode: Integer; +begin + //Drawing Caption + R := ARect; + Winapi.Windows.DrawText(ACanvas.Handle, PChar(AText), Length(AText), + R, AFlags or DT_CALCRECT); + case AAlignment of + taLeftJustify: OffsetRect(R, ASpacing, (ARect.Height - R.Height) div 2); + taRightJustify: OffsetRect(R, ARect.Width - R.Width - ASpacing, (ARect.Height - R.Height) div 2); + else + OffsetRect(R, (ARect.Width - R.Width) div 2, (ARect.Height - R.Height) div 2); + end; + OldBKMode := SetBkMode(ACanvas.Handle, Winapi.Windows.TRANSPARENT); + CanvasDrawText(ACanvas, R, AText, AFlags); + SetBkMode(ACanvas.Handle, OldBKMode); +end; + +procedure TStyledButtonRender.DrawNotificationBadge( + const ACanvas: TCanvas; const ASurfaceRect: TRect); +var + LRect: TRect; + W, H, LBadgeChars, LBadgeBorderSize: Integer; + LBadgeValue: string; + LScaleFactor: Single; + LFlags: Cardinal; +begin + if not FNotificationBadge.IsVisible then + Exit; + + LScaleFactor := GetOwnerScaleFactor; + ACanvas.Pen.Style := psClear; + ACanvas.Brush.Color := FNotificationBadge.Color; + ACanvas.Font.Color := FNotificationBadge.FontColor; + ACanvas.Font.Style := [TFontStyle.fsBold]; + + //Calculate Badge Size + LFlags := DT_NOCLIP or DT_CENTER or DT_VCENTER or DT_CALCRECT; + LRect := ASurfaceRect; + LBadgeChars := Length(FNotificationBadge.BadgeContent); + if FNotificationBadge.CustomText = '' then + LBadgeValue := StringOfChar('9', LBadgeChars) + else + LBadgeValue := FNotificationBadge.CustomText; + Winapi.Windows.DrawText(ACanvas.Handle, + PChar(LBadgeValue), LBadgeChars, LRect, LFlags); + LBadgeValue := FNotificationBadge.BadgeContent; + + //Add Border + LBadgeBorderSize := Round(3 * LScaleFactor); + InflateRect(LRect, Round(LBadgeBorderSize*2.2), LBadgeBorderSize); + if FNotificationBadge.Size = nbsSmallDot then + begin + //Reduce size of dot based on Font Size + H := Round(LRect.Height / 2); + W := H; + end + else + begin + H := LRect.Height; + W := Max(LRect.Width, H); + end; + + //Calculate Badge Position + if FNotificationBadge.Position in [nbpTopLeft, nbpTopRight] then + begin + LRect.Top := ASurfaceRect.Top; + LRect.Bottom := LRect.Top + H; + end + else + begin + LRect.Bottom := ASurfaceRect.Bottom; + LRect.Top := LRect.Bottom - H; + end; + if FNotificationBadge.Position in [nbpTopRight, nbpBottomRight] then + begin + LRect.Right := ASurfaceRect.Right; + LRect.Left := ASurfaceRect.Right - W; + end + else + begin + LRect.Left := ASurfaceRect.Left; + LRect.Right := ASurfaceRect.Left + W; + end; + //Draw Badge + CanvasDrawshape(ACanvas, LRect, btRounded, 0, ALL_ROUNDED_CORNERS, False); + + //Draw Badge Content + if FNotificationBadge.Size <> nbsSmallDot then + DrawText(ACanvas, LBadgeValue, taCenter, 0, LRect, + DT_NOCLIP or DT_CENTER or DT_VCENTER); +end; + +procedure TStyledButtonRender.DrawBackgroundAndBorder( + const ACanvas: TCanvas; + const AStyleAttribute: TStyledButtonAttributes; + const AEraseBackground: Boolean); +var + LDrawRect: TRect; + LButtonOffset: Integer; +begin + //Erase Background + if AEraseBackground then + EraseBackground(ACanvas); + + LDrawRect := FOwnerControl.ClientRect; + + //Don't draw button border for Flat Buttons + if FFlat and not FMouseInControl and not Focused then + ACanvas.Pen.Style := psClear; + + //Don't draw button face for Transparent Buttons + if FTransparent and not FDown and not FMouseInControl and not Focused then + ACanvas.Brush.Style := bsClear; + + //Draw Button Shape + CanvasDrawshape(ACanvas, LDrawRect, FStyleDrawType, + FStyleRadius*GetOwnerScaleFactor, FStyleRoundedCorners); + + //Draw Bar and Triangle + if FDropDownRect.Width > 0 then + begin + if FFlat then + ACanvas.Pen.Style := psClear; + if not (StyleDrawType in [btRounded, btEllipse]) then + begin + CanvasDrawBar(ACanvas, FDropDownRect, + GetOwnerScaleFactor, + ACanvas.Pen.Color); + CanvasDrawTriangle(ACanvas, FDropDownRect, + GetOwnerScaleFactor, + AStyleAttribute.FontColor); + end + else + begin + LButtonOffset := FDropDownRect.Height div 8; + FDropDownRect.Left := FDropDownRect.Left - LButtonOffset; + FDropDownRect.Right := FDropDownRect.Right - LButtonOffset; + CanvasDrawTriangle(ACanvas, FDropDownRect, + GetOwnerScaleFactor, + AStyleAttribute.FontColor); + end; + end; +end; + +function TStyledButtonRender.CalcImageRect(const ASurfaceRect: TRect; + const AImageWidth, AImageHeight: Integer): TRect; +var + LTextRect: TRect; +begin + CalcImageAndTextRect(ASurfaceRect, Caption, LTextRect, Result, + AImageWidth, AImageHeight, FImageAlignment, FImageMargins, GetOwnerScaleFactor); +end; + +procedure TStyledButtonRender.SetButtonStyles( + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + if (AFamily <> FStyleFamily) or + (AClass <> FStyleClass) or + (AAppearance <> FStyleAppearance) then + begin + FStyleFamily := AFamily; + FStyleClass := AClass; + FStyleAppearance := AAppearance; + ApplyButtonStyle; + end; +end; + +{$IFDEF D10_4+} +procedure TStyledButtonRender.CheckImageIndexes; +var + LImageIndex: TImageIndex; + LImageName: TImageName; +begin + if (Images = nil) or not Images.IsImageNameAvailable then + Exit; + LImageIndex := ImageIndex; + LImageName := ImageName; + Images.CheckIndexAndName(LImageIndex, LImageName); + if LImageIndex <> ImageIndex then + ImageIndex := LImageIndex; + if LImageName <> ImageName then + ImageName := LImageName; + Images.CheckIndexAndName(FHotImageIndex, FHotImageName); + Images.CheckIndexAndName(FPressedImageIndex, FPressedImageName); + Images.CheckIndexAndName(FSelectedImageIndex, FSelectedImageName); + Images.CheckIndexAndName(FStylusHotImageIndex, FStylusHotImageName); + if FDisabledImages <> nil then + FDisabledImages.CheckIndexAndName(FDisabledImageIndex, FDisabledImageName) + else + Images.CheckIndexAndName(FDisabledImageIndex, FDisabledImageName); +end; +{$ENDIF} + +procedure TStyledButtonRender.EraseBackground(const ACanvas: TCanvas); +var + LStyle: TCustomStyleServices; + LHandle: HWND; +begin + LStyle := StyleServices; + if HasTransparentParts then + begin + if FOwnerControl is TWinControl then + LHandle := TWinControl(FOwnerControl).Handle + else + LHandle := 0; + if OwnerControl is TCustomStyledGraphicButton then + begin + if LStyle.Available and Transparent then + LStyle.DrawParentBackground(LHandle, ACanvas.Handle, nil, False) + else + PerformEraseBackground(FOwnerControl, ACanvas.Handle); + end + else + begin + if LStyle.Available then + LStyle.DrawParentBackground(LHandle, ACanvas.Handle, nil, False) + else + PerformEraseBackground(FOwnerControl, ACanvas.Handle); + end; + end; +end; + +function TStyledButtonRender.GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList; out AImageIndex: Integer): boolean; +begin + AWidth := 0; + AHeight := 0; + //Return True if using ImageList + Result := GetImage(AImageList, AImageIndex); + if Result then + begin + AWidth := AImageList.Width; + AHeight := AImageList.Height; + end + else if ((FKind = bkCustom) and Assigned(FGlyph)) or (FKind <> bkCustom) then + begin + if Assigned(FGlyph) then + begin + AWidth := FGlyph.Width div FNumGlyphs; + AHeight := FGlyph.Height; + end + else + begin + {$IFDEF D10_4+} + AWidth := FOwnerControl.ScaleValue(DefaultBitBtnGlyphSize); + {$ELSE} + AWidth := DefaultBitBtnGlyphSize; + {$ENDIF} + AHeight := AWidth; + end; + end; +end; + +procedure TStyledButtonRender.DrawCaptionAndImage(const ACanvas: TCanvas; + const ASurfaceRect: TRect); +var + LTextFlags: Cardinal; + LImageRect, LTextRect: TRect; + LImageList: TCustomImageList; + LImageIndex: Integer; + LImageWidth, LImageHeight: Integer; + LUseImageList: Boolean; + LGlyphPos: TPoint; + LCaption: TCaption; +begin + if FShowCaption then + LCaption := GetCaptionToDraw + else + LCaption := ''; + case FCaptionAlignment of + taLeftJustify: LTextFlags := DT_NOCLIP or DT_LEFT or DT_VCENTER; + taRightJustify: LTextFlags := DT_NOCLIP or DT_RIGHT or DT_VCENTER; + else + LTextFlags := DT_NOCLIP or DT_CENTER or DT_VCENTER; + end; + if FWordWrap then + LTextFlags := LTextFlags or DT_WORDBREAK; + LTextFlags := FOwnerControl.DrawTextBiDiModeFlags(LTextFlags); + LUseImageList := GetImageSize(LImageWidth, LImageHeight, + LImageList, LImageIndex); + + //FUseButtonLayout is used by TStyledBitBtn and TStyledSpeedButton + //to use Layout for Icon position + if FUseButtonLayout then + begin + //Calculate LTextRect and LImageRect using Margin, Spacing and ButtonLayout + CalcImageAndTextRect(ACanvas, LCaption, ASurfaceRect, + TPoint.Create(0,0), LGlyphPos, LTextRect, + LImageWidth, LImageHeight, FButtonLayout, FMargin, FSpacing, LTextFlags); + LImageRect.Left := LGlyphPos.X; + LImageRect.Top := LGlyphPos.Y; + LImageRect.Width := LImageWidth; + LImageRect.Height := LImageHeight; + end + else + begin + if Style = bsCommandLink then + begin + CalcImageAndTextRect(ASurfaceRect, LCaption, LTextRect, LImageRect, + LImageWidth, LImageHeight, FImageAlignment, FImageMargins, GetOwnerScaleFactor); + if Assigned(Images) then + begin + //A CommandLink Buttons Ignores ImageAlignment and ImagePosition + //Fixed Left and Right of ImageRect + LImageRect.Right := LImageRect.Right - Round(8*GetOwnerScaleFactor); + LImageRect.Left := Round(8*GetOwnerScaleFactor); + LTextRect.Left := LImageWidth + FImageMargins.Left + FImageMargins.Right + + Round(8*GetOwnerScaleFactor); + end + else + begin + //Fixed Size of ImageRect + LImageRect.top := Round(16*GetOwnerScaleFactor); + LImageRect.Left := Round(10*GetOwnerScaleFactor); + LImageRect.Height := Round(20*GetOwnerScaleFactor); + LImageRect.Width := LImageRect.Height; + if AsVCLComponent then + DrawIconFromCommandLinkRes(ACanvas, LImageRect, + Self.ActiveStyleName, FState, Enabled) + else + DrawIconFromCommandLinkRes(ACanvas, LImageRect, + Self.FStyleClass, FState, Enabled); + end; + end + else + begin + //Calculate LTextRect and LImageRect using ImageMargins and ImageAlignment + CalcImageAndTextRect(ASurfaceRect, LCaption, LTextRect, LImageRect, + LImageWidth, LImageHeight, FImageAlignment, FImageMargins, GetOwnerScaleFactor); + end; + end; + if ElevationRequired then + begin + //Load the Shield Icon from Resource + DrawIconFromCommandLinkRes(ACanvas, LImageRect, + RESOURCE_SHIELD_ICON, FState, Enabled) + end + else if LUseImageList then + begin + //Uses an ImageList to draw the Icon + LImageList.Draw(ACanvas, LImageRect.Left, LImageRect.Top, + LImageIndex, Enabled); + end + else + begin + if ((FKind = bkCustom) and Assigned(FGlyph)) or (FKind <> bkCustom) then + begin + //Uses the Glyph to draw the Icon + DrawBitBtnGlyph(ACanvas, LImageRect, FKind, FState, Enabled, + FGlyph, FNumGlyphs, FTransparentColor); + end; + end; + if (Style = bsCommandLink) then + begin + //Load the Arrow Icon from Resource + if Assigned(Images) then + LTextRect.Left := LImageRect.Right+Round(10*GetOwnerScaleFactor) + else + LTextRect.Left := Round(38*GetOwnerScaleFactor); + LTextRect.Right := ASurfaceRect.Right; + ACanvas.Font.Height := Round(-16*GetOwnerScaleFactor); + if AsVCLComponent and (ActiveStyleName = 'Windows') then + ACanvas.Font.Color := HtmlToColor('#0279D7'); //Windows Blue color + //Calculate TextRect: WordWrap, centered + LTextFlags := DT_NOCLIP or DT_VCENTER or DT_WORDBREAK; + Winapi.Windows.DrawText(ACanvas.Handle, PChar(LCaption), + Length(LCaption), LTextRect, LTextFlags or DT_CALCRECT); + //WordWrap but not vertical centerer: fixed top + LTextFlags := DT_NOCLIP or DT_WORDBREAK; + LTextRect.Top := Round(28*GetOwnerScaleFactor); + DrawText(ACanvas, LCaption, taLeftJustify, 0, LTextRect, LTextFlags); + if FCommandLinkHint <> '' then + begin + ACanvas.Font.Height := Round(-11*GetOwnerScaleFactor); + //Draw Command Link Hint Under Caption + LTextRect.Top := LTextRect.Top + LTextRect.Height; + LTextRect.Bottom := ASurfaceRect.Bottom; + LTextRect.Right := ASurfaceRect.Right - Round(4*GetOwnerScaleFactor); + //Calculate TextRect: WordWrap, centered + LTextFlags := DT_NOCLIP or DT_VCENTER or DT_WORDBREAK; + Winapi.Windows.DrawText(ACanvas.Handle, PChar(FCommandLinkHint), + Length(FCommandLinkHint), LTextRect, LTextFlags or DT_CALCRECT); + //WordWrap but not vertical centerer: fixed top + LTextFlags := DT_NOCLIP or DT_WORDBREAK; + OffsetRect(LTextRect, 0, Round(15*GetOwnerScaleFactor)); + DrawText(ACanvas, FCommandLinkHint, taLeftJustify, 0, LTextRect, LTextFlags); + end; + end + else + DrawText(ACanvas, LCaption, FCaptionAlignment, FSpacing, LTextRect, LTextFlags); +end; + +procedure TStyledButtonRender.DrawButton(const ACanvas: TCanvas; + const AEraseBackground: Boolean); +var + LSurfaceRect: TRect; + LOldFontName: TFontName; + LOldFontColor: TColor; + LOldFontStyle: TFontStyles; + LOldParentFont: boolean; + LStyleAttribute: TStyledButtonAttributes; +begin + if not (csDesigning in ComponentState) and + (not FOwnerControl.Visible or (FUpdateCount > 0)) then + Exit; + + LOldParentFont := ParentFont; + LOldFontName := Font.Name; + LOldFontColor := Font.Color; + LOldFontStyle := Font.Style; + + try + LStyleAttribute := GetDrawingStyle(ACanvas); + + DrawBackgroundAndBorder(ACanvas, LStyleAttribute, AEraseBackground); + + LSurfaceRect := FOwnerControl.ClientRect; + if FDropDownRect.Width <> 0 then + Dec(LSurfaceRect.Right, FDropDownRect.Width); + + DrawCaptionAndImage(ACanvas, LSurfaceRect); + + LSurfaceRect := FOwnerControl.ClientRect; + DrawNotificationBadge(ACanvas, LSurfaceRect); + finally + if LOldParentFont then + ParentFont := LOldParentFont + else + begin + Font.Name := LOldFontName; + Font.Color := LOldFontColor; + Font.Style := LOldFontStyle; + end; + end; +end; + +function TStyledButtonRender.GetBackGroundColor: TColor; +begin + Result := GetAttributes(ButtonState).ButtonColor; +end; + +function TStyledButtonRender.GetButtonState: TStyledButtonState; +begin + if FOwnerControl is TCustomStyledGraphicButton then + Result := TCustomStyledGraphicButton(FOwnerControl).ButtonState + else if FOwnerControl is TCustomStyledButton then + Result := TCustomStyledButton(FOwnerControl).ButtonState + else + Result := bsmNormal; +end; + +function TStyledButtonRender.GetDrawingStyle(const ACanvas: TCanvas): TStyledButtonAttributes; +begin + //Getting drawing styles + Result := GetAttributes(ButtonState); + ACanvas.Pen.Style := Result.PenStyle; + ACanvas.Pen.Width := Round(Result.BorderWidth{$IFDEF D10_3+}*FOwnerControl.ScaleFactor{$ENDIF}); + ACanvas.Pen.Color := Result.BorderColor; + ACanvas.Brush.Style := Result.BrushStyle; + if Result.ButtonDrawStyle <> btnClear then + ACanvas.Brush.Color := Result.ButtonColor; + ACanvas.Font := Font; + ACanvas.Font.Color := Result.FontColor; + if ParentFont then + ACanvas.Font.Style := Result.FontStyle; + + if FStyle = TCustomButton.TButtonStyle.bsSplitButton then + begin + FDropDownRect := FOwnerControl.ClientRect; + FDropDownRect.Left := FDropDownRect.Right - GetSplitButtonWidth - ACanvas.Pen.Width -2; + end + else + FDropDownRect.Width := 0; +end; + +function TStyledButtonRender.GetFocused: Boolean; +begin + if FOwnerControl is TCustomControl then + Result := TCustomControl(FOwnerControl).Focused + else + Result := False; +end; + +function TStyledButtonRender.GetRescalingButton: Boolean; +begin + Result := FRescalingButton; +end; + +procedure TStyledButtonRender.SetRescalingButton(const AValue: Boolean); +begin + FRescalingButton := AValue; +end; + +procedure TStyledButtonRender.SetStyleDrawType(const AValue: TStyledButtonDrawType); +begin + if FStyleDrawType <> AValue then + begin + FStyleDrawType := AValue; + FCustomDrawType := True; + (* do not assign DrawType to any Style + FButtonStyleNormal.DrawType := FDrawType; + FButtonStylePressed.DrawType := FDrawType; + FButtonStyleSelected.DrawType := FDrawType; + FButtonStyleHot.DrawType := FDrawType; + FButtonStyleDisabled.DrawType := FDrawType; + *) + Invalidate; + end; +end; + +function TStyledButtonRender.IsDefaultImageMargins: Boolean; +begin + //Default image margins: when all margins are zero except for + //Actual ImageAlignment margin is default + case FImageAlignment of + iaLeft: Result := (FImageMargins.Left = DEFAULT_IMAGE_HMARGIN) and + (FImageMargins.Top = 0) and (FImageMargins.Right = 0) and (FImageMargins.Bottom = 0); + iaRight: Result := (FImageMargins.Right = DEFAULT_IMAGE_HMARGIN) and + (FImageMargins.Top = 0) and (FImageMargins.Left = 0) and (FImageMargins.Bottom = 0); + iaTop: Result := (FImageMargins.Top = DEFAULT_IMAGE_VMARGIN) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Bottom = 0); + iaBottom: Result := (FImageMargins.Bottom = DEFAULT_IMAGE_VMARGIN) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Top = 0); + iaCenter: Result := (FImageMargins.Bottom = 0) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Top = 0); + else + Result := False; + end; +end; + +procedure TStyledButtonRender.CalcDefaultImageMargins(const AValue: TImageAlignment); + + function AdJustMargin(const AMargin, AOffset: Integer): Integer; + begin + Result := AMargin + Round(AOffset*GetOwnerScaleFactor); + end; + +begin + if IsDefaultImageMargins then + begin + FImageMargins.Left := 0; + FImageMargins.Right := 0; + FImageMargins.Top := 0; + FImageMargins.Bottom := 0; + case AValue of + iaLeft: FImageMargins.Left := AdJustMargin(FImageMargins.Left, DEFAULT_IMAGE_HMARGIN); + iaRight: FImageMargins.Right := AdJustMargin(FImageMargins.Right, DEFAULT_IMAGE_HMARGIN); + iaTop: FImageMargins.Top := AdJustMargin(FImageMargins.Top, DEFAULT_IMAGE_VMARGIN); + iaBottom: FImageMargins.Bottom := AdJustMargin(FImageMargins.Bottom, DEFAULT_IMAGE_VMARGIN); + end; + end; +end; + +procedure TStyledButtonRender.SetLayout(const AValue: TButtonLayout); +begin + if AValue <> FButtonLayout then + begin + FButtonLayout := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetImageAlignment(const AValue: TImageAlignment); +begin + if AValue <> FImageAlignment then + begin + CalcDefaultImageMargins(AValue); + FImageAlignment := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetDisabledImageIndex(const AValue: TImageIndex); +begin + if AValue <> FDisabledImageIndex then + begin + FDisabledImageIndex := AValue; + {$IFDEF D10_4+} + if (FDisabledImages <> nil) and FDisabledImages.IsImageNameAvailable then + FDisabledImageName := FDisabledImages.GetNameByIndex(FDisabledImageIndex) + else + if (FDisabledImages = nil) and (FImages <> nil) and FImages.IsImageNameAvailable then + FDisabledImageName := FImages.GetNameByIndex(FDisabledImageIndex); + {$ENDIF} + UpdateImageIndexAndName; + end; +end; + +function TStyledButtonRender.GetImageIndex: TImageIndex; +begin + if (FOwnerControl is TCustomStyledButton) then + Result := TCustomStyledButton(FOwnerControl).ImageIndex + else if (FOwnerControl is TCustomStyledGraphicButton) then + Result := TCustomStyledGraphicButton(FOwnerControl).ImageIndex + else + raise EStyledButtonError.Create(ERROR_CANNOT_USE_RENDER); +end; + +procedure TStyledButtonRender.SetImageIndex(const AValue: TImageIndex); +begin + if AValue <> FImageIndex then + begin + FImageIndex := AValue; + if (FOwnerControl is TCustomStyledButton) then + TCustomStyledButton(FOwnerControl).ImageIndex := AValue + else if (FOwnerControl is TCustomStyledGraphicButton) then + TCustomStyledGraphicButton(FOwnerControl).ImageIndex := AValue; + + {$IFDEF D10_4+} + if (FImages <> nil) and FImages.IsImageNameAvailable then + ImageName := FImages.GetNameByIndex(ImageIndex); + {$ENDIF} + UpdateImageIndexAndName; + Invalidate; + end; +end; + +{$IFDEF D10_4+} +procedure TStyledButtonRender.SetDisabledImageName(const AValue: TImageName); +begin + if AValue <> FDisabledImageName then + begin + FDisabledImageName := AValue; + if (FDisabledImages <> nil) and FDisabledImages.IsImageNameAvailable then + FDisabledImageIndex := FDisabledImages.GetIndexByName(FDisabledImageName) + else + if (FDisabledImages = nil) and (FImages <> nil) and FImages.IsImageNameAvailable then + FDisabledImageIndex := FImages.GetIndexByName(FDisabledImageName); + UpdateImageIndexAndName; + end; +end; + +function TStyledButtonRender.GetImageName: TImageName; +begin + if (FOwnerControl is TCustomStyledButton) then + Result := TCustomStyledButton(FOwnerControl).FImageName + else if (FOwnerControl is TCustomStyledGraphicButton) then + Result := TCustomStyledGraphicButton(FOwnerControl).FImageName + else + raise EStyledButtonError.Create(ERROR_CANNOT_USE_RENDER); +end; + +procedure TStyledButtonRender.SetImageName(const AValue: TImageName); +begin + if AValue <> FImageName then + begin + FImageName := AValue; + if (FOwnerControl is TCustomStyledButton) then + TCustomStyledButton(FOwnerControl).ImageName := AValue + else if (FOwnerControl is TCustomStyledGraphicButton) then + TCustomStyledGraphicButton(FOwnerControl).ImageName := AValue; + UpdateImageIndexAndName; + Invalidate; + end; +end; + +procedure TStyledButtonRender.UpdateImages; +begin + if CheckWin32Version(5, 1) and (ImageIndex <> -1) then + begin + CheckImageIndexes; + end; +end; + +procedure TStyledButtonRender.UpdateImageName(Index: TImageIndex; + var Name: TImageName); +begin + if (FImages <> nil) and FImages.IsImageNameAvailable then + Name := FImages.GetNameByIndex(Index); + UpdateImageIndexAndName; +end; + +procedure TStyledButtonRender.UpdateImageIndex(Name: TImageName; + var Index: TImageIndex); +begin + if (FImages <> nil) and FImages.IsImageNameAvailable then + Index := FImages.GetIndexByName(Name); + UpdateImageIndexAndName; +end; + +procedure TStyledButtonRender.SetHotImageName(const AValue: TImageName); +begin + if AValue <> FHotImageName then + begin + FHotImageName := AValue; + UpdateImageIndex(AValue, FHotImageIndex); + end; +end; + +procedure TStyledButtonRender.SetStylusHotImageName(const AValue: TImageName); +begin + if AValue <> FStylusHotImageName then + begin + FStylusHotImageName := AValue; + UpdateImageIndex(AValue, FStylusHotImageIndex); + end; +end; + +procedure TStyledButtonRender.SetPressedImageName(const AValue: TImageName); +begin + if AValue <> FPressedImageName then + begin + FPressedImageName := AValue; + UpdateImageIndex(AValue, FPressedImageIndex); + end; +end; + +procedure TStyledButtonRender.SetSelectedImageName(const AValue: TImageName); +begin + if AValue <> FSelectedImageName then + begin + FSelectedImageName := AValue; + UpdateImageIndex(AValue, FSelectedImageIndex); + end; +end; +{$ENDIF} + +procedure TStyledButtonRender.UpdateImageIndexAndName; +begin +{$IFDEF D10_4+} + if (FImages <> nil) and FImages.IsImageNameAvailable then + begin + if (ImageName <> '') and (ImageIndex = -1) then + ImageIndex := FImages.GetIndexByName(ImageName) + else if (ImageName = '') and (ImageIndex <> -1) then + ImageName := FImages.GetNameByIndex(ImageIndex); + CheckImageIndexes; + end; +{$ENDIF} +end; + +function TStyledButtonRender.GetActiveStyleName: string; +begin + Result := Vcl.ButtonStylesAttributes.GetActiveStyleName(FOwnerControl); +end; + +procedure TStyledButtonRender.SetDisabledImages(const AValue: TCustomImageList); +begin + if AValue <> FDisabledImages then + begin + if DisabledImages <> nil then + begin + DisabledImages.RemoveFreeNotification(FOwnerControl); + DisabledImages.UnRegisterChanges(FImageChangeLink); + end; + FDisabledImages := AValue; + if DisabledImages <> nil then + begin + DisabledImages.RegisterChanges(FImageChangeLink); + DisabledImages.FreeNotification(FOwnerControl); + end; + UpdateImageIndexAndName; + Invalidate; + end; +end; + +procedure TStyledButtonRender.UpAllButtons; +var + LParent: TWinControl; + LControl: TControl; + I: Integer; + LGraphicButton: TCustomStyledGraphicButton; + LButton: TCustomStyledButton; +begin + LParent := FOwnerControl.Parent; + for I := 0 to LParent.ControlCount -1 do + begin + LControl := LParent.Controls[I]; + if LControl is TCustomStyledGraphicButton then + begin + LGraphicButton := TCustomStyledGraphicButton(LControl); + if LGraphicButton.Down and (LGraphicButton <> FOwnerControl) and + (LGraphicButton.GroupIndex = GroupIndex) then + begin + LGraphicButton.Down := False; + Break; + end; + end; + if LControl is TCustomStyledButton then + begin + LButton := TCustomStyledButton(LControl); + if LButton.Down and (LButton <> FOwnerControl) and + (LButton.GroupIndex = GroupIndex) then + begin + LButton.Down := False; + Break; + end; + end; + end; +end; + +procedure TStyledButtonRender.SetDown(const AValue: Boolean); +begin + if AValue <> FDown then + begin + FDown := AValue; + if AValue then + begin + FState := bsDown; + UpAllButtons; + end + else + FState := bsUp; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetDropDownMenu(const AValue: TPopupMenu); +begin + if AValue <> FDropDownMenu then + begin + if DropDownMenu <> nil then + DropDownMenu.RemoveFreeNotification(FOwnerControl); + FDropDownMenu := AValue; + if DropDownMenu <> nil then + DropDownMenu.FreeNotification(FOwnerControl); + end; +end; + +procedure TStyledButtonRender.SetElevationRequired(const AValue: Boolean); +begin + if FElevationRequired <> AValue then + begin + FElevationRequired := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetFlat(const AValue: Boolean); +begin + if FFlat <> AValue then + begin + FFlat := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetFocus; +begin + if FOwnerControl is TCustomControl and + TCustomControl(FOwnerControl).CanFocus and + TCustomControl(FOwnerControl).TabStop then + TCustomControl(FOwnerControl).SetFocus; +end; + +procedure TStyledButtonRender.SetGlyph(const AValue: TBitmap); +begin + if Assigned(AValue) then + FTransparentColor := AValue.TransparentColor; + Glyph.Assign(AValue); + Invalidate; +end; + +procedure TStyledButtonRender.SetGroupIndex(const AValue: Integer); +begin + if FGroupIndex <> AValue then + begin + FGroupIndex := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetHotImageIndex(const AValue: TImageIndex); +begin + if AValue <> FHotImageIndex then + begin + FHotImageIndex := AValue; + {$IFDEF D10_4+} + UpdateImageName(AValue, FHotImageName); + {$ENDIF} + end; +end; + +procedure TStyledButtonRender.SetStylusHotImageIndex(const AValue: TImageIndex); +begin + if FStylusHotImageIndex <> AValue then + begin + FStylusHotImageIndex := AValue; + {$IFDEF D10_4+} + UpdateImageName(AValue, FHotImageName); + {$ENDIF} + end; +end; + + +procedure TStyledButtonRender.SetImages(const AValue: TCustomImageList); +begin + if AValue <> FImages then + begin + if FImages <> nil then + begin + FImages.RemoveFreeNotification(FOwnerControl); + FImages.UnRegisterChanges(FImageChangeLink); + end; + FImages := AValue; + if FImages <> nil then + begin + FImages.RegisterChanges(FImageChangeLink); + FImages.FreeNotification(FOwnerControl); + end; + UpdateImageIndexAndName; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetKind(const AValue: TBitBtnKind); +begin + if AValue <> FKind then + begin + if AValue <> bkCustom then + begin + Default := AValue in [bkOK, bkYes]; + Cancel := AValue in [bkCancel, bkNo]; + + if ((csLoading in ComponentState) and (Caption = '')) or + (not (csLoading in ComponentState)) then + begin + if AValue <> bkCustom then + Caption := BitBtnCaptions(AValue); + end; + + ModalResult := BitBtnModalResults[AValue]; + end; + FKind := AValue; + Invalidate; + end; +end; + +function TStyledButtonRender.UpdateStyleUsingModalResult: boolean; +begin + if (FModalResult <> mrNone) then + begin + Result := True; + //Force style of the button as defined into Family + StyleFamilyUpdateAttributesByModalResult(FModalResult, + FStyleFamily, FStyleClass, FStyleAppearance); + StyleApplied := ApplyButtonStyle; + end + else + Result := False; +end; + +procedure TStyledButtonRender.SetMargin(const AValue: Integer); +begin + if FMargin <> AValue then + begin + FMargin := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetModalResult(const AValue: TModalResult); +begin + if FModalResult <> AValue then + begin + FModalResult := AValue; + UpdateStyleUsingModalResult; + end; +end; + +procedure TStyledButtonRender.SetNumGlyphs(const AValue: TNumGlyphs); +var + LValue: TNumGlyphs; +begin + LValue := AValue; + if LValue < 0 then LValue := 1 + else if LValue > 4 then LValue := 4; + if LValue <> FNumGlyphs then + begin + FNumGlyphs := LValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetPressedImageIndex(const AValue: TImageIndex); +begin + if AValue <> FPressedImageIndex then + begin + FPressedImageIndex := AValue; + {$IFDEF D10_4+} + UpdateImageName(AValue, FPressedImageName); + {$ENDIF} + end; +end; + +procedure TStyledButtonRender.SetButtonStyleNormal(const AValue: TStyledButtonAttributes); +begin + if not SameStyledButtonStyle(FButtonStyleNormal, AValue) then + begin + FButtonStyleNormal := AValue; + end; +end; + +procedure TStyledButtonRender.SetButtonStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + FStyleFamily := AStyleFamily; + FStyleClass := AStyleClass; + FStyleAppearance := AStyleAppearance; + if not ApplyButtonStyle then + raise EStyledButtonError.CreateFmt(ERROR_SETTING_BUTTON_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TStyledButtonRender.SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AModalResult: TModalResult); +begin + FStyleFamily := AStyleFamily; + FModalResult := AModalResult; + StyleFamilyUpdateAttributesByModalResult(FModalResult, + FStyleFamily, FStyleClass, FStyleAppearance); + if not ApplyButtonStyle then + raise EStyledButtonError.CreateFmt(ERROR_SETTING_BUTTON_STYLE, + [FStyleFamily, FStyleClass, FStyleAppearance]); +end; + +procedure TStyledButtonRender.SetButtonStyleDisabled( + const AValue: TStyledButtonAttributes); +begin + if not SameStyledButtonStyle(FButtonStyleDisabled, AValue) then + begin + FButtonStyleDisabled := AValue; + end; +end; + +procedure TStyledButtonRender.SetButtonStylePressed(const AValue: TStyledButtonAttributes); +begin + if not SameStyledButtonStyle(FButtonStylePressed, AValue) then + begin + FButtonStylePressed := AValue; + end; +end; + +procedure TStyledButtonRender.SetButtonStyleSelected(const AValue: TStyledButtonAttributes); +begin + if not SameStyledButtonStyle(FButtonStyleSelected, AValue) then + begin + FButtonStyleSelected := AValue; + end; +end; + +procedure TStyledButtonRender.SetButtonStyleHot(const AValue: TStyledButtonAttributes); +begin + if not SameStyledButtonStyle(FButtonStyleHot, AValue) then + begin + FButtonStyleHot := AValue; + end; +end; + +procedure TStyledButtonRender.SetNotificationBadge( + const AValue: TNotificationBadgeAttributes); +begin + if not SameNotificationBadgeAttributes(FNotificationBadge, AValue) then + begin + FNotificationBadge := AValue; + end; +end; + +procedure TStyledButtonRender.SetImageMargins(const AValue: TImageMargins); +begin + FImageMargins.Assign(AValue); +end; + +procedure TStyledButtonRender.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + if AValue <= 0 then + raise EReadError.create(SInvalidProperty); + FStyleRadius := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetStyleRoundedCorners(const AValue: TRoundedCorners); +begin + if FStyleRoundedCorners <> AValue then + begin + FStyleRoundedCorners := AValue; + Invalidate; + end; +end; + +function TStyledButtonRender.GetHasCustomAttributes: Boolean; +begin + Result := FButtonStyleNormal.HasCustomAttributes or + FButtonStylePressed.HasCustomAttributes or + FButtonStyleSelected.HasCustomAttributes or + FButtonStyleHot.HasCustomAttributes or + FButtonStyleDisabled.HasCustomAttributes; +end; + +procedure TStyledButtonRender.SetHasCustomAttributes(const AValue: Boolean); +begin + if not AValue then + begin + FButtonStyleNormal.ResetCustomAttributes; + FButtonStylePressed.ResetCustomAttributes; + FButtonStyleSelected.ResetCustomAttributes; + FButtonStyleHot.ResetCustomAttributes; + FButtonStyleDisabled.ResetCustomAttributes; + end; +end; + +procedure TStyledButtonRender.SetSelectedImageIndex(const AValue: TImageIndex); +begin + if AValue <> FSelectedImageIndex then + begin + FSelectedImageIndex := AValue; + {$IFDEF D10_4+} + UpdateImageName(AValue, FSelectedImageName); + {$ENDIF} + end; +end; + +procedure TStyledButtonRender.SetShowCaption(const AValue: Boolean); +begin + if FShowCaption <> AValue then + begin + FShowCaption := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetSpacing(const AValue: Integer); +begin + if FSpacing <> AValue then + begin + FSpacing := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetState(const AValue: TButtonState); +begin + if FState <> AValue then + begin + if (AValue <> bsDown) and FDown and not FAllowAllUp then + Exit; + FState := AValue; + end; +end; + +procedure TStyledButtonRender.SetStyle(const AValue: TCustomButton.TButtonStyle); +const + DefCmdLinkWidth = 175; + DefCmdLinkHeights: array[Boolean] of Integer = (57, 41); +begin + if AValue <> FStyle then + begin + FStyle := AValue; + if not (csLoading in ComponentState) then + begin + case AValue of + bsPushButton, + bsSplitButton: + begin + if FStyle = bsCommandLink then + FOwnerControl.SetBounds(FOwnerControl.Left, FOwnerControl.Top, + FOwnerControl.ExplicitWidth, FOwnerControl.ExplicitHeight); + end; + bsCommandLink: + begin + if Height < DefCmdLinkHeights[FCommandLinkHint = ''] then + FOwnerControl.Height := DefCmdLinkHeights[FCommandLinkHint = '']; + if Width < DefCmdLinkWidth then + FOwnerControl.Width := DefCmdLinkWidth; + FStyle := AValue; + end; + end; + end; + if (FStyle = TCustomButton.TButtonStyle.bsCommandLink) then + CaptionAlignment := TAlignment.taLeftJustify; + FMouseOverDropDown := False; + if not (csLoading in ComponentState) then + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +var + LValue: TStyledButtonAppearance; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_APPEARANCE; + if (LValue <> Self.FStyleAppearance) or not FStyleApplied then + begin + Self.FStyleAppearance := LValue; + StyleApplied := ApplyButtonStyle; + end; +end; + +procedure TStyledButtonRender.SetStyleApplied(const AValue: Boolean); +begin + FStyleApplied := AValue; +end; + +procedure TStyledButtonRender.SetStyleClass( + const AValue: TStyledButtonClass); +var + LValue: TStyledButtonClass; +begin + LValue := AValue; + //Using a specific Class in Classic Family force + //StyleElements without seClient + if (FStyleFamily = DEFAULT_CLASSIC_FAMILY) then + begin + if (LValue <> DEFAULT_WINDOWS_CLASS) then + FOwnerControl.StyleElements := FOwnerControl.StyleElements - [seClient]; +// else +// LValue := GetActiveStyleName; + if LValue = '' then + LValue := DEFAULT_WINDOWS_CLASS; + end; + if (LValue <> Self.FStyleClass) or not FStyleApplied then + begin + Self.FStyleClass := LValue; + StyleApplied := ApplyButtonStyle; + end; +end; + +procedure TStyledButtonRender.SetStyleFamily( + const AValue: TStyledButtonFamily); +var + LValue: TStyledButtonFamily; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_CLASSIC_FAMILY; + if (LValue <> Self.FStyleFamily) or not FStyleApplied then + begin + FStyleFamily := LValue; + StyleApplied := ApplyButtonStyle or + UpdateStyleUsingModalResult; + end; + if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + FOwnerControl.StyleElements := [seFont, seClient, seBorder]; +end; + +procedure TStyledButtonRender.SetText(const AValue: TCaption); +begin + if Caption <> AValue then + begin + FSetCaption(AValue); + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetCaptionAlignment(const AValue: TAlignment); +begin + if FCaptionAlignment <> AValue then + begin + FCaptionAlignment := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetTransparent(const AValue: Boolean); +begin + if FTransparent <> AValue then + begin + FTransparent := AValue; + if AValue then + FOwnerControl.ControlStyle := FOwnerControl.ControlStyle - [csOpaque] else + FOwnerControl.ControlStyle := FOwnerControl.ControlStyle + [csOpaque]; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetWordWrap(const AValue: Boolean); +begin + if FWordWrap <> AValue then + begin + FWordWrap := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.Loaded; +begin + inherited; + SetImageIndex(ImageIndex); + if not FStyleApplied (*and not HasCustomAttributes*) then + begin + StyleFamilyUpdateAttributesByModalResult(FModalResult, + FStyleFamily, FStyleClass, FStyleAppearance); + StyleApplied := ApplyButtonStyle; + end; +end; + +procedure TStyledButtonRender.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Enabled then + begin + State := bsDown; + SetFocus; + Invalidate; + inherited; + end; +end; + +function TStyledButtonRender.GetSplitButtonWidth: Integer; +begin + Result := Round(12{$IFDEF D10_3+}* FOwnerControl.ScaleFactor{$ENDIF}); +end; + +procedure TStyledButtonRender.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + FMouseOverDropDown := (FStyle = TCustomButton.TButtonStyle.bsSplitButton) + and (X >= FDropDownRect.Left); +end; + +procedure TStyledButtonRender.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Enabled then + begin + if GroupIndex <> 0 then + begin + if AllowAllUp and Down then + Down := False + else + Down := True; + end + else + State := bsUp; + Invalidate; + end; +end; + +function TStyledButtonRender.GetAction: TCustomAction; +begin + if FOwnerControl.Action is TCustomAction then + Result := TCustomAction(FOwnerControl.Action) + else + Result := nil; +end; + +procedure TStyledButtonRender.SetAction(const AAction: TCustomAction); +begin + FOwnerControl.Action := AAction; +end; + +procedure TStyledButtonRender.SetAllowAllUp(const AValue: Boolean); +begin + if FAllowAllUp <> AValue then + begin + FAllowAllUp := AValue; + Invalidate; + end; +end; + +function TStyledButtonRender.GetName: TComponentName; +begin + Result := FOwnerControl.Name; +end; + +function TStyledButtonRender.GetNumGlyphs: TNumGlyphs; +begin + Result := FNumGlyphs; +end; + +function TStyledButtonRender.GetOwnerScaleFactor: Single; +begin + Result := {$IFDEF D10_3+}FOwnerControl.ScaleFactor{$ELSE}1{$ENDIF}; +end; + +procedure TCustomStyledGraphicButton.SetNumGlyphs(const AValue: TNumGlyphs); +begin + FRender.NumGlyphs := AValue; +end; + +function TStyledButtonRender.GetParent: TWinControl; +begin + Result := FOwnerControl.Parent; +end; + +procedure TStyledButtonRender.SetParent(const AValue: TWinControl); +begin + FOwnerControl.Parent := AValue; +end; + +function TStyledButtonRender.GetControlEnabled: Boolean; +begin + Result := FOwnerControl.Enabled; +end; + +procedure TStyledButtonRender.SetCommandLinkHint(const AValue: string); +begin + if FCommandLinkHint <> AValue then + begin + FCommandLinkHint := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonRender.SetControlEnabled(const AValue: Boolean); +begin + FOwnerControl.Enabled := AValue; +end; + +procedure TStyledButtonRender.SetCustomStyleDrawType( + ACustomStyleDrawType: Boolean); +begin + FCustomDrawType := ACustomStyleDrawType; +end; + +function TStyledButtonRender.GetParentFont: Boolean; +begin + Assert(Assigned(FGetParentFont)); + Result := FGetParentFont; +end; + +procedure TStyledButtonRender.SetParentFont(const AValue: Boolean); +begin + Assert(Assigned(FSetParentFont)); + FSetParentFont(AValue); +end; + +function TStyledButtonRender.GetFont: TFont; +begin + Assert(Assigned(FControlFont)); + FControlFont(Result); +end; + +function TStyledButtonRender.GetGlyph: TBitmap; +begin + if not Assigned(FGlyph) then + FGlyph := TBitmap.Create; + Result := FGlyph; +end; + +function TStyledButtonRender.GetHint: string; +begin + if FOwnerControl is TGraphicControl then + Result := TGraphicControl(FOwnerControl).Hint + else if FOwnerControl is TCustomControl then + Result := TCustomControl(FOwnerControl).Hint + else + Result := ''; +end; + +function TStyledButtonRender.GetComponentState: TComponentState; +begin + Result := FOwnerControl.ComponentState; +end; + +function TStyledButtonRender.GetComponentWidth: Integer; +begin + Result := FOwnerControl.Width; +end; + +function TStyledButtonRender.GetCaptionToDraw: string; +begin + if FOwnerControl is TCustomStyledGraphicButton then + Result := TCustomStyledGraphicButton(FOwnerControl).GetCaptionToDraw + else if FOwnerControl is TCustomStyledButton then + Result := TCustomStyledButton(FOwnerControl).GetCaptionToDraw + else + Result := ''; +end; + +function TStyledButtonRender.GetComponentHeight: Integer; +begin + Result := FOwnerControl.Height; +end; + +procedure TStyledButtonRender.InternalCopyImage(Image: TBitmap; + ImageList: TCustomImageList; Index: Integer); +begin + with Image do + begin + Width := ImageList.Width; + Height := ImageList.Height; + Canvas.Brush.Color := clFuchsia; + Canvas.FillRect(Rect(0,0, Width, Height)); + ImageList.Draw(Canvas, 0, 0, Index); + end; +end; + +procedure TStyledButtonRender.Invalidate; +begin + FOwnerControl.Invalidate; +end; + +{ TCustomStyledGraphicButton } + +procedure TCustomStyledGraphicButton.AssignStyleTo(ADestRender: TStyledButtonRender); +begin + FRender.AssignStyleTo(ADestRender); +end; + +procedure TCustomStyledGraphicButton.AssignStyleTo(ADest: TCustomStyledGraphicButton); +begin + FRender.AssignStyleTo(ADest.Render); +end; + +function TCustomStyledGraphicButton.AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AImageAlignment: TImageAlignment = iaLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TCustomStyledGraphicButton; +begin + Result := FRender.AssignAttributes(AEnabled, + AImageList, + {$IFDEF D10_4+}AImageName,{$ENDIF} + AImageIndex, + AImageAlignment, + AAction, + AOnClick, + AName) as TCustomStyledGraphicButton; +end; + +procedure TCustomStyledGraphicButton.AssignTo(ADest: TPersistent); +var + LDest: TCustomStyledGraphicButton; +begin + inherited AssignTo(ADest); + if ADest is TCustomStyledGraphicButton then + begin + LDest := TCustomStyledGraphicButton(ADest); + FRender.AssignStyleTo(LDest.Render); + LDest.Cursor := Self.Cursor; + LDest.Hint := Self.Hint; + LDest.Visible := Self.Visible; + LDest.Caption := Self.Caption; + LDest.ModalResult := Self.ModalResult; + LDest.Tag := Self.Tag; + LDest.Enabled := Self.Enabled; + LDest.Down := Self.Down; + LDest.AllowAllUp := Self.AllowAllUp; + end; +end; + +procedure TCustomStyledGraphicButton.BeginUpdate; +begin + FRender.BeginUpdate; +end; + +procedure TCustomStyledGraphicButton.EndUpdate; +begin + FRender.EndUpdate; +end; + +{$IFDEF HiDPISupport} +procedure TCustomStyledGraphicButton.ChangeScale(M, D: Integer; isDpiChange: Boolean); +begin + if isDpiChange then + begin + RescalingButton := True; + try + if Assigned(FRender) then + FRender.ChangeScale(M, D, isDpiChange); + inherited; + finally + RescalingButton := False; + end; + end + else + inherited; +end; +{$ENDIF} + +procedure TCustomStyledGraphicButton.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsAccel(CharCode, Caption) and Visible then + begin + Click; + Result := 1; + end else + inherited; +end; + +procedure TCustomStyledGraphicButton.CMEnabledChanged(var Message: TMessage); +begin + inherited; + FRender.CMEnabledChanged(Message); +end; + +procedure TCustomStyledGraphicButton.CMEnter(var Message: TCMEnter); +begin + inherited; + FRender.CMEnter(Message); +end; + +procedure TCustomStyledGraphicButton.CMMouseEnter(var Message: TNotifyEvent); +begin + inherited; + FRender.CMMouseEnter(Message); +end; + +procedure TCustomStyledGraphicButton.CMMouseLeave(var Message: TNotifyEvent); +begin + inherited; + FRender.CMMouseLeave(Message); +end; + +procedure TCustomStyledGraphicButton.CMStyleChanged(var Message: TMessage); +begin + inherited; + FRender.CMStyleChanged(Message); +end; + +procedure TCustomStyledGraphicButton.Click; +begin + FRender.Click(False); +end; + +constructor TCustomStyledGraphicButton.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + inherited Create(AOwner); + FImageIndex := -1; + FRender := GetRenderClass.CreateStyled(Self, + ControlClick, ControlFont, GetCaption, SetCaption, + GetParentFont, SetParentFont, + AFamily, AClass, AAppearance, + _DefaultStyleDrawType, _DefaultCursor, _UseCustomDrawType); +end; + +constructor TCustomStyledGraphicButton.Create(AOwner: TComponent); +begin + CreateStyled(AOwner, + _DefaultFamily, + _DefaultClass, + _DefaultAppearance); +end; + +constructor TCustomStyledGraphicButton.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; + const AUseCustomDrawType: Boolean); +begin + inherited Create(AOwner); + FImageIndex := -1; + FRender := GetRenderClass.CreateStyled(Self, + ControlClick, ControlFont, GetCaption, SetCaption, + GetParentFont, SetParentFont, + AFamily, AClass, AAppearance, + ADrawType, ACursor, AUseCustomDrawType); +end; + +procedure TCustomStyledGraphicButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited; + FRender.ActionChange(Sender, CheckDefaults); +end; + +function TCustomStyledGraphicButton.IsCaptionAlignmentStored: Boolean; +begin + Result := FRender.IsCaptionAlignmentStored; +end; + +destructor TCustomStyledGraphicButton.Destroy; +begin + FreeAndNil(FRender); + inherited Destroy; +end; + +procedure TCustomStyledGraphicButton.DoDropDownMenu; +begin + FRender.DoDropDownMenu; +end; + +function TCustomStyledGraphicButton.GetText: TCaption; +begin + Result := FRender.GetText; +end; + +function TCustomStyledGraphicButton.GetTransparent: Boolean; +begin + Result := FRender.Transparent; +end; + +function TCustomStyledGraphicButton.GetKind: TBitBtnKind; +begin + Result := FRender.Kind; +end; + +function TCustomStyledGraphicButton.GetLayout: TButtonLayout; +begin + Result := FRender.Layout; +end; + +function TCustomStyledGraphicButton.ImageMarginsStored: Boolean; +begin + Result := not FRender.IsDefaultImageMargins; +end; + +function TCustomStyledGraphicButton.IsCaptionStored: Boolean; +begin + if (ActionLink = nil) then + Result := Caption <> '' + else + Result := not TGraphicButtonActionLink(ActionLink).IsCaptionLinked; +end; + +function TCustomStyledGraphicButton.IsCheckedStored: Boolean; +begin + if (ActionLink = nil) then + Result := FRender.Down + else + Result := not TGraphicButtonActionLink(ActionLink).IsCheckedLinked and + (FRender.Down); +end; + +function TCustomStyledGraphicButton.IsEnabledStored: Boolean; +begin + if (ActionLink = nil) then + Result := not Enabled + else + Result := not TGraphicButtonActionLink(ActionLink).IsEnabledLinked; +end; + +function TCustomStyledGraphicButton.IsImageIndexStored: Boolean; +begin + if (ActionLink = nil) then + Result := FImageIndex <> -1 + else + Result := not TGraphicButtonActionLink(ActionLink).IsImageIndexLinked and + (FImageIndex <> -1); +end; + +function TCustomStyledGraphicButton.IsNotificationBadgeStored: Boolean; +begin + Result := FRender.IsNotificationBadgeStored; +end; + +function TCustomStyledGraphicButton.IsCustomDrawType: Boolean; +begin + Result := FRender.IsCustomDrawType; +end; + +function TCustomStyledGraphicButton.IsCustomRadius: Boolean; +begin + Result := FRender.IsCustomRadius; +end; + +function TCustomStyledGraphicButton.IsStoredStyleFamily: Boolean; +begin + Result := FRender.IsStoredStyleFamily; +end; + +function TCustomStyledGraphicButton.IsStoredStyleClass: Boolean; +begin + Result := FRender.IsStoredStyleClass; +end; + +function TCustomStyledGraphicButton.IsStoredStyleAppearance: Boolean; +begin + Result := FRender.IsStoredStyleAppearance; +end; + +function TCustomStyledGraphicButton.IsStoredStyleElements: Boolean; +begin + Result := FRender.IsStoredStyleElements; +end; + +function TCustomStyledGraphicButton.IsStyleDisabledStored: Boolean; +begin + Result := FRender.IsStyleDisabledStored; +end; + +function TCustomStyledGraphicButton.IsStylePressedStored: Boolean; +begin + Result := FRender.IsStylePressedStored; +end; + +function TCustomStyledGraphicButton.IsStyleSelectedStored: Boolean; +begin + Result := FRender.IsStyleSelectedStored; +end; + +function TCustomStyledGraphicButton.IsStyleHotStored: Boolean; +begin + Result := FRender.IsStyleHotStored; +end; + +function TCustomStyledGraphicButton.IsStyleNormalStored: Boolean; +begin + Result := FRender.IsStyleNormalStored; +end; + +function TCustomStyledGraphicButton.GetButtonState: TStyledButtonState; +begin + //Getting button state + if not Enabled then + Result := bsmDisabled + else if (FRender.State = bsDown) or (FRender.Down) then + Result := bsmPressed + else if Focused then + Result := bsmSelected + else if FRender.MouseInControl then + Result := bsmHot + else + Result := bsmNormal; +end; + +function TCustomStyledGraphicButton.GetFlat: Boolean; +begin + Result := FRender.Flat; +end; + +function TCustomStyledGraphicButton.GetFocused: Boolean; +begin + Result := False; +end; + +function TCustomStyledGraphicButton.GetGlyph: TBitmap; +begin + Result := FRender.Glyph; +end; + +function TCustomStyledGraphicButton.GetGroupIndex: Integer; +begin + Result := FRender.GroupIndex; +end; + +procedure TCustomStyledGraphicButton.SetGlyph(const AValue: TBitmap); +begin + FRender.Glyph := AValue; +end; + +procedure TCustomStyledGraphicButton.SetGroupIndex(const AValue: Integer); +begin + FRender.GroupIndex := AValue; +end; + +procedure TCustomStyledGraphicButton.Paint; +begin + FRender.DrawButton(Canvas, not Transparent); +end; + +class procedure TCustomStyledGraphicButton.RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; const AAppearance: TStyledButtonAppearance; + const AStyleRadius: Integer; const ACursor: TCursor); +begin + _DefaultStyleDrawType := ADrawType; + _UseCustomDrawType := True; + _DefaultFamily := AFamily; + _DefaultClass := AClass; + _DefaultAppearance := AAppearance; + _DefaultStyleRadius := AStyleRadius; + _DefaultCursor := ACursor; +end; + +function TCustomStyledGraphicButton.GetRenderClass: TStyledButtonRenderClass; +begin + Result := TStyledButtonRender; +end; + +function TCustomStyledGraphicButton.GetRescalingButton: Boolean; +begin + Result := Assigned(FRender) and FRender.RescalingButton; +end; + +procedure TCustomStyledGraphicButton.SetRescalingButton(const AValue: Boolean); +begin + if Assigned(FRender) then + FRender.RescalingButton := AValue; +end; + +function TCustomStyledGraphicButton.GetStyleDrawType: TStyledButtonDrawType; +begin + Result := FRender.StyleDrawType; +end; + +procedure TCustomStyledGraphicButton.SetStyleDrawType(const AValue: TStyledButtonDrawType); +begin + FRender.StyleDrawType := AValue; +end; + +function TCustomStyledGraphicButton.GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; +begin + Result := FRender.GetInternalImage(AImageList, AImageIndex); +end; + +function TCustomStyledGraphicButton.GetImageAlignment: TImageAlignment; +begin + Result := FRender.ImageAlignment; +end; + +procedure TCustomStyledGraphicButton.SetImageAlignment(const AValue: TImageAlignment); +begin + FRender.ImageAlignment := AValue; +end; + +function TCustomStyledGraphicButton.GetDisabledImageIndex: TImageIndex; +begin + Result := FRender.DisabledImageIndex; +end; + +procedure TCustomStyledGraphicButton.SetDisabledImageIndex(const AValue: TImageIndex); +begin + FRender.DisabledImageIndex := AValue; +end; + +procedure TCustomStyledGraphicButton.SetImageIndex(const AValue: TImageIndex); +begin + if AValue <> FImageIndex then + begin + FImageIndex := AValue; + FRender.ImageIndex := AValue; + end; +end; + +{$IFDEF D10_4+} +function TCustomStyledGraphicButton.GetDisabledImageName: TImageName; +begin + Result := FRender.DisabledImageName; +end; + +procedure TCustomStyledGraphicButton.SetDisabledImageName(const AValue: TImageName); +begin + FRender.DisabledImageName := AValue; +end; + +function TCustomStyledGraphicButton.IsImageNameStored: Boolean; +begin + Result := (ActionLink = nil) or + not TGraphicButtonActionLink(ActionLink).IsImageNameLinked; +end; + +function TCustomStyledGraphicButton.GetImageName: TImageName; +begin + Result := FImageName; +end; + +procedure TCustomStyledGraphicButton.SetImageName(const AValue: TImageName); +begin + if AValue <> FImageName then + begin + FImageName := AValue; + FRender.ImageName := AValue; + end; +end; + +function TCustomStyledGraphicButton.GetHotImageName: TImageName; +begin + Result := FRender.HotImageName; +end; + +procedure TCustomStyledGraphicButton.SetHotImageName(const AValue: TImageName); +begin + FRender.HotImageName := AValue; +end; + +function TCustomStyledGraphicButton.GetPressedImageName: TImageName; +begin + Result := FRender.PressedImageName; +end; + +procedure TCustomStyledGraphicButton.SetPressedImageName(const AValue: TImageName); +begin + FRender.PressedImageName := AValue; +end; + +function TCustomStyledGraphicButton.GetSelectedImageName: TImageName; +begin + Result := FRender.SelectedImageName; +end; + +procedure TCustomStyledGraphicButton.SetSelectedImageName(const AValue: TImageName); +begin + FRender.SelectedImageName := AValue; +end; +{$ENDIF} + +function TCustomStyledGraphicButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TGraphicButtonActionLink; +end; + +function TCustomStyledGraphicButton.GetActiveStyleName: string; +begin + Result := FRender.ActiveStyleName; +end; + +function TCustomStyledGraphicButton.GetAllowAllUp: Boolean; +begin + Result := FRender.AllowAllUp; +end; + +function TCustomStyledGraphicButton.GetAsVCLComponent: Boolean; +begin + Result := FRender.AsVCLComponent; +end; + +function TCustomStyledGraphicButton.GetDisabledImages: TCustomImageList; +begin + Result := FRender.DisabledImages; +end; + +function TCustomStyledGraphicButton.GetDown: Boolean; +begin + Result := FRender.Down; +end; + +procedure TCustomStyledGraphicButton.SetDisabledImages(const AValue: TCustomImageList); +begin + FRender.DisabledImages := AValue; +end; + +procedure TCustomStyledGraphicButton.SetDown(const AValue: Boolean); +begin + FRender.Down := AValue; +end; + +function TCustomStyledGraphicButton.GetDropDownMenu: TPopupMenu; +begin + Result := FRender.DropDownMenu; +end; + +procedure TCustomStyledGraphicButton.SetDropDownMenu(const AValue: TPopupMenu); +begin + FRender.DropDownMenu := AValue; +end; + +procedure TCustomStyledGraphicButton.SetFlat(const AValue: Boolean); +begin + FRender.Flat := AValue; +end; + +function TCustomStyledGraphicButton.GetHotImageIndex: TImageIndex; +begin + Result := FRender.HotImageIndex; +end; + +procedure TCustomStyledGraphicButton.SetHotImageIndex(const AValue: TImageIndex); +begin + FRender.HotImageIndex := AValue; +end; + +function TCustomStyledGraphicButton.GetImages: TCustomImageList; +begin + Result := FRender.Images; +end; + +procedure TCustomStyledGraphicButton.SetImages(const AValue: TCustomImageList); +begin + FRender.Images := AValue; +end; + +procedure TCustomStyledGraphicButton.SetKind(const AValue: TBitBtnKind); +begin + FRender.Kind := AValue; +end; + +function TCustomStyledGraphicButton.GetMargin: Integer; +begin + Result := FRender.Margin; +end; + +procedure TCustomStyledGraphicButton.SetLayout(const AValue: TButtonLayout); +begin + FRender.Layout := AValue; +end; + +function TCustomStyledGraphicButton.GetModalResult: TModalResult; +begin + Result := FRender.ModalResult; +end; + +function TCustomStyledGraphicButton.GetMouseInControl: Boolean; +begin + Result := FRender.MouseInControl; +end; + +function TCustomStyledGraphicButton.GetNotificationBadge: TNotificationBadgeAttributes; +begin + Result := FRender.NotificationBadge; +end; + +function TCustomStyledGraphicButton.GetNumGlyphs: TNumGlyphs; +begin + Result := FRender.NumGlyphs; +end; + +procedure TCustomStyledGraphicButton.SetMargin(const AValue: Integer); +begin + FRender.Margin := AValue; +end; + +procedure TCustomStyledGraphicButton.SetModalResult(const AValue: TModalResult); +begin + FRender.ModalResult := AValue; +end; + +procedure TCustomStyledGraphicButton.SetName(const AValue: TComponentName); +var + LOldValue: string; +begin + LOldValue := Caption; + inherited; + if LOldValue <> Caption then + Invalidate; +end; + +procedure TCustomStyledGraphicButton.SetNotificationBadge( + const AValue: TNotificationBadgeAttributes); +begin + FRender.NotificationBadge := AValue; +end; + +function TCustomStyledGraphicButton.GetOnDropDownClick: TNotifyEvent; +begin + Result := FRender.OnDropDownClick; +end; + +procedure TCustomStyledGraphicButton.SetOnDropDownClick(const AValue: TNotifyEvent); +begin + FRender.OnDropDownClick := AValue; +end; + +function TCustomStyledGraphicButton.GetPressedImageIndex: TImageIndex; +begin + Result := FRender.PressedImageIndex; +end; + +procedure TCustomStyledGraphicButton.SetPressedImageIndex(const AValue: TImageIndex); +begin + FRender.PressedImageIndex := AValue; +end; + +function TCustomStyledGraphicButton.GetButtonStyleNormal: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleNormal; +end; + +procedure TCustomStyledGraphicButton.SetButtonStyleNormal(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleNormal := AValue; +end; + +procedure TCustomStyledGraphicButton.SetButtonStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + FRender.SetButtonStyle(AStyleFamily, AStyleClass, AStyleAppearance); +end; + +procedure TCustomStyledGraphicButton.SetAllowAllUp(const AValue: Boolean); +begin + FRender.AllowAllUp := AValue; +end; + +procedure TCustomStyledGraphicButton.SetAsVCLComponent(const AValue: Boolean); +begin + FRender.AsVCLComponent := AValue; +end; + +procedure TCustomStyledGraphicButton.SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AModalResult: TModalResult); +begin + FRender.SetButtonStyle(AStyleFamily, AModalResult); +end; + +function TCustomStyledGraphicButton.GetButtonStyleDisabled: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleDisabled; +end; + +procedure TCustomStyledGraphicButton.SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleDisabled := AValue; +end; + +function TCustomStyledGraphicButton.GetButtonStylePressed: TStyledButtonAttributes; +begin + Result := FRender.ButtonStylePressed; +end; + +procedure TCustomStyledGraphicButton.SetButtonStylePressed(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStylePressed := AValue; +end; + +function TCustomStyledGraphicButton.GetButtonStyleSelected: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleSelected; +end; + +procedure TCustomStyledGraphicButton.SetButtonStyleSelected(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleSelected := AValue; +end; + +function TCustomStyledGraphicButton.GetButtonStyleHot: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleHot; +end; + +procedure TCustomStyledGraphicButton.SetButtonStyleHot(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleHot := AValue; +end; + +function TCustomStyledGraphicButton.GetImageMargins: TImageMargins; +begin + Result := FRender.ImageMargins; +end; + +procedure TCustomStyledGraphicButton.SetImageMargins(const AValue: TImageMargins); +begin + FRender.ImageMargins := AValue; +end; + +function TCustomStyledGraphicButton.GetStyleRadius: Integer; +begin + Result := FRender.StyleRadius; +end; + +function TCustomStyledGraphicButton.GetStyleRoundedCorners: TRoundedCorners; +begin + Result := FRender.StyleRoundedCorners; +end; + +procedure TCustomStyledGraphicButton.SetStyleRadius(const AValue: Integer); +begin + FRender.StyleRadius := AValue; +end; + +procedure TCustomStyledGraphicButton.SetStyleRoundedCorners( + const AValue: TRoundedCorners); +begin + FRender.StyleRoundedCorners := AValue; +end; + +function TCustomStyledGraphicButton.GetSelectedImageIndex: TImageIndex; +begin + Result := FRender.SelectedImageIndex; +end; + +function TCustomStyledGraphicButton.GetShowCaption: Boolean; +begin + Result := FRender.ShowCaption; +end; + +function TCustomStyledGraphicButton.GetSpacing: Integer; +begin + Result := FRender.Spacing; +end; + +function TCustomStyledGraphicButton.GetSplitButtonWidth: Integer; +begin + Result := FRender.GetSplitButtonWidth; +end; + +procedure TCustomStyledGraphicButton.SetSelectedImageIndex(const AValue: TImageIndex); +begin + FRender.SelectedImageIndex := AValue; +end; + +procedure TCustomStyledGraphicButton.SetShowCaption(const AValue: Boolean); +begin + FRender.ShowCaption := AValue; +end; + +procedure TCustomStyledGraphicButton.SetSpacing(const AValue: Integer); +begin + FRender.Spacing := AValue; +end; + +function TCustomStyledGraphicButton.GetStyle: TCustomButton.TButtonStyle; +begin + Result := FRender.Style; +end; + +procedure TCustomStyledGraphicButton.SetStyle(const AValue: TCustomButton.TButtonStyle); +begin + FRender.Style := AValue; +end; + +function TCustomStyledGraphicButton.GetStyleAppearance: TStyledButtonAppearance; +begin + Result := FRender.StyleAppearance; +end; + +procedure TCustomStyledGraphicButton.SetStyleAppearance(const AValue: TStyledButtonAppearance); +begin + FRender.StyleAppearance := AValue; +end; + +function TCustomStyledGraphicButton.GetStyleApplied: Boolean; +begin + Result := FRender.StyleApplied; +end; + +procedure TCustomStyledGraphicButton.SetStyleApplied(const AValue: Boolean); +begin + FRender.StyleApplied := AValue; +end; + +function TCustomStyledGraphicButton.GetStyleClass: TStyledButtonClass; +begin + Result := FRender.StyleClass; +end; + +procedure TCustomStyledGraphicButton.SetStyleClass(const AValue: TStyledButtonClass); +begin + FRender.StyleClass := AValue; +end; + +function TCustomStyledGraphicButton.GetStyleFamily: TStyledButtonFamily; +begin + Result := FRender.StyleFamily; +end; + +procedure TCustomStyledGraphicButton.SetStyleFamily(const AValue: TStyledButtonFamily); +begin + FRender.StyleFamily := AValue; +end; + +{$IFDEF D10_4+} +procedure TCustomStyledGraphicButton.SetStyleName(const AValue: string); +begin + if (AValue <> '') and (StyleFamily <> DEFAULT_CLASSIC_FAMILY) then + StyleFamily := DEFAULT_CLASSIC_FAMILY; + inherited; + if (AValue <> '') then + StyleClass := AValue; +end; +{$ENDIF} + +procedure TCustomStyledGraphicButton.SetText(const AValue: TCaption); +begin + FRender.Caption := AValue; +end; + +procedure TCustomStyledGraphicButton.SetTransparent(const AValue: Boolean); +begin + FRender.Transparent := AValue; +end; + +function TCustomStyledGraphicButton.GetWordWrap: Boolean; +begin + Result := FRender.WordWrap; +end; + +function TCustomStyledGraphicButton.HasCustomGlyph: Boolean; +var + Link: TGraphicButtonActionLink; +begin + Link := TGraphicButtonActionLink(ActionLink); + Result := not ((Link <> nil) and Link.IsImageIndexLinked and + Link.IsGlyphLinked(ImageIndex)); +end; + +procedure TCustomStyledGraphicButton.SetWordWrap(const AValue: Boolean); +begin + FRender.WordWrap := AValue; +end; + +procedure TCustomStyledGraphicButton.ShowDropDownMenu; +begin + FRender.ShowDropDownMenu; +end; + +procedure TCustomStyledGraphicButton.Loaded; +begin + inherited; + FRender.Loaded; +end; + +procedure TCustomStyledGraphicButton.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + FRender.MouseDown(Button, Shift, X, Y); + if Enabled then + inherited; +end; + +procedure TCustomStyledGraphicButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + FRender.MouseMove(Shift, X, Y); +end; + +procedure TCustomStyledGraphicButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Enabled then + begin + FRender.MouseUp(Button, Shift, X, Y); + inherited; + end; +end; + +procedure TCustomStyledGraphicButton.ControlClick(Sender: TObject); +begin + inherited Click; +end; + +procedure TCustomStyledGraphicButton.ControlFont(var AValue: TFont); +begin + AValue := Self.Font; +end; + +procedure TCustomStyledGraphicButton.SetParentFont(const AValue: Boolean); +begin + Self.ParentFont := AValue; +end; + +function TCustomStyledGraphicButton.GetParentFont: Boolean; +begin + Result := Self.ParentFont; +end; + +function TCustomStyledGraphicButton.GetCaption: TCaption; +begin + Result := inherited Caption; +end; + +function TCustomStyledGraphicButton.GetCaptionToDraw: TCaption; +begin + Result := inherited Caption; +end; + +function TCustomStyledGraphicButton.GetCaptionAlignment: TAlignment; +begin + Result := FRender.CaptionAlignment; +end; + +function TCustomStyledGraphicButton.GetCommandLinkHint: string; +begin + Result := FRender.CommandLinkHint; +end; + +function TCustomStyledGraphicButton.GetCursor: TCursor; +begin + Result := inherited Cursor; +end; + +procedure TCustomStyledGraphicButton.SetCaption(const AValue: TCaption); +begin + inherited Caption := AValue; +end; + +procedure TCustomStyledGraphicButton.SetCaptionAlignment( + const AValue: TAlignment); +begin + FRender.CaptionAlignment := AValue; +end; + +procedure TCustomStyledGraphicButton.SetCommandLinkHint(const AValue: string); +begin + FRender.CommandLinkHint := AValue; +end; + +procedure TCustomStyledGraphicButton.SetCursor(const AValue: TCursor); +begin + if AValue <> Cursor then + begin + inherited Cursor := AValue; + end; +end; + +procedure TCustomStyledGraphicButton.Notification(AComponent: TComponent; AOperation: TOperation); +begin + inherited Notification(AComponent, AOperation); + if AOperation = opRemove then + begin + if Assigned(FRender) then + begin + if AComponent = DropDownMenu then + DropDownMenu := nil; + if AComponent = Images then + Images := nil; + if AComponent = DisabledImages then + DisabledImages := nil; + end; + end; +end; + +function TCustomStyledGraphicButton.GetTag: Integer; +begin + Result := FRender.Tag; +end; + +procedure TCustomStyledGraphicButton.SetTag(const AValue: Integer); +begin + FRender.Tag := AValue; +end; + +{ TGraphicButtonActionLink } + +procedure TGraphicButtonActionLink.AssignClient(AClient: TObject); +begin + inherited AssignClient(AClient); + FClient := AClient as TControl; +end; + +function TGraphicButtonActionLink.AssignedClientRender: Boolean; +begin + Result := ClientRender <> nil; +end; + +function TGraphicButtonActionLink.ClientRender: TStyledButtonRender; +begin + if FClient is TCustomStyledGraphicButton then + Result := TCustomStyledGraphicButton(FClient).FRender + else if FClient is TCustomStyledButton then + Result := TCustomStyledButton(FClient).FRender + else + Result := nil; +end; + +function TGraphicButtonActionLink.IsCheckedLinked: Boolean; +begin + if ClientRender <> nil then + begin + Result := inherited IsCheckedLinked and AssignedClientRender and + (ClientRender.Down = TCustomAction(Action).Checked); + end + else + Result := inherited IsCheckedLinked; +end; + +function TGraphicButtonActionLink.IsEnabledLinked: Boolean; +begin + Result := inherited IsEnabledLinked and + (FClient.Enabled = + TCustomAction(Action).Enabled); +end; + +function TGraphicButtonActionLink.IsGlyphLinked(Index: TImageIndex): Boolean; +var + LBitmap: TBitmap; + Images: TCustomImageList; + LGlyph: TBitmap; + LRender: TStyledButtonRender; +begin + Result := False; + if FClient is TCustomStyledGraphicButton then + begin + LGlyph := TCustomStyledGraphicButton(FClient).Glyph; + LRender := TCustomStyledGraphicButton(FClient).Render; + end + else if FClient is TCustomStyledButton then + begin + LGlyph := TCustomStyledButton(FClient).Glyph; + LRender := TCustomStyledButton(FClient).Render; + end + else + begin + LGlyph := nil; + LRender := nil; + end; + if Assigned(LGlyph) then + begin + Images := TCustomAction(Action).ActionList.Images; + Result := (Images <> nil) and (LGlyph <> nil) and + (LGlyph.Width = Images.Width) and (LGlyph.Height = Images.Height); + if Result then + begin + LBitmap := TBitmap.Create; + try + LRender.InternalCopyImage(LBitmap, Images, Index); + Result := LBitmap.Equals(LGlyph); + finally + LBitmap.Free; + end; + end; + end; +end; + +function TGraphicButtonActionLink.IsImageIndexLinked: Boolean; +begin + Assert(Assigned(FClient)); + if FClient is TCustomStyledButton then + Result := inherited IsImageIndexLinked and + (TCustomStyledButton(FClient).ImageIndex = + TCustomAction(Action).ImageIndex) + else if FClient is TCustomStyledGraphicButton then + Result := inherited IsImageIndexLinked and + (TCustomStyledGraphicButton(FClient).ImageIndex = + TCustomAction(Action).ImageIndex) + else + Result := False; +end; + +{$IFDEF D10_4+} +function TGraphicButtonActionLink.IsImageNameLinked: Boolean; +begin + Result := inherited IsImageNameLinked and + (TCustomStyledGraphicButton(FClient).ImageName = + TCustomAction(Action).ImageName); +end; +{$ENDIF} + +procedure TGraphicButtonActionLink.SetChecked(Value: Boolean); +begin + inherited; + if IsCheckedLinked and AssignedClientRender then + ClientRender.Down := Value; +end; + +procedure TGraphicButtonActionLink.SetEnabled(Value: Boolean); +begin + if IsEnabledLinked then + FClient.Enabled := Value; +end; + +procedure TGraphicButtonActionLink.SetGroupIndex(Value: Integer); +begin + inherited; + if IsGroupIndexLinked and AssignedClientRender then + ClientRender.GroupIndex := Value; +end; + +procedure TGraphicButtonActionLink.SetImageIndex(Value: Integer); +begin + if IsImageIndexLinked then + begin + if (FClient is TCustomStyledButton) then + TCustomStyledButton(FClient).ImageIndex := Value + else if (FClient is TCustomStyledGraphicButton) then + TCustomStyledGraphicButton(FClient).ImageIndex := Value; + end; +end; + +{ TStyledSpeedButton } + +constructor TStyledSpeedButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + SetBounds(0, 0, 23, 22); + ParentFont := True; + FRender.SetText(''); + FRender.FUseButtonLayout := True; + FRender.Transparent := True; +end; + +{ TCustomStyledButton } + +procedure TCustomStyledButton.AssignStyleTo(ADestRender: TStyledButtonRender); +begin + FRender.AssignStyleTo(ADestRender); +end; + +procedure TCustomStyledButton.AssignStyleTo(ADest: TCustomStyledButton); +begin + FRender.AssignStyleTo(ADest.Render); +end; + +function TCustomStyledButton.AssignAttributes( + const AEnabled: Boolean = True; + const AImageList: TCustomImageList = nil; + {$IFDEF D10_4+}const AImageName: string = '';{$ENDIF} + const AImageIndex: Integer = -1; + const AImageAlignment: TImageAlignment = iaLeft; + const AAction: TCustomAction = nil; + const AOnClick: TNotifyEvent = nil; + const AName: string = ''): TCustomStyledButton; +begin + Result := FRender.AssignAttributes(AEnabled, + AImageList, + {$IFDEF D10_4+}AImageName,{$ENDIF} + AImageIndex, + AImageAlignment, + AAction, + AOnClick, + AName) as TCustomStyledButton; +end; + +procedure TCustomStyledButton.AssignTo(ADest: TPersistent); +var + LDest: TCustomStyledButton; +begin + inherited AssignTo(ADest); + if ADest is TCustomStyledButton then + begin + if ADest is TCustomStyledButton then + begin + LDest := TCustomStyledButton(ADest); + FRender.AssignStyleTo(LDest.Render); + LDest.Cursor := Self.Cursor; + LDest.Hint := Self.Hint; + LDest.Visible := Self.Visible; + LDest.Caption := Self.Caption; + LDest.ModalResult := Self.ModalResult; + LDest.Tag := Self.Tag; + LDest.Enabled := Self.Enabled; + LDest.TabStop := Self.TabStop; + end; + end; +end; + +procedure TCustomStyledButton.BeginUpdate; +begin + FRender.BeginUpdate; +end; + +procedure TCustomStyledButton.EndUpdate; +begin + FRender.EndUpdate; +end; + +{$IFDEF HiDPISupport} +procedure TCustomStyledButton.ChangeScale(M, D: Integer; isDpiChange: Boolean); +begin + if isDpiChange then + begin + RescalingButton := True; + try + if Assigned(FRender) then + FRender.ChangeScale(M, D, isDpiChange); + inherited; + finally + RescalingButton := False; + end; + end + else + inherited; + end; +{$ENDIF} + +procedure TCustomStyledButton.CMEnabledChanged(var Message: TMessage); +begin + inherited; + FRender.CMEnabledChanged(Message); +end; + +procedure TCustomStyledButton.CMEnter(var Message: TCMEnter); +begin + inherited; + FRender.CMEnter(Message); +end; + +procedure TCustomStyledButton.CMMouseEnter(var Message: TNotifyEvent); +begin + inherited; + FRender.CMMouseEnter(Message); +end; + +procedure TCustomStyledButton.CMMouseLeave(var Message: TNotifyEvent); +begin + inherited; + FRender.CMMouseLeave(Message); +end; + +procedure TCustomStyledButton.CMStyleChanged(var Message: TMessage); +begin + inherited; + FRender.CMStyleChanged(Message); +end; + +constructor TCustomStyledButton.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + inherited Create(AOwner); + DoubleBuffered := True; + ParentColor := False; + FImageIndex := -1; + FRender := GetRenderClass.CreateStyled(Self, + ControlClick, ControlFont, GetCaption, SetCaption, + GetParentFont, SetParentFont, + AFamily, AClass, AAppearance, + _DefaultStyleDrawType, _DefaultCursor, _UseCustomDrawType); + TabStop := True; +end; + +constructor TCustomStyledButton.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; const ADrawType: TStyledButtonDrawType; + const ACursor: TCursor; const AUseCustomDrawType: Boolean); +begin + inherited Create(AOwner); + DoubleBuffered := True; + ParentColor := False; + FImageIndex := -1; + FRender := GetRenderClass.CreateStyled(Self, + ControlClick, ControlFont, GetCaption, SetCaption, + GetParentFont, SetParentFont, + AFamily, AClass, AAppearance, + ADrawType, ACursor, AUseCustomDrawType); + TabStop := True; +end; + +procedure TCustomStyledButton.CreateWnd; +begin + inherited CreateWnd; + FRender.Active := Default; +end; + +constructor TCustomStyledButton.Create(AOwner: TComponent); +begin + CreateStyled(AOwner, + _DefaultFamily, + _DefaultClass, + _DefaultAppearance); +end; + +procedure TCustomStyledButton.ActionChange(Sender: TObject; CheckDefaults: Boolean); +begin + inherited; + FRender.ActionChange(Sender, CheckDefaults); +end; + +destructor TCustomStyledButton.Destroy; +begin + FreeAndNil(FRender); + FreeAndNil(FPaintBuffer); + inherited Destroy; +end; + +function TCustomStyledButton.CalcImageRect(var ATextRect: TRect; const AImageWidth, + AImageHeight: Integer): TRect; +begin + Result := FRender.CalcImageRect(ATextRect, AImageWidth, AImageHeight); +end; + +function TCustomStyledButton.CanDropDownMenu: boolean; +begin + Result := FRender.CanDropDownMenu; +end; + +procedure TCustomStyledButton.DoDropDownMenu; +begin + FRender.DoDropDownMenu; +end; + +function TCustomStyledButton.GetText: TCaption; +begin + Result := FRender.GetText; +end; + +function TCustomStyledButton.GetKind: TBitBtnKind; +begin + Result := FRender.Kind; +end; + +function TCustomStyledButton.GetLayout: TButtonLayout; +begin + Result := FRender.Layout; +end; + +function TCustomStyledButton.ImageMarginsStored: Boolean; +begin + Result := not FRender.IsDefaultImageMargins; +end; + +function TCustomStyledButton.IsCaptionAlignmentStored: Boolean; +begin + Result := FRender.IsCaptionAlignmentStored; +end; + +function TCustomStyledButton.IsCaptionStored: Boolean; +begin + if (ActionLink = nil) then + Result := Caption <> '' + else + Result := not TGraphicButtonActionLink(ActionLink).IsCaptionLinked; +end; + +function TCustomStyledButton.IsCheckedStored: Boolean; +begin + if (ActionLink = nil) then + Result := FRender.Down + else + Result := not TGraphicButtonActionLink(ActionLink).IsCheckedLinked and + (FRender.Down); +end; + +function TCustomStyledButton.IsEnabledStored: Boolean; +begin + if (ActionLink = nil) then + Result := not Enabled + else + Result := not TGraphicButtonActionLink(ActionLink).IsEnabledLinked; +end; + +function TCustomStyledButton.IsImageIndexStored: Boolean; +begin + if (ActionLink = nil) then + Result := ImageIndex <> -1 + else + Result := not TGraphicButtonActionLink(ActionLink).IsImageIndexLinked; +end; + +function TCustomStyledButton.IsNotificationBadgeStored: Boolean; +begin + Result := FRender.IsNotificationBadgeStored; +end; + +function TCustomStyledButton.IsCustomDrawType: Boolean; +begin + Result := FRender.IsCustomDrawType; +end; + +function TCustomStyledButton.IsCustomRadius: Boolean; +begin + Result := FRender.IsCustomRadius; +end; + +function TCustomStyledButton.IsStoredStyleFamily: Boolean; +begin + Result := FRender.IsStoredStyleFamily; +end; + +function TCustomStyledButton.IsStoredStyleClass: Boolean; +begin + Result := FRender.IsStoredStyleClass; +end; + +function TCustomStyledButton.IsStoredStyleAppearance: Boolean; +begin + Result := FRender.IsStoredStyleAppearance; +end; + +function TCustomStyledButton.IsStoredStyleElements: Boolean; +begin + Result := FRender.IsStoredStyleElements; +end; + +function TCustomStyledButton.IsStyleDisabledStored: Boolean; +begin + Result := FRender.IsStyleDisabledStored; +end; + +function TCustomStyledButton.IsStylePressedStored: Boolean; +begin + Result := FRender.IsStylePressedStored; +end; + +function TCustomStyledButton.IsStyleSelectedStored: Boolean; +begin + Result := FRender.IsStyleSelectedStored; +end; + +function TCustomStyledButton.IsStyleHotStored: Boolean; +begin + Result := FRender.IsStyleHotStored; +end; + +function TCustomStyledButton.IsStyleNormalStored: Boolean; +begin + Result := FRender.IsStyleNormalStored; +end; + +function TCustomStyledButton.GetButtonState: TStyledButtonState; +begin + //Getting button state + if not Enabled then + Result := bsmDisabled + else if FRender.State = bsDown then + Result := bsmPressed + else if Focused then + Result := bsmSelected + else if FRender.MouseInControl then + Result := bsmHot + else + Result := bsmNormal; +end; + +function TCustomStyledButton.GetRenderClass: TStyledButtonRenderClass; +begin + Result := TStyledButtonRender; +end; + +function TCustomStyledButton.GetRescalingButton: Boolean; +begin + Result := Assigned(FRender) and FRender.RescalingButton; +end; + +procedure TCustomStyledButton.SetRescalingButton(const AValue: Boolean); +begin + if Assigned(FRender) then + FRender.RescalingButton := AValue; +end; + +function TCustomStyledButton.GetStyleDrawType: TStyledButtonDrawType; +begin + Result := FRender.StyleDrawType; +end; + +procedure TCustomStyledButton.SetStyleDrawType(const AValue: TStyledButtonDrawType); +begin + FRender.StyleDrawType := AValue; +end; + +function TCustomStyledButton.GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; +begin + Result := FRender.GetInternalImage(AImageList, AImageIndex); +end; + +function TCustomStyledButton.GetImageAlignment: TImageAlignment; +begin + Result := FRender.ImageAlignment; +end; + +procedure TCustomStyledButton.SetImageAlignment(const AValue: TImageAlignment); +begin + FRender.ImageAlignment := AValue; +end; + +function TCustomStyledButton.GetDefault: Boolean; +begin + Result := FRender.Default; +end; + +procedure TCustomStyledButton.SetDefault(const AValue: Boolean); +var + Form: TCustomForm; +begin + FRender.Default := AValue; + if HandleAllocated then + begin + Form := GetParentForm(Self); + if Form <> nil then + Form.Perform(CM_FOCUSCHANGED, 0, LPARAM(Form.ActiveControl)); + end; + if (csLoading in ComponentState) then + FRender.Active := FRender.Default; +end; + +function TCustomStyledButton.GetCancel: Boolean; +begin + Result := FRender.Cancel; +end; + +procedure TCustomStyledButton.SetCancel(const AValue: Boolean); +begin + FRender.Cancel := AValue; +end; + +function TCustomStyledButton.GetDisabledImageIndex: TImageIndex; +begin + Result := FRender.DisabledImageIndex; +end; + +procedure TCustomStyledButton.SetDisabledImageIndex(const AValue: TImageIndex); +begin + FRender.DisabledImageIndex := AValue; +end; + +procedure TCustomStyledButton.SetImageIndex(const AValue: TImageIndex); +begin + if AValue <> FImageIndex then + begin + FImageIndex := AValue; + FRender.ImageIndex := AValue; + end; +end; + +{$IFDEF D10_4+} +function TCustomStyledButton.GetDisabledImageName: TImageName; +begin + Result := FRender.DisabledImageName; +end; + +procedure TCustomStyledButton.SetDisabledImageName(const AValue: TImageName); +begin + FRender.DisabledImageName := AValue; +end; + +function TCustomStyledButton.IsImageNameStored: Boolean; +begin + Result := (ActionLink = nil) or + not TGraphicButtonActionLink(ActionLink).IsImageNameLinked; +end; + +function TCustomStyledButton.GetImageName: TImageName; +begin + Result := FRender.ImageName; +end; + +procedure TCustomStyledButton.SetImageName(const AValue: TImageName); +begin + if AValue <> FImageName then + begin + FImageName := AValue; + FRender.ImageName := AValue; + end; +end; + +function TCustomStyledButton.GetHotImageName: TImageName; +begin + Result := FRender.HotImageName; +end; + +procedure TCustomStyledButton.SetHotImageName(const AValue: TImageName); +begin + FRender.HotImageName := AValue; +end; + +function TCustomStyledButton.GetStylusHotImageName: TImageName; +begin + Result := FRender.StylusHotImageName; +end; + +procedure TCustomStyledButton.SetStylusHotImageName(const AValue: TImageName); +begin + FRender.StylusHotImageName := AValue; +end; + +function TCustomStyledButton.GetPressedImageName: TImageName; +begin + Result := FRender.PressedImageName; +end; + +procedure TCustomStyledButton.SetPressedImageName(const AValue: TImageName); +begin + FRender.PressedImageName := AValue; +end; + +function TCustomStyledButton.GetSelectedImageName: TImageName; +begin + Result := FRender.SelectedImageName; +end; + +procedure TCustomStyledButton.SetSelectedImageName(const AValue: TImageName); +begin + FRender.SelectedImageName := AValue; +end; +{$ENDIF} + +function TCustomStyledButton.GetActionLinkClass: TControlActionLinkClass; +begin + Result := TGraphicButtonActionLink; +end; + +function TCustomStyledButton.GetActiveStyleName: string; +begin + Result := FRender.ActiveStyleName; +end; + +function TCustomStyledButton.GetAllowAllUp: Boolean; +begin + Result := FRender.AllowAllUp; +end; + +function TCustomStyledButton.GetAsVCLComponent: Boolean; +begin + Result := FRender.AsVCLComponent; +end; + +function TCustomStyledButton.GetDisabledImages: TCustomImageList; +begin + Result := FRender.DisabledImages; +end; + +function TCustomStyledButton.GetDown: Boolean; +begin + Result := FRender.Down; +end; + +procedure TCustomStyledButton.SetDisabledImages(const AValue: TCustomImageList); +begin + FRender.DisabledImages := AValue; +end; + +procedure TCustomStyledButton.SetDown(const AValue: Boolean); +begin + FRender.Down := AValue; +end; + +function TCustomStyledButton.GetDropDownMenu: TPopupMenu; +begin + Result := FRender.DropDownMenu; +end; + +function TCustomStyledButton.GetElevationRequired: Boolean; +begin + Result := FRender.ElevationRequired; +end; + +function TCustomStyledButton.GetFlat: Boolean; +begin + Result := FRender.Flat; +end; + +function TCustomStyledButton.GetGlyph: TBitmap; +begin + Result := FRender.Glyph; +end; + +function TCustomStyledButton.GetGroupIndex: Integer; +begin + Result := FRender.GroupIndex; +end; + +procedure TCustomStyledButton.SetGlyph(const AValue: TBitmap); +begin + FRender.Glyph := AValue; +end; + +procedure TCustomStyledButton.SetGroupIndex(const AValue: Integer); +begin + FRender.GroupIndex := AValue; +end; + +procedure TCustomStyledButton.SetDropDownMenu(const AValue: TPopupMenu); +begin + FRender.DropDownMenu := AValue; +end; + +procedure TCustomStyledButton.SetElevationRequired(const AValue: Boolean); +begin + FRender.ElevationRequired := AValue; +end; + +procedure TCustomStyledButton.SetFlat(const AValue: Boolean); +begin + FRender.Flat := AValue; +end; + +function TCustomStyledButton.GetHotImageIndex: TImageIndex; +begin + Result := FRender.HotImageIndex; +end; + +procedure TCustomStyledButton.SetHotImageIndex(const AValue: TImageIndex); +begin + FRender.HotImageIndex := AValue; +end; + +function TCustomStyledButton.GetStylusHotImageIndex: TImageIndex; +begin + Result := FRender.StylusHotImageIndex; +end; + +procedure TCustomStyledButton.SetStylusHotImageIndex(const AValue: TImageIndex); +begin + FRender.StylusHotImageIndex := AValue; +end; + +function TCustomStyledButton.GetImages: TCustomImageList; +begin + Result := FRender.Images; +end; + +procedure TCustomStyledButton.SetImages(const AValue: TCustomImageList); +begin + FRender.Images := AValue; +end; + +procedure TCustomStyledButton.SetKind(const AValue: TBitBtnKind); +begin + FRender.Kind := AValue; +end; + +function TCustomStyledButton.GetMargin: Integer; +begin + Result := FRender.Margin; +end; + +procedure TCustomStyledButton.SetLayout(const AValue: TButtonLayout); +begin + FRender.Layout := AValue; +end; + +function TCustomStyledButton.GetModalResult: TModalResult; +begin + Result := FRender.ModalResult; +end; + +function TCustomStyledButton.GetMouseInControl: Boolean; +begin + Result := FRender.MouseInControl; +end; + +function TCustomStyledButton.GetNotificationBadge: TNotificationBadgeAttributes; +begin + Result := FRender.NotificationBadge; +end; + +function TCustomStyledButton.GetNumGlyphs: TNumGlyphs; +begin + Result := FRender.NumGlyphs; +end; + +procedure TCustomStyledButton.SetNumGlyphs(const AValue: TNumGlyphs); +begin + FRender.NumGlyphs := AValue; +end; + +procedure TCustomStyledButton.SetMargin(const AValue: Integer); +begin + FRender.Margin := AValue; +end; + +procedure TCustomStyledButton.SetModalResult(const AValue: TModalResult); +begin + FRender.ModalResult := AValue; +end; + +procedure TCustomStyledButton.SetName(const AValue: TComponentName); +var + LOldValue: string; +begin + LOldValue := Caption; + inherited; + if LOldValue <> Caption then + Invalidate; +end; + +procedure TCustomStyledButton.SetNotificationBadge( + const AValue: TNotificationBadgeAttributes); +begin + FRender.NotificationBadge := AValue; +end; + +function TCustomStyledButton.GetOnDropDownClick: TNotifyEvent; +begin + Result := FRender.OnDropDownClick; +end; + +procedure TCustomStyledButton.SetOnDropDownClick(const AValue: TNotifyEvent); +begin + FRender.OnDropDownClick := AValue; +end; + +function TCustomStyledButton.GetPressedImageIndex: TImageIndex; +begin + Result := FRender.PressedImageIndex; +end; + +procedure TCustomStyledButton.SetPressedImageIndex(const AValue: TImageIndex); +begin + FRender.PressedImageIndex := AValue; +end; + +function TCustomStyledButton.GetButtonStyleNormal: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleNormal; +end; + +procedure TCustomStyledButton.SetButtonStyleNormal(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleNormal := AValue; +end; + +procedure TCustomStyledButton.SetButtonStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + FRender.SetButtonStyle(AStyleFamily, AStyleClass, AStyleAppearance); +end; + +procedure TCustomStyledButton.SetAllowAllUp(const AValue: Boolean); +begin + FRender.AllowAllUp := AValue; +end; + +procedure TCustomStyledButton.SetAsVCLComponent(const AValue: Boolean); +begin + FRender.AsVCLComponent := AValue; +end; + +procedure TCustomStyledButton.SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AModalResult: TModalResult); +begin + FRender.SetButtonStyle(AStyleFamily, AModalResult); +end; + +function TCustomStyledButton.GetButtonStyleDisabled: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleDisabled; +end; + +procedure TCustomStyledButton.SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleDisabled := AValue; +end; + +function TCustomStyledButton.GetButtonStylePressed: TStyledButtonAttributes; +begin + Result := FRender.ButtonStylePressed; +end; + +procedure TCustomStyledButton.SetButtonStylePressed(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStylePressed := AValue; +end; + +function TCustomStyledButton.GetButtonStyleSelected: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleSelected; +end; + +procedure TCustomStyledButton.SetButtonStyleSelected(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleSelected := AValue; +end; + +function TCustomStyledButton.GetButtonStyleHot: TStyledButtonAttributes; +begin + Result := FRender.ButtonStyleHot; +end; + +procedure TCustomStyledButton.SetButtonStyleHot(const AValue: TStyledButtonAttributes); +begin + FRender.ButtonStyleHot := AValue; +end; + +function TCustomStyledButton.GetImageMargins: TImageMargins; +begin + Result := FRender.ImageMargins; +end; + +procedure TCustomStyledButton.SetImageMargins(const AValue: TImageMargins); +begin + FRender.ImageMargins := AValue; +end; + +function TCustomStyledButton.GetStyleRadius: Integer; +begin + Result := FRender.StyleRadius; +end; + +function TCustomStyledButton.GetStyleRoundedCorners: TRoundedCorners; +begin + Result := FRender.StyleRoundedCorners; +end; + +procedure TCustomStyledButton.SetStyleRadius(const AValue: Integer); +begin + FRender.StyleRadius := AValue; +end; + +procedure TCustomStyledButton.SetStyleRoundedCorners( + const AValue: TRoundedCorners); +begin + FRender.StyleRoundedCorners := AValue; +end; + +function TCustomStyledButton.GetSelectedImageIndex: TImageIndex; +begin + Result := FRender.SelectedImageIndex; +end; + +function TCustomStyledButton.GetShowCaption: Boolean; +begin + Result := FRender.ShowCaption; +end; + +function TCustomStyledButton.GetSpacing: Integer; +begin + Result := FRender.Spacing; +end; + +function TCustomStyledButton.GetSplitButtonWidth: Integer; +begin + Result := FRender.GetSplitButtonWidth; +end; + +procedure TCustomStyledButton.SetSelectedImageIndex(const AValue: TImageIndex); +begin + FRender.SelectedImageIndex := AValue; +end; + +procedure TCustomStyledButton.SetShowCaption(const AValue: Boolean); +begin + FRender.ShowCaption := AValue; +end; + +procedure TCustomStyledButton.SetSpacing(const AValue: Integer); +begin + FRender.Spacing := AValue; +end; + +function TCustomStyledButton.GetStyle: TCustomButton.TButtonStyle; +begin + Result := FRender.Style; +end; + +procedure TCustomStyledButton.SetStyle(const AValue: TCustomButton.TButtonStyle); +begin + FRender.Style := AValue; +end; + +function TCustomStyledButton.GetStyleAppearance: TStyledButtonAppearance; +begin + Result := FRender.StyleAppearance; +end; + +procedure TCustomStyledButton.SetStyleAppearance(const AValue: TStyledButtonAppearance); +begin + FRender.StyleAppearance := AValue; +end; + +function TCustomStyledButton.GetStyleApplied: Boolean; +begin + Result := FRender.StyleApplied; +end; + +procedure TCustomStyledButton.SetStyleApplied(const AValue: Boolean); +begin + FRender.StyleApplied := AValue; +end; + +function TCustomStyledButton.GetStyleClass: TStyledButtonClass; +begin + Result := FRender.StyleClass; +end; + +procedure TCustomStyledButton.SetStyleClass(const AValue: TStyledButtonClass); +begin + FRender.StyleClass := AValue; +end; + +function TCustomStyledButton.GetStyleFamily: TStyledButtonFamily; +begin + Result := FRender.StyleFamily; +end; + +procedure TCustomStyledButton.SetStyleFamily(const AValue: TStyledButtonFamily); +begin + FRender.StyleFamily := AValue; +end; + +{$IFDEF D10_4+} +procedure TCustomStyledButton.SetStyleName(const AValue: string); +begin + if (AValue <> '') and (StyleFamily <> DEFAULT_CLASSIC_FAMILY) then + StyleFamily := DEFAULT_CLASSIC_FAMILY; + inherited; + if (AValue <> '') then + StyleClass := AValue; +end; +{$ENDIF} + +procedure TCustomStyledButton.SetText(const AValue: TCaption); +begin + FRender.Caption := AValue; +end; + +function TCustomStyledButton.GetWordWrap: Boolean; +begin + Result := FRender.WordWrap; +end; + +function TCustomStyledButton.HasCustomGlyph: Boolean; +var + Link: TGraphicButtonActionLink; +begin + Link := TGraphicButtonActionLink(ActionLink); + Result := not ((Link <> nil) and Link.IsImageIndexLinked and + Link.IsGlyphLinked(ImageIndex)); +end; + +procedure TCustomStyledButton.SetWordWrap(const AValue: Boolean); +begin + FRender.WordWrap := AValue; +end; + +procedure TCustomStyledButton.ShowDropDownMenu; +begin + FRender.ShowDropDownMenu; +end; + +procedure TCustomStyledButton.Loaded; +begin + inherited; + FRender.Loaded; +end; + +procedure TCustomStyledButton.MouseDown(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + FRender.MouseDown(Button, Shift, X, Y); + if Enabled then + inherited; +end; + +procedure TCustomStyledButton.MouseMove(Shift: TShiftState; X, Y: Integer); +begin + inherited; + FRender.MouseMove(Shift, X, Y); +end; + +procedure TCustomStyledButton.MouseUp(Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +begin + if Enabled then + begin + FRender.MouseUp(Button, Shift, X, Y); + inherited; + end; +end; + +procedure TCustomStyledButton.ControlClick(Sender: TObject); +begin + inherited Click; +end; + +procedure TCustomStyledButton.ControlFont(var AValue: TFont); +begin + AValue := Self.Font; +end; + +procedure TCustomStyledButton.SetParentFont(const AValue: Boolean); +begin + Self.ParentFont := AValue; +end; + +function TCustomStyledButton.GetParentFont: Boolean; +begin + Result := Self.ParentFont; +end; + +function TCustomStyledButton.GetCaption: TCaption; +begin + Result := inherited Caption; +end; + +function TCustomStyledButton.GetCaptionToDraw: TCaption; +begin + Result := inherited Caption; +end; + +function TCustomStyledButton.GetCaptionAlignment: TAlignment; +begin + Result := FRender.CaptionAlignment; +end; + +function TCustomStyledButton.GetCommandLinkHint: string; +begin + Result := FRender.CommandLinkHint; +end; + +function TCustomStyledButton.GetCursor: TCursor; +begin + Result := inherited Cursor; +end; + +procedure TCustomStyledButton.SetCaption(const AValue: TCaption); +begin + inherited Caption := AValue; +end; + +procedure TCustomStyledButton.SetCaptionAlignment(const AValue: TAlignment); +begin + FRender.CaptionAlignment := AValue; +end; + +procedure TCustomStyledButton.SetCommandLinkHint(const AValue: string); +begin + FRender.CommandLinkHint := AValue; +end; + +procedure TCustomStyledButton.SetCursor(const AValue: TCursor); +begin + if AValue <> Cursor then + begin + inherited Cursor := AValue; + end; +end; + +procedure TCustomStyledButton.Notification(AComponent: TComponent; AOperation: TOperation); +begin + inherited Notification(AComponent, AOperation); + if AOperation = opRemove then + begin + if Assigned(FRender) then + begin + if AComponent = DropDownMenu then + DropDownMenu := nil; + if AComponent = Images then + Images := nil; + if AComponent = DisabledImages then + DisabledImages := nil; + end; + end; +end; + +class procedure TCustomStyledButton.RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; const AAppearance: TStyledButtonAppearance; + const AStyleRadius: Integer; const ACursor: TCursor); +begin + _DefaultStyleDrawType := ADrawType; + _UseCustomDrawType := True; + _DefaultFamily := AFamily; + _DefaultClass := AClass; + _DefaultAppearance := AAppearance; + _DefaultStyleRadius := AStyleRadius; + _DefaultCursor := ACursor; +end; + +procedure TCustomStyledButton.ReleasePaintBuffer; +begin + if FPaintBufferUsers = 0 then + FreeAndNil(FPaintBuffer); +end; + +function TCustomStyledButton.GetTag: Integer; +begin + Result := FRender.Tag; +end; + +procedure TCustomStyledButton.SetTag(const AValue: Integer); +begin + FRender.Tag := AValue; +end; + +procedure TCustomStyledButton.Click; +begin + FRender.Click(False); +end; + +procedure TCustomStyledButton.CMDialogChar(var Message: TCMDialogChar); +begin + with Message do + if IsAccel(CharCode, Caption) and CanFocus then + begin + Click; + Result := 1; + end else + inherited; +end; + +procedure TCustomStyledButton.CMDialogKey(var Message: TCMDialogKey); +begin + with Message do + if (((CharCode = VK_RETURN) and FRender.Active) or + ((CharCode = VK_ESCAPE) and Cancel)) and + (KeyDataToShiftState(Message.KeyData) = []) and CanFocus then + begin + Click; + Result := 1; + end + else + inherited; +end; + +procedure TCustomStyledButton.WMEraseBkGnd(var Message: TWmEraseBkgnd); +begin + inherited; + { Erase background if we're not doublebuffering or painting to memory. } + if not FDoubleBuffered or + (TMessage(Message).wParam = WPARAM(TMessage(Message).lParam)) then + begin + Brush.Color := FRender.GetBackGroundColor; + Brush.Style := bsSolid; + FillRect(Message.DC, ClientRect, Brush.Handle); + end; + Message.Result := 1; +end; + +procedure TCustomStyledButton.CNKeyDown(var Message: TWMKeyDown); +begin + with Message do + begin + Result := 1; + if not (csDesigning in ComponentState) then + begin + if (CharCode = VK_DOWN) and (CanDropDownMenu) then + DoDropDownMenu + else + inherited; + end; + Result := 0; + end; +end; + +procedure TCustomStyledButton.WMKeyDown(var Message: TMessage); +begin + inherited; + FRender.WMKeyDown(Message); +end; + +procedure TCustomStyledButton.WMKeyUp(var Message: TMessage); +begin + inherited; + FRender.WMKeyUp(Message); +end; + +procedure TCustomStyledButton.CMFocusChanged(var Message: TCMFocusChanged); +begin + with Message do + if Sender is TCustomStyledButton then + FRender.Active := Sender = Self + else + FRender.Active := Default; + inherited; +end; + +procedure TCustomStyledButton.WMSetFocus(var Message: TMessage); +begin + inherited; + Invalidate; +end; + +procedure TCustomStyledButton.WMKillFocus(var Message: TMessage); +begin + Invalidate; + inherited; +end; + +procedure TCustomStyledButton.WMPaint(var Message: TMessage); +var + DC: HDC; + LCanvas: TCanvas; + PS: TPaintStruct; +begin + //if FOverridePaint then + begin + DC := HDC(Message.WParam); + LCanvas := TCanvas.Create; + try + if DC <> 0 then + LCanvas.Handle := DC + else + LCanvas.Handle := BeginPaint(Self.Handle, PS); + if FDoubleBuffered and (DC = 0) then + begin + if FPaintBuffer = nil then + FPaintBuffer := TBitmap.Create; + Inc(FPaintBufferUsers); + try + FPaintBuffer.SetSize(Self.Width, Self.Height); + FRender.EraseBackground(FPaintBuffer.Canvas); + FRender.DrawButton(FPaintBuffer.Canvas, MouseInControl); + // paint other controls + PaintControls(FPaintBuffer.Canvas.Handle, nil); + LCanvas.Draw(0, 0, FPaintBuffer); + finally + Dec(FPaintBufferUsers); + ReleasePaintBuffer; + end; + end + else + begin + if not DoubleBuffered and (FPaintBuffer <> nil) then + ReleasePaintBuffer; + FRender.EraseBackground(LCanvas); + FRender.DrawButton(LCanvas, MouseInControl); + // paint other controls + PaintControls(LCanvas.Handle, nil); + end; + if DC = 0 then + EndPaint(Self.Handle, PS); + finally + LCanvas.Handle := 0; + LCanvas.Free; + end; + end; + Message.Result := 1; +end; + +{ TStyledBitBtn } + +constructor TStyledBitBtn.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FRender.FUseButtonLayout := True; +end; + +function TStyledBitBtn.IsCaptionStored: Boolean; +begin + Result := AnsiCompareStr(Caption, FRender.BitBtnCaptions(FRender.Kind)) <> 0; +end; + +initialization + TCustomStyledGraphicButton._DefaultStyleDrawType := DEFAULT_STYLEDRAWTYPE; + TCustomStyledGraphicButton._DefaultFamily := DEFAULT_CLASSIC_FAMILY; + TCustomStyledGraphicButton._DefaultClass := DEFAULT_WINDOWS_CLASS; + TCustomStyledGraphicButton._DefaultAppearance := DEFAULT_APPEARANCE; + TCustomStyledGraphicButton._DefaultStyleRadius := DEFAULT_RADIUS; + TCustomStyledGraphicButton._DefaultCursor := DEFAULT_CURSOR; + + TCustomStyledButton._DefaultStyleDrawType := DEFAULT_STYLEDRAWTYPE; + TCustomStyledButton._DefaultFamily := DEFAULT_CLASSIC_FAMILY; + TCustomStyledButton._DefaultClass := DEFAULT_WINDOWS_CLASS; + TCustomStyledButton._DefaultAppearance := DEFAULT_APPEARANCE; + TCustomStyledButton._DefaultStyleRadius := DEFAULT_RADIUS; + TCustomStyledButton._DefaultCursor := DEFAULT_CURSOR; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledButtonGroup.pas b/Ext/StyledComponents/source/Vcl.StyledButtonGroup.pas new file mode 100644 index 0000000..c11ebca --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledButtonGroup.pas @@ -0,0 +1,1491 @@ +{******************************************************************************} +{ } +{ StyledButtonGroup: a Styled ButtonGroup with TStyledGrpButtonItem } +{ Based on TButtonGroup and TStyledButton } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledButtonGroup; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.ImgList + , System.UITypes + , System.SysUtils + , System.Classes + , System.Math + , Vcl.ToolWin + , Vcl.ComCtrls + , Vcl.StdCtrls + , Vcl.ExtCtrls + , Vcl.Themes + , Vcl.Controls + , Vcl.ActnList + , Vcl.Menus + , Vcl.CategoryButtons + , Winapi.Messages + , Winapi.Windows + , Vcl.StyledButton + , Vcl.ButtonStylesAttributes + , Vcl.StandardButtonStyles + , Vcl.ButtonGroup + , Vcl.Graphics + ; + +resourcestring + ERROR_SETTING_BUTTONGROUP_STYLE = 'Error setting ButtonGroup Style: %s/%s/%s not available'; + +type + EStyledButtonGroupError = Exception; + + TStyledButtonGroup = class; + TStyledButtonGroupClass = class of TStyledButtonGroup; + TStyledGrpButtonItem = class; + TStyledGrpButtonItemClass = class of TGrpButtonItem; + TStyledGrpButtonItems = class; + TStyledGrpButtonItemsClass = class of TGrpButtonItems; + + TGrpButtonProc = reference to procedure (Button: TStyledGrpButtonItem); + + { TStyledGrpButtonItems } + TStyledGrpButtonItems = class(TGrpButtonItems) + private + function GetStyledButtonGroup: TStyledButtonGroup; + public + constructor Create(const ButtonGroup: TButtonGroup); override; + function Add: TStyledGrpButtonItem; + property ButtonGroup: TStyledButtonGroup read GetStyledButtonGroup; + end; + + { TStyledGrpButtonItem } + TStyledGrpButtonItem = class(TGrpButtonItem) + private + //Styled Attributes + FStyleRadius: Integer; + FStyleRoundedCorners: TRoundedCorners; + FStyleDrawType: TStyledButtonDrawType; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + FStyleApplied: Boolean; + procedure InvalidateOwner; + function IsCustomDrawType: Boolean; + function IsCustomRoundedCorners: Boolean; + function IsCustomRadius: Boolean; + function IsStoredStyle: Boolean; + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetStyleRadius(const AValue: Integer); + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + function GetStyledButtonGroup: TStyledButtonGroup; + function ApplyButtonStyle: Boolean; + procedure LoadDefaultStyles; + public + constructor Create(Collection: TCollection); override; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); + published + property ButtonGroup: TStyledButtonGroup read GetStyledButtonGroup; + + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius stored IsCustomRadius; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleRoundedCorners: TRoundedCorners read FStyleRoundedCorners write SetStyleRoundedCorners stored IsCustomRoundedCorners; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily stored IsStoredStyle; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass stored IsStoredStyle; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance stored IsStoredStyle; + end; + + { TStyledButtonGroup } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledButtonGroup = class(TButtonGroup) + private + //StyledButton Attributes + FButtonStyleNormal: TStyledButtonAttributes; + FButtonStylePressed: TStyledButtonAttributes; + FButtonStyleSelected: TStyledButtonAttributes; + FButtonStyleHot: TStyledButtonAttributes; + FButtonStyleDisabled: TStyledButtonAttributes; + + //Styled Attributes + FStyleRadius: Integer; + FStyleDrawType: TStyledButtonDrawType; + FStyleRoundedCorners: TRoundedCorners; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + FCustomDrawType: Boolean; + FStyleApplied: Boolean; + + FCaptionAlignment: TAlignment; + FImageAlignment: TImageAlignment; + FImageMargins: TImageMargins; + FSpacing: Integer; + FFlat: Boolean; + FButtonsCursor: TCursor; + FCursor: TCursor; + + class var + _DefaultStyleDrawType: TStyledButtonDrawType; + _UseCustomDrawType: Boolean; + _DefaultFamily: TStyledButtonFamily; + _DefaultClass: TStyledButtonClass; + _DefaultAppearance: TStyledButtonAppearance; + _DefaultStyleRadius: Integer; + _DefaultButtonsCursor: TCursor; + + procedure ImageMarginsChange(Sender: TObject); + function IsCustomDrawType: Boolean; + function IsCustomRoundedCorners: Boolean; + function IsCustomRadius: Boolean; + function ImageMarginsStored: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleClass: Boolean; + function IsStoredStyleFamily: Boolean; + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleRadius(const AValue: Integer); + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + function ApplyButtonGroupStyle: Boolean; + procedure SetStyleApplied(const AValue: Boolean); + function ApplyButtonStyle: Boolean; + function GetActiveStyleName: string; + function AsVCLStyle: Boolean; + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + procedure ProcessButtons(AButtonProc: TGrpButtonProc); + procedure SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleHot(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleNormal(const AValue: TStyledButtonAttributes); + procedure SetButtonStylePressed(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleSelected(const AValue: TStyledButtonAttributes); + procedure GetDrawingStyle(const ACanvas: TCanvas; + const AButtonState: TStyledButtonState; + const AItem: TStyledGrpButtonItem); + function GetAttributes(const AMode: TStyledButtonState): TStyledButtonAttributes; + procedure DrawBackgroundAndBorder(const ACanvas: TCanvas; + const ADrawRect, ADropDownRect: TRect; + const AStyleDrawType: TStyledButtonDrawType; + const ARadius: Single; const ARoundedCorners: TRoundedCorners); + procedure DrawCaptionAndImage(const ACanvas: TCanvas; const ASurfaceRect: TRect; + const ACaption: TCaption; const AImageIndex: Integer); + procedure SetCaptionAlignment(const AValue: TAlignment); + function GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList): boolean; + procedure DrawText(const ASurfaceRect: TRect; + const ACanvas: TCanvas; const AText: string; + const AAlignment: TAlignment; const ASpacing: Integer; var ARect: TRect; + AFlags: Cardinal); + procedure SetSpacing(const AValue: Integer); + procedure SetFlat(const AValue: Boolean); + function IsStyleEnabled: Boolean; + function IndexOfButtonAt(const X, Y: Integer): Integer; + procedure SetCursor(const AValue: TCursor); + procedure SetImageAlignment(const AValue: TImageAlignment); + function GetScaleFactor: Single; + function GetGrpButtonItems: TStyledGrpButtonItems; + procedure SetGrpButtonItems(const AValue: TStyledGrpButtonItems); + procedure SetImageMargins(const AValue: TImageMargins); + function IsDefaultImageMargins: Boolean; + procedure CalcDefaultImageMargins(const AValue: TImageAlignment); + {$IFNDEF D10_4+} + function IsCustomStyleActive: Boolean; + {$ENDIF} + //Windows messages + procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; + protected + procedure Loaded; override; + function GetButtonClass: TGrpButtonItemClass; override; + function GetButtonsClass: TGrpButtonItemsClass; override; + procedure UpdateStyleElements; override; + procedure DrawButton(AIndex: Integer; ACanvas: TCanvas; + ARect: TRect; AState: TButtonDrawState); override; + procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override; + public + procedure Assign(Source: TPersistent); override; + function StyledButtonState(const AIndex: Integer; + const AState: TButtonDrawState): TStyledButtonState; + class procedure RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; + const AFamily: TStyledButtonFamily = DEFAULT_CLASSIC_FAMILY; + const AClass: TStyledButtonClass = DEFAULT_WINDOWS_CLASS; + const AAppearance: TStyledButtonAppearance = DEFAULT_APPEARANCE; + const AStyleRadius: Integer = DEFAULT_RADIUS; + const AButtonsCursor: TCursor = DEFAULT_CURSOR); virtual; + procedure SetButtonGroupStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + //Styled constructor + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent stored False; + property StyleApplied: Boolean read FStyleApplied write SetStyleApplied; + published + property ButtonsCursor: TCursor read FButtonsCursor write FButtonsCursor default DEFAULT_CURSOR; + property Cursor: TCursor read FCursor write SetCursor default crDefault; + property CaptionAlignment: TAlignment read FCaptionAlignment write SetCaptionAlignment default taLeftJustify; + property Items: TStyledGrpButtonItems read GetGrpButtonItems write SetGrpButtonItems; + property ImageAlignment: TImageAlignment read FImageAlignment write SetImageAlignment default iaLeft; + property ImageMargins: TImageMargins read FImageMargins write SetImageMargins stored ImageMarginsStored; + property Flat: Boolean read FFlat write SetFlat default False; + property Spacing: Integer read FSpacing write SetSpacing default 4; + + //StyledButton Attributes + property ButtonStyleNormal: TStyledButtonAttributes read FButtonStyleNormal write SetButtonStyleNormal; + property ButtonStylePressed: TStyledButtonAttributes read FButtonStylePressed write SetButtonStylePressed; + property ButtonStyleSelected: TStyledButtonAttributes read FButtonStyleSelected write SetButtonStyleSelected; + property ButtonStyleHot: TStyledButtonAttributes read FButtonStyleHot write SetButtonStyleHot; + property ButtonStyleDisabled: TStyledButtonAttributes read FButtonStyleDisabled write SetButtonStyleDisabled; + + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius stored IsCustomRadius; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleRoundedCorners: TRoundedCorners read FStyleRoundedCorners write SetStyleRoundedCorners stored IsCustomRoundedCorners; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily stored IsStoredStyleFamily; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass stored IsStoredStyleClass; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance stored IsStoredStyleAppearance; + end; + +implementation + +uses + Vcl.Consts + , Vcl.Forms + , System.Types + , System.RTLConsts + ; + +const + DEFAULT_IMAGE_HMARGIN = 2; + DEFAULT_IMAGE_VMARGIN = 2; + +{ TStyledButtonGroup } + +constructor TStyledButtonGroup.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + Assert(Assigned(AOwner)); + inherited Create(AOwner); + + //new properties for StyledButtonGroup + FCaptionAlignment := taLeftJustify; + FSpacing := 4; + FFlat := False; + FImageAlignment := iaLeft; + FButtonsCursor := _DefaultButtonsCursor; + FImageMargins := TImageMargins.Create; + FImageMargins.Left := 2; + FImageMargins.OnChange := ImageMarginsChange; + + FButtonStyleNormal := TStyledButtonAttributes.Create(Self); + FButtonStyleNormal.Name := 'Normal'; + FButtonStylePressed := TStyledButtonAttributes.Create(Self); + FButtonStylePressed.Name := 'Pressed'; + FButtonStyleSelected := TStyledButtonAttributes.Create(Self); + FButtonStyleSelected.Name := 'Selected'; + FButtonStyleHot := TStyledButtonAttributes.Create(Self); + FButtonStyleHot.Name := 'Hot'; + FButtonStyleDisabled := TStyledButtonAttributes.Create(Self); + FButtonStyleDisabled.Name := 'Disabled'; + + FStyleDrawType := _DefaultStyleDrawType; + FStyleRadius := _DefaultStyleRadius; + FStyleRoundedCorners := ALL_ROUNDED_CORNERS; + FStyleFamily := AFamily; + FStyleClass := AClass; + FStyleAppearance := AAppearance; +end; + +procedure TStyledButtonGroup.CMStyleChanged(var Message: TMessage); +begin + inherited; + ApplyButtonStyle; +end; + +constructor TStyledButtonGroup.Create(AOwner: TComponent); +begin + CreateStyled(AOwner, + _DefaultFamily, + _DefaultClass, + _DefaultAppearance); +end; + +destructor TStyledButtonGroup.Destroy; +begin + FreeAndNil(FImageMargins); + FreeAndNil(FButtonStyleNormal); + FreeAndNil(FButtonStylePressed); + FreeAndNil(FButtonStyleSelected); + FreeAndNil(FButtonStyleHot); + FreeAndNil(FButtonStyleDisabled); + inherited Destroy; +end; + +function TStyledButtonGroup.GetScaleFactor: Single; +begin + Result := {$IFDEF D10_3+}ScaleFactor{$ELSE}1{$ENDIF}; +end; + +procedure TStyledButtonGroup.DrawBackgroundAndBorder( + const ACanvas: TCanvas; const ADrawRect, ADropDownRect: TRect; + const AStyleDrawType: TStyledButtonDrawType; + const ARadius: Single; const ARoundedCorners: TRoundedCorners); +var + LButtonOffset: Integer; + LDropDownRect: TRect; + LScaleFactor: Single; +begin + LScaleFactor := GetScaleFactor; + LDropDownRect := ADropDownRect; + //Draw Button Shape + CanvasDrawshape(ACanvas, ADrawRect, AStyleDrawType, + ARadius*LScaleFactor, ARoundedCorners); + + //Draw Bar and Triangle + if LDropDownRect.Width > 0 then + begin + if not (AStyleDrawType in [btRounded, btEllipse]) then + begin + CanvasDrawBar(ACanvas, LDropDownRect, + LScaleFactor, + ACanvas.Pen.Color); + CanvasDrawTriangle(ACanvas, LDropDownRect, + LScaleFactor, + ACanvas.Font.Color); + end + else + begin + LButtonOffset := LDropDownRect.Height div 8; + LDropDownRect.Left := LDropDownRect.Left - LButtonOffset; + LDropDownRect.Right := LDropDownRect.Right - LButtonOffset; + CanvasDrawTriangle(ACanvas, LDropDownRect, + LScaleFactor, + ACanvas.Font.Color); + end; + end; +end; + +function TStyledButtonGroup.GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList): boolean; +begin + AWidth := 0; + AHeight := 0; + //Return True if using ImageList + if Assigned(Images) then + begin + AWidth := Images.Width; + AHeight := Images.Height; + Result := True; + end + else + Result := False; +end; + +procedure TStyledButtonGroup.DrawText( + const ASurfaceRect: TRect; + const ACanvas: TCanvas; + const AText: string; const AAlignment: TAlignment; + const ASpacing: Integer; + var ARect: TRect; AFlags: Cardinal); +var + R: TRect; + LText: string; +begin + //Drawing Caption + R := ARect; + LText := AText; + Winapi.Windows.DrawText(ACanvas.Handle, PChar(AText), Length(AText), + R, AFlags or DT_CALCRECT); + case AAlignment of + taLeftJustify: + begin + OffsetRect(R, ASpacing, (ARect.Height - R.Height) div 2); + end; + taRightJustify: + begin + OffsetRect(R, ARect.Width - R.Width - ASpacing, (ARect.Height - R.Height) div 2); + end; + else + begin + OffsetRect(R, (ARect.Width - R.Width) div 2, (ARect.Height - R.Height) div 2); + end; + end; + if ASurfaceRect.Right < R.Right + ASpacing then + R.Right := ASurfaceRect.Right - ASpacing; + if ASurfaceRect.Left > R.Left - ASpacing then + R.Left := ASurfaceRect.Left + ASpacing; + ACanvas.TextRect(R, LText, [tfEndEllipsis]); +end; + +procedure TStyledButtonGroup.DrawCaptionAndImage( + const ACanvas: TCanvas; const ASurfaceRect: TRect; + const ACaption: TCaption; const AImageIndex: Integer); +var + LTextFlags: Cardinal; + LImageRect, LTextRect: TRect; + LImageList: TCustomImageList; + LImageWidth, LImageHeight: Integer; + LUseImageList: Boolean; +begin + if gboShowCaptions in ButtonOptions then + begin + case FCaptionAlignment of + taLeftJustify: LTextFlags := DT_NOCLIP or DT_LEFT or DT_VCENTER; + taRightJustify: LTextFlags := DT_NOCLIP or DT_RIGHT or DT_VCENTER; + else + LTextFlags := DT_NOCLIP or DT_CENTER or DT_VCENTER; + end; + LTextFlags := DrawTextBiDiModeFlags(LTextFlags); + (* + if FWordWrap then + LTextFlags := LTextFlags or DT_WORDBREAK; + *) + end + else + begin + LTextFlags := DT_NOCLIP or DT_CENTER or DT_VCENTER; + end; + LUseImageList := GetImageSize(LImageWidth, LImageHeight, LImageList); + + //Calculate LTextRect and LImageRect using ImageMargins and ImageAlignment + CalcImageAndTextRect(ASurfaceRect, ACaption, LTextRect, LImageRect, + LImageWidth, LImageHeight, FImageAlignment, FImageMargins, GetScaleFactor); + + if LUseImageList and not Assigned(OnDrawIcon) then + begin + //Uses an ImageList to draw the Icon + Images.Draw(ACanvas, LImageRect.Left, LImageRect.Top, + AImageIndex, Enabled); + end; + + if gboShowCaptions in ButtonOptions then + DrawText(ASurfaceRect, ACanvas, ACaption, FCaptionAlignment, FSpacing, + LTextRect, LTextFlags); +end; + +function TStyledButtonGroup.IndexOfButtonAt(const X, Y: Integer): Integer; +var + I: Integer; + LRect: TRect; + LPoint: TPoint; +begin + Result := -1; + LPoint := TPoint.Create(X,Y); + for I := 0 to Items.Count-1 do + begin + LRect := GetButtonRect(I); + if LRect.Contains(LPoint) then + begin + Result := I; + break; + end; + end; +end; + +{$IFNDEF D10_4+} +function TStyledButtonGroup.IsCustomStyleActive: Boolean; +begin + Result := False; +end; +{$ENDIF} + +function TStyledButtonGroup.StyledButtonState(const AIndex: Integer; + const AState: TButtonDrawState): TStyledButtonState; +var + LButtonItem: TStyledGrpButtonItem; +begin + LButtonItem := Items[AIndex] as TStyledGrpButtonItem; + Assert(Assigned(LButtonItem)); + //Calculate Styled State based on State + if (bdsHot in AState) and not (bdsDown in AState) then + Result := bsmHot + else if bdsDown in AState then + Result := bsmPressed + else if bdsFocused in AState then + Result := bsmSelected + else if not Enabled then + Result := bsmDisabled + else + Result := bsmNormal; +end; + +procedure TStyledButtonGroup.DrawButton(AIndex: Integer; ACanvas: TCanvas; + ARect: TRect; AState: TButtonDrawState); +var + LSurfaceRect: TRect; + LOldFontName: TFontName; + LOldFontColor: TColor; + LOldFontStyle: TFontStyles; + LOldParentFont: boolean; + LOldBrushStyle: TBrushStyle; + LOldPenWidth: Integer; + LStyle: TCustomStyleServices; + LState: TStyledButtonState; + LDetails: TThemedElementDetails; + LButtonItem: TStyledGrpButtonItem; + LDropDownRect: TRect; + LColor: TColor; +begin + //Do not call inherited + LButtonItem := Items[AIndex] as TStyledGrpButtonItem; + Assert(Assigned(LButtonItem)); + + if Assigned(OnDrawButton) and (not (csDesigning in ComponentState)) then + OnDrawButton(Self, AIndex, Canvas, ARect, AState) + else + begin + if Assigned(OnBeforeDrawButton) then + OnBeforeDrawButton(Self, AIndex, ACanvas, ARect, AState); + + LState := StyledButtonState(AIndex, AState); + + LOldParentFont := ParentFont; + LOldFontName := ACanvas.Font.Name; + LOldFontColor := ACanvas.Font.Color; + LOldFontStyle := ACanvas.Font.Style; + LOldBrushStyle := ACanvas.Brush.Style; + LOldPenWidth := ACanvas.Pen.Width; + try + GetDrawingStyle(ACanvas, LState, LButtonItem); + + //At the moment, no DropDown for Buttons + LDropDownRect := TRect.Create(0,0,0,0); + + if FFlat then + begin + LStyle := StyleServices{$IFDEF D10_4+}(Self){$ENDIF}; + if (LState in [bsmDisabled, bsmNormal]) and IsStyleEnabled then + begin + if (bdsSelected in AState) or (bdsDown in AState) then + LDetails := LStyle.GetElementDetails(tcbButtonSelected) + else if bdsHot in AState then + LDetails := LStyle.GetElementDetails(tcbButtonHot) + else + LDetails := LStyle.GetElementDetails(tcbButtonNormal); + + if not (IsCustomStyleActive and not (seFont in StyleElements)) and + LStyle.GetElementColor(LDetails, ecTextColor, LColor) and (LColor <> clNone) then + ACanvas.Font.Color := LColor; + end; + + //Don't draw button Face for Flat Normal/disabled Button + if LState in [bsmDisabled, bsmNormal] then + ACanvas.Brush.Style := bsClear; + end; + + DrawBackgroundAndBorder(ACanvas, ARect, LDropDownRect, + LButtonItem.StyleDrawType, LButtonItem.StyleRadius, LButtonItem.StyleRoundedCorners); + + LSurfaceRect := ARect; + if LDropDownRect.Width <> 0 then + Dec(LSurfaceRect.Right, LDropDownRect.Width); + + DrawCaptionAndImage(ACanvas, LSurfaceRect, LButtonItem.Caption, + LButtonItem.ImageIndex); + + { Draw the icon - prefer the event } + if Assigned(OnDrawIcon) then + OnDrawIcon(Self, AIndex, ACanvas, LSurfaceRect, AState, FSpacing); + + LSurfaceRect := ClientRect; + //DrawNotificationBadge(ACanvas, LSurfaceRect); + (* + { Show insert indications } + if [bdsInsertLeft, bdsInsertTop, bdsInsertRight, bdsInsertBottom] * State <> [] then + begin + ACanvas.Brush.Color := GetShadowColor(EdgeColor); + InsertIndication := Rect; + if bdsInsertLeft in State then + begin + Dec(InsertIndication.Left, 2); + InsertIndication.Right := InsertIndication.Left + 2; + end + else if bdsInsertTop in State then + begin + Dec(InsertIndication.Top); + InsertIndication.Bottom := InsertIndication.Top + 2; + end + else if bdsInsertRight in State then + begin + Inc(InsertIndication.Right, 2); + InsertIndication.Left := InsertIndication.Right - 2; + end + else if bdsInsertBottom in State then + begin + Inc(InsertIndication.Bottom); + InsertIndication.Top := InsertIndication.Bottom - 2; + end; + ACanvas.FillRect(InsertIndication); + ACanvas.Brush.Color := FillColor; + end; + *) + + if Assigned(OnAfterDrawButton) then + OnAfterDrawButton(Self, AIndex, Canvas, ARect, AState); + finally + //Restore original values + ACanvas.Font.Name := LOldFontName; + ACanvas.Font.Color := LOldFontColor; + ACanvas.Font.Style := LOldFontStyle; + ACanvas.Brush.Style := LOldBrushStyle; + ACanvas.Pen.Width := LOldPenWidth; + //ACanvas.Brush.Color := Color; + if LOldParentFont then + ParentFont := LOldParentFont; + end; + end; +end; + +procedure TStyledButtonGroup.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; +end; + +procedure TStyledButtonGroup.ImageMarginsChange(Sender: TObject); +begin + Invalidate; +end; + +function TStyledButtonGroup.IsDefaultImageMargins: Boolean; +begin + //Default image margins: when all margins are zero except for + case FImageAlignment of + iaLeft: Result := (FImageMargins.Left = DEFAULT_IMAGE_HMARGIN) and + (FImageMargins.Top = 0) and (FImageMargins.Right = 0) and (FImageMargins.Bottom = 0); + iaRight: Result := (FImageMargins.Right = DEFAULT_IMAGE_HMARGIN) and + (FImageMargins.Top = 0) and (FImageMargins.Left = 0) and (FImageMargins.Bottom = 0); + iaTop: Result := (FImageMargins.Top = DEFAULT_IMAGE_VMARGIN) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Bottom = 0); + iaBottom: Result := (FImageMargins.Bottom = DEFAULT_IMAGE_VMARGIN) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Top = 0); + iaCenter: Result := (FImageMargins.Bottom = 0) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Top = 0); + else + Result := False; + end; +end; + +procedure TStyledButtonGroup.CalcDefaultImageMargins(const AValue: TImageAlignment); + + function AdJustMargin(const AMargin, AOffset: Integer): Integer; + begin + Result := AMargin + Round(AOffset*GetScaleFactor); + end; + +begin + if IsDefaultImageMargins then + begin + FImageMargins.Left := 0; + FImageMargins.Right := 0; + FImageMargins.Top := 0; + FImageMargins.Bottom := 0; + case AValue of + iaLeft: FImageMargins.Left := AdJustMargin(FImageMargins.Left, DEFAULT_IMAGE_HMARGIN); + iaRight: FImageMargins.Right := AdJustMargin(FImageMargins.Right, DEFAULT_IMAGE_HMARGIN); + iaTop: FImageMargins.Top := AdJustMargin(FImageMargins.Top, DEFAULT_IMAGE_VMARGIN); + iaBottom: FImageMargins.Bottom := AdJustMargin(FImageMargins.Bottom, DEFAULT_IMAGE_VMARGIN); + end; + end; +end; + +function TStyledButtonGroup.ImageMarginsStored: Boolean; +begin + Result := not IsDefaultImageMargins; +end; + +function TStyledButtonGroup.IsCustomDrawType: Boolean; +begin + Result := FCustomDrawType; +end; + +function TStyledButtonGroup.IsCustomRoundedCorners: Boolean; +begin + Result := StyleRoundedCorners <> ALL_ROUNDED_CORNERS; +end; + +function TStyledButtonGroup.IsCustomRadius: Boolean; +begin + Result := StyleRadius <> DEFAULT_RADIUS; +end; + +function TStyledButtonGroup.IsStoredStyleAppearance: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + Result := FStyleAppearance <> LAppearance; +end; + +function TStyledButtonGroup.IsStoredStyleClass: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + + if AsVCLStyle then + begin + Result := (FStyleClass <> GetActiveStyleName) + and not SameText(FStyleClass, 'Windows'); + end + else + Result := FStyleClass <> LClass; +end; + +function TStyledButtonGroup.IsStoredStyleFamily: Boolean; +begin + Result := FStyleFamily <> DEFAULT_CLASSIC_FAMILY; +end; + +procedure TStyledButtonGroup.Loaded; +begin + inherited; + if not FStyleApplied (*and not HasCustomAttributes*) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, FStyleClass, FStyleAppearance, + FButtonStyleNormal, FButtonStylePressed, FButtonStyleSelected, + FButtonStyleHot, FButtonStyleDisabled); + StyleApplied := ApplyButtonStyle; + end; +end; + +procedure TStyledButtonGroup.MouseMove(Shift: TShiftState; X, Y: Integer); +var + LIndex: Integer; +begin + inherited; + LIndex := IndexOfButtonAt(X, Y); + if LIndex >= 0 then + inherited Cursor := FButtonsCursor + else + inherited Cursor := FCursor; +end; + +class procedure TStyledButtonGroup.RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; const AAppearance: TStyledButtonAppearance; + const AStyleRadius: Integer; const AButtonsCursor: TCursor); +begin + _DefaultStyleDrawType := ADrawType; + _UseCustomDrawType := True; + _DefaultFamily := AFamily; + _DefaultClass := AClass; + _DefaultAppearance := AAppearance; + _DefaultStyleRadius := AStyleRadius; + _DefaultButtonsCursor := AButtonsCursor; +end; + +function TStyledButtonGroup.ApplyButtonStyle: Boolean; +var + LButtonFamily: TButtonFamily; + LStyleClass: TStyledButtonClass; + LStyleAppearance: TStyledButtonAppearance; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then use + //VCL Style assigned to Button or Global VCL Style + if seBorder in StyleElements then + LStyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + end + else + begin + LStyleClass := FStyleClass; + LStyleAppearance := FStyleAppearance; + end; + Result := StyleFamilyCheckAttributes(FStyleFamily, + LStyleClass, LStyleAppearance, LButtonFamily); + if Result (*or (csDesigning in ComponentState)*) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, + LStyleClass, + LStyleAppearance, + FButtonStyleNormal, + FButtonStylePressed, + FButtonStyleSelected, + FButtonStyleHot, + FButtonStyleDisabled); + end; + StyleClass := LStyleClass; + StyleAppearance := LStyleAppearance; + if Result then + Invalidate; +end; + +procedure TStyledButtonGroup.Assign(Source: TPersistent); +begin + inherited Assign(Source); + if Source is TStyledButtonGroup then + begin + FStyleFamily := TStyledButtonGroup(Source).FStyleFamily; + FStyleClass := TStyledButtonGroup(Source).FStyleClass; + FStyleAppearance := TStyledButtonGroup(Source).FStyleAppearance; + FStyleRadius := TStyledButtonGroup(Source).FStyleRadius; + FStyleRoundedCorners := TStyledButtonGroup(Source).FStyleRoundedCorners; + FStyleDrawType := TStyledButtonGroup(Source).FStyleDrawType; + FButtonsCursor := TStyledButtonGroup(Source).FButtonsCursor; + Invalidate; + end; +end; + +function TStyledButtonGroup.AsVCLStyle: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements); +end; + +function TStyledButtonGroup.GetAsVCLComponent: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements) and + (FStyleClass = GetActiveStyleName); +end; + +function TStyledButtonGroup.GetButtonClass: TGrpButtonItemClass; +begin + Result := TStyledGrpButtonItem; +end; + +function TStyledButtonGroup.GetButtonsClass: TGrpButtonItemsClass; +begin + Result := TStyledGrpButtonItems; +end; + +procedure TStyledButtonGroup.SetAsVCLComponent(const AValue: Boolean); +begin + if AValue <> GetAsVCLComponent then + begin + if AValue then + begin + FStyleFamily := DEFAULT_CLASSIC_FAMILY; + FStyleClass := DEFAULT_WINDOWS_CLASS; + FStyleAppearance := DEFAULT_APPEARANCE; + StyleElements := StyleElements + [seClient]; + FCustomDrawType := False; + end + else if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + begin + StyleElements := StyleElements - [seClient]; + end; + UpdateStyleElements; + end; +end; + +procedure TStyledButtonGroup.UpdateStyleElements; +var + LStyleClass: TStyledButtonClass; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then Update style + //as VCL Style assigned to ButtonGroup or Global VCL Style + if seBorder in StyleElements then + StyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + FStyleClass := LStyleClass; + StyleApplied := ApplyButtonGroupStyle; + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + //ABtn.UpdateStyleElements; + ABtn.StyleDrawType := Self.StyleDrawType; + end); + end; + inherited; +end; + +function TStyledButtonGroup.ApplyButtonGroupStyle: Boolean; +var + LButtonFamily: TButtonFamily; +begin + Result := StyleFamilyCheckAttributes(FStyleFamily, + FStyleClass, FStyleAppearance, LButtonFamily); + if Result or (csDesigning in ComponentState) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, + FStyleClass, + FstyleAppearance, + FButtonStyleNormal, + FButtonStylePressed, + FButtonStyleSelected, + FButtonStyleHot, + FButtonStyleDisabled); + end; + Invalidate; +end; + +procedure TStyledButtonGroup.SetSpacing(const AValue: Integer); +begin + if FSpacing <> AValue then + begin + FSpacing := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +var + LValue: TStyledButtonAppearance; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_APPEARANCE; + if (FStyleAppearance <> LValue) or not FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + if ABtn.StyleAppearance = StyleAppearance then + ABtn.StyleAppearance := LValue; + end); + end; + FStyleAppearance := LValue; + StyleApplied := ApplyButtonGroupStyle; + end; +end; + +procedure TStyledButtonGroup.SetStyleApplied(const AValue: Boolean); +begin + FStyleApplied := AValue and (Items.Count > 0) and + not (csLoading in ComponentState); + if FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + ABtn.LoadDefaultStyles; + end); + end; + end; +end; + +procedure TStyledButtonGroup.SetStyleClass(const AValue: TStyledButtonClass); +var + LValue: TStyledButtonClass; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_WINDOWS_CLASS; + if (LValue <> Self.FStyleClass) or not FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + if ABtn.StyleClass = StyleClass then + ABtn.StyleClass := LValue; + end); + end; + FStyleClass := LValue; + StyleApplied := ApplyButtonGroupStyle; +// if (FStyleFamily = DEFAULT_CLASSIC_FAMILY) and +// (LValue <> 'Windows') then +// StyleElements := [seFont, seBorder]; + end; +end; + +procedure TStyledButtonGroup.SetStyleDrawType(const AValue: TStyledButtonDrawType); +begin + FCustomDrawType := True; + if FStyleDrawType <> AValue then + begin + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + if ABtn.StyleDrawType = StyleDrawType then + ABtn.StyleDrawType := AValue; + end); + FStyleDrawType := AValue; + StyleApplied := ApplyButtonGroupStyle; + end; +end; + +procedure TStyledButtonGroup.SetStyleFamily(const AValue: TStyledButtonFamily); +var + LValue: TStyledButtonFamily; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_CLASSIC_FAMILY; + if (LValue <> Self.FStyleFamily) or not FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + if ABtn.StyleFamily = FStyleFamily then + ABtn.StyleFamily := LValue; + end); + end; + FStyleFamily := LValue; + StyleApplied := ApplyButtonGroupStyle; + end; + if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + StyleElements := [seFont, seClient, seBorder]; +end; + +procedure TStyledButtonGroup.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + if AValue <= 0 then + raise EReadError.create(SInvalidProperty); + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + if ABtn.StyleRadius = FStyleRadius then + ABtn.StyleRadius := AValue; + end); + FStyleRadius := AValue; + StyleApplied := ApplyButtonGroupStyle; + end; +end; + +procedure TStyledButtonGroup.SetStyleRoundedCorners( + const AValue: TRoundedCorners); +begin + if FStyleRoundedCorners <> AValue then + begin + ProcessButtons( + procedure (ABtn: TStyledGrpButtonItem) + begin + if ABtn.StyleRoundedCorners = FStyleRoundedCorners then + ABtn.StyleRoundedCorners := AValue; + end); + FStyleRoundedCorners := AValue; + StyleApplied := ApplyButtonGroupStyle; + end; +end; + +procedure TStyledButtonGroup.SetButtonGroupStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + StyleFamily := AStyleFamily; + StyleClass := AStyleClass; + StyleAppearance := AStyleAppearance; + if not ApplyButtonGroupStyle then + raise EStyledButtonGroupError.CreateFmt(ERROR_SETTING_BUTTONGROUP_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TStyledButtonGroup.SetButtonStyleDisabled( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleDisabled <> AValue then + begin + FButtonStyleDisabled := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetButtonStyleHot( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleHot <> AValue then + begin + FButtonStyleHot := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetButtonStyleNormal( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleNormal <> AValue then + begin + FButtonStyleNormal := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetButtonStylePressed( + const AValue: TStyledButtonAttributes); +begin + if FButtonStylePressed <> AValue then + begin + FButtonStylePressed := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetButtonStyleSelected( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleSelected <> AValue then + begin + FButtonStyleSelected := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetCaptionAlignment(const AValue: TAlignment); +begin + if FCaptionAlignment <> AValue then + begin + FCaptionAlignment := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetCursor(const AValue: TCursor); +begin + inherited Cursor := AValue; + FCursor := AValue; +end; + +procedure TStyledButtonGroup.SetFlat(const AValue: Boolean); +begin + if FFlat <> AValue then + begin + FFlat := AValue; + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetGrpButtonItems(const AValue: TStyledGrpButtonItems); +begin + inherited Items := AValue; +end; + +procedure TStyledButtonGroup.SetImageAlignment(const AValue: TImageAlignment); +begin + if FImageAlignment <> AValue then + begin + CalcDefaultImageMargins(AValue); + FImageAlignment := AValue; + if Images <> nil then + Invalidate; + end; +end; + +procedure TStyledButtonGroup.SetImageMargins(const AValue: TImageMargins); +begin + FImageMargins.Assign(AValue); +end; + +function TStyledButtonGroup.GetActiveStyleName: string; +begin + Result := Vcl.ButtonStylesAttributes.GetActiveStyleName(Self); +end; + +function TStyledButtonGroup.GetAttributes(const AMode: TStyledButtonState): TStyledButtonAttributes; +begin + case Amode of + bsmPressed: Result := FButtonStylePressed; + bsmSelected: Result := FButtonStyleSelected; + bsmHot: Result := FButtonStyleHot; + bsmDisabled: Result := FButtonStyleDisabled; + else + Result := FButtonStyleNormal; + end; +end; + +procedure TStyledButtonGroup.GetDrawingStyle(const ACanvas: TCanvas; + const AButtonState: TStyledButtonState; + const AItem: TStyledGrpButtonItem); +var + LCustomAttributes: Boolean; + LSyleAttributes: TStyledButtonAttributes; +begin + LCustomAttributes := ((AItem.FStyleFamily) <> FStyleFamily) or + ((AItem.FStyleClass) <> FStyleClass) or + ((AItem.FStyleAppearance) <> FStyleAppearance); + try + if LCustomAttributes then + begin + //Getting custom drawing styles for single button + StyleFamilyUpdateAttributes( + AItem.FStyleFamily, AItem.FStyleClass, AItem.FStyleAppearance, + FButtonStyleNormal, FButtonStylePressed, FButtonStyleSelected, + FButtonStyleHot, FButtonStyleDisabled); + end; + + //Getting custom drawing styles for all buttons + LSyleAttributes := GetAttributes(AButtonState); + + ACanvas.Pen.Style := LSyleAttributes.PenStyle; + ACanvas.Pen.Width := Round(LSyleAttributes.BorderWidth{$IFDEF D10_3+}*ScaleFactor{$ENDIF}); + ACanvas.Pen.Color := LSyleAttributes.BorderColor; + ACanvas.Brush.Style := LSyleAttributes.BrushStyle; + if LSyleAttributes.ButtonDrawStyle <> btnClear then + ACanvas.Brush.Color := LSyleAttributes.ButtonColor; + ACanvas.Font := Font; + ACanvas.Font.Color := LSyleAttributes.FontColor; + if ParentFont then + ACanvas.Font.Style := LSyleAttributes.FontStyle; + finally + if LCustomAttributes then + begin + //Restore drawing styles for every buttons + StyleFamilyUpdateAttributes( + FStyleFamily, FStyleClass, FStyleAppearance, + FButtonStyleNormal, FButtonStylePressed, FButtonStyleSelected, + FButtonStyleHot, FButtonStyleDisabled); + end; + end; +end; + +function TStyledButtonGroup.GetGrpButtonItems: TStyledGrpButtonItems; +begin + Result := inherited Items as TStyledGrpButtonItems; +end; + +function TStyledButtonGroup.IsStyleEnabled: Boolean; +begin + Result := IsCustomStyleActive and (StyleElements <> []); +end; + +procedure TStyledButtonGroup.ProcessButtons( + AButtonProc: TGrpButtonProc); +var + I: Integer; + LButton: TStyledGrpButtonItem; +begin + if not Assigned(Items) then + Exit; + for I := 0 to Items.Count -1 do + begin + if Items[I] is TStyledGrpButtonItem then + begin + LButton := TStyledGrpButtonItem(Items[I]); + AButtonProc(LButton); + end; + end; +end; + +{ TStyledGrpButtonItem } + +function TStyledGrpButtonItem.ApplyButtonStyle: Boolean; +var + LButtonFamily: TButtonFamily; +begin + if not FStyleApplied then + begin + Result := StyleFamilyCheckAttributes(FStyleFamily, + FStyleClass, FStyleAppearance, LButtonFamily); + if Result then + begin + InvalidateOwner; + FStyleApplied := True; + end; + end + else + Result := False; +end; + +procedure TStyledGrpButtonItem.LoadDefaultStyles; +begin + if Assigned(ButtonGroup) and (ButtonGroup.FStyleApplied) and not FStyleApplied then + begin + FStyleFamily := ButtonGroup.StyleFamily; + FStyleClass := ButtonGroup.StyleClass; + FStyleAppearance := ButtonGroup.StyleAppearance; + FStyleRadius := ButtonGroup.StyleRadius; + FStyleRoundedCorners := ButtonGroup.StyleRoundedCorners; + FStyleDrawType := ButtonGroup.StyleDrawType; + end; +end; + +constructor TStyledGrpButtonItem.Create(Collection: TCollection); +begin + inherited; + FStyleDrawType := TStyledButtonGroup._DefaultStyleDrawType; + FStyleRadius := TStyledButtonGroup._DefaultStyleRadius; + FStyleRoundedCorners := ALL_ROUNDED_CORNERS; + LoadDefaultStyles; +end; + +function TStyledGrpButtonItem.GetStyledButtonGroup: TStyledButtonGroup; +begin + if Collection is TStyledGrpButtonItems then + Result := TStyledGrpButtonItems(Collection).ButtonGroup + else + Result := nil; +end; + +procedure TStyledGrpButtonItem.InvalidateOwner; +begin + if Assigned(ButtonGroup) then + ButtonGroup.Invalidate; +end; + +function TStyledGrpButtonItem.IsCustomDrawType: Boolean; +begin + Result := Assigned(ButtonGroup) and + (FStyleDrawType <> ButtonGroup.FStyleDrawType); +end; + +function TStyledGrpButtonItem.IsCustomRoundedCorners: Boolean; +begin + Result := Assigned(ButtonGroup) and + (FStyleRoundedCorners <> ButtonGroup.FStyleRoundedCorners); +end; + +function TStyledGrpButtonItem.IsCustomRadius: Boolean; +begin + Result := Assigned(ButtonGroup) and + (FStyleRadius <> ButtonGroup.FStyleRadius); +end; + +function TStyledGrpButtonItem.IsStoredStyle: Boolean; +begin + Result := Assigned(ButtonGroup) and + (FStyleFamily <> ButtonGroup.FStyleFamily) or + (FStyleClass <> ButtonGroup.FStyleClass) or + (FStyleAppearance <> ButtonGroup.FStyleAppearance); +end; + +procedure TStyledGrpButtonItem.SetStyleFamily( + const AValue: TStyledButtonFamily); +begin + if FStyleFamily <> AValue then + begin + FStyleFamily := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledGrpButtonItem.SetStyleClass( + const AValue: TStyledButtonClass); +begin + if FStyleClass <> AValue then + begin + FStyleClass := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledGrpButtonItem.SetButtonStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + FStyleApplied := False; + FStyleFamily := AStyleFamily; + FStyleClass := AStyleClass; + FStyleAppearance := AStyleAppearance; + if not ApplyButtonStyle then + raise EStyledButtonGroupError.CreateFmt(ERROR_SETTING_BUTTON_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TStyledGrpButtonItem.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +begin + if FStyleAppearance <> AValue then + begin + FStyleAppearance := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledGrpButtonItem.SetStyleDrawType( + const AValue: TStyledButtonDrawType); +begin + if FStyleDrawType <> AValue then + begin + FStyleDrawType := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledGrpButtonItem.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + FStyleRadius := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledGrpButtonItem.SetStyleRoundedCorners(const AValue: TRoundedCorners); +begin + if FStyleRoundedCorners <> AValue then + begin + FStyleRoundedCorners := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +{ TStyledGrpButtonItems } + +function TStyledGrpButtonItems.Add: TStyledGrpButtonItem; +begin + Result := inherited Add as TStyledGrpButtonItem; +end; + +constructor TStyledGrpButtonItems.Create(const ButtonGroup: TButtonGroup); +begin + inherited; + ; +end; + +function TStyledGrpButtonItems.GetStyledButtonGroup: TStyledButtonGroup; +begin + Result := inherited ButtonGroup as TStyledButtonGroup; +end; + +initialization + TStyledButtonGroup._DefaultStyleDrawType := DEFAULT_STYLEDRAWTYPE; + TStyledButtonGroup._DefaultFamily := DEFAULT_CLASSIC_FAMILY; + TStyledButtonGroup._DefaultClass := DEFAULT_WINDOWS_CLASS; + TStyledButtonGroup._DefaultAppearance := DEFAULT_APPEARANCE; + TStyledButtonGroup._DefaultStyleRadius := DEFAULT_RADIUS; + TStyledButtonGroup._DefaultButtonsCursor := DEFAULT_CURSOR; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledCategoryButtons.pas b/Ext/StyledComponents/source/Vcl.StyledCategoryButtons.pas new file mode 100644 index 0000000..27e1aa5 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledCategoryButtons.pas @@ -0,0 +1,1513 @@ +{******************************************************************************} +{ } +{ StyledCategoryButtons: a Styled CategoryButtons with TStyledButtonItem } +{ Based on TCategoryButtons and TButtonItem } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledCategoryButtons; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.ImgList + , System.UITypes + , System.SysUtils + , System.Classes + , System.Math + , Vcl.ToolWin + , Vcl.ComCtrls + , Vcl.StdCtrls + , Vcl.ExtCtrls + , Vcl.Themes + , Vcl.Controls + , Vcl.ActnList + , Vcl.Menus + , Vcl.CategoryButtons + , Winapi.Messages + , Winapi.Windows + , Vcl.StyledButton + , Vcl.ButtonStylesAttributes + , Vcl.StandardButtonStyles + , Vcl.Graphics + ; + +resourcestring + ERROR_SETTING_CATEGORYBUTTONS_STYLE = 'Error setting CategoryButtons Style: %s/%s/%s not available'; + +type + EStyledCategoryButtonsError = Exception; + + TStyledCategoryButtons = class; + TStyledCategoryButtonsClass = class of TStyledCategoryButtons; + TStyledButtonItem = class; + TStyledButtonItemClass = class of TButtonItem; + TStyledButtonCategory = class; + TStyledButtonCategoryClass = class of TStyledButtonCategory; + TStyledButtonCategories = class; + TStyledButtonCategoriesClass = class of TStyledButtonCategories; + + + TButtonProc = reference to procedure (Button: TStyledButtonItem); + + { TStyledButtonCategory } + TStyledButtonCategory = class(TButtonCategory) + public + constructor Create(Collection: TCollection); override; + end; + + { TStyledButtonCategories } + TStyledButtonCategories = class(TButtonCategories) + private + function GetStyledCategoryButtons: TStyledCategoryButtons; + function GetItem(Index: Integer): TStyledButtonCategory; + procedure SetItem(Index: Integer; const AValue: TStyledButtonCategory); + public + constructor Create(const CategoryButtons: TCategoryButtons); override; + function Add: TStyledButtonCategory; + property CategoryButtons: TStyledCategoryButtons read GetStyledCategoryButtons; + property Items[Index: Integer]: TStyledButtonCategory read GetItem write SetItem; default; + end; + + { TStyledButtonItem } + TStyledButtonItem = class(TButtonItem) + private + FCollection: TButtonCollection; + //Styled Attributes + FStyleRadius: Integer; + FStyleRoundedCorners: TRoundedCorners; + FStyleDrawType: TStyledButtonDrawType; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + FStyleApplied: Boolean; + procedure InvalidateOwner; + function IsCustomDrawType: Boolean; + function IsCustomRoundedCorners: Boolean; + function IsCustomRadius: Boolean; + function IsStoredStyle: Boolean; + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetStyleRadius(const AValue: Integer); + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + function GetStyledCategoryButtons: TStyledCategoryButtons; + function ApplyButtonStyle: Boolean; + procedure LoadDefaultStyles; + public + constructor Create(Collection: TCollection); override; + procedure SetButtonStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); + published + property CategoryButtons: TStyledCategoryButtons read GetStyledCategoryButtons; + + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius stored IsCustomRadius; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleRoundedCorners: TRoundedCorners read FStyleRoundedCorners write SetStyleRoundedCorners stored IsCustomRoundedCorners; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily stored IsStoredStyle; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass stored IsStoredStyle; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance stored IsStoredStyle; + end; + + + { TStyledCategoryButtons } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledCategoryButtons = class(TCategoryButtons) + private + //StyledButton Attributes + FButtonStyleNormal: TStyledButtonAttributes; + FButtonStylePressed: TStyledButtonAttributes; + FButtonStyleSelected: TStyledButtonAttributes; + FButtonStyleHot: TStyledButtonAttributes; + FButtonStyleDisabled: TStyledButtonAttributes; + + //Styled Attributes + FStyleRadius: Integer; + FStyleDrawType: TStyledButtonDrawType; + FStyleRoundedCorners: TRoundedCorners; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + FCustomDrawType: Boolean; + FStyleApplied: Boolean; + + FCaptionAlignment: TAlignment; + FImageAlignment: TImageAlignment; + FImageMargins: TImageMargins; + FSpacing: Integer; + FFlat: Boolean; + FButtonsCursor: TCursor; + FCursor: TCursor; + + class var + _DefaultStyleDrawType: TStyledButtonDrawType; + _UseCustomDrawType: Boolean; + _DefaultFamily: TStyledButtonFamily; + _DefaultClass: TStyledButtonClass; + _DefaultAppearance: TStyledButtonAppearance; + _DefaultStyleRadius: Integer; + _DefaultButtonsCursor: TCursor; + + procedure ImageMarginsChange(Sender: TObject); + function IsCustomDrawType: Boolean; + function IsCustomRoundedCorners: Boolean; + function IsCustomRadius: Boolean; + function ImageMarginsStored: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleClass: Boolean; + function IsStoredStyleFamily: Boolean; + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleRadius(const AValue: Integer); + procedure SetStyleRoundedCorners(const AValue: TRoundedCorners); + function ApplyCategoryButtonsStyle: Boolean; + procedure SetStyleApplied(const AValue: Boolean); + function ApplyButtonStyle: Boolean; + function GetActiveStyleName: string; + function AsVCLStyle: Boolean; + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + procedure ProcessButtons(AButtonProc: TButtonProc); + procedure SetButtonStyleDisabled(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleHot(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleNormal(const AValue: TStyledButtonAttributes); + procedure SetButtonStylePressed(const AValue: TStyledButtonAttributes); + procedure SetButtonStyleSelected(const AValue: TStyledButtonAttributes); + procedure GetDrawingStyle(const ACanvas: TCanvas; + const AButtonState: TStyledButtonState; + const AItem: TStyledButtonItem); + function GetAttributes(const AMode: TStyledButtonState): TStyledButtonAttributes; + procedure DrawBackgroundAndBorder(const ACanvas: TCanvas; + const ADrawRect, ADropDownRect: TRect; + const AStyleDrawType: TStyledButtonDrawType; + const ARadius: Single; const ARoundedCorners: TRoundedCorners); + procedure DrawCaptionAndImage(const ACanvas: TCanvas; const ASurfaceRect: TRect; + const ACaption: TCaption; const AImageIndex: Integer); + procedure SetCaptionAlignment(const AValue: TAlignment); + function GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList): boolean; + procedure DrawText(const ASurfaceRect: TRect; + const ACanvas: TCanvas; const AText: string; + const AAlignment: TAlignment; const ASpacing: Integer; var ARect: TRect; + AFlags: Cardinal); + procedure SetSpacing(const AValue: Integer); + procedure SetFlat(const AValue: Boolean); + function IsStyleEnabled: Boolean; + procedure SetCursor(const AValue: TCursor); + procedure SetImageAlignment(const AValue: TImageAlignment); + function GetScaleFactor: Single; + function GetButtonCategories: TStyledButtonCategories; + procedure SetButtonCategories(const AValue: TStyledButtonCategories); + procedure SetImageMargins(const AValue: TImageMargins); + function IsDefaultImageMargins: Boolean; + procedure CalcDefaultImageMargins(const AValue: TImageAlignment); + {$IFNDEF D10_4+} + function IsCustomStyleActive: Boolean; + {$ENDIF} + //Windows messages + procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; + protected + procedure Loaded; override; + + function GetButtonCategoriesClass: TButtonCategoriesClass; override; + function GetButtonCategoryClass: TButtonCategoryClass; override; + function GetButtonItemClass: TButtonItemClass; override; + + procedure UpdateStyleElements; override; + procedure DrawButton(const AButton: TButtonItem; ACanvas: TCanvas; + ARect: TRect; AState: TButtonDrawState); override; + procedure MouseMove(Shift: TShiftState; X: Integer; Y: Integer); override; + public + procedure Assign(Source: TPersistent); override; + function StyledButtonState(const AState: TButtonDrawState): TStyledButtonState; + class procedure RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; + const AFamily: TStyledButtonFamily = DEFAULT_CLASSIC_FAMILY; + const AClass: TStyledButtonClass = DEFAULT_WINDOWS_CLASS; + const AAppearance: TStyledButtonAppearance = DEFAULT_APPEARANCE; + const AStyleRadius: Integer = DEFAULT_RADIUS; + const AButtonsCursor: TCursor = DEFAULT_CURSOR); virtual; + procedure SetCategoryButtonsStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + //Styled constructor + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent stored False; + property StyleApplied: Boolean read FStyleApplied write SetStyleApplied; + published + property ButtonsCursor: TCursor read FButtonsCursor write FButtonsCursor default DEFAULT_CURSOR; + property Cursor: TCursor read FCursor write SetCursor default crDefault; + property CaptionAlignment: TAlignment read FCaptionAlignment write SetCaptionAlignment default taLeftJustify; + property Categories: TStyledButtonCategories read GetButtonCategories write SetButtonCategories; + property ImageAlignment: TImageAlignment read FImageAlignment write SetImageAlignment default iaLeft; + property ImageMargins: TImageMargins read FImageMargins write SetImageMargins stored ImageMarginsStored; + property Flat: Boolean read FFlat write SetFlat default False; + property Spacing: Integer read FSpacing write SetSpacing default 4; + + //StyledButton Attributes + property ButtonStyleNormal: TStyledButtonAttributes read FButtonStyleNormal write SetButtonStyleNormal; + property ButtonStylePressed: TStyledButtonAttributes read FButtonStylePressed write SetButtonStylePressed; + property ButtonStyleSelected: TStyledButtonAttributes read FButtonStyleSelected write SetButtonStyleSelected; + property ButtonStyleHot: TStyledButtonAttributes read FButtonStyleHot write SetButtonStyleHot; + property ButtonStyleDisabled: TStyledButtonAttributes read FButtonStyleDisabled write SetButtonStyleDisabled; + + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius stored IsCustomRadius; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleRoundedCorners: TRoundedCorners read FStyleRoundedCorners write SetStyleRoundedCorners stored IsCustomRoundedCorners; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily stored IsStoredStyleFamily; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass stored IsStoredStyleClass; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance stored IsStoredStyleAppearance; + end; + +implementation + +uses + Vcl.Consts + , Vcl.Forms + , System.Types + , System.RTLConsts + ; + +const + DEFAULT_IMAGE_HMARGIN = 2; + DEFAULT_IMAGE_VMARGIN = 2; + +{ TStyledCategoryButtons } + +constructor TStyledCategoryButtons.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + Assert(Assigned(AOwner)); + inherited Create(AOwner); + + //new properties for StyledCategoryButtons + FCaptionAlignment := taLeftJustify; + FSpacing := 4; + FFlat := False; + FImageAlignment := iaLeft; + FButtonsCursor := _DefaultButtonsCursor; + FImageMargins := TImageMargins.Create; + FImageMargins.Left := 2; + FImageMargins.OnChange := ImageMarginsChange; + + FButtonStyleNormal := TStyledButtonAttributes.Create(Self); + FButtonStyleNormal.Name := 'Normal'; + FButtonStylePressed := TStyledButtonAttributes.Create(Self); + FButtonStylePressed.Name := 'Pressed'; + FButtonStyleSelected := TStyledButtonAttributes.Create(Self); + FButtonStyleSelected.Name := 'Selected'; + FButtonStyleHot := TStyledButtonAttributes.Create(Self); + FButtonStyleHot.Name := 'Hot'; + FButtonStyleDisabled := TStyledButtonAttributes.Create(Self); + FButtonStyleDisabled.Name := 'Disabled'; + + FStyleDrawType := _DefaultStyleDrawType; + FStyleRadius := _DefaultStyleRadius; + FStyleRoundedCorners := ALL_ROUNDED_CORNERS; + FStyleFamily := AFamily; + FStyleClass := AClass; + FStyleAppearance := AAppearance; +end; + +procedure TStyledCategoryButtons.CMStyleChanged(var Message: TMessage); +begin + inherited; + ApplyButtonStyle; +end; + +constructor TStyledCategoryButtons.Create(AOwner: TComponent); +begin + CreateStyled(AOwner, + _DefaultFamily, + _DefaultClass, + _DefaultAppearance); +end; + +destructor TStyledCategoryButtons.Destroy; +begin + FreeAndNil(FImageMargins); + FreeAndNil(FButtonStyleNormal); + FreeAndNil(FButtonStylePressed); + FreeAndNil(FButtonStyleSelected); + FreeAndNil(FButtonStyleHot); + FreeAndNil(FButtonStyleDisabled); + inherited Destroy; +end; + +function TStyledCategoryButtons.GetScaleFactor: Single; +begin + Result := {$IFDEF D10_3+}ScaleFactor{$ELSE}1{$ENDIF}; +end; + +procedure TStyledCategoryButtons.DrawBackgroundAndBorder( + const ACanvas: TCanvas; const ADrawRect, ADropDownRect: TRect; + const AStyleDrawType: TStyledButtonDrawType; + const ARadius: Single; const ARoundedCorners: TRoundedCorners); +var + LButtonOffset: Integer; + LDropDownRect: TRect; + LScaleFactor: Single; +begin + LScaleFactor := GetScaleFactor; + LDropDownRect := ADropDownRect; + //Draw Button Shape + CanvasDrawshape(ACanvas, ADrawRect, AStyleDrawType, + ARadius*LScaleFactor, ARoundedCorners); + + //Draw Bar and Triangle + if LDropDownRect.Width > 0 then + begin + if not (AStyleDrawType in [btRounded, btEllipse]) then + begin + CanvasDrawBar(ACanvas, LDropDownRect, + LScaleFactor, + ACanvas.Pen.Color); + CanvasDrawTriangle(ACanvas, LDropDownRect, + LScaleFactor, + ACanvas.Font.Color); + end + else + begin + LButtonOffset := LDropDownRect.Height div 8; + LDropDownRect.Left := LDropDownRect.Left - LButtonOffset; + LDropDownRect.Right := LDropDownRect.Right - LButtonOffset; + CanvasDrawTriangle(ACanvas, LDropDownRect, + LScaleFactor, + ACanvas.Font.Color); + end; + end; +end; + +function TStyledCategoryButtons.GetImageSize(out AWidth, AHeight: Integer; + out AImageList: TCustomImageList): boolean; +begin + AWidth := 0; + AHeight := 0; + //Return True if using ImageList + if Assigned(Images) then + begin + AWidth := Images.Width; + AHeight := Images.Height; + Result := True; + end + else + Result := False; +end; + +procedure TStyledCategoryButtons.DrawText( + const ASurfaceRect: TRect; + const ACanvas: TCanvas; + const AText: string; const AAlignment: TAlignment; + const ASpacing: Integer; + var ARect: TRect; AFlags: Cardinal); +var + R: TRect; + LText: string; +begin + //Drawing Caption + R := ARect; + LText := AText; + Winapi.Windows.DrawText(ACanvas.Handle, PChar(AText), Length(AText), + R, AFlags or DT_CALCRECT); + case AAlignment of + taLeftJustify: + begin + OffsetRect(R, ASpacing, (ARect.Height - R.Height) div 2); + end; + taRightJustify: + begin + OffsetRect(R, ARect.Width - R.Width - ASpacing, (ARect.Height - R.Height) div 2); + end; + else + begin + OffsetRect(R, (ARect.Width - R.Width) div 2, (ARect.Height - R.Height) div 2); + end; + end; + if ASurfaceRect.Right < R.Right + ASpacing then + R.Right := ASurfaceRect.Right - ASpacing; + if ASurfaceRect.Left > R.Left - ASpacing then + R.Left := ASurfaceRect.Left + ASpacing; + ACanvas.TextRect(R, LText, [tfEndEllipsis]); +end; + +procedure TStyledCategoryButtons.DrawCaptionAndImage( + const ACanvas: TCanvas; const ASurfaceRect: TRect; + const ACaption: TCaption; const AImageIndex: Integer); +var + LTextFlags: Cardinal; + LImageRect, LTextRect: TRect; + LImageList: TCustomImageList; + LImageWidth, LImageHeight: Integer; + LUseImageList: Boolean; +begin + if boShowCaptions in ButtonOptions then + begin + case FCaptionAlignment of + taLeftJustify: LTextFlags := DT_NOCLIP or DT_LEFT or DT_VCENTER; + taRightJustify: LTextFlags := DT_NOCLIP or DT_RIGHT or DT_VCENTER; + else + LTextFlags := DT_NOCLIP or DT_CENTER or DT_VCENTER; + end; + LTextFlags := DrawTextBiDiModeFlags(LTextFlags); + (* + if FWordWrap then + LTextFlags := LTextFlags or DT_WORDBREAK; + *) + end + else + begin + LTextFlags := DT_NOCLIP or DT_CENTER or DT_VCENTER; + end; + LUseImageList := GetImageSize(LImageWidth, LImageHeight, LImageList); + + //Calculate LTextRect and LImageRect using ImageMargins and ImageAlignment + CalcImageAndTextRect(ASurfaceRect, ACaption, LTextRect, LImageRect, + LImageWidth, LImageHeight, FImageAlignment, FImageMargins, GetScaleFactor); + + if LUseImageList and not Assigned(OnDrawIcon) then + begin + //Uses an ImageList to draw the Icon + Images.Draw(ACanvas, LImageRect.Left, LImageRect.Top, + AImageIndex, Enabled); + end; + + if boShowCaptions in ButtonOptions then + DrawText(ASurfaceRect, ACanvas, ACaption, FCaptionAlignment, FSpacing, + LTextRect, LTextFlags); +end; + +{$IFNDEF D10_4+} +function TStyledCategoryButtons.IsCustomStyleActive: Boolean; +begin + Result := False; +end; +{$ENDIF} + +function TStyledCategoryButtons.StyledButtonState( + const AState: TButtonDrawState): TStyledButtonState; +begin + //Calculate Styled State based on State + if (bdsHot in AState) and not (bdsDown in AState) then + Result := bsmHot + else if bdsDown in AState then + Result := bsmPressed + else if bdsFocused in AState then + Result := bsmSelected + else if not Enabled then + Result := bsmDisabled + else + Result := bsmNormal; +end; + +procedure TStyledCategoryButtons.DrawButton(const AButton: TButtonItem; + ACanvas: TCanvas; ARect: TRect; AState: TButtonDrawState); +var + LSurfaceRect: TRect; + LOldFontName: TFontName; + LOldFontColor: TColor; + LOldFontStyle: TFontStyles; + LOldParentFont: boolean; + LOldBrushStyle: TBrushStyle; + LOldPenWidth: Integer; + LStyle: TCustomStyleServices; + LState: TStyledButtonState; + LDetails: TThemedElementDetails; + LButtonItem: TStyledButtonItem; + LDropDownRect: TRect; + LColor: TColor; +begin + //Do not call inherited + LButtonItem := AButton as TStyledButtonItem; + Assert(Assigned(LButtonItem)); + + if Assigned(OnDrawButton) and (not (csDesigning in ComponentState)) then + OnDrawButton(Self, LButtonItem, ACanvas, ARect, AState) + else + begin + if Assigned(OnBeforeDrawButton) then + OnBeforeDrawButton(Self, LButtonItem, ACanvas, ARect, AState); + + LState := StyledButtonState(AState); + + LOldParentFont := ParentFont; + LOldFontName := ACanvas.Font.Name; + LOldFontColor := ACanvas.Font.Color; + LOldFontStyle := ACanvas.Font.Style; + LOldBrushStyle := ACanvas.Brush.Style; + LOldPenWidth := ACanvas.Pen.Width; + try + GetDrawingStyle(ACanvas, LState, LButtonItem); + + //At the moment, no DropDown for Buttons + LDropDownRect := TRect.Create(0,0,0,0); + + if FFlat then + begin + LStyle := StyleServices{$IFDEF D10_4+}(Self){$ENDIF}; + if (LState in [bsmDisabled, bsmNormal]) and IsStyleEnabled then + begin + if (bdsSelected in AState) or (bdsDown in AState) then + LDetails := LStyle.GetElementDetails(tcbButtonSelected) + else if bdsHot in AState then + LDetails := LStyle.GetElementDetails(tcbButtonHot) + else + LDetails := LStyle.GetElementDetails(tcbButtonNormal); + + if not (IsCustomStyleActive and not (seFont in StyleElements)) and + LStyle.GetElementColor(LDetails, ecTextColor, LColor) and (LColor <> clNone) then + ACanvas.Font.Color := LColor; + end; + + //Don't draw button Face for Flat Normal/disabled Button + if LState in [bsmDisabled, bsmNormal] then + ACanvas.Brush.Style := bsClear; + end; + + DrawBackgroundAndBorder(ACanvas, ARect, LDropDownRect, + LButtonItem.StyleDrawType, LButtonItem.StyleRadius, LButtonItem.StyleRoundedCorners); + + LSurfaceRect := ARect; + if LDropDownRect.Width <> 0 then + Dec(LSurfaceRect.Right, LDropDownRect.Width); + + DrawCaptionAndImage(ACanvas, LSurfaceRect, LButtonItem.Caption, + LButtonItem.ImageIndex); + + { Draw the icon - prefer the event } + if Assigned(OnDrawIcon) then + OnDrawIcon(Self, LButtonItem, ACanvas, LSurfaceRect, AState, FSpacing); + + LSurfaceRect := ClientRect; + //DrawNotificationBadge(ACanvas, LSurfaceRect); + (* + { Show insert indications } + if [bdsInsertLeft, bdsInsertTop, bdsInsertRight, bdsInsertBottom] * State <> [] then + begin + ACanvas.Brush.Color := GetShadowColor(EdgeColor); + InsertIndication := Rect; + if bdsInsertLeft in State then + begin + Dec(InsertIndication.Left, 2); + InsertIndication.Right := InsertIndication.Left + 2; + end + else if bdsInsertTop in State then + begin + Dec(InsertIndication.Top); + InsertIndication.Bottom := InsertIndication.Top + 2; + end + else if bdsInsertRight in State then + begin + Inc(InsertIndication.Right, 2); + InsertIndication.Left := InsertIndication.Right - 2; + end + else if bdsInsertBottom in State then + begin + Inc(InsertIndication.Bottom); + InsertIndication.Top := InsertIndication.Bottom - 2; + end; + ACanvas.FillRect(InsertIndication); + ACanvas.Brush.Color := FillColor; + end; + *) + + if Assigned(OnAfterDrawButton) then + OnAfterDrawButton(Self, LButtonItem, ACanvas, ARect, AState); + finally + //Restore original values + ACanvas.Font.Name := LOldFontName; + ACanvas.Font.Color := LOldFontColor; + ACanvas.Font.Style := LOldFontStyle; + ACanvas.Brush.Style := LOldBrushStyle; + ACanvas.Pen.Width := LOldPenWidth; + //ACanvas.Brush.Color := Color; + if LOldParentFont then + ParentFont := LOldParentFont; + end; + end; +end; + +procedure TStyledCategoryButtons.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; +end; + +procedure TStyledCategoryButtons.ImageMarginsChange(Sender: TObject); +begin + Invalidate; +end; + +function TStyledCategoryButtons.IsDefaultImageMargins: Boolean; +begin + //Default image margins: when all margins are zero except for + case FImageAlignment of + iaLeft: Result := (FImageMargins.Left = DEFAULT_IMAGE_HMARGIN) and + (FImageMargins.Top = 0) and (FImageMargins.Right = 0) and (FImageMargins.Bottom = 0); + iaRight: Result := (FImageMargins.Right = DEFAULT_IMAGE_HMARGIN) and + (FImageMargins.Top = 0) and (FImageMargins.Left = 0) and (FImageMargins.Bottom = 0); + iaTop: Result := (FImageMargins.Top = DEFAULT_IMAGE_VMARGIN) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Bottom = 0); + iaBottom: Result := (FImageMargins.Bottom = DEFAULT_IMAGE_VMARGIN) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Top = 0); + iaCenter: Result := (FImageMargins.Bottom = 0) and + (FImageMargins.Left = 0) and (FImageMargins.Right = 0) and (FImageMargins.Top = 0); + else + Result := False; + end; +end; + +procedure TStyledCategoryButtons.CalcDefaultImageMargins(const AValue: TImageAlignment); + + function AdJustMargin(const AMargin, AOffset: Integer): Integer; + begin + Result := AMargin + Round(AOffset*GetScaleFactor); + end; + +begin + if IsDefaultImageMargins then + begin + FImageMargins.Left := 0; + FImageMargins.Right := 0; + FImageMargins.Top := 0; + FImageMargins.Bottom := 0; + case AValue of + iaLeft: FImageMargins.Left := AdJustMargin(FImageMargins.Left, DEFAULT_IMAGE_HMARGIN); + iaRight: FImageMargins.Right := AdJustMargin(FImageMargins.Right, DEFAULT_IMAGE_HMARGIN); + iaTop: FImageMargins.Top := AdJustMargin(FImageMargins.Top, DEFAULT_IMAGE_VMARGIN); + iaBottom: FImageMargins.Bottom := AdJustMargin(FImageMargins.Bottom, DEFAULT_IMAGE_VMARGIN); + end; + end; +end; + +function TStyledCategoryButtons.ImageMarginsStored: Boolean; +begin + Result := not IsDefaultImageMargins; +end; + +function TStyledCategoryButtons.IsCustomDrawType: Boolean; +begin + Result := FCustomDrawType; +end; + +function TStyledCategoryButtons.IsCustomRoundedCorners: Boolean; +begin + Result := StyleRoundedCorners <> ALL_ROUNDED_CORNERS; +end; + +function TStyledCategoryButtons.IsCustomRadius: Boolean; +begin + Result := StyleRadius <> DEFAULT_RADIUS; +end; + +function TStyledCategoryButtons.IsStoredStyleAppearance: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + Result := FStyleAppearance <> LAppearance; +end; + +function TStyledCategoryButtons.IsStoredStyleClass: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + + if AsVCLStyle then + begin + Result := (FStyleClass <> GetActiveStyleName) + and not SameText(FStyleClass, 'Windows'); + end + else + Result := FStyleClass <> LClass; +end; + +function TStyledCategoryButtons.IsStoredStyleFamily: Boolean; +begin + Result := FStyleFamily <> DEFAULT_CLASSIC_FAMILY; +end; + +procedure TStyledCategoryButtons.Loaded; +begin + inherited; + if not FStyleApplied (*and not HasCustomAttributes*) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, FStyleClass, FStyleAppearance, + FButtonStyleNormal, FButtonStylePressed, FButtonStyleSelected, + FButtonStyleHot, FButtonStyleDisabled); + StyleApplied := ApplyButtonStyle; + end; +end; + +procedure TStyledCategoryButtons.MouseMove(Shift: TShiftState; X, Y: Integer); +var + LButtonItem: TButtonItem; +begin + inherited; + LButtonItem := GetButtonAt(X, Y); + if Assigned(LButtonItem) then + inherited Cursor := FButtonsCursor + else + inherited Cursor := FCursor; +end; + +class procedure TStyledCategoryButtons.RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; const AAppearance: TStyledButtonAppearance; + const AStyleRadius: Integer; const AButtonsCursor: TCursor); +begin + _DefaultStyleDrawType := ADrawType; + _UseCustomDrawType := True; + _DefaultFamily := AFamily; + _DefaultClass := AClass; + _DefaultAppearance := AAppearance; + _DefaultStyleRadius := AStyleRadius; + _DefaultButtonsCursor := AButtonsCursor; +end; + +function TStyledCategoryButtons.ApplyButtonStyle: Boolean; +var + LButtonFamily: TButtonFamily; + LStyleClass: TStyledButtonClass; + LStyleAppearance: TStyledButtonAppearance; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then use + //VCL Style assigned to Button or Global VCL Style + if seBorder in StyleElements then + LStyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + end + else + begin + LStyleClass := FStyleClass; + LStyleAppearance := FStyleAppearance; + end; + Result := StyleFamilyCheckAttributes(FStyleFamily, + LStyleClass, LStyleAppearance, LButtonFamily); + if Result (*or (csDesigning in ComponentState)*) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, + LStyleClass, + LStyleAppearance, + FButtonStyleNormal, + FButtonStylePressed, + FButtonStyleSelected, + FButtonStyleHot, + FButtonStyleDisabled); + end; + StyleClass := LStyleClass; + StyleAppearance := LStyleAppearance; + if Result then + Invalidate; +end; + +procedure TStyledCategoryButtons.Assign(Source: TPersistent); +begin + inherited Assign(Source); + if Source is TStyledCategoryButtons then + begin + FStyleFamily := TStyledCategoryButtons(Source).FStyleFamily; + FStyleClass := TStyledCategoryButtons(Source).FStyleClass; + FStyleAppearance := TStyledCategoryButtons(Source).FStyleAppearance; + FStyleRadius := TStyledCategoryButtons(Source).FStyleRadius; + FStyleRoundedCorners := TStyledCategoryButtons(Source).FStyleRoundedCorners; + FStyleDrawType := TStyledCategoryButtons(Source).FStyleDrawType; + FButtonsCursor := TStyledCategoryButtons(Source).FButtonsCursor; + Invalidate; + end; +end; + +function TStyledCategoryButtons.AsVCLStyle: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements); +end; + +function TStyledCategoryButtons.GetAsVCLComponent: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements) and + (FStyleClass = GetActiveStyleName); +end; + +function TStyledCategoryButtons.GetButtonCategoriesClass: TButtonCategoriesClass; +begin + Result := TStyledButtonCategories; +end; + +function TStyledCategoryButtons.GetButtonCategoryClass: TButtonCategoryClass; +begin + Result := TStyledButtonCategory; +end; + +function TStyledCategoryButtons.GetButtonItemClass: TButtonItemClass; +begin + Result := TStyledButtonItem; +end; + +procedure TStyledCategoryButtons.SetAsVCLComponent(const AValue: Boolean); +begin + if AValue <> GetAsVCLComponent then + begin + if AValue then + begin + FStyleFamily := DEFAULT_CLASSIC_FAMILY; + FStyleClass := DEFAULT_WINDOWS_CLASS; + FStyleAppearance := DEFAULT_APPEARANCE; + StyleElements := StyleElements + [seClient]; + FCustomDrawType := False; + end + else if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + begin + StyleElements := StyleElements - [seClient]; + end; + UpdateStyleElements; + end; +end; + +procedure TStyledCategoryButtons.UpdateStyleElements; +var + LStyleClass: TStyledButtonClass; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then Update style + //as VCL Style assigned to CategoryButtons or Global VCL Style + if seBorder in StyleElements then + StyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + FStyleClass := LStyleClass; + StyleApplied := ApplyCategoryButtonsStyle; + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + //ABtn.UpdateStyleElements; + ABtn.StyleDrawType := Self.StyleDrawType; + end); + end; + inherited; +end; + +function TStyledCategoryButtons.ApplyCategoryButtonsStyle: Boolean; +var + LButtonFamily: TButtonFamily; +begin + Result := StyleFamilyCheckAttributes(FStyleFamily, + FStyleClass, FStyleAppearance, LButtonFamily); + if Result or (csDesigning in ComponentState) then + begin + StyleFamilyUpdateAttributes( + FStyleFamily, + FStyleClass, + FstyleAppearance, + FButtonStyleNormal, + FButtonStylePressed, + FButtonStyleSelected, + FButtonStyleHot, + FButtonStyleDisabled); + end; + Invalidate; +end; + +procedure TStyledCategoryButtons.SetSpacing(const AValue: Integer); +begin + if FSpacing <> AValue then + begin + FSpacing := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +var + LValue: TStyledButtonAppearance; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_APPEARANCE; + if (FStyleAppearance <> LValue) or not FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + if ABtn.StyleAppearance = StyleAppearance then + ABtn.StyleAppearance := LValue; + end); + end; + FStyleAppearance := LValue; + StyleApplied := ApplyCategoryButtonsStyle; + end; +end; + +procedure TStyledCategoryButtons.SetStyleApplied(const AValue: Boolean); +begin + FStyleApplied := AValue and (Categories.Count > 0) and + not (csLoading in ComponentState); + if FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + ABtn.LoadDefaultStyles; + end); + end; + end; +end; + +procedure TStyledCategoryButtons.SetStyleClass(const AValue: TStyledButtonClass); +var + LValue: TStyledButtonClass; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_WINDOWS_CLASS; + if (LValue <> Self.FStyleClass) or not FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + if ABtn.StyleClass = StyleClass then + ABtn.StyleClass := LValue; + end); + end; + FStyleClass := LValue; + StyleApplied := ApplyCategoryButtonsStyle; +// if (FStyleFamily = DEFAULT_CLASSIC_FAMILY) and +// (LValue <> 'Windows') then +// StyleElements := [seFont, seBorder]; + end; +end; + +procedure TStyledCategoryButtons.SetStyleDrawType(const AValue: TStyledButtonDrawType); +begin + FCustomDrawType := True; + if FStyleDrawType <> AValue then + begin + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + if ABtn.StyleDrawType = StyleDrawType then + ABtn.StyleDrawType := AValue; + end); + FStyleDrawType := AValue; + StyleApplied := ApplyCategoryButtonsStyle; + end; +end; + +procedure TStyledCategoryButtons.SetStyleFamily(const AValue: TStyledButtonFamily); +var + LValue: TStyledButtonFamily; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_CLASSIC_FAMILY; + if (LValue <> Self.FStyleFamily) or not FStyleApplied then + begin + if not (csLoading in ComponentState) then + begin + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + if ABtn.StyleFamily = FStyleFamily then + ABtn.StyleFamily := LValue; + end); + end; + FStyleFamily := LValue; + StyleApplied := ApplyCategoryButtonsStyle; + end; + if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + StyleElements := [seFont, seClient, seBorder]; +end; + +procedure TStyledCategoryButtons.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + if AValue <= 0 then + raise EReadError.create(SInvalidProperty); + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + if ABtn.StyleRadius = FStyleRadius then + ABtn.StyleRadius := AValue; + end); + FStyleRadius := AValue; + StyleApplied := ApplyCategoryButtonsStyle; + end; +end; + +procedure TStyledCategoryButtons.SetStyleRoundedCorners( + const AValue: TRoundedCorners); +begin + if FStyleRoundedCorners <> AValue then + begin + ProcessButtons( + procedure (ABtn: TStyledButtonItem) + begin + if ABtn.StyleRoundedCorners = FStyleRoundedCorners then + ABtn.StyleRoundedCorners := AValue; + end); + FStyleRoundedCorners := AValue; + StyleApplied := ApplyCategoryButtonsStyle; + end; +end; + +procedure TStyledCategoryButtons.SetCategoryButtonsStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + StyleFamily := AStyleFamily; + StyleClass := AStyleClass; + StyleAppearance := AStyleAppearance; + if not ApplyCategoryButtonsStyle then + raise EStyledCategoryButtonsError.CreateFmt(ERROR_SETTING_CATEGORYBUTTONS_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TStyledCategoryButtons.SetButtonStyleDisabled( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleDisabled <> AValue then + begin + FButtonStyleDisabled := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetButtonStyleHot( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleHot <> AValue then + begin + FButtonStyleHot := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetButtonStyleNormal( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleNormal <> AValue then + begin + FButtonStyleNormal := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetButtonStylePressed( + const AValue: TStyledButtonAttributes); +begin + if FButtonStylePressed <> AValue then + begin + FButtonStylePressed := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetButtonStyleSelected( + const AValue: TStyledButtonAttributes); +begin + if FButtonStyleSelected <> AValue then + begin + FButtonStyleSelected := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetCaptionAlignment(const AValue: TAlignment); +begin + if FCaptionAlignment <> AValue then + begin + FCaptionAlignment := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetCursor(const AValue: TCursor); +begin + inherited Cursor := AValue; + FCursor := AValue; +end; + +procedure TStyledCategoryButtons.SetFlat(const AValue: Boolean); +begin + if FFlat <> AValue then + begin + FFlat := AValue; + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetButtonCategories(const AValue: TStyledButtonCategories); +begin + inherited Categories := AValue; +end; + +procedure TStyledCategoryButtons.SetImageAlignment(const AValue: TImageAlignment); +begin + if FImageAlignment <> AValue then + begin + CalcDefaultImageMargins(AValue); + FImageAlignment := AValue; + if Images <> nil then + Invalidate; + end; +end; + +procedure TStyledCategoryButtons.SetImageMargins(const AValue: TImageMargins); +begin + FImageMargins.Assign(AValue); +end; + +function TStyledCategoryButtons.GetActiveStyleName: string; +begin + Result := Vcl.ButtonStylesAttributes.GetActiveStyleName(Self); +end; + +function TStyledCategoryButtons.GetAttributes(const AMode: TStyledButtonState): TStyledButtonAttributes; +begin + case Amode of + bsmPressed: Result := FButtonStylePressed; + bsmSelected: Result := FButtonStyleSelected; + bsmHot: Result := FButtonStyleHot; + bsmDisabled: Result := FButtonStyleDisabled; + else + Result := FButtonStyleNormal; + end; +end; + +procedure TStyledCategoryButtons.GetDrawingStyle(const ACanvas: TCanvas; + const AButtonState: TStyledButtonState; + const AItem: TStyledButtonItem); +var + LCustomAttributes: Boolean; + LSyleAttributes: TStyledButtonAttributes; +begin + LCustomAttributes := ((AItem.FStyleFamily) <> FStyleFamily) or + ((AItem.FStyleClass) <> FStyleClass) or + ((AItem.FStyleAppearance) <> FStyleAppearance); + try + if LCustomAttributes then + begin + //Getting custom drawing styles for single button + StyleFamilyUpdateAttributes( + AItem.FStyleFamily, AItem.FStyleClass, AItem.FStyleAppearance, + FButtonStyleNormal, FButtonStylePressed, FButtonStyleSelected, + FButtonStyleHot, FButtonStyleDisabled); + end; + + //Getting custom drawing styles for all buttons + LSyleAttributes := GetAttributes(AButtonState); + + ACanvas.Pen.Style := LSyleAttributes.PenStyle; + ACanvas.Pen.Width := Round(LSyleAttributes.BorderWidth{$IFDEF D10_3+}*ScaleFactor{$ENDIF}); + ACanvas.Pen.Color := LSyleAttributes.BorderColor; + ACanvas.Brush.Style := LSyleAttributes.BrushStyle; + if LSyleAttributes.ButtonDrawStyle <> btnClear then + ACanvas.Brush.Color := LSyleAttributes.ButtonColor; + ACanvas.Font := Font; + ACanvas.Font.Color := LSyleAttributes.FontColor; + if ParentFont then + ACanvas.Font.Style := LSyleAttributes.FontStyle; + finally + if LCustomAttributes then + begin + //Restore drawing styles for every buttons + StyleFamilyUpdateAttributes( + FStyleFamily, FStyleClass, FStyleAppearance, + FButtonStyleNormal, FButtonStylePressed, FButtonStyleSelected, + FButtonStyleHot, FButtonStyleDisabled); + end; + end; +end; + +function TStyledCategoryButtons.GetButtonCategories: TStyledButtonCategories; +begin + Result := inherited Categories as TStyledButtonCategories; +end; + +function TStyledCategoryButtons.IsStyleEnabled: Boolean; +begin + Result := IsCustomStyleActive and (StyleElements <> []); +end; + +procedure TStyledCategoryButtons.ProcessButtons( + AButtonProc: TButtonProc); +var + C, B: Integer; + LCategory: TStyledButtonCategory; + LButton: TStyledButtonItem; +begin + if not Assigned(Categories) then + Exit; + for C := 0 to Categories.Count -1 do + begin + if Categories[C] is TStyledButtonCategory then + begin + LCategory := TStyledButtonCategory(Categories[C]); + for B := 0 to LCategory.Items.Count -1 do + begin + if LCategory.Items[B] is TStyledButtonItem then + begin + LButton := TStyledButtonItem(LCategory.Items[B]); + AButtonProc(LButton); + end; + end; + end; + end; +end; + +{ TStyledButtonItem } + +function TStyledButtonItem.ApplyButtonStyle: Boolean; +var + LButtonFamily: TButtonFamily; +begin + if not FStyleApplied then + begin + Result := StyleFamilyCheckAttributes(FStyleFamily, + FStyleClass, FStyleAppearance, LButtonFamily); + if Result then + begin + InvalidateOwner; + FStyleApplied := True; + end; + end + else + Result := False; +end; + +procedure TStyledButtonItem.LoadDefaultStyles; +begin + if Assigned(CategoryButtons) and (CategoryButtons.FStyleApplied) and not FStyleApplied then + begin + FStyleFamily := CategoryButtons.StyleFamily; + FStyleClass := CategoryButtons.StyleClass; + FStyleAppearance := CategoryButtons.StyleAppearance; + FStyleRadius := CategoryButtons.StyleRadius; + FStyleRoundedCorners := CategoryButtons.StyleRoundedCorners; + FStyleDrawType := CategoryButtons.StyleDrawType; + end; +end; + +constructor TStyledButtonItem.Create(Collection: TCollection); +begin + inherited; + FCollection := Collection as TButtonCollection; + FStyleDrawType := TStyledCategoryButtons._DefaultStyleDrawType; + FStyleRadius := TStyledCategoryButtons._DefaultStyleRadius; + FStyleRoundedCorners := ALL_ROUNDED_CORNERS; + LoadDefaultStyles; +end; + +function TStyledButtonItem.GetStyledCategoryButtons: TStyledCategoryButtons; +begin + if Assigned(FCollection) and Assigned(FCollection.Category) then + Result := FCollection.Category.CategoryButtons as TStyledCategoryButtons + else + Result := nil; +end; + +procedure TStyledButtonItem.InvalidateOwner; +begin + if Assigned(CategoryButtons) then + CategoryButtons.Invalidate; +end; + +function TStyledButtonItem.IsCustomDrawType: Boolean; +begin + Result := Assigned(CategoryButtons) and + (FStyleDrawType <> CategoryButtons.FStyleDrawType); +end; + +function TStyledButtonItem.IsCustomRoundedCorners: Boolean; +begin + Result := Assigned(CategoryButtons) and + (FStyleRoundedCorners <> CategoryButtons.FStyleRoundedCorners); +end; + +function TStyledButtonItem.IsCustomRadius: Boolean; +begin + Result := Assigned(CategoryButtons) and + (FStyleRadius <> CategoryButtons.FStyleRadius); +end; + +function TStyledButtonItem.IsStoredStyle: Boolean; +begin + Result := Assigned(CategoryButtons) and + ((FStyleFamily <> CategoryButtons.FStyleFamily) or + (FStyleClass <> CategoryButtons.FStyleClass) or + (FStyleAppearance <> CategoryButtons.FStyleAppearance)); +end; + +procedure TStyledButtonItem.SetStyleFamily( + const AValue: TStyledButtonFamily); +begin + if FStyleFamily <> AValue then + begin + FStyleFamily := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledButtonItem.SetStyleClass( + const AValue: TStyledButtonClass); +begin + if FStyleClass <> AValue then + begin + FStyleClass := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledButtonItem.SetButtonStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + FStyleApplied := False; + FStyleFamily := AStyleFamily; + FStyleClass := AStyleClass; + FStyleAppearance := AStyleAppearance; + if not ApplyButtonStyle then + raise EStyledCategoryButtonsError.CreateFmt(ERROR_SETTING_BUTTON_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TStyledButtonItem.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +begin + if FStyleAppearance <> AValue then + begin + FStyleAppearance := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledButtonItem.SetStyleDrawType( + const AValue: TStyledButtonDrawType); +begin + if FStyleDrawType <> AValue then + begin + FStyleDrawType := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledButtonItem.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + FStyleRadius := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +procedure TStyledButtonItem.SetStyleRoundedCorners(const AValue: TRoundedCorners); +begin + if FStyleRoundedCorners <> AValue then + begin + FStyleRoundedCorners := AValue; + InvalidateOwner; + end; + ApplyButtonStyle; +end; + +{ TStyledButtonCategories } + +function TStyledButtonCategories.Add: TStyledButtonCategory; +begin + Result := inherited Add as TStyledButtonCategory; +end; + +constructor TStyledButtonCategories.Create(const CategoryButtons: TCategoryButtons); +begin + inherited Create(CategoryButtons); +end; + +function TStyledButtonCategories.GetItem(Index: Integer): TStyledButtonCategory; +begin + Result := inherited GetItem(Index) as TStyledButtonCategory; +end; + +procedure TStyledButtonCategories.SetItem(Index: Integer; + const AValue: TStyledButtonCategory); +begin + inherited SetItem(Index, AValue); +end; + +function TStyledButtonCategories.GetStyledCategoryButtons: TStyledCategoryButtons; +begin + Result := inherited CategoryButtons as TStyledCategoryButtons; +end; + +{ TStyledButtonCategory } + +constructor TStyledButtonCategory.Create(Collection: TCollection); +begin + inherited Create(Collection); +end; + +initialization + TStyledCategoryButtons._DefaultStyleDrawType := DEFAULT_STYLEDRAWTYPE; + TStyledCategoryButtons._DefaultFamily := DEFAULT_CLASSIC_FAMILY; + TStyledCategoryButtons._DefaultClass := DEFAULT_WINDOWS_CLASS; + TStyledCategoryButtons._DefaultAppearance := DEFAULT_APPEARANCE; + TStyledCategoryButtons._DefaultStyleRadius := DEFAULT_RADIUS; + TStyledCategoryButtons._DefaultButtonsCursor := DEFAULT_CURSOR; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledCmpMessages.pas b/Ext/StyledComponents/source/Vcl.StyledCmpMessages.pas new file mode 100644 index 0000000..3e2d856 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledCmpMessages.pas @@ -0,0 +1,219 @@ +{******************************************************************************} +{ } +{ StyledCmpMessages: Messages translated for Styled Component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledCmpMessages; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.Dialogs; + +resourcestring +{$IF DEFINED(ItaMessages) OR DEFINED(CBLIB_ITA)} + STR_YES = '&S�'; + STR_NO = '&No'; + STR_OK = 'OK'; + STR_CANCEL = 'Annulla'; + STR_ABORT = '&Interrompi'; + STR_RETRY = '&Riprova'; + STR_IGNORE = 'I&gnora'; + STR_ALL = '&Tutti'; + STR_NOTOALL = '&No a tutti'; + STR_YESTOALL = '&S� a tutti'; + STR_HELP = '&Aiuto'; + STR_ABOUT = 'Informazioni'; + STR_WARNING = 'Attenzione'; + STR_ERROR = 'Errore'; + STR_INFORMATION = 'Informazione'; + STR_CONFIRM = 'Conferma'; + STR_CLOSE = '&Chiudi'; + EINSTANTERRORDESC = 'Errore nei dati'; + EDATABASEERRORDESC = 'Errore nei dati'; + EGENERICERROR = 'Errore'; + EACCESSVIOLDESC = 'Errore non previsto nel programma'; + ERR_ACCES_VIOL_DESC = 'Si � verificato un errore inatteso nel programma.'+sLineBreak+sLineBreak+'%s'+sLineBreak+sLineBreak+ + 'Si consiglia di uscire dal programma e riavviarlo (i dati gi� registrati non andranno perduti)'+sLineBreak+ + 'Se l''errore dovesse persistere contattare il supporto tecnico'; + + //Navigator buttons Captions + CaptionFirstRecord = 'Primo'; + CaptionPriorRecord = 'Precedente'; + CaptionNextRecord = 'Successivo'; + CaptionLastRecord = 'Ultimo'; + CaptionInsertRecord = 'Inserisci'; + CaptionDeleteRecord = 'Elimina'; + CaptionEditRecord = 'Modifica'; + CaptionPostEdit = 'Salva'; + CaptionCancelEdit = 'Annulla'; + CaptionConfirmCaption = 'Conferma'; + CaptionRefreshRecord = 'Aggiorna'; + CaptionApplyUpdates = 'Applica'; + CaptionCancelUpdates = 'Ripristina'; + //Navigator buttons Hints + SFirstRecord = 'Primo record'; + SPriorRecord = 'Record precedente'; + SNextRecord = 'Record successivo'; + SLastRecord = 'Ultimo record'; + SInsertRecord = 'Inserisci record'; + SDeleteRecord = 'Cancella record'; + SEditRecord = 'Modifica record'; + SPostEdit = 'Salva le modifiche'; + SCancelEdit = 'Annulla le modifiche'; + SConfirmCaption = 'Conferma'; + SRefreshRecord = 'Aggiorna i dati'; + SApplyUpdates = 'Memorizza tutte le modifiche'; + SCancelUpdates = 'Annulla tutte le modifiche'; + SDeleteRecordQuestion = 'Vuoi cancellare il record?'; + +{$ELSEIF Defined(FraMessages)} + STR_YES = '&Oui'; + STR_NO = '&Non'; + STR_OK = 'Ok'; + STR_CANCEL = 'Annuler'; + STR_ABORT = '&Abandonner'; + STR_RETRY = '&R�essayer'; + STR_IGNORE = '&Ignorer'; + STR_ALL = '&Tous'; + STR_NOTOALL = '&Non � tout'; + STR_YESTOALL = '&Oui � tout'; + STR_HELP = '&Aide'; + STR_ABOUT = 'A propos'; + STR_WARNING = 'Attention'; + STR_ERROR = 'Erreur'; + STR_INFORMATION = 'Information'; + STR_CONFIRM = 'Confirmer'; + STR_CLOSE = '&Fermer'; + EINSTANTERRORDESC = 'Erreur de donn�es'; + EDATABASEERRORDESC = 'Erreur de donn�es'; + EGENERICERROR = 'Erreur'; + EACCESSVIOLDESC = 'Violation d''acc�s'; + ERR_ACCES_VIOL_DESC = 'Une erreur non g�r�e a �t� detect�e.'+sLineBreak+sLineBreak+'%s'+sLineBreak+sLineBreak+ + 'Il est recommand� de fermer et de relancer l''application.'+sLineBreak+ + 'Si le programme persiste, contactez le support technique.'; + + //Navigator buttons Captions + CaptionFirstRecord = 'Premier'; + CaptionPriorRecord = 'Pr�c�dent'; + CaptionNextRecord = 'Suivant'; + CaptionLastRecord = 'Dernier'; + CaptionInsertRecord = 'Ins�rer'; + CaptionDeleteRecord = 'Supprimer'; + CaptionEditRecord = 'Editer'; + CaptionPostEdit = 'Valider'; + CaptionCancelEdit = 'Abandonner'; + CaptionConfirmCaption = 'Confirmer'; + CaptionRefreshRecord = 'Rafraichir'; + CaptionApplyUpdates = 'Appliquer'; + CaptionCancelUpdates = 'Annuler'; + //Navigator buttons Hints + SFirstRecord = 'Premier enregistrement'; + SPriorRecord = 'Enregistrement pr�c�dent'; + SNextRecord = 'Enregistrement suivant'; + SLastRecord = 'Dernier enregistrement'; + SInsertRecord = 'Ins�rer un enregistrement'; + SDeleteRecord = 'Supprimer l''enregistrement'; + SEditRecord = 'Editer l''enregistrement '; + SPostEdit = 'Valider les modifications'; + SCancelEdit = 'Abandonner les modifications'; + SConfirmCaption = 'Confirmer'; + SRefreshRecord = 'Rafraichir les donn�es'; + SApplyUpdates = 'Appliquer les modifications'; + SCancelUpdates = 'Annuler les modifications'; + SDeleteRecordQuestion = 'Supprimer l''enregistrement?'; +{$ELSE} + STR_YES = '&Yes'; + STR_NO = '&No'; + STR_OK = 'OK'; + STR_CANCEL = 'Cancel'; + STR_ABORT = '&Abort'; + STR_RETRY = '&Retry'; + STR_IGNORE = '&Ignore'; + STR_ALL = '&All'; + STR_NOTOALL = 'N&o to All'; + STR_YESTOALL = 'Yes to &All'; + STR_HELP = '&Help'; + STR_ABOUT = 'About'; + STR_WARNING = 'Warning'; + STR_ERROR = 'Error'; + STR_INFORMATION = 'Information'; + STR_CONFIRM = 'Confirm'; + STR_CLOSE = '&Close'; + EDATABASEERRORDESC = 'Error in data'; + EFILERERROR = 'Error in input/output file operation'; + EGENERICERROR = 'Error'; + EACCESSVIOLDESC = 'Unexpected error in application'; + ERR_ACCES_VIOL_DESC = 'Unexpected error.'+sLineBreak+sLineBreak+'%s'+sLineBreak+sLineBreak+ + 'It is recommended to exit and reexecute the program.'+sLineBreak+ + 'If this error persists, please contact our technical support.'; + + //Navigator buttons Captions + CaptionFirstRecord = 'First'; + CaptionPriorRecord = 'Prior'; + CaptionNextRecord = 'Next'; + CaptionLastRecord = 'Last'; + CaptionInsertRecord = 'Insert'; + CaptionDeleteRecord = 'Delete'; + CaptionEditRecord = 'Edit'; + CaptionPostEdit = 'Post'; + CaptionCancelEdit = 'Cancel'; + CaptionConfirmCaption = 'Confirm'; + CaptionRefreshRecord = 'Refresh'; + CaptionApplyUpdates = 'Apply'; + CaptionCancelUpdates = 'Revert'; + //Navigator buttons Hints + SFirstRecord = 'First record'; + SPriorRecord = 'Prior record'; + SNextRecord = 'Next record'; + SLastRecord = 'Last record'; + SInsertRecord = 'Insert record'; + SDeleteRecord = 'Delete record'; + SEditRecord = 'Edit record'; + SPostEdit = 'Post edit'; + SCancelEdit = 'Cancel edit'; + SConfirmCaption = 'Confirm'; + SRefreshRecord = 'Refresh data'; + SApplyUpdates = 'Apply updates'; + SCancelUpdates = 'Revert updates'; + SDeleteRecordQuestion = 'Delete record?'; +{$ENDIF} + +function GetMsgDlgTitle(const AMsgDlgType: TMsgDlgType): string; + +implementation + +function GetMsgDlgTitle(const AMsgDlgType: TMsgDlgType): string; +begin + case AMsgDlgType of + mtWarning: Result := STR_WARNING; + mtError: Result := STR_ERROR; + mtConfirmation: Result := STR_CONFIRM; + else + Result := STR_INFORMATION; + end; +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledCmpStrUtils.pas b/Ext/StyledComponents/source/Vcl.StyledCmpStrUtils.pas new file mode 100644 index 0000000..7e3b756 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledCmpStrUtils.pas @@ -0,0 +1,171 @@ +{******************************************************************************} +{ } +{ StyledCmpStrUtils: String utils for Styled Component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledCmpStrUtils; + +{$INCLUDE StyledComponents.inc} + +interface + +function HRefToString(const HRef: string): string; +function StringToHRef(const LinkStr: string; DisplayLabel: string = ''): string; +function CopyByIndexes( const S : string; StartIndex, EndIndex : Integer ) : string; +function ExtractHrefValues(const HRef: string; + out LinkStr, DisplayLabel: string) : boolean; +function ClearHRefs(const Msg: string; OnlyFileNotExists: boolean = False): string; +function GetErrorClassNameDesc(const ExceptionClassName : string; + IsAccessViolation: boolean) : string; +function GetProjectURL: string; +function GetProjectWikiURL: string; + +implementation + +uses + System.SysUtils + , Vcl.StyledCmpMessages + ; + +function GetProjectURL: string; +begin + Result := 'https://github.com/EtheaDev/StyledComponents'; +end; + +function GetProjectWikiURL: string; +begin + Result := 'https://github.com/EtheaDev/StyledComponents/wiki'; +end; + +function HRefToString(const HRef: string): string; +var + DisplayLabel: string; + LinkStr: string; +begin + //Esempio: stringa in input: '%s',[LinkStr, LDisplayLabel]); +end; + +function ExtractHrefValues(const HRef: string; + out LinkStr, DisplayLabel: string) : boolean; +var + p1, p2, p3: integer; +begin + //Esempio: stringa in input: 'Editor' + //DisplayLabel: Editor + //LinkStr: c:\windows\system32\Notepad.exe'; + p1 := pos('>', HRef); + p2 := Length(HRef)-3; + p3 := pos('">',HRef); + //controllo congruit� + if (p1 > 0) and (p3 > 0) and + SameText(Copy(HRef,1,9),'', UpperCase(SubMsg)); + if (p1 > 0) and (p2 > 0) then + begin + //Ho individuato un Hyperlink dalla posizione p1 alla p2+3 + HRef :=CopyByIndexes(SubMsg,p1,p2+3); + ExtractHrefValues(HRef, LinkStr, DisplayLabel); + if not OnlyFileNotExists or not FileExists(LinkStr) then + Result := Result + Copy(SubMsg,1,p1-1)+HRefToString(HRef) + else + Result := Result + Copy(SubMsg,1,p1-1)+HRef; + SubMsg := Copy(SubMsg,p2+4,maxint); + end + else + begin + Result := Result + SubMsg; + break; + end; + end; +end; + +function GetErrorClassNameDesc(const ExceptionClassName : string; + IsAccessViolation: boolean) : string; +begin + Result := ''; + if pos('Database', ExceptionClassName) > 0 then + Result := EDATABASEERRORDESC + else if IsAccessViolation then + Result := EACCESSVIOLDESC + else + Result := EGENERICERROR; +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledCompResources.dfm b/Ext/StyledComponents/source/Vcl.StyledCompResources.dfm new file mode 100644 index 0000000..ab488be --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledCompResources.dfm @@ -0,0 +1,83 @@ +object StyledCompResourcesData: TStyledCompResourcesData + Height = 192 + Width = 320 + object SVGIconImageCollection: TSVGIconImageCollection + SVGIconItems = < + item + IconName = 'Warning' + SVGText = + '' + FixedColor = clYellow + end + item + IconName = 'Error' + SVGText = + '<' + + '/svg>' + FixedColor = clRed + end + item + IconName = 'Information' + SVGText = + '' + FixedColor = clBlue + end + item + IconName = 'Confirmation' + SVGText = + '' + FixedColor = clLime + end + item + IconName = 'Custom' + SVGText = + '' + FixedColor = clSilver + end> + Left = 145 + Top = 80 + end +end diff --git a/Ext/StyledComponents/source/Vcl.StyledComponentsHooks.pas b/Ext/StyledComponents/source/Vcl.StyledComponentsHooks.pas new file mode 100644 index 0000000..46a98fd --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledComponentsHooks.pas @@ -0,0 +1,74 @@ +{******************************************************************************} +{ } +{ StyledComponentsHooks: an interposer Unit to use Styled Components } +{ using Standard Delphi Controls Class Names } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledComponentsHooks; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.StyledButton + , Vcl.StyledDbNavigator + , Vcl.StyledToolbar + , Vcl.StyledButtonGroup + , Vcl.StyledCategoryButtons + ; + +type + //Interposer Class for TButton -> TStyledButton + TButton = class(TStyledButton) end; + + //Interposer Class for TBitBtn -> TStyledBitBtn + TBitBtn = class(TStyledBitBtn) end; + + //Interposer Class for TBitBtn -> TStyledSpeedButton + TSpeedButton = class(TStyledSpeedButton) end; + + //Interposer Class for TDbNavigator -> TStyledDbNavigator + TDbNavigator = class(TStyledDbNavigator) end; + + //Interposer Class for TBindNavigator -> TStyledBindNavigator + TBindNavigator = class(TStyledBindNavigator) end; + + //Interposer Class for TToolbar -> TStyledToolbar + TToolbar = class(TStyledToolbar) end; + + //Interposer Class for TToolbutton -> TStyledToolButton + TToolbutton = class(TStyledToolbutton) end; + + //Interposer Class for TButtonGroup -> TStyledButtonGroup + TButtonGroup = class(TStyledButtonGroup) end; + + //Interposer Class for TCategoryButtons -> TStyledCategoryButtons + TCategoryButtons = class(TStyledCategoryButtons) end; + + //Interposer Class for TButtonCategory -> TStyledButtonCategory + TButtonCategory = class(TStyledButtonCategory) end; + +implementation + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledDbNavigator.pas b/Ext/StyledComponents/source/Vcl.StyledDbNavigator.pas new file mode 100644 index 0000000..07a044d --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledDbNavigator.pas @@ -0,0 +1,2261 @@ +{******************************************************************************} +{ } +{ StyledDbNavigator: a DbNavigator with TStyledNavButtons inside } +{ Based on TStyledToolbar } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledDbNavigator; + +interface + +{$INCLUDE StyledComponents.inc} + +{$IFDEF D10_4+} + {$R StyledNavButtonsPNG.RES} +{$ELSE} + {$R StyledNavButtonsBMP.RES} +{$ENDIF} + +uses + Vcl.ImgList + , System.UITypes + , System.SysUtils + , System.Classes + , System.Math + , Vcl.ToolWin + , Vcl.ComCtrls + , Vcl.StdCtrls + , Vcl.ExtCtrls + , Vcl.Themes + , Vcl.Controls + , Vcl.ActnList + , Vcl.Menus + , Winapi.Messages + , Winapi.Windows + , Vcl.StyledButton + , Vcl.ButtonStylesAttributes + , Vcl.StandardButtonStyles + , Vcl.DBCtrls + , Data.db + , Data.Bind.Components + , Data.Bind.Controls +{$IFDEF D10_4+} + , Vcl.VirtualImageList + , Vcl.ImageCollection +{$ENDIF} + ; + +resourcestring + ERROR_SETTING_DBNAVIGATOR_STYLE = 'Error setting DbNavigator Style: %s/%s/%s not available'; + +const + NavigatorDefaultBtns = [ + TNavigateBtn.nbFirst, TNavigateBtn.nbPrior, TNavigateBtn.nbNext, + TNavigateBtn.nbLast, TNavigateBtn.nbInsert, TNavigateBtn.nbDelete, + TNavigateBtn.nbEdit, TNavigateBtn.nbPost, TNavigateBtn.nbCancel, + TNavigateBtn.nbRefresh]; + + NavigatorMoveBtns = [TNavigateBtn.nbFirst..TNavigateBtn.nbLast]; + +type + EStyledDbnavigatorError = Exception; + + TCustomStyledDBNavigator = class; + TStyledDbNavigator = class; + TStyledNavButton = class; + TStyledNavDataLink = class; + + TButtonProc = reference to procedure (Button: TStyledNavButton); + TNavButtons = array[TNavigateBtn] of TStyledNavButton; + + TNavigateButtonEvent = procedure (Sender: TObject; Button: TNavigateButton) of object; + TNavigatorOrientation = (orHorizontal, orVertical); + + { TStyledNavButton } + TStyledNavButton = class(TStyledGraphicButton) + private + FIndex: TNavigateBtn; + FNavStyle: TNavButtonStyle; + FRepeatTimer: TTimer; + FDbNavigator: TCustomStyledDBNavigator; + FImageAlignment: TImageAlignment; + FDragging: Boolean; + procedure TimerExpired(Sender: TObject); + procedure UpdateButtonContent; + function IsImageAlignmentStored: Boolean; + procedure SetImageAlignment(const AValue: TImageAlignment); + function IsCustomDrawType: Boolean; + function IsCustomRadius: Boolean; + function IsCustomRoundedCorners: Boolean; + function IsStoredStyleFamily: Boolean; + function IsStoredStyleAppearance: Boolean; + protected + function IsStoredStyleClass: Boolean; override; + function GetCaptionToDraw: TCaption; override; + procedure SetCaption(const AValue: TCaption); override; + procedure Paint; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + property NavStyle: TNavButtonStyle read FNavStyle write FNavStyle; + property Index : TNavigateBtn read FIndex write FIndex; + published + property ImageAlignment: TImageAlignment read FImageAlignment write SetImageAlignment Stored IsImageAlignmentStored; + property Caption: TCaption read GetCaption write SetCaption stored IsCaptionStored; + //StyledComponents Attributes + property StyleRadius stored IsCustomRadius; + property StyleRoundedCorners stored IsCustomRoundedCorners; + property StyleDrawType stored IsCustomDrawType; + property StyleFamily stored IsStoredStyleFamily; + property StyleClass stored IsStoredStyleClass; + property StyleAppearance stored IsStoredStyleAppearance; + property ButtonStyleNormal; + property ButtonStylePressed; + property ButtonStyleSelected; + property ButtonStyleHot; + property ButtonStyleDisabled; + property NotificationBadge; + property OnDropDownClick; + end; + + { TCustomStyledDBNavigator } + TCustomStyledDBNavigator = class(TCustomPanel) + private + //Standard support as TDbNavigator + FVisibleButtons: TNavButtonSet; + FHints: TStrings; + FCaptions: TStrings; + FDefaultHints: TStrings; + FDefaultCaptions: TStrings; + FButtonWidth: Integer; + FButtonHeight: Integer; + FMinBtnSize: TPoint; + FOnNavClick: ENavClick; + FBeforeAction: ENavClick; + FocusedButton: TNavigateBtn; + FConfirmDelete: Boolean; + FFlat: Boolean; + FMaxErrors: Integer; + FKind: TDBNavigatorKind; + FButtons: TNavButtons; + + //ImageList Support + FImageChangeLink: TChangeLink; + FDisabledImageChangeLink: TChangeLink; + + //Styled Attributes + FStyleRadius: Integer; + FStyleDrawType: TStyledButtonDrawType; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + FCustomDrawType: Boolean; + FStyleApplied: Boolean; + + //Imagelist support + FImages: TCustomImageList; + FDisabledImages: TCustomImageList; + FShowCaptions: Boolean; + + {$IFDEF D10_4+} + FButtonImages: TVirtualImageList; + + //Internal ImageList and Collection for standard images + class var FButtonsImageCollection: TImageCollection; + class constructor Create; + class destructor Destroy; + + procedure UpdateButtonsImageIndex; + procedure UpdateButtonsIcons; + + procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; + {$ELSE} + procedure UpdateButtonsGlyphs; + {$ENDIF} + + class var + _DefaultStyleDrawType: TStyledButtonDrawType; + _UseCustomDrawType: Boolean; + _DefaultFamily: TStyledButtonFamily; + _DefaultClass: TStyledButtonClass; + _DefaultAppearance: TStyledButtonAppearance; + _DefaultStyleRadius: Integer; + _DefaultCursor: TCursor; + + procedure ImageListChange(Sender: TObject); + procedure DisabledImageListChange(Sender: TObject); + procedure ProcessButtons(AButtonProc: TButtonProc); + + function AsVCLStyle: Boolean; + function ApplyDbnavigatorStyle: Boolean; + + procedure BtnMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); + function GetHints: TStrings; + procedure HintsChanged(Sender: TObject); + procedure CaptionsChanged(Sender: TObject); + procedure InitButtons; + procedure InitCaptions; + procedure SetFlat(const AValue: Boolean); + procedure SetHints(const AValue: TStrings); + procedure SetKind(const AValue: TDBNavigatorKind); + procedure SetSize(var W: Integer; var H: Integer); + procedure SetVisible(const AValue: TNavButtonSet); + procedure WMSize(var Message: TWMSize); message WM_SIZE; + procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS; + procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS; + procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; + procedure WMWindowPosChanging(var Message: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING; + function IsCustomDrawType: Boolean; + function IsCustomRadius: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleClass: Boolean; + function IsStoredStyleFamily: Boolean; + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleRadius(const AValue: Integer); + procedure SetDisabledImages(const AValue: TCustomImageList); + procedure SetImages(const AValue: TCustomImageList); + procedure SetStyleApplied(const AValue: Boolean); + procedure SetShowCaptions(const AValue: Boolean); + procedure UpdateButtons; + function GetCaptions: TStrings; + procedure SetCaptions(const AValue: TStrings); + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + function GetButtonItem(AIndex: TNavigateBtn): TStyledNavButton; + protected + function GetActiveStyleName: string; + procedure ClickHandler(Sender: TObject); virtual; abstract; + procedure InitHints; virtual; + function GetButton(const AValue: TNavigateBtn): TStyledNavButton; + procedure UpdateStyleElements; override; + procedure CalcMinSize(var W, H: Integer); + procedure CreateWnd; override; + procedure KeyDown(var Key: Word; Shift: TShiftState); override; + procedure Loaded; override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure Paint; override; + {$IFDEF D10_4+} + procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override; + {$ELSE} + procedure SetButtonGlyph(Index: TNavigateBtn); virtual; + {$ENDIF} + public + procedure Assign(Source: TPersistent); override; + class procedure RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; + const AFamily: TStyledButtonFamily = DEFAULT_CLASSIC_FAMILY; + const AClass: TStyledButtonClass = DEFAULT_WINDOWS_CLASS; + const AAppearance: TStyledButtonAppearance = DEFAULT_APPEARANCE; + const AStyleRadius: Integer = DEFAULT_RADIUS; + const ACursor: TCursor = DEFAULT_CURSOR); virtual; + //Styled constructor + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure SetDbNavigatorStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + + property StyleApplied: Boolean read FStyleApplied write SetStyleApplied; + //Access readonly properties + property Buttons: TNavButtons read FButtons; + property ButtonWidth: Integer read FButtonWidth; + property ButtonHeight: Integer read FButtonHeight; + property VisibleButtons: TNavButtonSet read FVisibleButtons write SetVisible default NavigatorDefaultBtns; + property MaxErrors: Integer read FMaxErrors write FMaxErrors default -1; + + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent stored False; + property Align; + property Anchors; + property ButtonItems[Index: TNavigateBtn]: TStyledNavButton read GetButtonItem; + property Constraints; + property DragCursor; + property DragKind; + property DragMode; + property Enabled; + property Flat: Boolean read FFlat write SetFlat default False; + property Ctl3D; + property Captions: TStrings read GetCaptions write SetCaptions; + property Hints: TStrings read GetHints write SetHints; + property Kind: TDBNavigatorKind read FKind write SetKind default dbnHorizontal; + property ParentCtl3D; + property ParentShowHint; + property PopupMenu; + property ConfirmDelete: Boolean read FConfirmDelete write FConfirmDelete default True; + property ShowHint; + property TabOrder; + property TabStop; + property Visible; + property BeforeAction: ENavClick read FBeforeAction write FBeforeAction; + property OnClick: ENavClick read FOnNavClick write FOnNavClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnResize; + property OnStartDock; + property OnStartDrag; + + //Imagelist support + property DisabledImages: TCustomImageList read FDisabledImages write SetDisabledImages; + property Images: TCustomImageList read FImages write SetImages; + + property ShowCaptions: Boolean read FShowCaptions write SetShowCaptions default False; + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius stored IsCustomRadius; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily stored IsStoredStyleFamily; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass stored IsStoredStyleClass; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance stored IsStoredStyleAppearance; + end; + + { TStyledDBNavigator } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledDBNavigator = class (TCustomStyledDBNavigator) + private + FDataLink: TStyledNavDataLink; + procedure SetDataSource(const AValue: TDataSource); + function GetDataSource: TDataSource; + procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED; + protected + procedure DataChanged; + procedure EditingChanged; + procedure ActiveChanged; + procedure ClickHandler(Sender: TObject); override; + procedure Notification(AComponent: TComponent; Operation: TOperation); override; + procedure ApplyUpdates; virtual; + function CanApplyUpdates: Boolean; virtual; + procedure CancelUpdates; virtual; + function CanCancelUpdates: Boolean; virtual; + procedure Loaded; override; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure BtnClick(Index: TNavigateBtn); virtual; + published + property ActiveStyleName: string read GetActiveStyleName; + property Align; + property Anchors; + property AsVCLComponent stored False; + property BeforeAction; + property Captions; + property ConfirmDelete; + property Constraints; + property Ctl3D; + property Cursor default DEFAULT_CURSOR; + property DataSource: TDataSource read GetDataSource write SetDataSource; + property DragCursor; + property DragKind; + property DragMode; + property DisabledImages; + property Enabled; + property Flat; + property Hints; + property Images; + property Kind; + property MaxErrors; + property ParentCtl3D; + property ParentShowHint; + property PopupMenu; + property ShowCaptions; + property ShowHint; + property StyleElements; + property TabOrder; + property TabStop; + property Visible; + property VisibleButtons; + + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnResize; + property OnStartDock; + property OnStartDrag; + + //StyledComponents Attributes + property StyleRadius; + property StyleDrawType; + property StyleFamily; + property StyleClass; + property StyleAppearance; + end; + + { TStyledNavDataLink } + + TStyledNavDataLink = class(TDataLink) + private + FNavigator: TStyledDBNavigator; + protected + procedure EditingChanged; override; + procedure DataSetChanged; override; + procedure ActiveChanged; override; + public + constructor Create(ANav: TStyledDBNavigator); + destructor Destroy; override; + end; + + { TStyledBindNavigator } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledBindNavigator = class(TCustomStyledDbNavigator, IBindNavigator) + private + FController: TBindNavigatorController; + FBeforeAction: TNavigateButtonEvent; + FOnNavClick: TNavigateButtonEvent; + procedure OnActiveChanged(Sender: TObject); + procedure OnDataChanged(Sender: TObject); + procedure OnEditingChanged(Sender: TObject); + function GetDataSource: TBaseLinkingBindSource; + procedure SetDataSource(Value: TBaseLinkingBindSource); + procedure SetVisible(const Value: TNavigateButtons); + function GetButton(Index: TNavigateButton): TStyledNavButton; + function GetOrientation: TNavigatorOrientation; + procedure SetOrientation(const Value: TNavigatorOrientation); + function NavigateButtonToNavBtn(const AValue: TNavigateButton): TNavigateBtn; + function NavBtnToNavigateButton(const AValue: TNavigateBtn): TNavigateButton; + function NavigateButtonsToNavBtns(const AValue: TNavigateButtons): TNavButtonSet; + function NavBtnsToNavigateButtons(const AValue: TNavButtonSet): TNavigateButtons; + function GetVisibleButtons: TNavigateButtons; + protected + procedure ClickHandler(Sender: TObject); override; + property Buttons[Index: TNavigateButton]: TStyledNavButton read GetButton; + procedure ActiveChanged; + procedure DataChanged; + procedure EditingChanged; + //procedure BtnIDClick(Index: TNavBtnID); override; + public + procedure BtnClick(Index: TNavigateButton); reintroduce; virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + published + property Align; + property Anchors; + property AsVCLComponent stored False; + property BeforeAction: TNavigateButtonEvent read FBeforeAction write FBeforeAction; + property Captions; + property ConfirmDelete; + property Constraints; + property Ctl3D; + property Cursor default DEFAULT_CURSOR; + property DataSource: TBaseLinkingBindSource read GetDataSource write SetDataSource; + property DragCursor; + property DragKind; + property DragMode; + property DisabledImages; + property Enabled; + property Flat; + property Hints; + property Images; + property Kind; + property MaxErrors; + property Orientation: TNavigatorOrientation read GetOrientation write SetOrientation default orHorizontal; + property ParentCtl3D; + property ParentShowHint; + property PopupMenu; + property ShowCaptions; + property ShowHint; + property StyleElements; + property TabOrder; + property TabStop; + property Visible; + property VisibleButtons: TNavigateButtons read GetVisibleButtons write SetVisible default NavigatorDefaultButtons; + + property OnClick: TNavigateButtonEvent read FOnNavClick write FOnNavClick; + property OnContextPopup; + property OnDblClick; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnResize; + property OnStartDock; + property OnStartDrag; + + //StyledComponents Attributes + property StyleRadius; + property StyleDrawType; + property StyleFamily; + property StyleClass; + property StyleAppearance; + end; + +implementation + +uses + Vcl.Consts + , Vcl.Forms + , Vcl.Dialogs + , Vcl.Graphics + , System.Types + , System.RTLConsts + , Vcl.StyledCmpMessages + , Vcl.StyledTaskDialog + ; + +const + DEFAULT_BTN_IMAGE_SIZE = 15; + COLORED_IMAGE_COLLECTION = 'SNB_'; + WHITE_IMAGE_COLLECTION = 'NAVW_'; + BLACK_IMAGE_COLLECTION = 'NAVB_'; + VERTICAL_ICON = '_VERT'; + DEFAULT_IMAGE_MARGIN = 4; + +var + BtnTypeName: array[TNavigateBtn] of PChar = ('FIRST', 'PRIOR', 'NEXT', + 'LAST', 'INSERT', 'DELETE', 'EDIT', 'POST', 'CANCEL', 'REFRESH', 'APPLYUPDATES', + 'CANCELUPDATES'); + BtnHintId: array[TNavigateBtn] of Pointer = (@SFirstRecord, @SPriorRecord, + @SNextRecord, @SLastRecord, @SInsertRecord, @SDeleteRecord, @SEditRecord, + @SPostEdit, @SCancelEdit, @SRefreshRecord, @SApplyUpdates, @SCancelUpdates); + BtnCaptionId: array[TNavigateBtn] of Pointer = (@CaptionFirstRecord, @CaptionPriorRecord, + @CaptionNextRecord, @CaptionLastRecord, @CaptionInsertRecord, @CaptionDeleteRecord, @CaptionEditRecord, + @CaptionPostEdit, @CaptionCancelEdit, @CaptionRefreshRecord, @CaptionApplyUpdates, @CaptionCancelUpdates); + +{$IFDEF D10_4+} +class constructor TCustomStyledDBNavigator.Create; +begin +end; + +procedure InitButtonsImageCollection; +var + LBtnName: string; + + procedure AddImageToCollection(const APrefix, ABtnName: string); + begin + TCustomStyledDBNavigator.FButtonsImageCollection.Add( + APrefix+ABtnName, HInstance, + APrefix+ABtnName, ['', '_20X']); + end; + +begin + if TCustomStyledDBNavigator.FButtonsImageCollection <> nil then + Exit; + TCustomStyledDBNavigator.FButtonsImageCollection := TImageCollection.Create(nil); + for var I := Low(BtnTypeName) to High(BtnTypeName) do + begin + LBtnName := BtnTypeName[I]; + //Add colored image (prefix SNB in StyledNavButtonsPNG.RES) + AddImageToCollection(COLORED_IMAGE_COLLECTION,LBtnName); + //Add black image (prefix NAVB in StyledNavButtonsPNG.RES) + AddImageToCollection(BLACK_IMAGE_COLLECTION,LBtnName); + //Add white image (prefix NAVW in StyledNavButtonsPNG.RES) + AddImageToCollection(WHITE_IMAGE_COLLECTION,LBtnName); + end; + //Add also vertical images + for var I := TNavigateBtn.nbFirst to TNavigateBtn.nbLast do + begin + LBtnName := BtnTypeName[I] + VERTICAL_ICON; + //Add colored image (prefix SNB in StyledNavButtonsPNG.RES) + AddImageToCollection(COLORED_IMAGE_COLLECTION,LBtnName); + //Add black image (prefix NAVB in StyledNavButtonsPNG.RES) + AddImageToCollection(BLACK_IMAGE_COLLECTION,LBtnName); + //Add white image (prefix NAVW in StyledNavButtonsPNG.RES) + AddImageToCollection(WHITE_IMAGE_COLLECTION,LBtnName); + end; +end; +{$ENDIF} + +constructor TCustomStyledDBNavigator.Create(AOwner: TComponent); +begin + CreateStyled(AOwner, + _DefaultFamily, + _DefaultClass, + _DefaultAppearance); +end; + +constructor TCustomStyledDBNavigator.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + {$IFDEF D10_4+} + InitButtonsImageCollection; + {$ENDIF} + inherited Create(AOwner); + FShowCaptions := False; + ControlStyle := ControlStyle + - [csDoubleClicks, csAcceptsControls, csSetCaption, csGestures] + [csOpaque]; + if not NewStyleControls then + ControlStyle := ControlStyle + [csFramed]; + FVisibleButtons := NavigatorDefaultBtns; + FHints := TStringList.Create; + FCaptions := TStringList.Create; + TStringList(FHints).OnChange := HintsChanged; + TStringList(FCaptions).OnChange := CaptionsChanged; + {$IFDEF D10_4+} + FButtonImages := TVirtualImageList.Create(nil); + FButtonImages.AutoFill := True; + FButtonImages.ImageCollection := FButtonsImageCollection; + FButtonImages.SetSize(DEFAULT_BTN_IMAGE_SIZE, DEFAULT_BTN_IMAGE_SIZE); + {$ENDIF} + + FStyleDrawType := _DefaultStyleDrawType; + FStyleRadius := _DefaultStyleRadius; + FStyleFamily := AFamily; + FStyleClass := AClass; + FStyleAppearance := AAppearance; + Cursor := _DefaultCursor; + + InitButtons; + InitHints; + InitCaptions; + BevelOuter := bvNone; + BevelInner := bvNone; + MaxErrors := -1; + Kind := dbnHorizontal; + Width := 241; + Height := 25; + FButtonWidth := 0; + FButtonHeight := 0; + FocusedButton := TNavigateBtn.nbFirst; + FConfirmDelete := True; + FullRepaint := False; + + FImageChangeLink := TChangeLink.Create; + FImageChangeLink.OnChange := ImageListChange; + + FDisabledImageChangeLink := TChangeLink.Create; + FDisabledImageChangeLink.OnChange := DisabledImageListChange; + + //FHotImageChangeLink := TChangeLink.Create; + //FHotImageChangeLink.OnChange := HotImageListChange; + + ParentBackground := True; + ParentColor := True; + BevelOuter := bvNone; + Flat := False; +end; + +{$IFNDEF D10_4+} +procedure TCustomStyledDBNavigator.UpdateButtonsGlyphs; +var + I: TNavigateBtn; + UseGlyphs: Boolean; +begin + UseGlyphs := not Assigned(FImages); //not StyleServices.Enabled or StyleServices.IsSystemStyle; + for I := Low(FButtons) to High(FButtons) do + begin + if UseGlyphs and (Buttons[I].ImageIndex = -1) then + SetButtonGlyph(I) + else if not UseGlyphs then + Buttons[I].ImageIndex := Ord(I); + end; +end; +{$ENDIF} + +procedure TCustomStyledDBNavigator.CreateWnd; +begin + inherited; + {$IFNDEF D10_4+} + UpdateButtonsGlyphs; + {$ENDIF} +end; + +destructor TCustomStyledDBNavigator.Destroy; +begin + FreeAndNil(FDefaultHints); + FreeAndNil(FDefaultCaptions); + FreeAndNil(FHints); + FreeAndNil(FCaptions); + FreeAndNil(FDisabledImageChangeLink); + FreeAndNil(FImageChangeLink); + {$IFDEF D10_4+} + FreeAndNil(FButtonImages); + {$ENDIF} + inherited Destroy; +end; + +{$IFDEF D10_4+} +class destructor TCustomStyledDBNavigator.Destroy; +begin + FreeAndNil(FButtonsImageCollection); +end; + +procedure TCustomStyledDBNavigator.ChangeScale(M, D: Integer; isDpiChange: Boolean); +begin + inherited; + if FButtonImages <> nil then + FButtonImages.SetSize(MulDiv(FButtonImages.Width, M, D), MulDiv(FButtonImages.Height, M, D)); +end; + +procedure TCustomStyledDBNavigator.CMStyleChanged(var Message: TMessage); +begin + UpdateButtonsIcons; + Invalidate; +end; + +procedure TCustomStyledDBNavigator.UpdateButtonsImageIndex; +var + I: TNavigateBtn; + Btn: TStyledNavButton; +begin + for I := Low(FButtons) to High(FButtons) do + begin + Btn := Buttons[I]; + if (FKind = dbnVertical) and (I in NavigatorMoveBtns) then + Btn.ImageIndex := Ord(I) + Ord(High(FButtons)) +1 + else + Btn.ImageIndex := Ord(I); + end; +end; + +procedure TCustomStyledDBNavigator.UpdateButtonsIcons; +var + LStyleName, LBtnName: string; + LThemeAttribute: TThemeAttribute; +begin + if Assigned(FImages) then + begin + UpdateButtonsImageIndex; + Exit; + end; + + if (StyleFamily = DEFAULT_CLASSIC_FAMILY) then + LStyleName := StyleClass; + if LStyleName = 'Windows' then + LStyleName := GetActiveStyleName; + for var I := Low(FButtons) to High(FButtons) do + begin + var Btn := Buttons[I]; + LBtnName := BtnTypeName[I]; + + if (LStyleName = 'Windows') then + begin + //Use colored images (for backward compatibility) + LBtnName := COLORED_IMAGE_COLLECTION+LBtnName; + end + else + begin + if GetStyleAttributes(LStyleName, LThemeAttribute) then + begin + if LThemeAttribute.ThemeType = ttLight then + //Use black images for light theme + LBtnName := BLACK_IMAGE_COLLECTION+LBtnName + else + //Use white images for dark theme + LBtnName := WHITE_IMAGE_COLLECTION+LBtnName; + end + else + //Use colored images (for backward compatibility) + LBtnName := COLORED_IMAGE_COLLECTION+LBtnName; + end; + + //Vertical images + if (FKind = dbnVertical) and + (I in NavigatorMoveBtns) then + LBtnName := LBtnName+VERTICAL_ICON; + Btn.ImageName := LBtnName; + end; +end; +{$ELSE} +procedure TCustomStyledDBNavigator.SetButtonGlyph(Index: TNavigateBtn); +var + LResName: string; +begin + FmtStr(LResName, 'SNB_%s', [BtnTypeName[Index]]); + FButtons[Index].NumGlyphs := 2; + FButtons[Index].Glyph.LoadFromResourceName(HInstance, LResName); +end; +{$ENDIF} + +procedure TCustomStyledDBNavigator.Paint; +begin + if StyleServices.Enabled and not StyleServices.IsSystemStyle then + with Canvas do + begin + Brush.Style := bsSolid; + Brush.Color := StyleServices.GetSystemColor(clBtnFace); + FillRect(Rect(0, 0, Width, Height)); + end + else + inherited; +end; + +procedure TCustomStyledDBNavigator.ImageListChange(Sender: TObject); +begin + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + ABtn.Images := Images; + if not Assigned(Images) then + {$IFDEF D10_4+} + ABtn.Images := FButtonImages; + {$ELSE} + ABtn.ImageIndex := -1; + {$ENDIF} + end); + {$IFDEF D10_4+} + UpdateButtonsIcons; + {$ELSE} + UpdateButtonsGlyphs; + {$ENDIF} +end; + +procedure TCustomStyledDBNavigator.DisabledImageListChange(Sender: TObject); +begin + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + ABtn.DisabledImages := DisabledImages; + end + ); +end; + +procedure TCustomStyledDBNavigator.ProcessButtons(AButtonProc: TButtonProc); +var + I: TNavigateBtn; +begin + for I := Low(FButtons) to High(FButtons) do + AButtonProc(FButtons[I]); +end; + +class procedure TCustomStyledDBNavigator.RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; const AAppearance: TStyledButtonAppearance; + const AStyleRadius: Integer; const ACursor: TCursor); +begin + _DefaultStyleDrawType := ADrawType; + _UseCustomDrawType := True; + _DefaultFamily := AFamily; + _DefaultClass := AClass; + _DefaultAppearance := AAppearance; + _DefaultStyleRadius := AStyleRadius; + _DefaultCursor := ACursor; +end; + +procedure TCustomStyledDBNavigator.InitButtons; +var + I: TNavigateBtn; + Btn: TStyledNavButton; + X, Y: Integer; +begin + FMinBtnSize := Point(20, 18); + X := 0; + Y := 0; + for I := Low(FButtons) to High(FButtons) do + begin + Btn := TStyledNavButton.Create(Self); + Btn.Flat := Flat; + Btn.Index := I; + Btn.Visible := I in FVisibleButtons; + Btn.Enabled := True; + Btn.SetBounds (X, Y, FMinBtnSize.X, FMinBtnSize.Y); + Btn.OnClick := ClickHandler; + Btn.OnMouseDown := BtnMouseDown; + Btn.Parent := Self; + FButtons[I] := Btn; + if Kind = dbnHorizontal then + X := X + FMinBtnSize.X + else + Y := Y + FMinBtnSize.Y; + end; + FButtons[TNavigateBtn.nbPrior].NavStyle := FButtons[TNavigateBtn.nbPrior].NavStyle + [nsAllowTimer]; + FButtons[TNavigateBtn.nbNext].NavStyle := FButtons[TNavigateBtn.nbNext].NavStyle + [nsAllowTimer]; + {$IFDEF D10_4+} + UpdateButtonsIcons; + {$ELSE} + UpdateButtonsGlyphs; + {$ENDIF} +end; + +procedure TCustomStyledDBNavigator.InitCaptions; +var + I: Integer; + J: TNavigateBtn; +begin + if not Assigned(FDefaultCaptions) then + begin + FDefaultCaptions := TStringList.Create; + for J := Low(FButtons) to High(FButtons) do + FDefaultCaptions.Add(LoadResString(BtnCaptionId[J])); + end; + for J := Low(FButtons) to High(FButtons) do + FButtons[J].Caption := FDefaultCaptions[Ord(J)]; + J := Low(FButtons); + for I := 0 to (FCaptions.Count - 1) do + begin + if FCaptions.Strings[I] <> '' then + FButtons[J].Caption := FCaptions.Strings[I]; + if J = High(FButtons) then + Exit; + Inc(J); + end; +end; + +procedure TCustomStyledDBNavigator.InitHints; +var + I: Integer; + J: TNavigateBtn; +begin + if not Assigned(FDefaultHints) then + begin + FDefaultHints := TStringList.Create; + for J := Low(FButtons) to High(FButtons) do + FDefaultHints.Add(LoadResString(BtnHintId[J])); + end; + for J := Low(FButtons) to High(FButtons) do + FButtons[J].Hint := FDefaultHints[Ord(J)]; + J := Low(FButtons); + for I := 0 to (FHints.Count - 1) do + begin + if FHints.Strings[I] <> '' then + FButtons[J].Hint := FHints.Strings[I]; + if J = High(FButtons) then + Exit; + Inc(J); + end; +end; + +function TCustomStyledDBNavigator.IsCustomDrawType: Boolean; +begin + Result := FCustomDrawType; +end; + +function TCustomStyledDBNavigator.IsCustomRadius: Boolean; +begin + Result := StyleRadius <> DEFAULT_RADIUS; +end; + +function TCustomStyledDBNavigator.IsStoredStyleAppearance: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + Result := FStyleAppearance <> LAppearance; +end; + +function TCustomStyledDBNavigator.IsStoredStyleClass: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + + if AsVCLStyle then + begin + Result := (FStyleClass <> GetActiveStyleName) + and not SameText(FStyleClass, 'Windows'); + end + else + Result := FStyleClass <> LClass; +end; + +function TCustomStyledDBNavigator.IsStoredStyleFamily: Boolean; +begin + Result := FStyleFamily <> DEFAULT_CLASSIC_FAMILY; +end; + +procedure TCustomStyledDBNavigator.HintsChanged(Sender: TObject); +begin + InitHints; +end; + +procedure TCustomStyledDBNavigator.CaptionsChanged(Sender: TObject); +begin + InitCaptions; +end; + +procedure TCustomStyledDBNavigator.SetFlat(const AValue: Boolean); +begin + if FFlat <> AValue then + begin + FFlat := AValue; + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + ABtn.Flat := AValue; + end); + end; +end; + +procedure TCustomStyledDBNavigator.SetHints(const AValue: TStrings); +begin + if AValue.Text = FDefaultHints.Text then + FHints.Clear else + FHints.Assign(AValue); +end; + +procedure TCustomStyledDBNavigator.SetCaptions(const AValue: TStrings); +begin + if AValue.Text = FDefaultCaptions.Text then + FCaptions.Clear else + FCaptions.Assign(AValue); +end; + +procedure TCustomStyledDBNavigator.SetImages(const AValue: TCustomImageList); +begin + if FImages <> AValue then + begin + FImages := AValue; + ImageListChange(Self); + end; +end; + +function TCustomStyledDBNavigator.GetHints: TStrings; +begin + if (csDesigning in ComponentState) and not (csWriting in ComponentState) and + not (csReading in ComponentState) and (FHints.Count = 0) then + Result := FDefaultHints else + Result := FHints; +end; + +function TCustomStyledDBNavigator.GetCaptions: TStrings; +begin + if (csDesigning in ComponentState) and not (csWriting in ComponentState) and + not (csReading in ComponentState) and (FCaptions.Count = 0) then + Result := FDefaultCaptions else + Result := FCaptions; +end; + +procedure TCustomStyledDBNavigator.SetKind(const AValue: TDBNavigatorKind); +begin + if FKind <> AValue then + begin + FKind := AValue; + if not (csLoading in ComponentState) then + SetBounds(Left, Top, Height, Width); + {$IFDEF D10_4+} + UpdateButtonsIcons; + {$ELSE} + UpdateButtonsGlyphs; + {$ENDIF} + Invalidate; + end; +end; + +function TCustomStyledDBNavigator.GetActiveStyleName: string; +begin + Result := Vcl.ButtonStylesAttributes.GetActiveStyleName(Self); +end; + +function TCustomStyledDBNavigator.GetButton( + const AValue: TNavigateBtn): TStyledNavButton; +begin + Result := FButtons[Avalue]; +end; + +function TCustomStyledDBNavigator.GetButtonItem( + AIndex: TNavigateBtn): TStyledNavButton; +begin + Result := GetButton(AIndex); +end; + +procedure TCustomStyledDBNavigator.GetChildren(Proc: TGetChildProc; Root: TComponent); +//var +// J: TNavigateBtn; +begin +// for J := Low(FButtons) to High(FButtons) do +// Proc(FButtons[J]); +end; + +procedure TCustomStyledDBNavigator.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) then + begin + if (AComponent = Images) then + Images := {$IFDEF D10_4+}FButtonImages;{$ELSE}nil;{$ENDIF} + if (AComponent = DisabledImages) then + DisabledImages := nil; + end; +end; + +procedure TCustomStyledDBNavigator.SetVisible(const AValue: TNavButtonSet); +var + I: TNavigateBtn; + W, H: Integer; +begin + W := Width; + H := Height; + FVisibleButtons := AValue; + for I := Low(FButtons) to High(FButtons) do + FButtons[I].Visible := I in FVisibleButtons; + SetSize(W, H); + if (W <> Width) or (H <> Height) then + inherited SetBounds (Left, Top, W, H); + Invalidate; +end; + +procedure TCustomStyledDBNavigator.UpdateStyleElements; +var + LStyleClass: TStyledButtonClass; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then Update style + //as VCL Style assigned to Dbnavigator or Global VCL Style + if seBorder in StyleElements then + StyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + FStyleClass := LStyleClass; + StyleApplied := ApplyDbnavigatorStyle; + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + ABtn.UpdateStyleElements; + ABtn.StyleDrawType := Self.StyleDrawType; + end); + end; + inherited; +end; + +procedure TCustomStyledDBNavigator.CalcMinSize(var W, H: Integer); +var + Count: Integer; + I: TNavigateBtn; +begin + if (csLoading in ComponentState) then Exit; + if FButtons[TNavigateBtn.nbFirst] = nil then Exit; + + Count := 0; + for I := Low(FButtons) to High(FButtons) do + if FButtons[I].Visible then + Inc(Count); + if Count = 0 then Inc(Count); + {$IFDEF D10_4+} + if Kind = dbnHorizontal then + begin + W := Max(W, Count * ScaleValue(FMinBtnSize.X)); + H := Max(H, ScaleValue(FMinBtnSize.Y)); + if Align = alNone then W := (W div Count) * Count; + end + else + begin + W := Max(W, ScaleValue(FMinBtnSize.X)); + H := Max(H, Count * ScaleValue(FMinBtnSize.Y)); + if Align = alNone then H := (H div Count) * Count; + end; + {$ELSE} + if Kind = dbnHorizontal then + begin + W := Max(W, Count * FMinBtnSize.X); + H := Max(H, FMinBtnSize.Y); + if Align = alNone then W := (W div Count) * Count; + end + else + begin + W := Max(W, FMinBtnSize.X); + H := Max(H, Count * FMinBtnSize.Y); + if Align = alNone then H := (H div Count) * Count; + end; + {$ENDIF} +end; + +procedure TCustomStyledDBNavigator.UpdateButtons; +begin + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + ABtn.UpdateButtonContent; + end); +end; + +procedure TCustomStyledDBNavigator.SetShowCaptions(const AValue: Boolean); +begin + if FShowCaptions <> AValue then + begin + FShowCaptions := AValue; + UpdateButtons; + end; +end; + +procedure TCustomStyledDBNavigator.SetSize(var W: Integer; var H: Integer); +var + Count: Integer; + I: TNavigateBtn; + Space, Temp, Remain: Integer; + X, Y: Integer; +begin + if (csLoading in ComponentState) then + Exit; + if FButtons[TNavigateBtn.nbFirst] = nil then + Exit; + + CalcMinSize(W, H); + + Count := 0; + for I := Low(FButtons) to High(FButtons) do + if FButtons[I].Visible then + Inc(Count); + if Count = 0 then Inc(Count); + + if Kind = dbnHorizontal then + begin + FButtonWidth := W div Count; + FButtonHeight := H; + Temp := Count * FButtonWidth; + if Align = alNone then W := Temp; + Remain := W - Temp; + end + else + begin + FButtonWidth := W; + FButtonHeight := H div Count; + Temp := Count * FButtonHeight; + if Align = alNone then H := Temp; + Remain := H - Temp; + end; + + X := 0; + Y := 0; + Temp := Count div 2; + + for I := Low(FButtons) to High(FButtons) do + begin + if FButtons[I].Visible then + begin + Space := 0; + if Remain <> 0 then + begin + Dec(Temp, Remain); + if Temp < 0 then + begin + Inc(Temp, Count); + Space := 1; + end; + end; + if Kind = dbnHorizontal then + begin + FButtons[I].SetBounds(X, Y, FButtonWidth + Space, Height); + Inc(X, FButtonWidth + Space); + end + else + begin + FButtons[I].SetBounds(X, Y, FButtonWidth, FButtonHeight + Space); + Inc(Y, FButtonHeight + Space); + end; + end + else + if Kind = dbnHorizontal then + FButtons[I].SetBounds(Width + 1, 0, FButtonWidth, Height) + else + FButtons[I].SetBounds(0, Height + 1, FButtonWidth, FButtonHeight); + end; +end; + +procedure TCustomStyledDBNavigator.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +var + LValue: TStyledButtonAppearance; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_APPEARANCE; + if (FStyleAppearance <> LValue) or not FStyleApplied then + begin + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + if ABtn.StyleAppearance = StyleAppearance then + ABtn.StyleAppearance := LValue; + end); + FStyleAppearance := LValue; + StyleApplied := ApplyDbnavigatorStyle; + end; +end; + +procedure TCustomStyledDBNavigator.SetStyleApplied(const AValue: Boolean); +begin + FStyleApplied := AValue; +end; + +procedure TCustomStyledDBNavigator.SetStyleClass(const AValue: TStyledButtonClass); +var + LValue: TStyledButtonClass; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_WINDOWS_CLASS; + if (LValue <> Self.FStyleClass) or not FStyleApplied then + begin + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + ABtn.StyleClass := LValue; + end); + FStyleClass := LValue; + {$IFDEF D10_4+} + UpdateButtonsIcons; + {$ENDIF} + StyleApplied := ApplyDbnavigatorStyle; + if (FStyleFamily = DEFAULT_CLASSIC_FAMILY) and + (LValue <> 'Windows') then + StyleElements := [seFont, seBorder]; + end; +end; + +procedure TCustomStyledDBNavigator.SetStyleDrawType( + const AValue: TStyledButtonDrawType); +begin + FCustomDrawType := True; + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + if ABtn.StyleDrawType = StyleDrawType then + ABtn.StyleDrawType := AValue; + end); + if FStyleDrawType <> AValue then + begin + FStyleDrawType := AValue; + StyleApplied := ApplyDbnavigatorStyle; + end; +end; + +procedure TCustomStyledDBNavigator.SetStyleFamily(const AValue: TStyledButtonFamily); +var + LValue: TStyledButtonFamily; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_CLASSIC_FAMILY; + if (LValue <> Self.FStyleFamily) or not FStyleApplied then + begin + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + if ABtn.StyleFamily = FStyleFamily then + ABtn.StyleFamily := LValue; + end); + FStyleFamily := LValue; + StyleApplied := ApplyDbnavigatorStyle; + {$IFDEF D10_4+} + UpdateButtonsIcons; + {$ENDIF} + end; + if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + StyleElements := [seFont, seClient, seBorder]; +end; + +procedure TCustomStyledDBNavigator.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + if AValue <= 0 then + raise EReadError.create(SInvalidProperty); + ProcessButtons( + procedure (ABtn: TStyledNavButton) + begin + if ABtn.StyleRadius = FStyleRadius then + ABtn.StyleRadius := AValue; + end); + FStyleRadius := AValue; + StyleApplied := ApplyDbnavigatorStyle; + end; +end; + +procedure TCustomStyledDBNavigator.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +var + W, H: Integer; +begin + W := AWidth; + H := AHeight; + if not HandleAllocated then SetSize(W, H); + inherited SetBounds (ALeft, ATop, W, H); +end; + +procedure TCustomStyledDBNavigator.WMSize(var Message: TWMSize); +var + W, H: Integer; +begin + inherited; + W := Width; + H := Height; + SetSize(W, H); +end; + +procedure TCustomStyledDBNavigator.WMWindowPosChanging(var Message: TWMWindowPosChanging); +begin + inherited; + if (SWP_NOSIZE and Message.WindowPos.Flags) = 0 then + CalcMinSize(Message.WindowPos.cx, Message.WindowPos.cy); +end; + +procedure TCustomStyledDBNavigator.BtnMouseDown(Sender: TObject; Button: TMouseButton; + Shift: TShiftState; X, Y: Integer); +var + OldFocus: TNavigateBtn; +begin + OldFocus := FocusedButton; + FocusedButton := TStyledNavButton (Sender).Index; + if TabStop and (GetFocus <> Handle) and CanFocus then + begin + SetFocus; + if (GetFocus <> Handle) then + Exit; + end + else if TabStop and (GetFocus = Handle) and (OldFocus <> FocusedButton) then + begin + FButtons[OldFocus].Invalidate; + FButtons[FocusedButton].Invalidate; + end; +end; + +function TCustomStyledDBNavigator.ApplyDbnavigatorStyle: Boolean; +var + LButtonFamily: TButtonFamily; + LAttributesNormal, LAttributesOther: TStyledButtonAttributes; +begin + Result := StyleFamilyCheckAttributes(FStyleFamily, + FStyleClass, FStyleAppearance, LButtonFamily); + if Result or (csDesigning in ComponentState) then + begin + LAttributesNormal := nil; + LAttributesOther := nil; + try + LAttributesNormal := TStyledButtonAttributes.Create(nil); + LAttributesOther := TStyledButtonAttributes.Create(nil); + StyleFamilyUpdateAttributes( + FStyleFamily, + FStyleClass, + FstyleAppearance, + LAttributesNormal, + LAttributesOther, + LAttributesOther, + LAttributesOther, + LAttributesOther); +(* + if not FCustomDrawType then + begin + FStyleDrawType := LAttributesNormal.DrawType; + FCustomDrawType := False; + end; +*) + finally + LAttributesNormal.Free; + LAttributesOther.Free; + end; + end; +end; + +procedure TCustomStyledDBNavigator.Assign(Source: TPersistent); +var + LNavigator: TCustomStyledDBNavigator; +begin + inherited Assign(Source); + if Source is TCustomStyledDBNavigator then + begin + LNavigator := TCustomStyledDBNavigator(Source); + FFlat := LNavigator.FFlat; + FKind := LNavigator.FKind; + FConfirmDelete := LNavigator.FConfirmDelete; + DisabledImages := LNavigator.FDisabledImages; + Images := LNavigator.FImages; + FShowCaptions := LNavigator.FShowCaptions; + FStyleRadius := LNavigator.FStyleRadius; + FStyleDrawType := LNavigator.FStyleDrawType; + FStyleFamily := LNavigator.FStyleFamily; + FStyleClass := LNavigator.FStyleClass; + FStyleAppearance := LNavigator.FStyleAppearance; + Invalidate; + end; +end; + +function TCustomStyledDBNavigator.AsVCLStyle: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements); +end; + +procedure TCustomStyledDBNavigator.SetAsVCLComponent(const AValue: Boolean); +begin + if AValue <> GetAsVCLComponent then + begin + if AValue then + begin + FStyleFamily := DEFAULT_CLASSIC_FAMILY; + FStyleClass := DEFAULT_WINDOWS_CLASS; + FStyleAppearance := DEFAULT_APPEARANCE; + StyleElements := StyleElements + [seClient]; + FCustomDrawType := False; + end + else if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + begin + StyleElements := StyleElements - [seClient]; + end; + UpdateStyleElements; + end; +end; + +function TCustomStyledDBNavigator.GetAsVCLComponent: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements) and + (FStyleClass = GetActiveStyleName); +end; + +procedure TCustomStyledDBNavigator.WMSetFocus(var Message: TWMSetFocus); +begin + FButtons[FocusedButton].Invalidate; +end; + +procedure TCustomStyledDBNavigator.WMKillFocus(var Message: TWMKillFocus); +begin + FButtons[FocusedButton].Invalidate; +end; + +procedure TCustomStyledDBNavigator.KeyDown(var Key: Word; Shift: TShiftState); +var + NewFocus: TNavigateBtn; + OldFocus: TNavigateBtn; +begin + OldFocus := FocusedButton; + case Key of + VK_RIGHT: + begin + if OldFocus < High(FButtons) then + begin + NewFocus := OldFocus; + repeat + NewFocus := Succ(NewFocus); + until (NewFocus = High(FButtons)) or (FButtons[NewFocus].Visible); + if FButtons[NewFocus].Visible then + begin + FocusedButton := NewFocus; + FButtons[OldFocus].Invalidate; + FButtons[NewFocus].Invalidate; + end; + end; + end; + VK_LEFT: + begin + NewFocus := FocusedButton; + repeat + if NewFocus > Low(FButtons) then + NewFocus := Pred(NewFocus); + until (NewFocus = Low(FButtons)) or (FButtons[NewFocus].Visible); + if NewFocus <> FocusedButton then + begin + FocusedButton := NewFocus; + FButtons[OldFocus].Invalidate; + FButtons[FocusedButton].Invalidate; + end; + end; + VK_SPACE: + begin + if FButtons[FocusedButton].Enabled then + FButtons[FocusedButton].Click; + end; + end; +end; + +procedure TCustomStyledDBNavigator.WMGetDlgCode(var Message: TWMGetDlgCode); +begin + Message.Result := DLGC_WANTARROWS; +end; + +procedure TCustomStyledDBNavigator.SetDbNavigatorStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + StyleFamily := AStyleFamily; + StyleClass := AStyleClass; + StyleAppearance := AStyleAppearance; + if not ApplyDbnavigatorStyle then + raise EStyledButtonError.CreateFmt(ERROR_SETTING_DBNAVIGATOR_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TCustomStyledDBNavigator.SetDisabledImages(const AValue: TCustomImageList); +begin + if FDisabledImages <> AValue then + begin + FDisabledImages := AValue; + DisabledImageListChange(Self); + end; +end; + +procedure TCustomStyledDBNavigator.Loaded; +var + W, H: Integer; +begin + inherited Loaded; + W := Width; + H := Height; + SetSize(W, H); + if (W <> Width) or (H <> Height) then + inherited SetBounds (Left, Top, W, H); + InitHints; +end; + +{ TStyledDBNavigator } + +procedure TStyledDBNavigator.ActiveChanged; +var + I: TNavigateBtn; +begin + if not (Enabled and FDataLink.Active) then + for I := Low(FButtons) to High(FButtons) do + FButtons[I].Enabled := False + else + begin + DataChanged; + EditingChanged; + end; +end; + +procedure TStyledDBNavigator.ApplyUpdates; +var + Intf: IDataSetCommandSupport; +begin + if (Self.DataSource <> nil) and Supports(Self.DataSource.DataSet, IDataSetCommandSupport, Intf) then + Intf.ExecuteCommand(sApplyUpdatesDataSetCommand, [MaxErrors]) +end; + +procedure TStyledDBNavigator.BtnClick(Index: TNavigateBtn); +begin + if (DataSource <> nil) and (DataSource.State <> dsInactive) then + begin + if not (csDesigning in ComponentState) and Assigned(FBeforeAction) then + FBeforeAction(Self, Index); + with DataSource.DataSet do + begin + case Index of + TNavigateBtn.nbPrior: Prior; + TNavigateBtn.nbNext: Next; + TNavigateBtn.nbFirst: First; + TNavigateBtn.nbLast: Last; + TNavigateBtn.nbInsert: Insert; + TNavigateBtn.nbEdit: Edit; + TNavigateBtn.nbCancel: Cancel; + TNavigateBtn.nbPost: Post; + TNavigateBtn.nbRefresh: Refresh; + TNavigateBtn.nbDelete: + if not FConfirmDelete or + (StyledMessageDlg(SDeleteRecordQuestion, mtConfirmation, + mbOKCancel, 0) <> idCancel) then Delete; + TNavigateBtn.nbApplyUpdates: Self.ApplyUpdates; + TNavigateBtn.nbCancelUpdates: Self.CancelUpdates; + end; + end; + end; + if not (csDesigning in ComponentState) and Assigned(FOnNavClick) then + FOnNavClick(Self, Index); +end; + +function TStyledDBNavigator.CanApplyUpdates: Boolean; +var + Intf: IDataSetCommandSupport; +begin + if (Self.DataSource <> nil) and Supports(Self.DataSource.DataSet, IDataSetCommandSupport, Intf) then + Result := dcEnabled in Intf.GetCommandStates(sApplyUpdatesDataSetCommand) + else + Result := False; +end; + +function TStyledDBNavigator.CanCancelUpdates: Boolean; +var + Intf: IDataSetCommandSupport; +begin + if (Self.DataSource <> nil) and Supports(Self.DataSource.DataSet, IDataSetCommandSupport, Intf) then + Result := dcEnabled in Intf.GetCommandStates(sCancelUpdatesDataSetCommand) + else + Result := False; +end; + +procedure TStyledDBNavigator.CancelUpdates; +var + Intf: IDataSetCommandSupport; +begin + if (Self.DataSource <> nil) and Supports(Self.DataSource.DataSet, IDataSetCommandSupport, Intf) then + Intf.ExecuteCommand(sCancelUpdatesDataSetCommand, [MaxErrors]) +end; + +procedure TStyledDBNavigator.ClickHandler(Sender: TObject); +begin + inherited; + BtnClick(TStyledNavButton(Sender).Index); +end; + +procedure TStyledDBNavigator.CMEnabledChanged(var Message: TMessage); +begin + inherited; + if not (csLoading in ComponentState) then + ActiveChanged; +end; + +constructor TStyledDBNavigator.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + FDataLink := TStyledNavDataLink.Create(Self); +end; + +procedure TStyledDBNavigator.DataChanged; +var + UpEnable, DnEnable: Boolean; + CanModify, CanRefresh: Boolean; +begin + CanModify := Enabled and FDataLink.Active and FDataLink.DataSet.CanModify; + CanRefresh := Enabled and FDataLink.Active and FDataLink.DataSet.CanRefresh; + UpEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.BOF; + DnEnable := Enabled and FDataLink.Active and not FDataLink.DataSet.EOF; + FButtons[TNavigateBtn.nbFirst].Enabled := UpEnable; + FButtons[TNavigateBtn.nbPrior].Enabled := UpEnable; + FButtons[TNavigateBtn.nbNext].Enabled := DnEnable; + FButtons[TNavigateBtn.nbLast].Enabled := DnEnable; + FButtons[TNavigateBtn.nbDelete].Enabled := CanModify and + not (FDataLink.DataSet.BOF and FDataLink.DataSet.EOF); + FButtons[TNavigateBtn.nbRefresh].Enabled := CanRefresh; + FButtons[TNavigateBtn.nbApplyUpdates].Enabled := CanModify and Self.CanApplyUpdates; + FButtons[TNavigateBtn.nbCancelUpdates].Enabled := CanModify and Self.CanCancelUpdates; +end; + +destructor TStyledDBNavigator.Destroy; +begin + FreeAndNil(FDataLink); + inherited Destroy; +end; + +procedure TStyledDBNavigator.EditingChanged; +var + CanModify: Boolean; +begin + CanModify := Enabled and FDataLink.Active and FDataLink.DataSet.CanModify; + Buttons[TNavigateBtn.nbInsert].Enabled := CanModify; + Buttons[TNavigateBtn.nbEdit].Enabled := CanModify and not FDataLink.Editing; + Buttons[TNavigateBtn.nbPost].Enabled := CanModify and FDataLink.Editing; + Buttons[TNavigateBtn.nbCancel].Enabled := CanModify and FDataLink.Editing; + Buttons[TNavigateBtn.nbRefresh].Enabled := Enabled and (TNavigateBtn.nbRefresh in VisibleButtons) and FDataLink.Active and FDataLink.DataSet.CanRefresh; + Buttons[TNavigateBtn.nbApplyUpdates].Enabled := CanModify and (TNavigateBtn.nbApplyUpdates in VisibleButtons) and Self.CanApplyUpdates; + Buttons[TNavigateBtn.nbCancelUpdates].Enabled := CanModify and (TNavigateBtn.nbCancelUpdates in VisibleButtons) and Self.CanCancelUpdates; +end; + +function TStyledDBNavigator.GetDataSource: TDataSource; +begin + Result := FDataLink.DataSource; +end; + +procedure TStyledDBNavigator.Loaded; +begin + inherited; + ActiveChanged; +end; + +procedure TStyledDBNavigator.Notification(AComponent: TComponent; + Operation: TOperation); +begin + inherited Notification(AComponent, Operation); + if (Operation = opRemove) then + begin + if (FDataLink <> nil) and (AComponent = DataSource) then + DataSource := nil; + end; +end; + +procedure TStyledDBNavigator.SetDataSource(const AValue: TDataSource); +begin + FDataLink.DataSource := AValue; + if not (csLoading in ComponentState) then + ActiveChanged; + if AValue <> nil then + AValue.FreeNotification(Self); +end; + +{ TStyledNavButton } + +constructor TStyledNavButton.Create(AOwner: TComponent); +begin + if AOwner is TCustomStyledDbNavigator then + begin + FDbNavigator := TCustomStyledDbNavigator(AOwner); + inherited CreateStyled(AOwner, + FDbNavigator._DefaultFamily, FDbNavigator._DefaultClass, + FDbNavigator._DefaultAppearance, + FDbNavigator._DefaultStyleDrawType, + FDbNavigator._DefaultCursor, + FDbNavigator._UseCustomDrawType); + StyleRadius := FDbNavigator.StyleRadius; + ControlStyle := [csCaptureMouse, csDoubleClicks, csSetCaption, csOpaque]; + end + else + inherited Create(AOwner); + //ControlStyle := ControlStyle + [csCaptureMouse]; + ImageAlignment := iaTop; +end; + +destructor TStyledNavButton.Destroy; +begin + if FRepeatTimer <> nil then + FRepeatTimer.Free; + inherited Destroy; +end; + +function TStyledNavButton.GetCaptionToDraw: TCaption; +begin + if Assigned(FDbNavigator) and not FDbNavigator.ShowCaptions then + Result := '' + else + Result := inherited GetCaption; +end; + +function TStyledNavButton.IsCustomDrawType: Boolean; +begin + if Assigned(FDbNavigator) then + Result := StyleDrawType <> FDbNavigator.StyleDrawType + else + Result := StyleDrawType <> btRoundRect; +end; + +function TStyledNavButton.IsCustomRadius: Boolean; +begin + if Assigned(FDbNavigator) then + Result := StyleRadius <> FDbNavigator.StyleRadius + else + Result := StyleRadius <> DEFAULT_RADIUS; +end; + +function TStyledNavButton.IsCustomRoundedCorners: Boolean; +begin + Result := StyleRoundedCorners <> ALL_ROUNDED_CORNERS; +end; + +function TStyledNavButton.IsImageAlignmentStored: Boolean; +begin + if Assigned(FDbNavigator) then + Result := FImageAlignment <> iaTop + else + Result := True; +end; + +function TStyledNavButton.IsStoredStyleFamily: Boolean; +begin + if Assigned(FDbNavigator) then + Result := not SameText(StyleFamily,FDbNavigator.StyleFamily) + else + Result := True; +end; + +function TStyledNavButton.IsStoredStyleAppearance: Boolean; +begin + if Assigned(FDbNavigator) then + Result := not SameText(StyleAppearance, FDbNavigator.StyleAppearance) + else + Result := True; +end; + +function TStyledNavButton.IsStoredStyleClass: Boolean; +begin + if Assigned(FDbNavigator) then + Result := not SameText(StyleClass,FDbNavigator.StyleClass) + else + Result := inherited IsStoredStyleClass; +end; + +procedure TStyledNavButton.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + inherited MouseDown(Button, Shift, X, Y); + if nsAllowTimer in FNavStyle then + begin + if FRepeatTimer = nil then + FRepeatTimer := TTimer.Create(Self); + + FRepeatTimer.OnTimer := TimerExpired; + FRepeatTimer.Interval := InitRepeatPause; + FRepeatTimer.Enabled := True; + end; + if (Button = mbLeft) and Enabled then + begin + FDragging := True; + end; +end; + +procedure TStyledNavButton.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +var + DoClick: Boolean; +begin + if FRepeatTimer <> nil then + FRepeatTimer.Enabled := False; + inherited MouseUp(Button, Shift, X, Y); + if FDragging then + begin + FDragging := False; + DoClick := (X >= 0) and (X < ClientWidth) and (Y >= 0) and (Y <= ClientHeight); + if DoClick then Click; + end; +end; + +procedure TStyledNavButton.TimerExpired(Sender: TObject); +begin + FRepeatTimer.Interval := RepeatPause; + if (Buttonstate = bsmPressed) and (MouseInControl) then + begin + try + Click; + except + FRepeatTimer.Enabled := False; + raise; + end; + end; +end; + +procedure TStyledNavButton.UpdateButtonContent; +begin + //Updates content of Button based on ShowCaptions and Style + if Assigned(FDbNavigator) then + begin + if FDbNavigator.ShowCaptions then + begin + inherited ImageAlignment := FImageAlignment; + case FImageAlignment of + iaLeft: inherited ImageMargins.Left := DEFAULT_IMAGE_MARGIN; + iaRight: inherited ImageMargins.Right := DEFAULT_IMAGE_MARGIN; + iaTop: inherited ImageMargins.Top := DEFAULT_IMAGE_MARGIN; + iaBottom: inherited ImageMargins.Bottom := DEFAULT_IMAGE_MARGIN; + end; + end + else + begin + inherited ImageAlignment := iaCenter; + end; + if Assigned(FDbNavigator.Images) then + inherited Images := FDbNavigator.Images + else + inherited Images := {$IFDEF D10_4+}FDbNavigator.FButtonImages;{$ELSE}nil;{$ENDIF} + inherited DisabledImages := FDbNavigator.DisabledImages; + StyleElements := FDbNavigator.StyleElements; + end; + Invalidate; +end; + +procedure TStyledNavButton.Paint; +begin + inherited Paint; +end; + +procedure TStyledNavButton.SetCaption(const AValue: TCaption); +begin + if AValue <> (inherited Caption) then + begin + inherited SetCaption(AValue); + Invalidate; + end; +end; + +procedure TStyledNavButton.SetImageAlignment(const AValue: TImageAlignment); +begin + if FImageAlignment <> AValue then + begin + FImageAlignment := AValue; + UpdateButtonContent; + end; +end; + +{ TStyledNavDataLink } + +constructor TStyledNavDataLink.Create(ANav: TStyledDBNavigator); +begin + inherited Create; + FNavigator := ANav; + VisualControl := True; +end; + +destructor TStyledNavDataLink.Destroy; +begin + FNavigator := nil; + inherited Destroy; +end; + +procedure TStyledNavDataLink.EditingChanged; +begin + if FNavigator <> nil then + FNavigator.EditingChanged; +end; + +procedure TStyledNavDataLink.DataSetChanged; +begin + if FNavigator <> nil then + FNavigator.DataChanged; +end; + +procedure TStyledNavDataLink.ActiveChanged; +begin + if FNavigator <> nil then + FNavigator.ActiveChanged; +end; + +var + NavigateButtonHintId: array[TNavigateButton] of string = (SFirstRecord, SPriorRecord, + SNextRecord, SLastRecord, SInsertRecord, SDeleteRecord, SEditRecord, + SPostEdit, SCancelEdit, SRefreshRecord, + SApplyUpdates, SCancelUpdates); + +{ TStyledBindNavigator } + +procedure TStyledBindNavigator.ClickHandler(Sender: TObject); +begin + inherited; + BtnClick(NavBtnToNavigateButton(TStyledNavButton(Sender).Index)); +end; + +constructor TStyledBindNavigator.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + VisibleButtons := NavigatorDefaultButtons; + FController := TBindNavigatorController.Create(Self); + FController.OnEditingChanged := OnEditingChanged; + FController.OnDataChanged := OnDataChanged; + FController.OnActiveChanged := OnActiveChanged; +end; + +procedure TStyledBindNavigator.ActiveChanged; +var + LActive: Boolean; +begin + LActive := FController.Active; + if not (Enabled and LActive) then + FController.DisableButtons( + procedure(AButton: TNavigateButton; AEnabled: Boolean) + begin + Buttons[AButton].Enabled := AEnabled; + end) + else + begin + FController.EnableButtons(NavigatorButtons, Self.Enabled, + procedure(AButton: TNavigateButton; AEnabled: Boolean) + begin + Buttons[AButton].Enabled := AEnabled; + end) + end; +end; + +procedure TStyledBindNavigator.DataChanged; +begin + FController.EnableButtons(NavigatorScrollButtons + + [nbDelete, nbApplyUpdates, nbCancelUpdates], Self.Enabled, + procedure(AButton: TNavigateButton; AEnabled: Boolean) + begin + Buttons[AButton].Enabled := AEnabled; + end); +end; + +destructor TStyledBindNavigator.Destroy; +begin + FreeAndNil(FController); + inherited; +end; + +procedure TStyledBindNavigator.EditingChanged; +begin + FController.EnableButtons(NavigatorEditButtons - [nbDelete], Enabled, + procedure(AButton: TNavigateButton; AEnabled: Boolean) + begin + Buttons[AButton].Enabled := AEnabled; + end); +end; + +procedure TStyledBindNavigator.OnEditingChanged(Sender: TObject); +begin + EditingChanged; +end; + +procedure TStyledBindNavigator.OnActiveChanged(Sender: TObject); +begin + ActiveChanged; +end; + +procedure TStyledBindNavigator.OnDataChanged(Sender: TObject); +begin + DataChanged; +end; + +procedure TStyledBindNavigator.SetDataSource(Value: TBaseLinkingBindSource); +begin + if FController.DataSource <> Value then + begin + FController.DataSource := Value; + if not (csLoading in ComponentState) then + ActiveChanged; + end; +end; + +function TStyledBindNavigator.GetOrientation: TNavigatorOrientation; +begin + if inherited Kind = dbnHorizontal then + Result := orHorizontal + else + Result := orVertical; +end; + +function TStyledBindNavigator.GetVisibleButtons: TNavigateButtons; +begin + Result := NavBtnsToNavigateButtons(inherited VisibleButtons); +end; + +procedure TStyledBindNavigator.SetOrientation(const Value: TNavigatorOrientation); +begin + if Value = orHorizontal then + inherited Kind := dbnHorizontal + else + inherited Kind := dbnVertical; +end; + +function TStyledBindNavigator.NavigateButtonsToNavBtns( + const AValue: TNavigateButtons): TNavButtonSet; +begin + Result := []; + if TNavigateButton.nbFirst in AValue then Result := Result + [TNavigateBtn.nbFirst]; + if TNavigateButton.nbPrior in AValue then Result := Result + [TNavigateBtn.nbPrior]; + if TNavigateButton.nbNext in AValue then Result := Result + [TNavigateBtn.nbNext]; + if TNavigateButton.nbLast in AValue then Result := Result + [TNavigateBtn.nbLast]; + if TNavigateButton.nbInsert in AValue then Result := Result + [TNavigateBtn.nbInsert]; + if TNavigateButton.nbDelete in AValue then Result := Result + [TNavigateBtn.nbDelete]; + if TNavigateButton.nbEdit in AValue then Result := Result + [TNavigateBtn.nbEdit]; + if TNavigateButton.nbPost in AValue then Result := Result + [TNavigateBtn.nbPost]; + if TNavigateButton.nbCancel in AValue then Result := Result + [TNavigateBtn.nbCancel]; + if TNavigateButton.nbRefresh in AValue then Result := Result + [TNavigateBtn.nbRefresh]; + if TNavigateButton.nbApplyUpdates in AValue then Result := Result + [TNavigateBtn.nbApplyUpdates]; + if TNavigateButton.nbCancelUpdates in AValue then Result := Result + [TNavigateBtn.nbCancelUpdates]; +end; + +function TStyledBindNavigator.NavBtnsToNavigateButtons( + const AValue: TNavButtonSet): TNavigateButtons; +begin + Result := []; + if TNavigateBtn.nbFirst in AValue then Result := Result + [TNavigateButton.nbFirst]; + if TNavigateBtn.nbPrior in AValue then Result := Result + [TNavigateButton.nbPrior]; + if TNavigateBtn.nbNext in AValue then Result := Result + [TNavigateButton.nbNext]; + if TNavigateBtn.nbLast in AValue then Result := Result + [TNavigateButton.nbLast]; + if TNavigateBtn.nbInsert in AValue then Result := Result + [TNavigateButton.nbInsert]; + if TNavigateBtn.nbDelete in AValue then Result := Result + [TNavigateButton.nbDelete]; + if TNavigateBtn.nbEdit in AValue then Result := Result + [TNavigateButton.nbEdit]; + if TNavigateBtn.nbPost in AValue then Result := Result + [TNavigateButton.nbPost]; + if TNavigateBtn.nbCancel in AValue then Result := Result + [TNavigateButton.nbCancel]; + if TNavigateBtn.nbRefresh in AValue then Result := Result + [TNavigateButton.nbRefresh]; + if TNavigateBtn.nbApplyUpdates in AValue then Result := Result + [TNavigateButton.nbApplyUpdates]; + if TNavigateBtn.nbCancelUpdates in AValue then Result := Result + [TNavigateButton.nbCancelUpdates]; +end; + +function TStyledBindNavigator.NavigateButtonToNavBtn( + const AValue: TNavigateButton): TNavigateBtn; +begin + case AValue of + TNavigateButton.nbFirst: Result := TNavigateBtn.nbFirst; + TNavigateButton.nbPrior: Result := TNavigateBtn.nbPrior; + TNavigateButton.nbNext: Result := TNavigateBtn.nbNext; + TNavigateButton.nbLast: Result := TNavigateBtn.nbLast; + TNavigateButton.nbInsert: Result := TNavigateBtn.nbInsert; + TNavigateButton.nbDelete: Result := TNavigateBtn.nbDelete; + TNavigateButton.nbEdit: Result := TNavigateBtn.nbEdit; + TNavigateButton.nbPost: Result := TNavigateBtn.nbPost; + TNavigateButton.nbCancel: Result := TNavigateBtn.nbCancel; + TNavigateButton.nbRefresh: Result := TNavigateBtn.nbRefresh; + TNavigateButton.nbApplyUpdates: Result := TNavigateBtn.nbApplyUpdates; + TNavigateButton.nbCancelUpdates: Result := TNavigateBtn.nbCancelUpdates; + else + Result := TNavigateBtn.nbFirst; + end; +end; + +function TStyledBindNavigator.NavBtnToNavigateButton( + const AValue: TNavigateBtn): TNavigateButton; +begin + case AValue of + TNavigateBtn.nbFirst : Result := TNavigateButton.nbFirst; + TNavigateBtn.nbPrior : Result := TNavigateButton.nbPrior; + TNavigateBtn.nbNext : Result := TNavigateButton.nbNext; + TNavigateBtn.nbLast : Result := TNavigateButton.nbLast; + TNavigateBtn.nbInsert : Result := TNavigateButton.nbInsert; + TNavigateBtn.nbDelete : Result := TNavigateButton.nbDelete; + TNavigateBtn.nbEdit : Result := TNavigateButton.nbEdit; + TNavigateBtn.nbPost : Result := TNavigateButton.nbPost; + TNavigateBtn.nbCancel : Result := TNavigateButton.nbCancel; + TNavigateBtn.nbRefresh : Result := TNavigateButton.nbRefresh; + TNavigateBtn.nbApplyUpdates : Result := TNavigateButton.nbApplyUpdates; + TNavigateBtn.nbCancelUpdates: Result := TNavigateButton.nbCancelUpdates; + else + Result := TNavigateButton.nbFirst; + end; +end; + +procedure TStyledBindNavigator.SetVisible(const Value: TNavigateButtons); +begin + inherited VisibleButtons := NavigateButtonsToNavBtns(Value); +end; + +function TStyledBindNavigator.GetDataSource: TBaseLinkingBindSource; +begin + Result := FController.DataSource as TBaseLinkingBindSource; +end; + +function TStyledBindNavigator.GetButton(Index: TNavigateButton): TStyledNavButton; +begin + Result := inherited GetButton(NavigateButtonToNavBtn(Index)); +end; + +procedure TStyledBindNavigator.BtnClick(Index: TNavigateButton); +begin + if (DataSource <> nil) then + begin + if not (csDesigning in ComponentState) and Assigned(BeforeAction) then + BeforeAction(Self, Index); + FController.ExecuteButton(Index, + function: Boolean + begin + Result := not ConfirmDelete or + (MessageDlg(SDeleteRecordQuestion, mtConfirmation, + mbOKCancel, 0) <> idCancel); + end + ); + end; + if not (csDesigning in ComponentState) and Assigned(OnClick) then + OnClick(Self, Index); +end; + +initialization + TCustomStyledDBNavigator._DefaultStyleDrawType := DEFAULT_STYLEDRAWTYPE; + TCustomStyledDBNavigator._DefaultFamily := DEFAULT_CLASSIC_FAMILY; + TCustomStyledDBNavigator._DefaultClass := DEFAULT_WINDOWS_CLASS; + TCustomStyledDBNavigator._DefaultAppearance := DEFAULT_APPEARANCE; + TCustomStyledDBNavigator._DefaultStyleRadius := DEFAULT_RADIUS; + TCustomStyledDBNavigator._DefaultCursor := DEFAULT_CURSOR; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledGraphicsUtils.pas b/Ext/StyledComponents/source/Vcl.StyledGraphicsUtils.pas new file mode 100644 index 0000000..3f93069 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledGraphicsUtils.pas @@ -0,0 +1,140 @@ +{******************************************************************************} +{ } +{ Vcl.StyledGraphicUtils: utilities for Styled Components } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledGraphicsUtils; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Classes + , ImgList + , Windows + , Graphics + , Vcl.Imaging.pngimage + , Vcl.StyledButton + , ComCtrls; + +procedure StyledButtonExportToPng(AButtonRender: TStyledButtonRender; + const AWidth, AHeight: Integer; + const AOutFolder: string; const AFileName: string = ''); + +implementation + +uses + System.SysUtils + , System.Types + , System.IOUtils + , Vcl.Themes + , Vcl.Clipbrd + ; + +// Source: http://www.entwickler-ecke.de/topic_Bitmap+pf32bit+mit+Alpha+afPremultipied+zu+PNG+speichern_103159,0.html +type + TRGB = packed record B, G, R: byte end; + TRGBA = packed record B, G, R, A: byte end; + TRGBAArray = array[0..0] of TRGBA; + +{$R-} +function PNG4TransparentBitMap(aBitmap: TBitmap): TPNGImage; +var + X, Y: integer; + BmpRGBA: ^TRGBAArray; + PngRGB: ^TRGB; +begin + //201011 Thomas Wassermann + Result := TPNGImage.CreateBlank(COLOR_RGBALPHA, 8, aBitmap.Width , aBitmap.Height); + + Result.CreateAlpha; + Result.Canvas.CopyMode:= cmSrcCopy; + Result.Canvas.Draw(0, 0, aBitmap); + + for Y := 0 to Pred(aBitmap.Height) do + begin + BmpRGBA := aBitmap.ScanLine[Y]; + PngRGB:= Result.Scanline[Y]; + aBitmap.AlphaFormat := TAlphaFormat.afDefined; // Enable alpha channel + for X := 0 to Pred(aBitmap.width) do + begin + Result.AlphaScanline[Y][X] := BmpRGBA[X].A; + if aBitmap.AlphaFormat in [afDefined, afPremultiplied] then + begin + if BmpRGBA[X].A <> 0 then + begin + PngRGB^.B := Round(BmpRGBA[X].B / BmpRGBA[X].A * 255); + PngRGB^.R := Round(BmpRGBA[X].R / BmpRGBA[X].A * 255); + PngRGB^.G := Round(BmpRGBA[X].G / BmpRGBA[X].A * 255); + end + else + begin + PngRGB^.B := Round(BmpRGBA[X].B * 255); + PngRGB^.R := Round(BmpRGBA[X].R * 255); + PngRGB^.G := Round(BmpRGBA[X].G * 255); + end; + end; + Inc(PngRGB); + end; + end; +end; + +procedure StyledButtonExportToPng(AButtonRender: TStyledButtonRender; + const AWidth, AHeight: Integer; + const AOutFolder: string; + const AFileName: string = ''); +var + LImagePng: TPngImage; + LBitmap: TBitmap; + LFileName: string; + BmpRGBA: ^TRGBAArray; + PngRGB: ^TRGB; +begin + //Notice: this procedure works fine olny with + //DrawTextWithGDIPlus and DrawRectWithGDIPlus compiler directives + LBitmap := nil; + LImagePng := nil; + try + LBitmap := TBitmap.Create; + LBitmap.PixelFormat := TPixelFormat.pf32bit; // 32bit bitmap + LBitmap.AlphaFormat := TAlphaFormat.afDefined; // Enable alpha channel + + // Fill background with transparent + LBitmap.SetSize(AWidth, AHeight); + LBitmap.Canvas.Brush.Style := bsSolid; + LBitmap.Canvas.Brush.Color := AButtonRender.Font.Color; + LBitmap.Canvas.FillRect(Rect(0, 0, AWidth, AHeight)); + + AButtonRender.DrawButton(LBitmap.Canvas, False); + + LImagePng := PNG4TransparentBitMap(LBitmap); + LFileName := ChangeFileExt(TPath.Combine(AOutFolder,AFileName),'.png'); + LImagePng.SaveToFile(LFileName); + finally + LImagePng.free; + LBitmap.Free; + end; +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledMessagesHooks.pas b/Ext/StyledComponents/source/Vcl.StyledMessagesHooks.pas new file mode 100644 index 0000000..6f4d07b --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledMessagesHooks.pas @@ -0,0 +1,81 @@ +{******************************************************************************} +{ } +{ StyledMessagesHooks: an interposer Unit to use Styled Dialog Boxes } +{ using Standard Delphi calls MessageDialog or ShowMessage } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledMessagesHooks; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.Dialogs + ; + +function MessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; + +function MessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; + +function TaskDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; + +procedure ShowMessage(const Msg: string); + +implementation + +uses + Vcl.StyledTaskDialog + ; + +function MessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; +begin + Result := StyledMessageDlg(Msg, DlgType, Buttons, HelpCtx); +end; + +function MessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; +begin + Result := StyledMessageDlgPos(Msg, DlgType, Buttons, HelpCtx, X, Y); +end; + +function TaskDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; +begin + Result := StyledTaskDlgPos(Title, Msg, DlgType, Buttons, HelpCtx, X, Y); +end; + +procedure ShowMessage(const Msg: string); +begin + StyledShowMessage(Msg); +end; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledTaskDialog.pas b/Ext/StyledComponents/source/Vcl.StyledTaskDialog.pas new file mode 100644 index 0000000..b97c6ae --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledTaskDialog.pas @@ -0,0 +1,633 @@ +{******************************************************************************} +{ } +{ StyledTaskDialog: a Task Dialog Component with StyleButtons } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledTaskDialog; + +{$INCLUDE StyledComponents.inc} + +interface + +uses + System.SysUtils + , System.Classes + , WinApi.Windows + , Vcl.Dialogs + , Vcl.Graphics + , Vcl.Forms + , Vcl.ButtonStylesAttributes + ; + +const + DEFAULT_ALPHABLEND = 255; + DEFAULT_MAIN_ICON_SIZE = 64; + +type + TStyledDialogIcons = array[TMsgDlgType] of TIcon; + +{$WARN SYMBOL_PLATFORM OFF} +{ TaskDialog based message dialog; requires Windows Vista or later } +type + { TStyledTaskDialog } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledTaskDialog = class(TTaskDialog) + private + FHelpFile: string; + FParentWnd: HWND; + FPosition: TPoint; + FMainIconSize: Integer; + strict protected + function DoExecute(ParentWnd: HWND): Boolean; override; + procedure DoOnDialogCreated; override; + procedure DoOnHelp; override; + public + procedure DoOnHyperlinkClicked(const AURL: string); override; + constructor Create(AOwner: TComponent); override; + function Execute(ParentWnd: HWND): Boolean; overload; override; + property HelpFile: string read FHelpFile write FHelpFile; + property Position: TPoint read FPosition write FPosition; + property MainIconSize: Integer read FMainIconSize write FMainIconSize default DEFAULT_MAIN_ICON_SIZE; + end; + + // Abstraction of a Dialog Launcher + ITaskDialogLauncher = interface + ['{B2F16F98-C163-4706-A803-E624126D8DF6}'] + function DoExecute(ParentWnd: HWND; + const ADialogType: TMsgDlgType; + const ATaskDialog: TStyledTaskDialog; + const ADialogBtnFamily: TStyledButtonFamily): boolean; + end; + +function StyledMessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; +function StyledMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; + +function StyledMessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; +function StyledMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; + +function StyledMessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn; + CustomButtonCaptions: array of string): Integer; overload; +function StyledMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn; + CustomButtonCaptions: array of string): Integer; overload; + +function StyledMessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; overload; +function StyledMessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; overload; + +function StyledTaskDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; overload; +function StyledTaskDlgPos(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn; HelpCtx: Longint; + X: Integer = -1; Y: Integer = -1): Integer; overload; + +procedure StyledShowMessage(const Msg: string); overload; + +procedure SetUseAlwaysTaskDialog(AValue: boolean); +procedure RegisterCustomExecute(const AShowStyledTaskDialog: ITaskDialogLauncher; + const AButtonFamily: TStyledButtonFamily = ''); +procedure UnregisterCustomExecute; +procedure InitializeStyledTaskDialogs(AUseTaskDialog: Boolean; AFont: TFont; + const ADialogButtonsFamily: TStyledButtonFamily = ''; + const AAlphaBlendValue: Byte = DEFAULT_ALPHABLEND); +function GetTaskDlgType(const AIcon: TTaskDialogIcon): TMsgDlgType; +function GetDialogFont: TFont; +function GetDialogBtnFamily: TStyledButtonFamily; + +function GetDialogTypeTitle(const DlgType: TMsgDlgType): string; +function GetDialogAlphaBlendValue: Byte; + +implementation + +uses + System.TypInfo + , System.Math + , System.Types + , Vcl.Themes + , Winapi.CommCtrl + , System.WideStrUtils + , Winapi.MultiMon + , System.HelpIntfs + , System.UITypes + , Vcl.Controls + , Vcl.StdCtrls + , Vcl.ExtCtrls + , Vcl.Consts + , Winapi.ShellApi + , Vcl.StyledCmpMessages + , Vcl.StyledButton + , Vcl.StyledCmpStrUtils + , Vcl.StyledTaskDialogStdUnit + ; + +var + _TaskDialogExecute: ITaskDialogLauncher; + _DialogButtonsFamily: TStyledButtonFamily; + _CustomIcons: TStyledDialogIcons; + _DialogFont: TFont; + _UseAlwaysTaskDialog: boolean; + _AlphaBlendValue: Byte; + + ButtonNames: array[TMsgDlgBtn] of string = ( + 'Yes', 'No', 'OK', 'Cancel', 'Abort', 'Retry', 'Ignore', 'All', 'NoToAll', + 'YesToAll','Help','Close'); + ModalResults: array[TMsgDlgBtn] of Integer = ( + mrYes, mrNo, mrOk, mrCancel, mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, + mrYesToAll, 0, mrClose); + +function GetDialogAlphaBlendValue: Byte; +begin + Result := _AlphaBlendValue; +end; + +function GetDialogFont: TFont; +begin + Result := _DialogFont; +end; + +function GetDialogBtnFamily: TStyledButtonFamily; +begin + Result := _DialogButtonsFamily; +end; + +function IsTaskMessageSupported : Boolean; +begin +{$IFDEF D16+} + Result := (Win32MajorVersion >= 6) and StyleServices.Enabled; +{$ELSE} + Result := (Win32MajorVersion >= 6) and StyleServices.Enabled; +{$ENDIF} +end; + +function StyledMessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; overload; +begin + Result := StyledTaskDlgPos(GetDialogTypeTitle(DlgType), + Msg, DlgType, Buttons, HelpCtx, -1, -1); +end; + +function StyledMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; +begin + Result := StyledTaskDlgPos(Title, Msg, DlgType, Buttons, HelpCtx, -1, -1); +end; + +function StyledMessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; +begin + Result := StyledTaskDlgPos(GetDialogTypeTitle(DlgType), + Msg, DlgType, Buttons, DefaultButton, HelpCtx, -1, -1); +end; + +function StyledMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn): Integer; overload; +begin + Result := StyledTaskDlgPos(Title, Msg, DlgType, Buttons, DefaultButton, + HelpCtx, -1, -1); +end; + +function StyledMessageDlg(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn; + CustomButtonCaptions: array of string): Integer; overload; +begin + Result := StyledTaskDlgPos(GetDialogTypeTitle(DlgType), Msg, DlgType, + Buttons, DefaultButton, HelpCtx, -1, -1); +end; + +function StyledMessageDlg(const Title, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn; + CustomButtonCaptions: array of string): Integer; overload; +begin + Result := StyledTaskDlgPos(Title, Msg, DlgType, Buttons, DefaultButton, + HelpCtx, -1, -1); +end; + +function StyleMessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer): Integer; +begin + Result := MessageDlgPosHelp(Msg, DlgType, Buttons, HelpCtx, X, Y, ''); +end; + +function StyledMessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; X: Integer = -1; Y: Integer = -1): Integer; +var + DefaultButton: TMsgDlgBtn; +begin + if mbYes in Buttons then DefaultButton := mbYes + else if mbOK in Buttons then DefaultButton := mbOK + else if mbNo in Buttons then DefaultButton := mbNo + else if mbCancel in Buttons then DefaultButton := mbCancel + else if mbAbort in Buttons then DefaultButton := mbAbort + else if mbRetry in Buttons then DefaultButton := mbRetry + else if mbIgnore in Buttons then DefaultButton := mbIgnore + else if mbAll in Buttons then DefaultButton := mbAll + else if mbNoToAll in Buttons then DefaultButton := mbNoToAll + else if mbYesToAll in Buttons then DefaultButton := mbYesToAll + else if mbHelp in Buttons then DefaultButton := mbHelp + else if mbClose in Buttons then DefaultButton := mbClose + else DefaultButton := mbYes; + if Buttons = [] then + Buttons := [mbOK]; + Result := StyledMessageDlgPos(Msg, DlgType, Buttons, DefaultButton, HelpCtx, X, Y); +end; + +function StyledMessageDlgPos(const Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn; HelpCtx: Longint; X: Integer = -1; Y: Integer = -1): Integer; +var + Dlg : TForm; + MyMsg : string; + + procedure ChangeButtonCaption(MsgDlgBtn : TMsgDlgBtn; + const Caption : string); + var + Button : TButton; + begin + Button := Dlg.FindComponent(ButtonNames[MsgDlgBtn]) as TButton; + if Assigned(Button) then + Button.Caption := Caption; + end; + +begin + if IsTaskMessageSupported and _UseAlwaysTaskDialog then + begin + //Use a TaskDialog to Show the message instead of a MessageDialog + Result := StyledTaskDlgPos('',Msg,DlgType,Buttons,DefaultButton,HelpCtx,X,Y); + end + else + begin + //Use standard MessageDlg + //clear message for Hyperlinks (becasue are not supported) + MyMsg := ClearHRefs(Msg); + Dlg := CreateMessageDialog(MyMsg, DlgType, Buttons, DefaultButton); + try + if Assigned(_DialogFont) then + Dlg.Font.Assign(_DialogFont); + + Dlg.HelpContext := HelpCtx; + if X >= 0 then Dlg.Left := X; + if Y >= 0 then Dlg.Top := Y; + if (Y < 0) and (X < 0) then Dlg.Position := poScreenCenter; + + ChangeButtonCaption(mbYes,'&'+STR_YES); + ChangeButtonCaption(mbNo,'&'+STR_NO); + ChangeButtonCaption(mbOK,STR_OK); + ChangeButtonCaption(mbCancel,STR_CANCEL); + ChangeButtonCaption(mbAbort,STR_ABORT); + ChangeButtonCaption(mbRetry,STR_RETRY); + ChangeButtonCaption(mbIgnore,STR_IGNORE); + ChangeButtonCaption(mbAll,'&'+STR_ALL); + ChangeButtonCaption(mbNoToAll,'&'+STR_NOTOALL); + ChangeButtonCaption(mbYesToAll,'&'+STR_YESTOALL); + ChangeButtonCaption(mbHelp,'&'+STR_HELP); + ChangeButtonCaption(mbClose,'&'+STR_CLOSE); + + //Caption translated + Dlg.Caption := GetDialogTypeTitle(DlgType); + + Result := Dlg.ShowModal; + finally + Dlg.Free; + end; + end; +end; + +procedure InitializeStyledTaskDialogs(AUseTaskDialog: Boolean; AFont: TFont; + const ADialogButtonsFamily: TStyledButtonFamily = ''; + const AAlphaBlendValue: Byte = DEFAULT_ALPHABLEND); +begin + if Assigned(AFont) then + begin + if not Assigned(_DialogFont) then + _DialogFont := TFont.Create; + _DialogFont.Assign(AFont); + end + else + FreeAndNil(_DialogFont); + _UseAlwaysTaskDialog := AUseTaskDialog; + _DialogButtonsFamily := ADialogButtonsFamily; + _AlphaBlendValue := AAlphaBlendValue; +end; + +procedure UnregisterCustomIcons; +begin + _CustomIcons[mtWarning] := nil; + _CustomIcons[mtError] := nil; + _CustomIcons[mtInformation] := nil; + _CustomIcons[mtConfirmation] := nil; + _CustomIcons[mtCustom] := nil; +end; + +procedure RegisterCustomIcons(const ACustomIcons: TStyledDialogIcons); +begin + UnregisterCustomIcons; + _CustomIcons := ACustomIcons; +end; + +procedure SetUseAlwaysTaskDialog(AValue: boolean); +begin + _UseAlwaysTaskDialog := AValue; +end; + +procedure RegisterCustomExecute(const AShowStyledTaskDialog: ITaskDialogLauncher; + const AButtonFamily: TStyledButtonFamily = ''); +begin + _TaskDialogExecute := AShowStyledTaskDialog; +end; + +procedure UnRegisterCustomExecute; +begin + _TaskDialogExecute := nil; +end; + +function GetTaskDlgType( + const AIcon: TTaskDialogIcon): TMsgDlgType; +begin + if AIcon = tdiNone then + Result := TMsgDlgType.mtCustom + else if AIcon = tdiWarning then + Result := TMsgDlgType.mtWarning + else if AIcon = tdiError then + Result := TMsgDlgType.mtError + else if AIcon = tdiInformation then + Result := TMsgDlgType.mtInformation + else if AIcon = tdiShield then + Result := TMsgDlgType.mtCustom + else + Result := TMsgDlgType.mtInformation; +end; + +function DoTaskMessageDlgPos(const Instruction, Msg: string; DlgType: TMsgDlgType; + Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultButton: TMsgDlgBtn; + X: Integer = -1; Y: Integer = -1; + CustomIcon : TIcon = nil): Integer; +const + IconMap: array[TMsgDlgType] of TTaskDialogIcon = (tdiWarning, tdiError, + tdiInformation, tdiInformation, tdiNone); + LModalResults: array[TMsgDlgBtn] of Integer = (mrYes, mrNo, mrOk, mrCancel, + mrAbort, mrRetry, mrIgnore, mrAll, mrNoToAll, mrYesToAll, mrHelp, mrClose); +var + DlgBtn: TMsgDlgBtn; + LTaskDialog: TStyledTaskDialog; + LTaskDialogButtonItem: TTaskDialogBaseButtonItem; +begin + Application.ModalStarted; + LTaskDialog := TStyledTaskDialog.Create(nil); + try + // Assign buttons + for DlgBtn := Low(TMsgDlgBtn) to High(TMsgDlgBtn) do + begin + if DlgBtn in Buttons then + begin + LTaskDialogButtonItem := LTaskDialog.Buttons.Add; + //Button Caption translated + case DlgBtn of + mbYes: LTaskDialogButtonItem.Caption := STR_YES; + mbNo: LTaskDialogButtonItem.Caption := STR_NO; + mbOK: LTaskDialogButtonItem.Caption := STR_OK; + mbCancel: LTaskDialogButtonItem.Caption := STR_CANCEL; + mbAbort: LTaskDialogButtonItem.Caption := STR_ABORT; + mbRetry: LTaskDialogButtonItem.Caption := STR_RETRY; + mbIgnore: LTaskDialogButtonItem.Caption := STR_IGNORE; + mbAll: LTaskDialogButtonItem.Caption := STR_ALL; + mbNoToAll: LTaskDialogButtonItem.Caption := STR_NOTOALL; + mbYesToAll: LTaskDialogButtonItem.Caption := STR_YESTOALL; + mbHelp: LTaskDialogButtonItem.Caption := STR_HELP; + mbClose: LTaskDialogButtonItem.Caption := STR_CLOSE; + end; + if DlgBtn = DefaultButton then + LTaskDialogButtonItem.Default := True; + LTaskDialogButtonItem.ModalResult := LModalResults[DlgBtn]; + end; + end; + + // Set dialog properties + with LTaskDialog do + begin + CommonButtons := []; + if Application.UseRightToLeftReading then + Flags := Flags + [tfRtlLayout]; + if pos(' '' then + MsgWithTitle := UpperCase(Title)+sLineBreak+Msg + else + MsgWithTitle := Msg; + if IsTaskMessageSupported then + Result := DoTaskMessageDlgPos(Title, Msg, DlgType, Buttons, HelpCtx, DefaultButton, X, Y) + else + Result := StyledMessageDlgPos(MsgWithTitle, DlgType, Buttons, DefaultButton, HelpCtx, -1, -1); +end; + +procedure StyledShowMessage(const Msg: string); overload; +begin + StyledMessageDlg(Msg, TMsgDlgType.mtInformation, [TMsgDlgBtn.mbOK], 0); +end; + +{ TStyledTaskDialog } +constructor TStyledTaskDialog.Create(AOwner: TComponent); +begin + inherited; + FMainIconSize := DEFAULT_MAIN_ICON_SIZE; +end; + +function TStyledTaskDialog.DoExecute(ParentWnd: HWND): Boolean; +type + TTaskDialogIcon = (tdiWarning, tdiError, + tdiInformation, tdiShield, tdiNone); +var + LTaskDlgType: TMsgDlgType; +begin + LTaskDlgType := GetTaskDlgType(MainIcon); + + //Use a custom interface if registered + if Assigned(_TaskDialogExecute) then + Result := _TaskDialogExecute.DoExecute(ParentWnd, + LTaskDlgType, Self, _DialogButtonsFamily) + else + Result := inherited DoExecute(ParentWnd); +end; + +procedure TStyledTaskDialog.DoOnDialogCreated; +var + Rect: TRect; + LX, LY: Integer; + LHandle: HMONITOR; + LMonitorInfo: TMonitorInfo; +begin + LX := Position.X; + LY := Position.Y; + LHandle := MonitorFromWindow(FParentWnd, MONITOR_DEFAULTTONEAREST); + LMonitorInfo.cbSize := SizeOf(LMonitorInfo); + if GetMonitorInfo(LHandle, {$IFNDEF CLR}@{$ENDIF}LMonitorInfo) then + with LMonitorInfo do + begin + GetWindowRect(Handle, Rect); + if LX < 0 then + LX := ((rcWork.Right - rcWork.Left) - (Rect.Right - Rect.Left)) div 2; + if LY < 0 then + LY := ((rcWork.Bottom - rcWork.Top) - (Rect.Bottom - Rect.Top)) div 2; + Inc(LX, rcWork.Left); + Inc(LY, rcWork.Top); + SetWindowPos(Handle, 0, LX, LY, 0, 0, SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOZORDER); + end; +end; + +procedure TStyledTaskDialog.DoOnHelp; +var + LHelpFile: string; + LHelpSystem: IHelpSystem; + +{$IFNDEF D12+} + procedure ShowHelpException(E: Exception); + var + Msg: string; + Flags: Integer; + begin + Flags := MB_OK or MB_ICONSTOP; + if Application.UseRightToLeftReading then + Flags := Flags or MB_RTLREADING; + Msg := E.Message; + if (Msg <> '') and (AnsiLastChar(Msg) > '.') then + Msg := Msg + '.'; + MessageBox(Application.Handle, PChar(Msg), PChar(Application.Title), Flags); + end; +{$ENDIF} + +begin + if HelpContext <> 0 then + begin + if FHelpFile = '' then + LHelpFile := Application.HelpFile + else + LHelpFile := HelpFile; + if System.HelpIntfs.GetHelpSystem(LHelpSystem) then + try + LHelpSystem.Hook(Application.Handle, LHelpFile, HELP_CONTEXT, HelpContext); + except + on E: Exception do + ShowHelpException(E); + end; + end; +end; + +procedure TStyledTaskDialog.DoOnHyperlinkClicked(const AURL: string); +begin + inherited DoOnHyperlinkClicked(AURL); +end; + +function TStyledTaskDialog.Execute(ParentWnd: HWND): Boolean; +begin + FParentWnd := ParentWnd; + Result := inherited Execute(ParentWnd); +end; + +function GetDialogTypeTitle(const DlgType: TMsgDlgType): string; +begin + case DlgType of + mtWarning : Result := STR_WARNING; + mtError : Result := STR_ERROR; + mtInformation : Result := STR_INFORMATION; + mtConfirmation : Result := STR_CONFIRM; + mtCustom : Result := STR_INFORMATION; + end; +end; + +initialization + _UseAlwaysTaskDialog := True; + _AlphaBlendValue := DEFAULT_ALPHABLEND; + _DialogFont := nil; + +finalization + if Assigned(_DialogFont) then + _DialogFont.Free; + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.dfm b/Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.dfm new file mode 100644 index 0000000..bd9f4f8 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.dfm @@ -0,0 +1,354 @@ +object StyledTaskDialogForm: TStyledTaskDialogForm + Left = 0 + Top = 0 + BorderIcons = [biSystemMenu] + BorderStyle = bsDialog + ClientHeight = 244 + ClientWidth = 992 + Color = clWindow + Constraints.MinHeight = 200 + Constraints.MinWidth = 400 + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -12 + Font.Name = 'Segoe UI' + Font.Style = [] + KeyPreview = True + Position = poMainFormCenter + OnClose = FormClose + OnCreate = FormCreate + OnDestroy = FormDestroy + OnKeyDown = FormKeyDown + OnShow = FormShow + TextHeight = 15 + object BottomBevel: TBevel + Left = 0 + Top = 206 + Width = 992 + Height = 3 + Align = alBottom + Shape = bsBottomLine + end + object FooterPanel: TPanel + Left = 0 + Top = 209 + Width = 992 + Height = 35 + Align = alBottom + BevelEdges = [beTop] + BevelKind = bkFlat + BevelOuter = bvNone + ParentBackground = False + TabOrder = 0 + object FooterIconPanel: TPanel + AlignWithMargins = True + Left = 4 + Top = 4 + Width = 25 + Height = 25 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + end + object FooterTextLabel: TLinkLabel + AlignWithMargins = True + Left = 37 + Top = 8 + Width = 951 + Height = 17 + Margins.Left = 4 + Margins.Top = 8 + Margins.Right = 4 + Margins.Bottom = 8 + Align = alClient + Caption = 'FooterTextLabel' + TabOrder = 1 + OnLinkClick = TextLabelLinkClick + end + end + object CenterPanel: TPanel + AlignWithMargins = True + Left = 4 + Top = 4 + Width = 984 + Height = 158 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alClient + BevelOuter = bvNone + Color = clWindow + ParentBackground = False + TabOrder = 1 + object ImagePanel: TPanel + AlignWithMargins = True + Left = 4 + Top = 4 + Width = 64 + Height = 150 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alLeft + BevelOuter = bvNone + TabOrder = 0 + object IconContainer: TPanel + Left = 0 + Top = 0 + Width = 64 + Height = 64 + Align = alTop + BevelOuter = bvNone + TabOrder = 0 + end + end + object MessageScrollBox: TScrollBox + Left = 72 + Top = 0 + Width = 912 + Height = 158 + VertScrollBar.Visible = False + Align = alClient + BevelInner = bvNone + BevelOuter = bvNone + BorderStyle = bsNone + TabOrder = 1 + object TitleLabel: TLabel + AlignWithMargins = True + Left = 4 + Top = 4 + Width = 46 + Height = 15 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alTop + Caption = 'Title Text' + WordWrap = True + end + object AutoSizeLabel: TLabel + AlignWithMargins = True + Left = 4 + Top = 27 + Width = 904 + Height = 13 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alTop + AutoSize = False + Caption = 'AutoSizeLabel' + WordWrap = True + end + object TextLabel: TLinkLabel + AlignWithMargins = True + Left = 4 + Top = 46 + Width = 840 + Height = 15 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + AutoSize = False + BevelInner = bvNone + BevelOuter = bvNone + Caption = 'Text Label' + TabOrder = 0 + OnLinkClick = TextLabelLinkClick + end + end + end + object ButtonsPanel: TPanel + Left = 0 + Top = 166 + Width = 992 + Height = 40 + Margins.Left = 4 + Margins.Top = 4 + Margins.Right = 4 + Margins.Bottom = 4 + Align = alBottom + BevelOuter = bvNone + DoubleBuffered = False + ParentBackground = False + ParentDoubleBuffered = False + TabOrder = 2 + object YesButton: TStyledButton + AlignWithMargins = True + Left = 35 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Yes' + ModalResult = 6 + TabOrder = 0 + OnClick = ButtonClick + end + object NoButton: TStyledButton + AlignWithMargins = True + Left = 115 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'No' + ModalResult = 7 + TabOrder = 1 + OnClick = ButtonClick + end + object OKButton: TStyledButton + AlignWithMargins = True + Left = 195 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'OK' + ModalResult = 1 + TabOrder = 2 + OnClick = ButtonClick + end + object CancelButton: TStyledButton + AlignWithMargins = True + Left = 275 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Cancel' + ModalResult = 2 + TabOrder = 3 + OnClick = ButtonClick + end + object AbortButton: TStyledButton + AlignWithMargins = True + Left = 355 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Abort' + ModalResult = 3 + TabOrder = 4 + OnClick = ButtonClick + end + object RetryButton: TStyledButton + AlignWithMargins = True + Left = 435 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Retry' + ModalResult = 4 + TabOrder = 5 + OnClick = ButtonClick + end + object IgnoreButton: TStyledButton + AlignWithMargins = True + Left = 515 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Ignore' + ModalResult = 5 + TabOrder = 6 + OnClick = ButtonClick + end + object AllButton: TStyledButton + AlignWithMargins = True + Left = 595 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'All' + ModalResult = 12 + TabOrder = 7 + OnClick = ButtonClick + end + object NoToAllButton: TStyledButton + AlignWithMargins = True + Left = 675 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'No to All' + ModalResult = 13 + TabOrder = 8 + OnClick = ButtonClick + end + object YesToAllButton: TStyledButton + AlignWithMargins = True + Left = 755 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Yes to All' + ModalResult = 14 + TabOrder = 9 + OnClick = ButtonClick + end + object HelpButton: TStyledButton + AlignWithMargins = True + Left = 835 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Help' + ModalResult = 9 + TabOrder = 10 + OnClick = HelpButtonClick + end + object CloseButton: TStyledButton + AlignWithMargins = True + Left = 915 + Top = 4 + Width = 74 + Height = 32 + Margins.Top = 4 + Margins.Bottom = 4 + Align = alRight + Caption = 'Close' + ModalResult = 8 + TabOrder = 11 + OnClick = ButtonClick + end + end +end diff --git a/Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.pas b/Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.pas new file mode 100644 index 0000000..42dc7c7 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledTaskDialogFormUnit.pas @@ -0,0 +1,1006 @@ +{******************************************************************************} +{ } +{ StyledTaskDialogForm: a Task Dialog Form with StyleButtons } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledTaskDialogFormUnit; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Winapi.Windows, + Winapi.Messages, + System.SysUtils, + System.Variants, + System.Classes, + Vcl.Graphics, + Vcl.Controls, + Vcl.Forms, + Vcl.Dialogs, + Vcl.StdCtrls, + Vcl.ExtCtrls, + Vcl.ImgList, + System.UITypes, + Vcl.StyledButton, + Vcl.StyledTaskDialog, + Vcl.StandardButtonStyles, + Vcl.BootstrapButtonStyles, + Vcl.AngularButtonStyles, + Vcl.ButtonStylesAttributes, + Vcl.ColorButtonStyles; + +type + TTaskDialogLauncherHandler = class(TInterfacedObject, ITaskDialogLauncher) + function DoExecute(ParentWnd: HWND; + const ADialogType: TMsgDlgType; + const ATaskDialog: TStyledTaskDialog; + const ADialogBtnFamily: TStyledButtonFamily): Boolean; + end; + + TStyledTaskDialogForm = class(TForm) + FooterPanel: TPanel; + CenterPanel: TPanel; + ImagePanel: TPanel; + ButtonsPanel: TPanel; + BottomBevel: TBevel; + MessageScrollBox: TScrollBox; + TitleLabel: TLabel; + TextLabel: TLinkLabel; + AutoSizeLabel: TLabel; + YesButton: TStyledButton; + NoButton: TStyledButton; + OKButton: TStyledButton; + CancelButton: TStyledButton; + AbortButton: TStyledButton; + RetryButton: TStyledButton; + IgnoreButton: TStyledButton; + AllButton: TStyledButton; + NoToAllButton: TStyledButton; + YesToAllButton: TStyledButton; + HelpButton: TStyledButton; + CloseButton: TStyledButton; + FooterIconPanel: TPanel; + FooterTextLabel: TLinkLabel; + IconContainer: TPanel; + procedure FormCreate(Sender: TObject); + procedure ButtonClick(Sender: TObject); + procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); + procedure FormShow(Sender: TObject); + procedure TextLabelLinkClick(Sender: TObject; const Link: string; + LinkType: TSysLinkType); + procedure FormDestroy(Sender: TObject); + procedure HelpButtonClick(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); + private + FFocusedButton: TStyledButton; + FCustomIcons: TStyledDialogIcons; + FTaskDialog: TCustomTaskDialog; + FDialogType: TMsgDlgType; + FDialogBtnFamily: TStyledButtonFamily; + FCommonButtons: TTaskDialogCommonButtons; + FDefaultButton: TTaskDialogCommonButton; + FButtons: TTaskDialogButtons; + FFooterIcon: TTaskDialogIcon; + FCustomMainIcon: TIcon; + FCustomFooterIcon: TIcon; + FMainIcon: TTaskDialogIcon; + FOnVerificationClicked: TNotifyEvent; + FOnTimer: TTaskDlgTimerEvent; + FOnRadioButtonClicked: TNotifyEvent; + FOnHyperlinkClicked: TNotifyEvent; + FOnExpanded: TNotifyEvent; + FOnNavigated: TNotifyEvent; + FOnButtonClicked: TTaskDlgClickEvent; + procedure GetIconNameAndIndex(ATaskDialog: TMsgDlgType; + out AImageName: string; out AImageIndex: Integer); overload; + procedure GetIconNameAndIndex(ATaskDialogIcon: TTaskDialogIcon; + out AImageName: string; out AImageIndex: Integer); overload; + procedure ShowDialogForm; + procedure SetHelpContext(const AValue: Integer); + function GetHelpContext: Integer; + function GetText: string; + function GetTitle: string; + procedure SetText(const AValue: string); + procedure SetTitle(const AValue: string); + procedure AdjustHeight; + procedure AdjustWidth; + procedure AdjustButtonsCaption; + procedure SetButtons(const AValue: TTaskDialogButtons); + procedure PlayMessageDlgSound; + procedure FocusDefaultButton; + procedure LoadDialogImage; + procedure SetFocusToButton(AStyledButton: TStyledButton); + procedure SetFooterText(const AValue: string); + function GetFooterText: string; + function GetFocusedButton: TStyledButton; + procedure InitDlgButtonsWithFamily(const AFamily: TStyledButtonFamily); + procedure UpdateButtonVisibility; + procedure SetFooterIcon(const AValue: TTaskDialogIcon); + procedure SetCustomMainIcon(const AValue: TIcon); + procedure SetCustomFooterIcon(const AValue: TIcon); + procedure SetMainIcon(const AValue: TTaskDialogIcon); + procedure AddCustomButtons(const AButtons: TTaskDialogButtons); + function FindButton(const AModalResult: TModalResult): TStyledButton; + procedure SetMainIconSize(const AValue: Integer); + function GetMainIconSize: Integer; +(* + property Button: TTaskDialogButtonItem read FButton write FButton; +*) + property Buttons: TTaskDialogButtons read FButtons write SetButtons; + property CommonButtons: TTaskDialogCommonButtons read FCommonButtons write FCommonButtons default [tcbOk, tcbCancel]; + property DefaultButton: TTaskDialogCommonButton read FDefaultButton write FDefaultButton default tcbOk; +(* + property ExpandButtonCaption: string read FExpandButtonCaption write FExpandButtonCaption; + property Expanded: Boolean read FExpanded; + property ExpandedText: string read FExpandedText write SetExpandedText; + property Flags: TTaskDialogFlags read FFlags write SetFlags default [tfAllowDialogCancellation]; + property Handle: HWND read FHandle; +*) + property MainIcon: TTaskDialogIcon read FMainIcon write SetMainIcon default tdiInformation; + property CustomMainIcon: TIcon read FCustomMainIcon write SetCustomMainIcon; + property MainIconSize: Integer read GetMainIconSize write SetMainIconSize default DEFAULT_MAIN_ICON_SIZE; + + property CustomFooterIcon: TIcon read FCustomFooterIcon write SetCustomFooterIcon; + property FooterIcon: TTaskDialogIcon read FFooterIcon write SetFooterIcon default tdiNone; + property FooterText: string read GetFooterText write SetFooterText; + + property HelpContext: Integer read GetHelpContext write SetHelpContext default 0; +(* + property ProgressBar: TTaskDialogProgressBar read FProgressBar write FProgressBar; + property RadioButton: TTaskDialogRadioButtonItem read FRadioButton; + property RadioButtons: TTaskDialogButtons read FRadioButtons write SetRadioButtons; +*) + property TextMessage: string read GetText write SetText; + property TitleMessage: string read GetTitle write SetTitle; +(* + property URL: string read FURL; + property VerificationText: string read FVerificationText write FVerificationText; +*) + property OnButtonClicked: TTaskDlgClickEvent read FOnButtonClicked write FOnButtonClicked; + property OnExpanded: TNotifyEvent read FOnExpanded write FOnExpanded; + property OnHyperlinkClicked: TNotifyEvent read FOnHyperlinkClicked write FOnHyperlinkClicked; + property OnNavigated: TNotifyEvent read FOnNavigated write FOnNavigated; + property OnRadioButtonClicked: TNotifyEvent read FOnRadioButtonClicked write FOnRadioButtonClicked; + property OnTimer: TTaskDlgTimerEvent read FOnTimer write FOnTimer; + property OnVerificationClicked: TNotifyEvent read FOnVerificationClicked write FOnVerificationClicked; + protected + class function CanUseAnimations: Boolean; virtual; abstract; + function TaskDialogIconToImageIndex( + const ATaskDialogIcon: TTaskDialogIcon): Integer; + procedure UpdateCustomIcons; + procedure Loaded; override; + procedure LoadImage(const AImageIndex: TImageIndex; + AImageName: string); virtual; abstract; + procedure LoadCustomMainIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); virtual; + procedure LoadCustomFooterIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); virtual; + procedure DefaultDialogSize(out AClientWidth, AClientHeight, AImageSize: Integer); virtual; + property TaskDialog: TCustomTaskDialog read FTaskDialog; + public + procedure SetDialogFont(const AFont: TFont); virtual; + constructor Create(AOwner: TComponent); override; + end; + + TStyledTaskDialogFormClass = class of TStyledTaskDialogForm; + +/// +/// To activate or deactivate use of Custom Task Dialog +/// +procedure UseStyledDialogForm(const AActivate: Boolean); + +/// +/// Register the custom StyledTaskDialog passing the Form Class +/// The Form must inherits from TStyledTaskDialogForm +/// +procedure RegisterTaskDialogFormClass(AFormClass: TStyledTaskDialogFormClass); + +/// +/// Unregister the custom StyledTaskDialog to use Standard Task Dialog +/// +procedure UnregisterTaskDialogFormClass; + +implementation + +{$R *.dfm} + +uses + System.Math + , Vcl.Themes + , System.HelpIntfs + , Winapi.ShellAPI + , Vcl.StyledCmpMessages + , System.Typinfo + ; + +var + _DialogLauncher: ITaskDialogLauncher; + _AnimatedTaskDialogFormClass, _TaskDialogFormClass: TStyledTaskDialogFormClass; + _DlgButtonClasses: TButtonClasses; + _DialogPosition: Vcl.Forms.TPosition; + +procedure RegisterTaskDialogFormClass(AFormClass: TStyledTaskDialogFormClass); +begin + if AFormClass.CanUseAnimations then + _AnimatedTaskDialogFormClass := AFormClass + else + _TaskDialogFormClass := AFormClass; + UseStyledDialogForm(True); +end; + +procedure UnregisterTaskDialogFormClass; +begin + _AnimatedTaskDialogFormClass := nil; + _TaskDialogFormClass := nil; +end; + +procedure UseStyledDialogForm(const AActivate: Boolean); +begin + if AActivate then + RegisterCustomExecute(_DialogLauncher) + else + UnregisterCustomExecute; +end; + +{ TStyledTaskDialogForm } + +procedure TStyledTaskDialogForm.SetButtons(const AValue: TTaskDialogButtons); +var + I: Integer; + LTaskDialogButtonItem: TTaskDialogBaseButtonItem; + LStyledButton: TStyledButton; +begin + FButtons := AValue; + for I := FButtons.Count -1 downto 0 do + begin + LTaskDialogButtonItem := FButtons[I]; + case LTaskDialogButtonItem.ModalResult of + mrYes: LStyledButton := YesButton; + mrNo: LStyledButton := NoButton; + mrOk: LStyledButton := OKButton; + mrCancel: LStyledButton := CancelButton; + mrAbort: LStyledButton := AbortButton; + mrRetry: LStyledButton := RetryButton; + mrIgnore: LStyledButton := IgnoreButton; + mrAll: LStyledButton := AllButton; + mrNoToAll: LStyledButton := NoToAllButton; + mrYesToAll: LStyledButton := YesToAllButton; + mrClose: LStyledButton := CloseButton; + mrHelp: LStyledButton := HelpButton; + else + LStyledButton := HelpButton; + end; + if Assigned(LStyledButton) then + begin + //LStyledButton.Caption := LTaskDialogButtonItem.Caption; + if LTaskDialogButtonItem.Default then + SetFocusToButton(LStyledButton); + end; + end; +end; + +procedure TStyledTaskDialogForm.SetCustomMainIcon(const AValue: TIcon); +begin + if FCustomMainIcon <> AValue then + begin + FCustomMainIcon := AValue; + LoadCustomMainIcon(FCustomMainIcon, FMainIcon); + end; +end; + +procedure TStyledTaskDialogForm.SetCustomFooterIcon(const AValue: TIcon); +begin + if FCustomFooterIcon <> AValue then + begin + FCustomMainIcon := AValue; + LoadCustomFooterIcon(FCustomFooterIcon, FfooterIcon); + end; +end; + +procedure TStyledTaskDialogForm.SetFocusToButton(AStyledButton: TStyledButton); +begin + if AStyledButton.CanFocus then + AStyledButton.SetFocus; + FFocusedButton := AStyledButton; +end; + +procedure TStyledTaskDialogForm.SetMainIcon(const AValue: TTaskDialogIcon); +begin + if FMainIcon <> AValue then + begin + FMainIcon := AValue; + LoadCustomMainIcon(FCustomMainIcon, FMainIcon); + end; +end; + +procedure TStyledTaskDialogForm.SetMainIconSize(const AValue: Integer); +begin + if AValue <> ImagePanel.Width then + begin + ImagePanel.Width := AValue; + IconContainer.Height := AValue; + end; +end; + +procedure TStyledTaskDialogForm.SetFooterIcon(const AValue: TTaskDialogIcon); +begin + if FFooterIcon <> AValue then + begin + FFooterIcon := AValue; + LoadCustomFooterIcon(FCustomFooterIcon, FFooterIcon); + end; +end; + +procedure TStyledTaskDialogForm.SetFooterText(const AValue: string); +var + LRows: TStringList; +begin + if AValue <> '' then + begin + LRows := TStringList.Create; + try + LRows.Text := AValue; + FooterTextLabel.Caption := AValue; + if LRows.Count > 1 then + FooterPanel.Height := FooterPanel.Height * LRows.Count; + FooterPanel.Visible := True; + finally + LRows.Free; + end; + end + else + FooterPanel.Visible := False; +end; + +procedure TStyledTaskDialogForm.FocusDefaultButton; +begin + if not Assigned(FFocusedButton) then + begin + case DefaultButton of + tcbOk: SetFocusToButton(OKbutton); + tcbYes: SetFocusToButton(YesButton); + tcbNo: SetFocusToButton(NoButton); + tcbCancel: SetFocusToButton(CancelButton); + tcbRetry: SetFocusToButton(RetryButton); + tcbClose: SetFocusToButton(CloseButton); + end; + end; +end; + +procedure TStyledTaskDialogForm.SetDialogFont(const AFont: TFont); +begin + Self.Font.Assign(AFont); + TextLabel.Font.Name := Font.Name; + TextLabel.Font.Size := AFont.Size; + //TitleLabel font attributes + if not StyleServices.Enabled or StyleServices.IsSystemStyle then + TitleLabel.Font.Color := clHighlight + else + TextLabel.Font.Color := StyleServices.GetSystemColor(clHighlight); + TitleLabel.Font.Style := [TFontStyle.fsBold]; + TitleLabel.Font.Name := Font.Name; + TitleLabel.Font.Height := Round(AFont.Height * 1.4); +end; + +procedure TStyledTaskDialogForm.SetHelpContext(const AValue: Integer); +begin + inherited HelpContext := AValue; + HelpButton.HelpContext := AValue; +end; + +procedure TStyledTaskDialogForm.AdjustHeight; +var + LFooterPanelHeight: Integer; + LMinHeight, LCalcHeight: Integer; + LImageSize, LWidth, LHeight, LMargins: Integer; +begin + LMargins := ImagePanel.Left * 2; + DefaultDialogSize(LWidth, LHeight, LImageSize); + if FooterPanel.Visible then + LFooterPanelHeight := FooterPanel.Height + LMargins + else + LFooterPanelHeight := 0; + LCalcHeight := + AutoSizeLabel.Height + LMargins + + TitleLabel.Height + LMargins + + LFooterPanelHeight + + ButtonsPanel.Height + LMargins; + LMinHeight := LImageSize + LMargins + + LFooterPanelHeight + LMargins + + ButtonsPanel.Height + LMargins; + + Constraints.MinHeight := LMinHeight + + Height - ClientHeight; + + LHeight := Min(Self.Monitor.Height - 100, + Max(LCalcHeight, LMinHeight)); + + ClientHeight := LHeight; + + TextLabel.Font.Assign(AutoSizeLabel.Font); + TextLabel.Height := AutoSizeLabel.Height; + AutoSizeLabel.Visible := False; + + if LCalcHeight > LHeight then + begin + MessageScrollBox.VertScrollBar.Visible := True; + MessageScrollBox.VertScrollBar.Range := LCalcHeight; + end + else + MessageScrollBox.VertScrollBar.Visible := False; +end; + +procedure TStyledTaskDialogForm.AdjustWidth; +var + LFormWidth, I: Integer; + LStyledButton: TStyledButton; + LMargins: Integer; + LImageSize, LWidth, LHeight: Integer; +begin + DefaultDialogSize(LWidth, LHeight, LImageSize); + LMargins := ButtonsPanel.Margins.Left; + LFormWidth := LMargins; + for I := 0 to ComponentCount -1 do + begin + if Components[I] is TStyledButton then + begin + LStyledButton := TStyledButton(Components[I]); + if LStyledButton.Visible then + LFormWidth := LFormWidth + LStyledButton.Width + LMargins + LMargins; + end; + end; + LFormWidth := LFormWidth + LMargins; + ClientWidth := Max(LWidth, LFormWidth); +end; + +procedure TStyledTaskDialogForm.SetText(const AValue: string); +begin + AutoSizeLabel.Caption := AValue; + TextLabel.Caption := AValue; +end; + +procedure TStyledTaskDialogForm.SetTitle(const AValue: string); +begin + TitleLabel.Caption := AValue; +end; + +procedure TStyledTaskDialogForm.LoadCustomFooterIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); +begin + //In descendand form implements this method + ; +end; + +procedure TStyledTaskDialogForm.LoadCustomMainIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); +begin + //In descendand form implements this method + ; +end; + +procedure TStyledTaskDialogForm.LoadDialogImage; +var + LIconName: string; + LIconIndex: Integer; +begin + if (tfUseHiconMain in FTaskDialog.Flags) and Assigned(FTaskDialog.CustomMainIcon) then + begin + LoadCustomMainIcon(FTaskDialog.CustomMainIcon, FTaskDialog.MainIcon); + end + else + begin + if FMainIcon <> tdiNone then + GetIconNameAndIndex(FMainIcon, LIconName, LIconIndex) + else + GetIconNameAndIndex(FDialogType, LIconName, LIconIndex); + LoadImage(LIconIndex, LIconName); + end; +end; + +function TStyledTaskDialogForm.FindButton(const AModalResult: TModalResult): TStyledButton; +var + I: Integer; +begin + for I := 0 to self.ComponentCount -1 do + begin + if Components[I] is TStyledButton then + begin + Result := TStyledButton(Components[I]); + if Result.ModalResult = AModalResult then + begin + Result.Visible := True; + Exit; + end; + end; + end; + Result := nil; +end; + +procedure TStyledTaskDialogForm.UpdateButtonVisibility; + + function IsButtonVisible(const AButton: TStyledButton): Boolean; + var + I: Integer; + LTaskDialogButtonItem: TTaskDialogBaseButtonItem; + begin + Result := False; + for I := FButtons.Count -1 downto 0 do + begin + LTaskDialogButtonItem := FButtons[I]; + if AButton.ModalResult = LTaskDialogButtonItem.ModalResult then + begin + Result := True; + break; + end; + end; + end; + +begin + YesButton.Visible := (tcbYes in FCommonButtons) or IsButtonVisible(YesButton); + NoButton.Visible := (tcbNo in FCommonButtons) or IsButtonVisible(NoButton); + OKButton.Visible := (tcbOk in FCommonButtons) or IsButtonVisible(OKButton); + CancelButton.Visible := (tcbCancel in FCommonButtons) or IsButtonVisible(CancelButton); + AbortButton.Visible := IsButtonVisible(AbortButton); + RetryButton.Visible := (tcbRetry in FCommonButtons) or IsButtonVisible(RetryButton); + IgnoreButton.Visible := IsButtonVisible(IgnoreButton); + AllButton.Visible := IsButtonVisible(AllButton); + NoToAllButton.Visible := IsButtonVisible(NoToAllButton); + YesToAllButton.Visible := IsButtonVisible(YesToAllButton); + HelpButton.Visible := IsButtonVisible(HelpButton); + CloseButton.Visible := (tcbClose in FCommonButtons) or IsButtonVisible(CloseButton); +end; + +procedure TStyledTaskDialogForm.AddCustomButtons(const AButtons: TTaskDialogButtons); +var + LButtonItem: TTaskDialogButtonItem; + I: Integer; + LLastButton, LStyledButton: TStyledButton; +begin + LLastButton := nil; + for I := AButtons.Count -1 downto 0 do + begin + //Find if the Button is already present in the Form + LButtonItem := AButtons.Items[I] as TTaskDialogButtonItem; + LStyledButton := FindButton(LButtonItem.ModalResult); + if not Assigned(LStyledButton) then + begin + LStyledButton := TStyledButton.Create(Self); + LStyledButton.SetButtonStyle(FDialogBtnFamily, LButtonItem.ModalResult); + end; + LStyledButton.Caption := LButtonItem.Caption; + LStyledButton.Default := LButtonItem.Default; + (* + if LButtonItem.CommandLinkHint <> '' then + begin + LStyledButton.Style := bsCommandLink; + LStyledButton.CommandLinkHint := LButtonItem.CommandLinkHint; + end; + *) + LStyledButton.ElevationRequired := LButtonItem.ElevationRequired; + LStyledButton.Enabled := LButtonItem.Enabled; + LStyledButton.Parent := ButtonsPanel; + LStyledButton.AlignWithMargins := True; + LStyledButton.Margins.Assign(YesButton.Margins); + LStyledButton.Align := alRight; + if Assigned(LLastButton) then + LStyledButton.Left := LLastButton.Left-LLastButton.Width; + LLastButton := LStyledButton; + end; +end; + +procedure TStyledTaskDialogForm.ShowDialogForm; +begin + //Initialize components based on ATaskDialog attributes + Caption := FTaskDialog.Caption; + HelpContext := FTaskDialog.HelpContext; + CommonButtons := FTaskDialog.CommonButtons; + DefaultButton := FTaskDialog.DefaultButton; + Buttons := FTaskDialog.Buttons; + AddCustomButtons(FTaskDialog.Buttons); + UpdateButtonVisibility; + + if FDialogBtnFamily <> '' then + InitDlgButtonsWithFamily(FDialogBtnFamily); + + MainIcon := FTaskDialog.MainIcon; + CustomMainIcon := FTaskDialog.CustomMainIcon; + +(* + property ExpandButtonCaption: string read FExpandButtonCaption write FExpandButtonCaption; + property Expanded: Boolean read FExpanded; + property ExpandedText: string read FExpandedText write SetExpandedText; + property Flags: TTaskDialogFlags read FFlags write SetFlags default [tfAllowDialogCancellation]; + property Handle: HWND read FHandle; +*) + CustomFooterIcon := FTaskDialog.CustomFooterIcon; + FooterIcon := FTaskDialog.FooterIcon; + FooterText := FTaskDialog.FooterText; +(* + property ProgressBar: TTaskDialogProgressBar read FProgressBar write FProgressBar; + property RadioButton: TTaskDialogRadioButtonItem read FRadioButton; + property RadioButtons: TTaskDialogButtons read FRadioButtons write SetRadioButtons; +*) + TextMessage := FTaskDialog.Text; + TitleMessage := FTaskDialog.Title; +(* + property URL: string read FURL; + property VerificationText: string read FVerificationText write FVerificationText; + property OnButtonClicked: TTaskDlgClickEvent read FOnButtonClicked write FOnButtonClicked; + property OnDialogConstructed: TNotifyEvent read FOnDialogConstructed write FOnDialogConstructed; + property OnDialogCreated: TNotifyEvent read FOnDialogCreated write FOnDialogCreated; + property OnDialogDestroyed: TNotifyEvent read FOnDialogDestroyed write FOnDialogDestroyed; + property OnExpanded: TNotifyEvent read FOnExpanded write FOnExpanded; + property OnHyperlinkClicked: TNotifyEvent read FOnHyperlinkClicked write FOnHyperlinkClicked; + property OnNavigated: TNotifyEvent read FOnNavigated write FOnNavigated; + property OnRadioButtonClicked: TNotifyEvent read FOnRadioButtonClicked write FOnRadioButtonClicked; + property OnTimer: TTaskDlgTimerEvent read FOnTimer write FOnTimer; + property OnVerificationClicked: TNotifyEvent read FOnVerificationClicked write FOnVerificationClicked; +*) + //Load and show Image + LoadDialogImage; +end; + +function TStyledTaskDialogForm.TaskDialogIconToImageIndex( + const ATaskDialogIcon: TTaskDialogIcon): Integer; +begin + case ATaskDialogIcon of + tdiWarning: Result := 0; + tdiError: Result := 1; + tdiInformation: Result := 2; + tdiShield: Result := 5; + else + Result := 4; + end; +end; + +procedure TStyledTaskDialogForm.TextLabelLinkClick(Sender: TObject; + const Link: string; LinkType: TSysLinkType); +begin + if (LinkType = sltURL) and Assigned(FOnHyperlinkClicked) and + (FTaskDialog is TStyledTaskDialog) then + TStyledTaskDialog(FTaskDialog).DoOnHyperlinkClicked(Link) + else + ShellExecute(Self.Handle, 'open' , PChar(Link), nil, nil, SW_SHOW ); +end; + +procedure TStyledTaskDialogForm.UpdateCustomIcons; + + procedure GetAndSetIcon(const AType: TMsgDlgType; + AColor: TColor); + var + LIcon: TIcon; + LTypeName: string; + begin + LIcon := TIcon.Create; + LTypeName := GetEnumName(TypeInfo(TMsgDlgType), Ord(AType)); + FreeAndNil(FCustomIcons[AType]); + FCustomIcons[AType] := LIcon; + end; + +begin + GetAndSetIcon(mtWarning, clYellow); + GetAndSetIcon(mtError, clRed); + GetAndSetIcon(mtInformation, clSkyBlue); + GetAndSetIcon(mtConfirmation, clLime); + GetAndSetIcon(mtCustom, clWindow); +(* + if FRegistered then + RegisterCustomIcons(FCustomIcons); +*) +end; + +procedure TStyledTaskDialogForm.ButtonClick(Sender: TObject); +var + LModalResult: TModalResult; +begin + LModalResult := (Sender as TStyledButton).ModalResult; + Close; + self.ModalResult := LModalResult; +end; + +constructor TStyledTaskDialogForm.Create(AOwner: TComponent); +begin + inherited; + FCommonButtons := [tcbOk, tcbCancel]; + FDefaultButton := tcbOk; + FDialogBtnFamily := DEFAULT_CLASSIC_FAMILY; +end; + +procedure TStyledTaskDialogForm.DefaultDialogSize(out AClientWidth, AClientHeight, AImageSize: Integer); +var + LScaleFactor: Single; +begin + LScaleFactor := Self.PixelsPerInch / 96; + //Values for 96 DPI + AClientWidth := Round(600 * LScaleFactor); + AClientHeight := Round(280 * LScaleFactor); + AImageSize := Round(128 * LScaleFactor); +end; + +procedure TStyledTaskDialogForm.FormClose(Sender: TObject; + var Action: TCloseAction); +var + LCanClose: Boolean; +begin + LCanClose := True; + if Assigned(OnButtonClicked) then + OnButtonClicked(Sender, ModalResult, LCanClose); + if not LCanClose then + Action := TCloseAction.caNone; +end; + +procedure TStyledTaskDialogForm.FormCreate(Sender: TObject); +begin + FooterPanel.Visible := False; +end; + +procedure TStyledTaskDialogForm.FormDestroy(Sender: TObject); +begin + FCustomIcons[mtWarning].Free; + FCustomIcons[mtError].Free; + FCustomIcons[mtInformation].Free; + FCustomIcons[mtConfirmation].Free; + FCustomIcons[mtCustom].Free; +end; + +function TStyledTaskDialogForm.GetFocusedButton: TStyledButton; +var + I: Integer; +begin + for I := 0 to ComponentCount -1 do + begin + if (Components[I] is TStyledButton) then + begin + Result := TStyledButton(Components[I]); + if Result.Focused then + Exit; + end; + end; + Result := FFocusedButton; +end; + +procedure TStyledTaskDialogForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); +var + LButton: TStyledButton; +begin + if Key = VK_ESCAPE then + CancelButton.Click + else if key = VK_RETURN then + begin + LButton := GetFocusedButton; + if LButton <> nil then + LButton.Click + else + OKButton.Click; + end; +end; + +procedure TStyledTaskDialogForm.PlayMessageDlgSound; +const + Sounds: array [TMsgDlgType] of integer = ( + MB_ICONEXCLAMATION, MB_ICONHAND, MB_OK, + MB_ICONQUESTION, MB_ICONASTERISK); +begin + MessageBeep(Sounds[FDialogType]); +end; + +procedure TStyledTaskDialogForm.FormShow(Sender: TObject); +begin + Screen.Cursor := crHourGlass; + try + AdjustButtonsCaption; + ShowDialogForm; + AdjustWidth; + AutoSizeLabel.AutoSize := True; + AdjustHeight; + PlayMessageDlgSound; + FocusDefaultButton; + finally + Screen.Cursor := crDefault; + end; +end; + +function TStyledTaskDialogForm.GetFooterText: string; +begin + Result := FooterTextLabel.Caption; +end; + +function TStyledTaskDialogForm.GetHelpContext: Integer; +begin + Result := inherited HelpContext; +end; + +procedure TStyledTaskDialogForm.GetIconNameAndIndex( + ATaskDialog: TMsgDlgType; out AImageName: string; out AImageIndex: Integer); +const + ImageNames: array[TMsgDlgType] of string = + ('Warning', 'Error', 'Information', 'Confirmation', 'Custom'); +begin + AImageName := ImageNames[ATaskDialog]; + AImageIndex := Ord(ATaskDialog); +end; + +procedure TStyledTaskDialogForm.GetIconNameAndIndex( + ATaskDialogIcon: TTaskDialogIcon; out AImageName: string; out AImageIndex: Integer); +const + ImageNames: array[tdiNone..tdiShield] of string = + ('Custom', 'Warning', 'Error', 'Information', 'Shield'); + ImageIndexes: array[tdiNone..tdiShield] of integer = (4, 0, 1, 2, 5); +begin + AImageName := ImageNames[ATaskDialogIcon]; + AImageIndex := ImageIndexes[ATaskDialogIcon]; +end; + +function TStyledTaskDialogForm.GetMainIconSize: Integer; +begin + Result := ImagePanel.Width; +end; + +function TStyledTaskDialogForm.GetText: string; +begin + Result := TextLabel.Caption; +end; + +function TStyledTaskDialogForm.GetTitle: string; +begin + Result := TitleLabel.Caption; +end; + +procedure TStyledTaskDialogForm.HelpButtonClick(Sender: TObject); +begin + ModalResult := mrNone; + Application.HelpContext(HelpContext); +end; + +procedure TStyledTaskDialogForm.AdjustButtonsCaption; +begin + YesButton.Caption := STR_YES; + NoButton.Caption := STR_NO; + OKButton.Caption := STR_OK; + CancelButton.Caption := STR_CANCEL; + HelpButton.Caption := STR_HELP; + RetryButton.Caption := STR_RETRY; + AbortButton.Caption := STR_ABORT; + IgnoreButton.Caption := STR_IGNORE; + AllButton.Caption := STR_ALL; + NoToAllButton.Caption := STR_NOTOALL; + YesToAllButton.Caption := STR_YESTOALL; + CloseButton.Caption := STR_CLOSE; +end; + +procedure TStyledTaskDialogForm.Loaded; +begin + Position := _DialogPosition; + TextLabel.Align := alTop; + inherited; +end; + +procedure TStyledTaskDialogForm.InitDlgButtonsWithFamily(const AFamily: TStyledButtonFamily); + + procedure UpdateButtonStyle(const AButton: TStyledButton); + begin + if AButton.Visible then + AButton.SetButtonStyle(AFamily, AButton.ModalResult); + end; + +begin + UpdateButtonStyle(YesButton); + UpdateButtonStyle(NoButton); + UpdateButtonStyle(OKButton); + UpdateButtonStyle(CancelButton); + UpdateButtonStyle(AbortButton); + UpdateButtonStyle(RetryButton); + UpdateButtonStyle(IgnoreButton); + UpdateButtonStyle(AllButton); + UpdateButtonStyle(NoToAllButton); + UpdateButtonStyle(YesToAllButton); + UpdateButtonStyle(HelpButton); + UpdateButtonStyle(CloseButton); +end; + +{ TTaskDialogLauncherHandler } + +function TTaskDialogLauncherHandler.DoExecute(ParentWnd: HWND; + const ADialogType: TMsgDlgType; + const ATaskDialog: TStyledTaskDialog; + const ADialogBtnFamily: TStyledButtonFamily): Boolean; +var + LForm: TStyledTaskDialogForm; + LFont: TFont; + LDlgBtnFamily: TStyledButtonFamily; +begin + if tfPositionRelativeToWindow in ATaskDialog.Flags then + _DialogPosition := poOwnerFormCenter + else + _DialogPosition := poScreenCenter; + if Assigned(_AnimatedTaskDialogFormClass) then + LForm := _AnimatedTaskDialogFormClass.Create(nil) + else + LForm := _TaskDialogFormClass.Create(nil); + try + if Assigned(ATaskDialog.OnDialogConstructed) then + ATaskDialog.OnDialogConstructed(ATaskDialog); + + //Assign all events of TaskDialog + LForm.OnButtonClicked := ATaskDialog.OnButtonClicked; + LForm.OnExpanded := ATaskDialog.OnExpanded; + LForm.OnHyperlinkClicked := ATaskDialog.OnHyperlinkClicked; + LForm.OnNavigated := ATaskDialog.OnNavigated; + LForm.OnRadioButtonClicked := ATaskDialog.OnRadioButtonClicked; + LForm.OnTimer := ATaskDialog.OnTimer; + LForm.OnVerificationClicked := ATaskDialog.OnVerificationClicked; + + //Assign called TaskDialog component + LForm.FTaskDialog := ATaskDialog; + + //Assign Size of Main Icon + LForm.MainIconSize := ATaskDialog.MainIconSize; + + LForm.FDialogType := ADialogType; + LForm.FDialogBtnFamily := ADialogBtnFamily; + LFont := GetDialogFont; + LForm.AlphaBlendValue := GetDialogAlphaBlendValue; + LForm.AlphaBlend := LForm.AlphaBlendValue <> DEFAULT_ALPHABLEND; + LDlgBtnFamily := GetDialogBtnFamily; + if Assigned(LFont) then + LForm.SetDialogFont(LFont) + else + LForm.SetDialogFont(Screen.MessageFont); + + if Assigned(ATaskDialog.OnDialogCreated) then + ATaskDialog.OnDialogCreated(ATaskDialog); + + //Show the Dialog in Modal mode + LForm.ShowModal; + + ATaskDialog.ModalResult := LForm.ModalResult; + ATaskDialog.Button := TTaskDialogButtonItem(ATaskDialog.Buttons.FindButton(ATaskDialog.ModalResult)); + //ATaskDialog.RadioButton := TTaskDialogRadioButtonItem(ATaskDialog.RadioButtons.FindButton(LRadioButton)); +(* + if LVerificationChecked then + Include(FFlags, tfVerificationFlagChecked) + else + Exclude(FFlags, tfVerificationFlagChecked); +*) + Result := True; + finally + LForm.Free; + if Assigned(ATaskDialog.OnDialogDestroyed) then + ATaskDialog.OnDialogDestroyed(ATaskDialog); + end; +end; + +initialization + _TaskDialogFormClass := TStyledTaskDialogForm; + //Create handler for execute custom TaskDialog Form + _DialogLauncher := TTaskDialogLauncherHandler.Create; + + _DialogPosition := poScreenCenter; + //Register the handler + RegisterCustomExecute(_DialogLauncher); + //Init default Dialog buttons Styles + SetLength(_DlgButtonClasses, Ord(TMsgDlgBtn.mbClose)+1); + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.dfm b/Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.dfm new file mode 100644 index 0000000..2685d40 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.dfm @@ -0,0 +1,16944 @@ +inherited StyledTaskDialogStd: TStyledTaskDialogStd + Caption = 'StyledTaskDialogStd' + TextHeight = 15 + inherited FooterPanel: TPanel + inherited FooterIconPanel: TPanel + object FooterImage: TImage + Left = 0 + Top = 0 + Width = 25 + Height = 25 + Align = alTop + Stretch = True + Transparent = True + end + end + end + inherited CenterPanel: TPanel + inherited ImagePanel: TPanel + inherited IconContainer: TPanel + object Image: TImage + Left = 0 + Top = 0 + Width = 64 + Height = 64 + Align = alClient + Stretch = True + Transparent = True + end + end + end + end + object ImageList: TImageList + ColorDepth = cd32Bit + DrawingStyle = dsTransparent + Height = 128 + Masked = False + Width = 128 + Left = 56 + Top = 56 + Bitmap = { + 494C010106000800040080008000FFFFFFFF2110FFFFFFFFFFFFFFFF424D3600 + 0000000000003600000028000000000200000001000001002000000000000000 + 0800000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000014131149A99C8FD0FDE9D5FECCC4B7FFC5BCAEF635322E7D0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000110F + 0E42CBBBABE4FDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC3 + B6FC2D2B27730000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000D0C0B3BBFB0A1DDFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCAC1B2FA25222068000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000005050426AEA093D3FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFC5BEAFF710100E4600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000075A534C98FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF999086D50000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001E1B1958FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF4945 + 3F92000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000004040322B5A7 + 98D7FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFC9BFB3F90D0D0C3F00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000002F2B276EFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF666159AD000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000001010114A6998CCEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFC5BCAEF60504042600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001A181653FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF423E3A8B000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000102031D0A141B570E1C26680E1C26680D1B24650306 + 0933000000020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000003746B62ACFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFADA499E40000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000102031F3C7AA3D556ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE1224307500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000201 + 0117D4C4B3E9FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC3 + B7FD0606052C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000102 + 031F56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE39739ACF000000040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000D0C0B3AFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF2422206700000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000003C7A + A3D556ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000000400000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000002D2A266CFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF635E56AA000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000102031D56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD200000004000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000696159A4FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFA69E92DF0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000A141B5756AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE39759DD1000000030000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000028F8478BFFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFBCB3A6EF00000004000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE39759CD00000 + 0003000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000007B2A396D5FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFC7BDB1F80000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3975 + 9CD0000000030000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000ED4C4B3E9FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC3B7FD0202 + 021C000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE39739ACF0000000300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000101 + 0116F7E3D0FBFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEF6E9D6FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCDC5 + B7FF0605052A0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE387298CE00000003000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000001000010F5E1 + CFFAFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEAEDEE1FE0ECBFDFF01C9FFFFE5A21FFFE3A426FFD4B988FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCDC5B7FF0303021F00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE387298CE000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000AE0CEBDEFFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF1E7 + D7FE49D2F4FF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFDDAC + 49FFCDC3AFFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCDC4B7FE01010114000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE387197CD0000000300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000006C8B8A9E2FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEB3DFE1FE01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFD3BA8BFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC3B6FC0000000C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE377095CC00000002000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000003B2A396D5FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF4E8D6FE51D4F2FF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFDDAD4EFFCDC2B1FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFC7BDB1F80000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE366F94CB000000020000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000008C8176BDFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEBEE1DFFE01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD3BC92FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFBBB1A5EE00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE366F94CB0000 + 0002000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000047413C87FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FE8EDAE6FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD7B574FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF867F76C7000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE366E + 92CA000000020000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001B191754FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFCE9D5FE58D5F1FF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFDCAE52FFCCC4 + B6FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF433F3B8C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE366D91C90000000200000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000707062DFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEEE7 + D7FE23CDFAFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE2A7 + 33FFCDC2AEFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF1716 + 1452000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE356B90C800000002000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000101 + 0112FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FED4E3DBFE01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFD0BE9FFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF040403230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE356B90C8000000020000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000B5A7 + 98D7FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEBDE0DFFE01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFD2BC91FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFC9BFB3F90000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE346B8FC70000000200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000003D38337DFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEBDE0DFFE01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFD2BC91FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF79736BBD00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE34698DC600000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000009080730FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEBDE0DFFE01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD2BC91FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF1A181657000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE33688CC5000000010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000006FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEBCE0DFFE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD2BB90FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FF0000000C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000081116502D5D7CBA56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE2D5D7CBA08111650000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000746B62ACFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEBCE0DFFE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD2BB90FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFADA499E40000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000070E134956ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE070E134900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000013121047FDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEC5E1DEFE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD1BD + 96FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF33302C7A00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001E3D539856ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE1E3D5398000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000004FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEE3E5 + D9FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFCEC1A7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF00000008000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000244963A656ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE244963A60000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000504A438FFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF7E8D6FE0ECB + FDFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE3A426FFCCC3B4FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF90877ECE000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000F1E286B56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE0F1E + 286B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000005040424FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FE3DD1F5FF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFDFAA43FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF0F0E0D430000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 011256ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE000001120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000B8AA9BD9FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FE75D9EDFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFDAB163FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFC9BFB2F90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001A35 + 488E56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE1A35488E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001E1C1A59FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEA6DEE3FE01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFD4B884FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF4A46 + 4093000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000056AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEE2E5D9FE01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFCEC0A7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000001021A56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0001021A00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000002B27 + 2469FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FE27CEF9FF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE1A735FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF5F5A52A70000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000070E144B56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE070E144B00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000003FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FE8CDAE7FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD7B573FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF0000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000D1A236356AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0D1A236300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000038342F78FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEDEE4DAFE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFCFC0A5FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF736D65B800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000007FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FE1FCEFAFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE2A630FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF0000000E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000034302C74FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FE84D8E8FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD8B4 + 6EFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF6D675FB3000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEEE7 + D7FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFCDC2AEFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001514124BFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FE5ED6 + F0FF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFDCAE56FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FF383531800000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000B3A597D6FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEE0E5DAFE01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFCFC0A6FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFC7BDB2F80000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000005050527FDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FE43D2F4FF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFDFAA46FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF12100F4800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000070675EA9FDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECEE3DCFE01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFD0BE9BFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFAAA296E200000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000001FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FE29CFF9FF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE1A836FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF00000002000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001715134DFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCE3DDFE01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFD1BD9AFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF3B373383000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000008D8277BEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FE4AD3F3FF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFDEAC4AFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFBAB1A4EE000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE50A3DAF60E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D276950A3DAF656ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000006FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEEFE7D7FE01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFCEC2AFFFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF0000000C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000024211E60FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FE7DD9EBFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD9B369FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF544F499C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009D9084C8FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFC1B7ABF30000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEAEDEE1FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD4B988FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000B0A0937FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FE32D0F7FF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE0A83CFFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF211F + 1D62000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004F49428EFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEF8E8D6FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFCCC3B4FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF8E86 + 7CCD000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000CDBDADE5FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEAADEE2FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD5B985FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC2 + B5FC000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0009FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FE4BD3F3FF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFDEAC4BFFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF010100120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001413 + 1149FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF35322E7D0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004741 + 3C87FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEC6E1DEFE01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFD1BD + 97FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF867F76C70000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE3B769FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003B78A0D356ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000968B + 7FC4FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FE67D7EFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFDBB0 + 5BFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFBFB5A9F10000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEE8A930FFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF13C8 + F8FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000008FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF0000001000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000F0E0D3FFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFAE0 + BEFEE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFFB2C4C0FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF2A28246F00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000322E2A72FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF4CE + 92FEE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF82C6D1FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF6B655EB100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000059524A97FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF0C0 + 68FFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF52C7E2FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF999085D500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE0E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27694C9ACDEF56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000008A7F75BCFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEE9AF + 3DFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF22C8F3FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFBAB0A4ED00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE54ACE6FD0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000029526EAF56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000C6B6A7E1FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCAC2B4FB00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000162C3A8056ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFCE5CCFEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFFC2C4BBFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE0000 + 000E000000000000000000000000000000000000000000000000000000000000 + 0000000000000002021B56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF8DBB3FEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFFA6C5C5FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE1932 + 4389000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001E3D539856ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000009FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF5D39CFEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF8EC5CDFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF01010113000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE000000080000000000000000000000000000000000000000000000000000 + 000000000000000000000000000022455DA156ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000001010116FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF2CA86FEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF74C6D6FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF0605052A000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE366D91C90000000400000000000000000000000000000000000000000000 + 000000000000000000000000000000000000070D124856ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000004040322FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF1C473FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF5EC7DEFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF0D0D0C3F000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE4081ACDB00000009000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000041831428856AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000807072FFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF0C16AFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF55C6E1FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF19171555000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE51A4DBF70205062C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 02194184B1DE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000D0C0B3BFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEFBD63FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF4DC7E4FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF25222068000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE162C3A8000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000539759DD156ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000013121047FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEEBA5CFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF44C7E7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF34312D7B000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE4389B7E20102031F0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000234698DC656ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE1020 + 2B6E000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000256ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE183040860000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000811185256ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0C19216100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000003E7FA9D956ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000A151D5A56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE060C1044000000000000000000000000000000000000 + 0000000000000000000000000000000000000103042256ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE12253176000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000056ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE1C394C92000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000056ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE1C394C92000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000156ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE0D1A2364000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000056ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE22455DA1000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00004E9DD2F256ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE01030422000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000156ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE2B5776B5000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000A151C5956ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE1C394C9200000000000000000000000000000000000000000000 + 00000000000000000000000000000000000004090C3C56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEDB856FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF3EC7E9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001327347956ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE172E3D830000000100000000000000000000000000000000000000000000 + 000000000000000000000000000000000000254B65A856ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEEEBD61FFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF4AC7E5FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE0205072E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000080810164F1429377C1429377C0810154E0000 + 0112000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000A56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF2CB8AFEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF78C6D4FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE336689C30000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000264C66A956ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFCE7D2FEE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFFC8C4B8FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE0913 + 1955000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000070E134956ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEF9DD + B7FEE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFFAAC5C3FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE050B0E400000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000810154E56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE8D2FEF5D39EFEEFBF68FFEBB347FFE6A527FFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF0AC9FCFF2EC8EFFF52C7E2FF8FC6CCFFCAC4 + B8FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1D276900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00011429377C56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFBE3C8FEF5D2 + 9CFEF0C16FFFEAAF40FFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF26C8F2FF59C7 + E0FF8CC6CEFFBEC4BCFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE1429377C0000000A00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000050B0F4250A3 + DAF656ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEF9DEBAFEF1C77EFEEAB041FFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF27C8F1FF69C6D9FFAEC5C2FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE254B64A7010305260000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000010304251933468B56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D4FEF5D4 + A0FEEDB856FFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF3EC7 + E9FF91C5CCFFCBC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE468EBEE6326587C221435B9F1428367B11222E72172E3E841E3D + 529727506CAD458BBBE456ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEF6D5A2FEEAB145FFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF2AC8F0FF93C5CBFFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFAE1C0FEEFBE65FFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF4EC7E3FFB6C4BFFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFCE7D1FEF2C9 + 85FEE6A422FFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF05C9 + FDFF71C6D7FFC7C4B9FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEF6D6A5FEE9AE3CFFE5A21FFFE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF22C8F3FF96C6CAFFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEF5D39EFEE5A21FFFE5A21FFFE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF01C9FFFF01C9FFFF8FC6CCFFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE8D3FEF0C57BFEE5A21FFFE5A2 + 1FFFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF01C9FFFF01C9FFFF66C6DBFFCAC4B8FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFBE3C7FEEDB8 + 57FFE5A21FFFE5A21FFFE5A21FFFE5A21FFF01C9FFFF01C9FFFF01C9FFFF01C9 + FFFF3EC8E9FFBDC4BCFFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1D276956AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEF8DBB2FEE8AB32FFE5A21FFFE5A21FFF01C9FFFF01C9FFFF17C8F7FFA5C5 + C5FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E1C266756AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0E1C266700000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000019171551FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEF7D7A8FEF0C26EFF5AC7DFFF9AC6C9FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF3F3C3788000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000810154E56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0913195400000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000B0A0937FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF211F1D62000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000205072D56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0205072F00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000002FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FF00000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000056AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000403B3680FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FF7D766EC000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000002D5D + 7CBA56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE2D5D7CBA0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004D47 + 408CFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEE5D3C1F2DECCBBEEF5E1CFFAFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCDC5B7FFCDC4B7FECCC4 + B6FECCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF8D857BCC0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000102 + 032056ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE030609330000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000010000100D0C0B3B1614134C0C0B0A380303021D00000004000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00030707062C211F1C5D4E48418D8C8176BDDCCABAEDFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCDC5B7FEBAB1A4EE8E867CCD504B46991716 + 1452000000080000000000000000000000000000000000000000000000000000 + 000000000000000000000000000A0A09093722201E6439353281252220680303 + 021F000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000011222E7256ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE2A54 + 72B2000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000A0A09354C46 + 3F8BC8B8A9E2FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC3 + B6FC8D857BCC201E1C6100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000003E7FA9D956ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE51A4DBF70000 + 0009000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000071917145070675EA9FDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFACA397E33F3C3788000000100000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000101163F80ABDA56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE51A4DBF7000102180000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000324211F61C4B5A6E0FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCAC2B4FB55504A9E000000080000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000011222E7256ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE2A5472B200000009000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000504 + 0424635B539FFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFA29A + 8FDC100F0E450000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000102031F2D5B7BB956ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56ADE8FE56AD + E8FE56ADE8FE56ADE8FE2D5D7CBA030609330000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000084D47408CFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF8D857BCC000000100000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000205 + 072D0810154E0E1C26670E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D + 27690E1D27690E1D27690E1D27690E1D27690E1D27690E1D27690E1C26670913 + 19540205072F0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000001010011696159A4FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFA69D93DF0404032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000303021E8A7F75BCFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFBAB0A4ED0A0A0938000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001210 + 0F44FDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF302E2A770000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000D8C8176BDFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFBAB1A4EE0202 + 0119000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000221F1D5EFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC4B7FF504B4699000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000002020219CDBDADE5FDE9D5FEFDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFCCC4B7FFCCC2B5FC0807063000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000004988C80C5FDE9D5FEFDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFCCC4B7FFBFB7AAF2000000080000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000675E57A2FDE9 + D5FEFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FFCCC4B7FFA49B90DD00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000003F3A + 357FFDE9D5FEFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FFCCC4 + B7FF7C756CBF0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000023201D5FFDE9D5FEFDE9D5FEFDE9D5FECCC4B7FFCCC4B7FFCCC4B7FF524E + 489B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000005050527AD9F92D2FDE9D5FECCC4B7FFC6BEB0F711100F470000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000C0000 + 03200001073001030D400204145004061E6004061E600204145001030D400001 + 0730000003200000000C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000060402 + 01250E080341140B044D1A0F055822130663221306631A0F0558140B044D0E08 + 0341040201250000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000060003 + 0125020B0441030F064D04140758051A0963051A096304140758030F064D020B + 0441000301250000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000011503051A5A080D3E8B0F1874BC1727B6EC1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1727B6EC0F1874BC080D3E8B03051A5A0000 + 0115000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000010000141A0E055745270E8E874C1BC5DA7B2CFBE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEDA7B2CFB874C1BC545270E8E1A0E05570100 + 0014000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000010014041407570B36138E166A26C523AB3EFB24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE23AB3EFB166A26C50B36138E041407570001 + 0014000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000F03051B5B0C1462AD1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0C1462AD03051B5B0000000F0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000C22130663713F16B4E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE713F16B4221306630000000C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000C051A0963125720B424AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE125720B4051A09630000000C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000A0508256C1523A4E01B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1523A4E00508256C0000000A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000E2D1A0973A35C21D9E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEA35C21D92D1A09730000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000E07230D731A802ED924AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE1A802ED907230D730000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000204 + 134D0F1A7BC21B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0F1A + 7BC20204134D0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000E08 + 034280481AC0E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE8048 + 1AC00E0803420000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000020B + 0442156424C024AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1564 + 24C0020B04420000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000040720641B2CCFFC1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2CCFFC04072064000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000123140765DA7B2CFBE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEDA7B2CFB23140765000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000001051B0A6523AB3EFB24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE23AB3EFB051B0A65000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000A292F762EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0A292F760000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000003050829701B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0508297000000003000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000012C190972E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2C19097200000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000107230C7224AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE07230C7200000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000012CBAD4FA2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2CBAD4FA000000010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020415521B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE020415520000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000150B044EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE150B044E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000310064E24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0310064E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000030E10462EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE030E1046000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 021E121D8BCE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121D + 8BCE0000021E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000302 + 0021A25B20D8E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEA25B + 20D8030200210000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000002 + 01211A7F2ED824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1A7F + 2ED8000201210000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001D7A8ACA2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1D7A8ACA00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000001080D3D891B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE080D3D8900000001000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000351E0A7CE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE351E0A7C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000008290F7C24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE08290F7C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000303202EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0003032000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000021B1625AFE71B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1625AFE70000021B0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000301001EBB6926E8E07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEBB6926E80301001E0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000002001E1E9235E824AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE1E9235E80002001E0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000010444E982EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE10444E980000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000020414501B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0204145000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000160C0451E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE160C045100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000311065124AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE0311065100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000092EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE000000090000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000010A114F9C1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0A114F9C000000010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000512E1099E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE512E1099000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000D3F179924AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0D3F1799000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000071F23662EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE071F2366000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000006121D8BCE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121D8BCE0000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000068B4E1CC8E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE8B4E1CC80000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000006166D27C824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE166D27C80000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000027A5BCEB2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE27A5BCEB00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000E1624ADE61B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1624 + ADE60000000E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000100 + 0012BE6A26EAE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEBE6A + 26EA010000120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00121F9436EA24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1F94 + 36EA000000120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000002090A382EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE02090A3800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000002191B2C + CEFB1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2CCEFB0000021900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000001000016E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0100001600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000001001624AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0001001600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001866 + 74B92EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE186674B90000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000002191B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000219000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000001000016E07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFE01000016000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000001001624AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE00010016000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 01172EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE000101170000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000E1B2CCEFB1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2CCEFB0000000E0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000001000012E07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFE010000120000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000001224AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE000000120000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000D363D872EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0D36 + 3D87000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000061624ADE61B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1624ADE60000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000006BE6A26EAE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEBE6A26EA0000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000061F9436EA24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE1F9436EA0000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000042EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0000 + 0004000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000001121D8BCE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121D8BCE00000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000008B4E1CC8E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE8B4E1CC800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000166D27C824AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE166D27C800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000051518552EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE051518550000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A114F9C1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0A114F9C000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000512E1099E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE512E1099000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000D3F179924AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0D3F1799000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000228FA3DB2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE228FA3DB000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020414501B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE020414500000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000160C0451E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE160C04510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000311065124AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE031106510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000105062B2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0105062B000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000021B1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 021B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000301001EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0301 + 001E000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000002001E24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0002 + 001E000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000145561A92EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE145561A900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00011625AFE71B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1625 + AFE7000000010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BB6926E8E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEBB69 + 26E8000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001E9235E824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1E92 + 35E8000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000F2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0000000F00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000080D + 3D891B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE080D3D890000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000351E + 0A7CE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE351E0A7C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000829 + 0F7C24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE22A73DF81B8731DF1B8731DF22A73DF824AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE08290F7C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000A292F762EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE0A292F760000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000021E1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000021E00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000003020021E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0302002100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000002012124AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE1D8D33E40D3E1798030F054C0000 + 000A000000000000000000000000000000000000000000000000000000000000 + 00000000000A030F064D0D3E17981D8D33E424AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0002012100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000012CBAD4FA2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2CBAD4FA000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000121D8BCE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE121D8BCE00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000A25B20D8E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEA25B20D800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001A7F2ED824AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE1B8631DE0417085D000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000030517085E1C8831E024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE1A7F2ED800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000030E10462EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE030E1046000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000020415521B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE14219BDA1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1421 + 9BDA1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE02041552000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000150B044EE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFED2762AF62615 + 0769261507692615076926150769261507692615076926150769261507692615 + 076926150769D2762AF6E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFE150B044E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000310064E24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0F47 + 1AA3000301250000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000003 + 01260F4A1BA524AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE0310064E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001D7A8ACA2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE1D7A8ACA00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000031B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F + 91D300000004000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000001E07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFE000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000124AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE156826C40001001A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000002001C166C27C724AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000303202EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE0003032000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000050829701B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D30000 + 00040000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 000000000004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE050829700000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002C190972E07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFE2C1909720000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000007230C7224AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AE3FFD020C044500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000020E054824AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE07230C720000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001044 + 4E982EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE10444E980000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D3000000040000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 00000000000000000004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000001E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0000000100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000124AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE135C21B8000000040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000006136123BD24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE0000000100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00092EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE000000090000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000040720641B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D300000004000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0407206400000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000023140765E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2314076500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000051B0A6524AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE082A0F7D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000092E108324AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE051B0A6500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000071F23662EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2BB4CDF60720 + 2468072024680720246807202468072024680720246807202468072024680720 + 2468072024682BB4CDF62EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE071F + 2366000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001B2CCFFC1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D30000000400000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 000000000000000000000000000000000004121F91D31B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2CCFFC00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DA7B2CFBE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEDA7B2CFB00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000023AB3EFB24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE030E05490000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000310 + 064E24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE23AB3EFB00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000027A5BCEB2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE27A5BCEB0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000204134D1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE121F91D3000000040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000004121F91D31B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0204134D000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000E080342E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0E080342000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000020B044224AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE020D + 0447000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000030F054C24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE020B0442000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000002090A382EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE02090A380000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000F1A7BC21B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE14219BDA00000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000414219BDA1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0F1A7BC2000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080481AC0E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE80481AC0000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000156424C024AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0416085B0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000519096124AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE156424C0000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000186674B92EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE186674B9000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000A1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000000A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000E24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE07230C72000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000007260E7824AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000101172EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE00010117000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000508256C1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0508256C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000002D1A0973E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2D1A09730000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000007230D7324AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE146223BE00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000166A26C524AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE07230D730000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000D363D872EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0D363D8700000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001523A4E01B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1523A4E00000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000A35C21D9E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEA35C21D90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001A802ED924AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE0000000F00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000001124AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1A802ED90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000042EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0000000400000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000F1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 000F000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000CE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0000 + 000C000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000C24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE0310064F0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000313065424AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0000 + 000C000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000051518552EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE051518550000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000003051B5B1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0305 + 1B5B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000022130663E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2213 + 0663000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000051A096324AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE146324BF000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000156826C424AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE051A + 0963000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000228FA3DB2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE228FA3DB000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000C1462AD1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0C14 + 62AD000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000713F16B4E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE713F + 16B4000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000125720B424AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE00040127000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000004012924AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1257 + 20B4000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000105062B2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE0105062B000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000024AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE166A26C600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000166D27C824AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000145561A92EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE145561A900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 01151B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000001150000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000100 + 0014E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE010000140000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 001424AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0106023000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000106023124AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE000100140000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000F2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2BB4CDF60720 + 2569072025690720256907202569072025690720256907202569072025690720 + 2569072025692BB4CDF62EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE0000000F00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000305 + 1A5A1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE03051A5A0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001A0E + 0557E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE1A0E05570000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000414 + 075724AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE18782CD218782CD218782CD218782CD218782CD218782CD21878 + 2CD218782CD218782CD218782CD218782CD218782CD218782CD218782CD21878 + 2CD218782CD218782CD218782CD218782CD218782CD218782CD218782CD21878 + 2CD218782CD218782CD218782CD218782CD218782CD218782CD218782CD21878 + 2CD218782CD218782CD218782CD218782CD218782CD218782CD218782CD21878 + 2CD218782CD218782CD218782CD218782CD218782CD218782CD218782CD21878 + 2CD218782CD218782CD218782CD218782CD218782CD218782CD218782CD224AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE041407570000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000A29 + 2F762EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE0A292F760000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000080D + 3E8B1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE080D3E8B0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004527 + 0E8EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE45270E8E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000B36 + 138E24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE0B36138E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00012CBAD4FA2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2CBA + D4FA000000010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000F18 + 74BC1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE0F1874BC0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000874C + 1BC5E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE874C1BC50000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000166A + 26C524AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE166A26C50000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000030E10462EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE030E + 1046000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001727 + B6EC1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003230000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1727B6EC0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DA7B + 2CFBE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEDA7B2CFB0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000023AB + 3EFB24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE23AB3EFB0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001D7A8ACA2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1D7A8ACA0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000303202EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE000303200000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000C1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000000C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000006E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000624AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000010444E982EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE10444E98000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003201B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000004020125E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0402012500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000003012524AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0003012500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000092EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE00000009000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000107301B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0001073000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E080341E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0E08034100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000020B044124AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE020B044100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000071F23662EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE071F236600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000001030D401B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE01030D4000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000140B044DE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE140B044D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000030F064D24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE030F064D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000027A5BCEB2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE27A5BCEB0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000020414501B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0204145000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001A0F0558E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE1A0F055800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000414075824AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0414075800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000002090A382EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE02090A380000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000004061E601B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE04061E6000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000022130663E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE2213066300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000051A096324AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE051A096300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000186674B92EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE186674B9000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000004061E601B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE04061E6000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000022130663E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE9A571FD30000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE2213066300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000519096024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE051A096300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000101172EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE00010117000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000020414501B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0204145000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000001A0F0558E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE1A0F055800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000311065024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0414075800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000D363D872EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE0D363D8700000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000001030D401B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE01030D4000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000140B044DE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE140B044D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000020B044024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE030F064D00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000042EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE0000000400000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000107301B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0001073000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000E080341E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0E08034100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000106023024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE020B044100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000515 + 18552EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE051518550000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003201B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000004020125E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0402012500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000002012024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0003012500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000228FA3DB2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE228F + A3DB000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000C1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000000C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000006E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE9956 + 1FD299561FD299561FD299561FD299561FD299561FD299561FD299561FD29956 + 1FD299561FD2E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000C24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1259 + 20B5092C108007220C700A34138B18772BD124AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE18772BD10A34138B07220C70092C + 1080125920B524AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000105062B2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0105 + 062B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE061E0B6B000000020000 + 00000000000000000000000000000000000000010014104D1CA924AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE104D1CA9000100140000000000000000000000000000 + 00000000000000000002061E0B6B24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000145561A92EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE145561A90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001727 + B6EC1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003230000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1727B6EC0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000DA7B + 2CFBE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEDA7B2CFB0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001F96 + 37EB24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE0001001A00000000000000000000 + 00000000000000000000000000000000000000000000000000000414075624AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0414075600000000000000000000000000000000000000000000 + 00000000000000000000000000000001001A24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE23AB3EFB0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000F2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001F8496D22EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0000000F0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000F18 + 74BC1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE0F1874BC0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000874C + 1BC5E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE874C1BC50000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000135E + 22BA24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE0001001A0000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000061C + 0A6724AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE061C0A670000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000001001A24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE166A26C50000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A292F762EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1F8496D20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000208597D32EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0A292F76000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000080D + 3E8B1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE080D3E8B0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000004527 + 0E8EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE45270E8E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000A32 + 128924AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE061E0B6B000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000197B2CD524AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE197B + 2CD5000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000061E0B6B24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE0B36138E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000012CBAD4FA2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2BB4CDF60720 + 2468072024680720246807202468072024680720246807202468072024680720 + 2468072024682BB4CDF62EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2CBAD4FA00000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000305 + 1A5A1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE03051A5A0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001A0E + 0557E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE1A0E05570000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000414 + 075724AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE00000002000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000020B044124AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE020B + 0441000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000224AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE041407570000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000030E10462EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE030E104600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 01151B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000001150000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000100 + 0014E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE010000140000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 001224AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE125920B500000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000024AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000125920B524AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE000100140000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001D7A8ACA2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE1D7A8ACA0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000023AA3EFA24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE092C108000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001F9436EA24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1F9436EA0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000092C108024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000303202EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE000303200000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000C1462AD1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0C14 + 62AD000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000713F16B4E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE713F + 16B4000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000F4C1CA824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE07220C7000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001B812FDA24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1B812FDA0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000007220C7024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1257 + 20B4000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000010444E982EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE10444E98000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000003051B5B1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0305 + 1B5B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000022130663E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2213 + 0663000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000414075724AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0A34138B00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000022A33BF524AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE22A33BF50000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000A34138B24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE051A + 0963000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000092EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE00000009000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000F1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 000F000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000CE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0000 + 000C000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000C24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE18772BD100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000924AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0000 + 0009000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000018772BD124AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0000 + 000C000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000071F23662EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE071F236600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001523A4E01B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1523A4E00000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000A35C21D9E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEA35C21D90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000001A802ED924AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE00010014000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000006200C6E24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0620 + 0C6E000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000001001424AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1A802ED90000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000027A5 + BCEB2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE27A5BCEB0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000508256C1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0508256C0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000002D1A0973E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2D1A09730000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000051B0A6524AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE104D1CA9000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE000000080000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000104D1CA924AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE07230D730000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000209 + 0A382EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE02090A380000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000A1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 0323000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000000A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000724AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE041407560000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001360 + 23BC24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE136023BC0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000414075624AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000186674B92EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1866 + 74B9000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000F1A7BC21B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE14219BDA00000004000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 03231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE000003230000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000414219BDA1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0F1A7BC2000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000080481AC0E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE80481AC0000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000135E22BA24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE061C0A6700000000000000000000 + 0000000000000000000000000000000000000000000000000008136023BC24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE136023BC00000008000000000000000000000000000000000000 + 0000000000000000000000000000061C0A6724AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE156424C0000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000101172EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0001 + 0117000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000204134D1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE121F91D3000000040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000003231B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000032300000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000004121F91D31B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0204134D000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000E080342E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0E080342000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000020C044424AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE197B2CD5020B04410000 + 00000000000000000000000000000000000906200C6E24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE06200C6E0000000900000000000000000000 + 000000000000020B0441197B2CD524AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE020B0442000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000D363D872EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0D363D870000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000001B2CCFFC1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D30000000400000000000000000000 + 00000000000000000000000000000000000000000000000003231B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000323000000000000000000000000000000000000 + 000000000000000000000000000000000004121F91D31B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2CCFFC00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000DA7B2CFBE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE9A571FD30000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEDA7B2CFB00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000219F3AF224AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE1F9436EA1B812FDA22A33BF524AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE22A33BF51B812FDA1F94 + 36EA24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE23AB3EFB00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000042EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE000000040000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000040720641B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D300000004000000000000 + 000000000000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000000000000000000000000000 + 0000000000000000000000000004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0407206400000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000023140765E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2314076500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000415075924AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE051B0A6500000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000051518552EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE05151855000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000001B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D3000000040000 + 0000000000000000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000032300000000000000000000 + 00000000000000000004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000001E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0000000100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000024AE3FFD24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE0000000100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000228FA3DB2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE228FA3DB00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000050829701B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F91D30000 + 00040000000000000000000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE00000323000000000000 + 000000000004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE050829700000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000002C190972E07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFE2C1909720000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000051B0A6524AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE07230C720000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000105062B2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0105062B00000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000031B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121F + 91D300000004000003231B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE000003230000 + 0004121F91D31B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE000000030000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000001E07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE99561FD20000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000009A571FD3E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFE000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000124AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000145561A92EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE145561A90000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000020415521B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE14219BDA1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1421 + 9BDA1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE02041552000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000150B044EE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFED2762AF62515 + 0768251507682515076825150768251507682515076825150768251507682515 + 076825150768D2762AF6E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFE150B044E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000020C044524AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE0310064E000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000F2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE0000000F0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000121D8BCE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE121D8BCE00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000A25B20D8E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEA25B20D800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000156424C024AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE1A7F2ED800000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000A292F762EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE0A292F76000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000021E1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0000021E00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000003020021E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0302002100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000001001724AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0002012100000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000012CBAD4FA2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2CBAD4FA00000001000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000080D + 3D891B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE080D3D890000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000351E + 0A7CE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFE351E0A7C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000828 + 0E7B24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE08290F7C0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000030E10462EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE030E104600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00011625AFE71B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1625 + AFE7000000010000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000BB6926E8E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEBB69 + 26E8000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00001A7F2ED824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1E92 + 35E8000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001D7A + 8ACA2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE1D7A8ACA0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000021B1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0000 + 021B000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000301001EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE0301 + 001E000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000001324AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0002 + 001E000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000003 + 03202EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE000303200000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020414501B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE020414500000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000160C0451E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE160C04510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020C044324AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE031106510000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000010444E982EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE1044 + 4E98000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A114F9C1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0A114F9C000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000512E1099E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE512E1099000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A35138C24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0D3F1799000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000092EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0000 + 0009000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000001121D8BCE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121D8BCE00000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000008B4E1CC8E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE8B4E1CC800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000136123BD24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE166D27C800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000071F23662EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE071F23660000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000061624ADE61B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1624ADE60000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000006BE6A26EAE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEBE6A26EA0000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000021A7D2ED724AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE1F9436EA0000000600000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000027A5BCEB2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE27A5BCEB000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000E1B2CCEFB1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2CCEFB0000000E0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000001000012E07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFE010000120000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000008209A38EE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE000000120000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000002090A382EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE02090A38000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000002191B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE00000219000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000001000016E07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFE01000016000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000001224AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE00010016000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000186674B92EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE186674B900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000002191B2C + CEFB1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2CCEFB0000021900000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000001000016E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE0100001600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000011209A + 38EE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE0001001600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000101172EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0001011700000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000E1624ADE61B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1624 + ADE60000000E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000100 + 0012BE6A26EAE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEBE6A + 26EA010000120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00091A7F2ED824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1F94 + 36EA000000120000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000D363D872EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE0D363D870000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000006121D8BCE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121D8BCE0000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000068B4E1CC8E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE8B4E1CC80000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000002146324BF24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE166D27C80000 + 0006000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000042EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE000000040000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000010A114F9C1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0A114F9C000000010000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000512E1099E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE512E1099000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000A35138C24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0D3F1799000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000051518552EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE2EC0DBFE05151855000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000020414501B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0204145000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000160C0451E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE160C045100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000020C044324AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE0311065100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000228FA3DB2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE228FA3DB00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000021B1625AFE71B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1625AFE70000021B0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000301001EBB6926E8E07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEBB6926E80301001E0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000100141B812FDA24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE1E9235E80002001E0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000105062B2EC0 + DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE2EC0DBFE0105062B00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000001080D3D891B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE080D3D8900000001000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000351E0A7CE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE351E0A7C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000008290F7C24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE08290F7C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000001455 + 61A92EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE145561A90000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 021E121D8BCE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE121D + 8BCE0000021E0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000302 + 0021A25B20D8E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEA25B + 20D8030200210000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 0018156725C224AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1A7F + 2ED8000201210000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000F2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0 + DBFE0000000F0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020415521B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE020415520000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000150B044EE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE150B044E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000020E054824AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE0310064E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000A292F762EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE0A29 + 2F76000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000003050829701B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0508297000000003000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000012C190972E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE2C19097200000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000001051C0A6624AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE07230C7200000001000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000012CBAD4FA2EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE2CBAD4FA0000 + 0001000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000040720641B2CCFFC1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2CCFFC04072064000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000123140765DA7B2CFBE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEDA7B2CFB23140765000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000416085B22A33BF524AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE23AB3EFB051B0A65000000010000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000030E10462EC0DBFE2EC0DBFE2EC0DBFE2EC0DBFE030E10460000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000204 + 134D0F1A7BC21B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE0F1A + 7BC20204134D0000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000E08 + 034280481AC0E07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFE8048 + 1AC00E0803420000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000000000000000000000000000020D + 0446135F23BB24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE1564 + 24C0020B04420000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000001D7A8ACA2EC0DBFE2EC0DBFE1D7A8ACA000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000A0508256C1523A4E01B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1523A4E00508256C0000000A0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000E2D1A0973A35C21D9E07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEA35C21D92D1A09730000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000008061C0A671B8430DC24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE1A802ED907230D730000000E0000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000303202EC0DBFE2EC0DBFE00030320000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000F03051B5B0C1462AD1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE0C1462AD03051B5B0000000F0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000C22130663713F16B4E07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFE713F16B4221306630000000C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000C04140757104D1CA924AD + 3FFC24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE125720B4051A09630000000C0000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000010444E9810444E9800000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000011503051A5A080D3E8B0F1874BC1727B6EC1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2DD3FE1B2D + D3FE1B2DD3FE1B2DD3FE1B2DD3FE1727B6EC0F1874BC080D3E8B03051A5A0000 + 0115000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000010000141A0E055745270E8E874C1BC5DA7B2CFBE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E2DFEE07E + 2DFEE07E2DFEE07E2DFEE07E2DFEDA7B2CFB874C1BC545270E8E1A0E05570100 + 0014000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000013041407580A33128A135E22BA1F9637EB24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF40FE24AF + 40FE24AF40FE24AF40FE24AF40FE23AB3EFB166A26C50B36138E041407570001 + 0014000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000090000000900000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000C0000 + 03200001073001030D400204145004061E6004061E600204145001030D400001 + 0730000003200000000C00000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000060402 + 01250E080341140B044D1A0F055822130663221306631A0F0558140B044D0E08 + 0341040201250000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000000000000000000000000000000000000000000000000000000000C0002 + 012001060230020B04400311065005190960051A096304140758030F064D020B + 0441000301250000000600000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000000000000000000000000000424D3E000000000000003E000000 + 2800000000020000000100000100010000000000004000000000000000000000 + 000000000000000000000000FFFFFF0000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000000} + end +end diff --git a/Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.pas b/Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.pas new file mode 100644 index 0000000..777def3 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledTaskDialogStdUnit.pas @@ -0,0 +1,130 @@ +{******************************************************************************} +{ } +{ StyledTaskDialogStd: an example of Task Dialog Form } +{ using an ImageList and a Image component } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledTaskDialogStdUnit; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Winapi.Windows + , Winapi.Messages + , System.SysUtils + , System.Variants + , System.Classes + , Vcl.Graphics + , Vcl.Controls + , Vcl.Forms + , Vcl.Dialogs + , Vcl.StyledTaskDialogFormUnit + , Vcl.ImgList + , Vcl.StyledButton + , Vcl.ExtCtrls + , Vcl.StdCtrls + , System.UITypes + , Vcl.Imaging.pngimage + , Vcl.ButtonStylesAttributes + , Vcl.StandardButtonStyles + , Vcl.BootstrapButtonStyles + , Vcl.AngularButtonStyles + , Vcl.ColorButtonStyles, System.ImageList + ; + +type + TStyledTaskDialogStd = class(TStyledTaskDialogForm) + ImageList: TImageList; + FooterImage: TImage; + Image: TImage; + private + protected + procedure InternalLoadImage(const AImage: TImage; + const AImageIndex: TImageIndex; AImageName: string); virtual; + class function CanUseAnimations: Boolean; override; + procedure LoadImage(const AImageIndex: TImageIndex; AImageName: string); override; + procedure LoadCustomMainIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); override; + procedure LoadCustomFooterIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); override; + public + end; + +implementation + +{$R *.dfm} + +uses + Vcl.Themes; + +class function TStyledTaskDialogStd.CanUseAnimations: Boolean; +begin + Result := False; +end; + +procedure TStyledTaskDialogStd.LoadCustomFooterIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); +begin + if (ATaskDialogIcon <> tdiNone) and not Assigned(AIcon) then + InternalLoadImage(FooterImage, + TaskDialogIconToImageIndex(ATaskDialogIcon), '') + else if Assigned(AIcon) then + FooterImage.Picture.Bitmap.Assign(AIcon); +end; + +procedure TStyledTaskDialogStd.LoadCustomMainIcon(const AIcon: TIcon; + const ATaskDialogIcon: TTaskDialogIcon); +begin + if (ATaskDialogIcon <> tdiNone) and not Assigned(AIcon) then + InternalLoadImage(Image, + TaskDialogIconToImageIndex(ATaskDialogIcon), '') + else if Assigned(AIcon) then + Image.Picture.Bitmap.Assign(AIcon); +end; + +procedure TStyledTaskDialogStd.LoadImage( + const AImageIndex: TImageIndex; AImageName: string); +begin + InternalLoadImage(Image, AImageIndex, AImageName); +end; + +procedure TStyledTaskDialogStd.InternalLoadImage(const AImage: TImage; + const AImageIndex: TImageIndex; AImageName: string); +var + LBackGroundColor: TColor; +begin + LBackGroundColor := TStyleManager.ActiveStyle.GetSystemColor(clWindow); + AImage.Picture.Bitmap.Canvas.Brush.Color := LBackGroundColor; + AImage.Picture.Bitmap.Canvas.FillRect(Rect(0, 0, + ImageList.Width, ImageList.Height)); + AImage.Picture.Bitmap.PixelFormat := pf32bit; + AImage.Picture.Bitmap.Transparent := True; + ImageList.GetBitmap(AImageIndex, AImage.Picture.Bitmap); +end; + +initialization + RegisterTaskDialogFormClass(TStyledTaskDialogStd); + +end. diff --git a/Ext/StyledComponents/source/Vcl.StyledToolbar.pas b/Ext/StyledComponents/source/Vcl.StyledToolbar.pas new file mode 100644 index 0000000..07d9e12 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.StyledToolbar.pas @@ -0,0 +1,2273 @@ +{******************************************************************************} +{ } +{ StyledToolbar: a Toolbar with TStyledToolButtons inside } +{ Based on TFlowPanel and TStyledGraphicButton } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.StyledToolbar; + +interface + +{$INCLUDE StyledComponents.inc} + +uses + Vcl.ImgList + , System.UITypes + , System.SysUtils + , System.Classes + , System.Math + , Vcl.ToolWin + , Vcl.ComCtrls + , Vcl.StdCtrls + , Vcl.ExtCtrls + , Vcl.Themes + , Vcl.Controls + , Vcl.ActnList + , Vcl.Menus + , Vcl.Graphics + , Vcl.GraphUtil + , Winapi.Messages + , Winapi.Windows + , Vcl.StyledButton + , Vcl.ButtonStylesAttributes + , Vcl.StandardButtonStyles + ; + +resourcestring + ERROR_SETTING_TOOLBAR_STYLE = 'Error setting Toolbar Style: %s/%s/%s not available'; + +type + EStyledToolbarError = Exception; + + TStyledToolbar = class; + TStyledToolButton = class; + TStyledToolButtonClass = class of TStyledToolButton; + + TButtonProc = reference to procedure (Button: TStyledToolButton); + TControlProc = reference to procedure (Control: TControl); + + { TStyledToolButton } + TStyledToolButton = class(TCustomStyledGraphicButton) + private + FAutoSize: Boolean; + FGrouped: Boolean; + FMarked: Boolean; + FStyle: TToolButtonStyle; + FEnabled: Boolean; + FImageAlignment: TImageAlignment; + FMenuItem: TMenuItem; + function IsStoredCursor: Boolean; + function IsStoredFlat: Boolean; + function IsCustomRadius: Boolean; + function IsCustomRoundedCorners: Boolean; + function IsCustomDrawType: Boolean; + function IsStoredStyleFamily: Boolean; + function IsStoredStyleAppearance: Boolean; + function GetIndex: Integer; + function IsImagesStored: Boolean; + function IsWidthStored: Boolean; + procedure SetGrouped(AValue: Boolean); + procedure SetMarked(AValue: Boolean); + procedure SetStyle(AValue: TToolButtonStyle); + procedure UpdateButtonContent; + procedure SetImageAlignment(const AValue: TImageAlignment); + function IsSeparator: Boolean; + function IsDropDown: Boolean; + function GetEnable: Boolean; + procedure SetEnable(const AValue: Boolean); + function GetHeight: Integer; + procedure SetHeight(const AValue: Integer); + function IsImageAlignmentStored: Boolean; + procedure UpAllPrevButtons(const AIndex: Integer); + procedure UpAllNextButtons(const AIndex: Integer); + procedure SetMenuItem(const AValue: TMenuItem); + function GetWrap: Boolean; + procedure SetWrap(const AValue: Boolean); + procedure UpdateGroupIndex; + function GetStyleDrawType: TStyledButtonDrawType; + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + protected + FToolBar: TStyledToolBar; + function GetCaptionToDraw: TCaption; override; + procedure SetCaption(const AValue: TCaption); override; + function IsStoredStyleClass: Boolean; override; + function IsEnabledStored: Boolean; override; + function IsCaptionStored: Boolean; override; + function GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; override; + function GetButtonState: TStyledButtonState; override; + procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; + procedure MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); override; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + procedure SetAutoSize(AValue: Boolean); override; + procedure SetToolBar(AToolBar: TStyledToolBar); + procedure SetParent(AParent: TWinControl); override; + procedure ValidateContainer(AComponent: TComponent); override; + public + constructor Create(AOwner: TComponent); override; + procedure Click; override; + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + published + //property ActiveStyleName; + property Action; + property Align; + property AllowAllUp default False; + property Anchors; + property AsVCLComponent stored False; + property Constraints; + property Cursor stored IsStoredCursor; + property Down default False; + property DragCursor; + property DragKind; + property DragMode; + property Enabled: Boolean read GetEnable write SetEnable stored IsEnabledStored; + property Font; + property OnContextPopup; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnMouseActivate; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnGesture; + property OnStartDock; + property OnStartDrag; + property OnClick; + property PopUpMenu; + property ParentFont; + property ParentShowHint; + property ShowHint; + {$IFDEF D10_4+} + property StyleName; + {$ENDIF} + property StyleElements; + property Transparent; + property Visible; + property Caption: TCaption read GetCaption write SetCaption stored IsCaptionStored; + property CaptionAlignment; + property CommandLinkHint; + property ImageAlignment: TImageAlignment read FImageAlignment write SetImageAlignment Stored IsImageAlignmentStored; + property DisabledImageIndex; + property DisabledImages; + property DropDownMenu; + property Flat stored IsStoredFlat; + property Glyph; + property NumGlyphs; + property HotImageIndex; + property Images stored IsImagesStored; + property ImageIndex; + property Kind; + property PressedImageIndex; + property SelectedImageIndex; + {$IFDEF D10_4+} + property DisabledImageName; + property HotImageName; + property ImageName; + property PressedImageName; + property SelectedImageName; + {$ENDIF} + property ImageMargins; + property ModalResult; + property Tag; + //StyledComponents Attributes + property StyleRadius stored IsCustomRadius; + property StyleRoundedCorners stored IsCustomRoundedCorners; + property StyleDrawType: TStyledButtonDrawType read GetStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleFamily stored IsStoredStyleFamily; + property StyleClass stored IsStoredStyleClass; + property StyleAppearance stored IsStoredStyleAppearance; + property WordWrap stored False; + property ButtonStyleNormal; + property ButtonStylePressed; + property ButtonStyleSelected; + property ButtonStyleHot; + property ButtonStyleDisabled; + property NotificationBadge; + property OnDropDownClick; + + property AutoSize: Boolean read FAutoSize write SetAutoSize default False; + property Grouped: Boolean read FGrouped write SetGrouped default False; + property Height: Integer read GetHeight write SetHeight stored False; + property Index: Integer read GetIndex; + property Marked: Boolean read FMarked write SetMarked default False; + property MenuItem: TMenuItem read FMenuItem write SetMenuItem; + property Style: TToolButtonStyle read FStyle write SetStyle default tbsButton; + property Width stored IsWidthStored; + property Wrap: Boolean read GetWrap write SetWrap default False; + end; + + + TSTBNewButtonEvent = procedure(Sender: TStyledToolbar; AIndex: Integer; + var AButton: TStyledToolButton) of object; + TSTBButtonEvent = procedure(Sender: TStyledToolbar; + AButton: TCustomStyledGraphicButton) of object; + + { TStyledToolbar } + [ComponentPlatforms(pidWin32 or pidWin64)] + TStyledToolbar = class(TCustomFlowPanel) + private + //Private variable of Properties + FTransparent: Boolean; + FButtons: TList; + FShowCaptions: Boolean; + FImages: TCustomImageList; + FButtonWidth: Integer; + FButtonHeight: Integer; + FFlat: Boolean; + FHideClippedButtons: Boolean; + FCustomizable: Boolean; + FList: Boolean; + FDisabledImages: TCustomImageList; + FImageChangeLink: TChangeLink; + FDisabledImageChangeLink: TChangeLink; + FUpdateCount: Integer; + FOnCustomizeNewButton: TSTBNewButtonEvent; + FOnCustomizeAdded: TSTBButtonEvent; + FCaptureChangeCancels: Boolean; + FInMenuLoop: Boolean; + FAutoSize: Boolean; + FButtonsCursor: TCursor; + + //Properties ignores (only for backward compatibility) + FGradientDrawingOptions: TTBGradientDrawingOptions; + FGradientDirection: TGradientDirection; + FDrawingStyle: TTBDrawingStyle; + FGradientEndColor: TColor; + FGradientStartColor: TColor; + + //Styled Attributes + FStyleRadius: Integer; + FStyleDrawType: TStyledButtonDrawType; + FStyleFamily: TStyledButtonFamily; + FStyleClass: TStyledButtonClass; + FStyleAppearance: TStyledButtonAppearance; + FCustomDrawType: Boolean; + FStyleApplied: Boolean; + FDisableButtonAlign: Integer; + FOnToolButtonClick: TNotifyEvent; + + class var + _DefaultStyleDrawType: TStyledButtonDrawType; + _UseCustomDrawType: Boolean; + _DefaultFamily: TStyledButtonFamily; + _DefaultClass: TStyledButtonClass; + _DefaultAppearance: TStyledButtonAppearance; + _DefaultStyleRadius: Integer; + _DefaultButtonsCursor: TCursor; + + function ControlsWidth: Integer; + function ControlsHeight: Integer; + procedure InsertButton(Control: TControl); + procedure RemoveButton(Control: TControl); + procedure SetButtonHeight(const AValue: Integer); + //procedure HotImageListChange(Sender: TObject); + procedure SetButtonWidth(const AValue: Integer); + procedure SetCustomizable(const AValue: Boolean); + procedure SetDisabledImages(const AValue: TCustomImageList); + procedure SetFlat(const AValue: Boolean); + procedure SetHideClippedButtons(const AValue: Boolean); + procedure SetImages(const AValue: TCustomImageList); + procedure SetIndent(const AValue: Integer); + procedure SetList(const AValue: Boolean); + procedure SetShowCaptions(const AValue: Boolean); + + procedure CMControlChange(var Message: TCMControlChange); message CM_CONTROLCHANGE; + procedure CMParentFontChanged(var Message: TCMParentFontChanged); message CM_PARENTFONTCHANGED; + procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED; + procedure CMStyleChanged(var Message: TMessage); message CM_STYLECHANGED; + procedure WMSysCommand(var Message: TWMSysCommand); message WM_SYSCOMMAND; + + function FindButtonFromAccel(Accel: Word): TStyledToolButton; + procedure ImageListChange(Sender: TObject); + procedure DisabledImageListChange(Sender: TObject); + procedure ProcessButtons(AButtonProc: TButtonProc); + procedure ProcessControls(AControlProc: TControlProc); + function IsCustomDrawType: Boolean; + function IsCustomRadius: Boolean; + function IsStoredStyleAppearance: Boolean; + function IsStoredStyleClass: Boolean; + function IsStoredStyleFamily: Boolean; + procedure SetStyleAppearance(const AValue: TStyledButtonAppearance); + procedure SetStyleClass(const AValue: TStyledButtonClass); + procedure SetStyleDrawType(const AValue: TStyledButtonDrawType); + procedure SetStyleFamily(const AValue: TStyledButtonFamily); + procedure SetStyleRadius(const AValue: Integer); + function ApplyToolbarStyle: Boolean; + procedure SetStyleApplied(const AValue: Boolean); + procedure UpdateButtons; + function GetIndent: Integer; + function FindLastControl: TControl; + function GetWrapable: Boolean; + procedure SetWrapable(const AValue: Boolean); + function GetEdgeBorders: TEdgeBorders; + function GetEdgeInner: TEdgeStyle; + function GetEdgeOuter: TEdgeStyle; + procedure SetEdgeBorders(const AValue: TEdgeBorders); + procedure SetEdgeInner(const AValue: TEdgeStyle); + procedure SetEdgeOuter(const AValue: TEdgeStyle); + procedure UpdateBevelKind; + function GetActiveStyleName: string; + function AsVCLStyle: Boolean; + function GetAsVCLComponent: Boolean; + procedure SetAsVCLComponent(const AValue: Boolean); + function GetAutoWrap: Boolean; + function GetAutoSize: Boolean; + procedure SetTransparent(const AValue: Boolean); + function GetDisableButtonAlign: Boolean; + procedure SetDisableButtonAlign(const AValue: Boolean); + function IsGradientEndColorStored: Boolean; + procedure SetButtonsCursor(const AValue: TCursor); + property DisableButtonAlign: Boolean read GetDisableButtonAlign write SetDisableButtonAlign; + protected + {$IFDEF D10_1+} + procedure ChangeScale(M, D: Integer; isDpiChange: Boolean); override; + {$ENDIF} + procedure SetAutoSize(AValue: Boolean); override; + procedure Notification(AComponent: TComponent; AOperation: TOperation); override; + function TrackMenu(Button: TStyledToolButton): Boolean; dynamic; + procedure SetParent(AParent: TWinControl); override; + procedure UpdateStyleElements; override; + procedure ClickButton(Button: TStyledToolButton); dynamic; + procedure CancelMenu; dynamic; + procedure GetButtonSize(var AWidth, AHeight: Integer); + procedure ResizeButtons; + function GetButton(AIndex: Integer): TStyledToolButton; + function GetButtonCount: Integer; + procedure AlignControls(AControl: TControl; var Rect: TRect); override; + procedure AdjustSize; override; + function GetStyledToolButtonClass: TStyledToolButtonClass; virtual; + procedure Loaded; override; + public + procedure Assign(Source: TPersistent); override; + class procedure RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; + const AFamily: TStyledButtonFamily = DEFAULT_CLASSIC_FAMILY; + const AClass: TStyledButtonClass = DEFAULT_WINDOWS_CLASS; + const AAppearance: TStyledButtonAppearance = DEFAULT_APPEARANCE; + const AStyleRadius: Integer = DEFAULT_RADIUS); virtual; + procedure BeginUpdate; virtual; + procedure EndUpdate; virtual; + procedure ClearButtons; + procedure Click; override; + procedure SetToolbarStyle(const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); + procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override; + //Styled constructor + constructor CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); virtual; + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + function NewButton(out ANewToolButton: TStyledToolButton; + const AStyle: TToolButtonStyle = tbsButton): Boolean; + procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override; + property AsVCLComponent: Boolean read GetAsVCLComponent write SetAsVCLComponent stored False; + property ButtonCount: Integer read GetButtonCount; + property Buttons[Index: Integer]: TStyledToolButton read GetButton; + property StyleApplied: Boolean read FStyleApplied write SetStyleApplied; + property AutoWrap: Boolean read GetAutoWrap; + published + property Align default alTop; + property Anchors; + property AutoSize: Boolean read GetAutoSize write SetAutoSize default False; + property ButtonsCursor: TCursor read FButtonsCursor write SetButtonsCursor default DEFAULT_CURSOR; + property BorderWidth; + property ButtonHeight: Integer read FButtonHeight write SetButtonHeight default 22; + property ButtonWidth: Integer read FButtonWidth write SetButtonWidth default 23; + property Caption; + property Color; + property Constraints; + property Ctl3D; + property Customizable: Boolean read FCustomizable write SetCustomizable default False; + property DisabledImages: TCustomImageList read FDisabledImages write SetDisabledImages; + property DoubleBuffered; + property DockSite; + property DragCursor; + property DragKind; + property DragMode; + property EdgeBorders: TEdgeBorders read GetEdgeBorders write SetEdgeBorders default []; + property EdgeInner: TEdgeStyle read GetEdgeInner write SetEdgeInner default esNone; + property EdgeOuter: TEdgeStyle read GetEdgeOuter write SetEdgeOuter default esNone; + property Enabled; + property Flat: Boolean read FFlat write SetFlat default True; + property Font; + property Height; + property HideClippedButtons: Boolean read FHideClippedButtons write SetHideClippedButtons default False; + property Images: TCustomImageList read FImages write SetImages; + property Indent: Integer read GetIndent write SetIndent default 0; + property List: Boolean read FList write SetList default False; + property ParentBiDiMode; + property ParentBackground; + property ParentColor default True; + property ParentDoubleBuffered; + property ParentFont; + property ParentShowHint; + property PopupMenu; + property ShowCaptions: Boolean read FShowCaptions write SetShowCaptions default False; + property ShowHint; + property TabOrder; + property TabStop; + property Touch; + property Transparent: Boolean read FTransparent write SetTransparent stored False; + property Visible; + property StyleElements; + property Wrapable: Boolean read GetWrapable write SetWrapable default True; + property OnAlignInsertBefore; + property OnAlignPosition; + property OnCanResize; + property OnClick; + property OnContextPopup; + property OnDblClick; + property OnDockDrop; + property OnDockOver; + property OnDragDrop; + property OnDragOver; + property OnEndDock; + property OnEndDrag; + property OnEnter; + property OnExit; + property OnGesture; + property OnGetSiteInfo; + property OnMouseActivate; + property OnMouseDown; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + property OnMouseUp; + property OnResize; + property OnStartDock; + property OnStartDrag; + property OnUnDock; + + //Properties ignores (only for backward compatibility) + property GradientDrawingOptions: TTBGradientDrawingOptions read FGradientDrawingOptions write FGradientDrawingOptions default [gdoHotTrack, gdoGradient]; + property GradientDirection: TGradientDirection read FGradientDirection write FGradientDirection default gdVertical; + property DrawingStyle: TTBDrawingStyle read FDrawingStyle write FDrawingStyle default TTBDrawingStyle.dsNormal; + property GradientEndColor: TColor read FGradientEndColor write FGradientEndColor stored IsGradientEndColorStored; + property GradientStartColor: TColor read FGradientStartColor write FGradientStartColor default clWindow; + + //StyledComponents Attributes + property StyleRadius: Integer read FStyleRadius write SetStyleRadius stored IsCustomRadius; + property StyleDrawType: TStyledButtonDrawType read FStyleDrawType write SetStyleDrawType stored IsCustomDrawType; + property StyleFamily: TStyledButtonFamily read FStyleFamily write SetStyleFamily stored IsStoredStyleFamily; + property StyleClass: TStyledButtonClass read FStyleClass write SetStyleClass stored IsStoredStyleClass; + property StyleAppearance: TStyledButtonAppearance read FStyleAppearance write SetStyleAppearance stored IsStoredStyleAppearance; + + //Event Handlers + property OnCustomizeNewButton: TSTBNewButtonEvent read FOnCustomizeNewButton write FOnCustomizeNewButton; + property OnCustomizeAdded: TSTBButtonEvent read FOnCustomizeAdded write FOnCustomizeAdded; + property OnToolButtonClick: TNotifyEvent read FOnToolButtonClick write FOnToolButtonClick; + end; + +implementation + +uses + Vcl.Consts + , Vcl.Forms + , System.Types + , System.RTLConsts + ; + +const + DEFAULT_SEP_WIDTH = 6; + DEFAULT_TOOLBUTTON_WIDTH = 23; + DEFAULT_TOOLBUTTON_HEIGHT = 22; + DEFAULT_IMAGE_HMARGIN = 8; + +{ TStyledToolButton } + +constructor TStyledToolButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + if StyleServices.Available then + ControlStyle := [csSetCaption, csClickEvents] + else + ControlStyle := [csCaptureMouse, csSetCaption, csClickEvents]; + FStyle := tbsButton; + Width := DEFAULT_TOOLBUTTON_WIDTH; + Height := DEFAULT_TOOLBUTTON_HEIGHT; + ImageAlignment := iaTop; + FEnabled := True; +end; + +procedure TStyledToolButton.MouseDown(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + inherited MouseDown(Button, Shift, X, Y); +end; + +procedure TStyledToolButton.MouseUp(Button: TMouseButton; Shift: TShiftState; + X, Y: Integer); +begin + inherited MouseUp(Button, Shift, X, Y); +(* + if (Button = mbLeft) and (Style = tbsCheck) then + begin + if (Down and AllowAllUp) or (not Down) then + Down := not Down; + end; +*) +end; + +procedure TStyledToolButton.Click; +begin + if not IsDropDown and Assigned(DropDownMenu) then + ShowDropDownMenu + else + begin + inherited Click; + if Assigned(FToolbar) and Assigned(FToolbar.FOnToolButtonClick) then + begin + FToolbar.FOnToolButtonClick(Self); + end; + end; +end; + +function TStyledToolButton.GetButtonState: TStyledButtonState; +begin + if (Style = tbsCheck) and Down then + Result := bsmPressed + else + Result := inherited GetButtonState; +end; + +function TStyledToolButton.GetCaptionToDraw: TCaption; +begin + if Assigned(FToolBar) and not FToolBar.ShowCaptions then + Result := '' + else + Result := inherited GetCaption; +end; + +function TStyledToolButton.GetEnable: Boolean; +begin + if IsSeparator then + Result := False + else + Result := inherited Enabled; +end; + +function TStyledToolButton.GetHeight: Integer; +begin + Result := inherited Height; +end; + +function TStyledToolButton.GetImage(out AImageList: TCustomImageList; + out AImageIndex: Integer): Boolean; +begin + if IsSeparator then + begin + AImageList := nil; + AImageIndex := -1; + Result := False; + end + else + Result := inherited GetImage(AImageList, AImageIndex); +end; + +function TStyledToolButton.GetIndex: Integer; +begin + if Assigned(FToolBar) then + Result := FToolBar.FButtons.IndexOf(Self) + else + Result := -1; +end; + +function TStyledToolButton.GetStyleDrawType: TStyledButtonDrawType; +begin + Result := inherited StyleDrawType; +end; + +function TStyledToolButton.GetWrap: Boolean; +begin + Result := inherited WordWrap; +end; + +function TStyledToolButton.IsCaptionStored: Boolean; +begin + if IsSeparator then + Result := False + else + Result := inherited IsCaptionStored; +end; + +function TStyledToolButton.IsImageAlignmentStored: Boolean; +begin + if Assigned(FToolBar) then + Result := FImageAlignment <> iaTop + else + Result := True; +end; + +function TStyledToolButton.IsImagesStored: Boolean; +begin + Result := not Assigned(FToolBar) or + (Images <> FToolBar.Images); +end; + +function TStyledToolButton.IsWidthStored: Boolean; +begin + if IsSeparator then + begin + Result := Width <> DEFAULT_SEP_WIDTH + end + else if Assigned(FToolBar) then + begin + if IsDropDown then + Result := (Width - GetSplitButtonWidth <> FToolbar.ButtonWidth) + else + Result := (Width <> FToolbar.ButtonWidth); + end + else + Result := Width <> DEFAULT_TOOLBUTTON_WIDTH; +end; + +procedure TStyledToolButton.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited Notification(AComponent, AOperation); + if AOperation = opRemove then + begin + if AComponent = FToolBar then + FToolBar := nil; + end; +end; + +procedure TStyledToolButton.SetAutoSize(AValue: Boolean); +begin + if AValue <> AutoSize then + begin + FAutoSize := AValue; + if Assigned(FToolBar) then + FToolBar.ResizeButtons; + end; +end; + +procedure TStyledToolButton.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +var + LUpdateToolBar: Boolean; + LHeight, LWidth: Integer; +begin + LHeight := Height; + LWidth := Width; + if IsDropDown then + LWidth := FToolBar.ButtonWidth + GetSplitButtonWidth; + LUpdateToolBar := (not RescalingButton) + and Assigned(FToolBar) and ((AWidth <> Width) or (AHeight <> Height)) + and not IsSeparator + and not (csLoading in ComponentState); + inherited SetBounds(ALeft, ATop, AWidth, AHeight); + if LUpdateToolbar then + begin + LUpdateToolbar := False; + if AHeight <> LHeight then + begin + FToolBar.FButtonHeight := AHeight; + LUpdateToolbar := True; + end; + if AWidth <> LWidth then + begin + FToolBar.FButtonWidth := AWidth; + LUpdateToolbar := True; + end; + if LUpdateToolbar and (AWidth <> 0) and (AHeight <> 0) then + FToolBar.ResizeButtons; + end; +end; + +function TStyledToolButton.IsSeparator: Boolean; +begin + Result := Style in [tbsSeparator, tbsDivider]; +end; + +function TStyledToolButton.IsDropDown: Boolean; +begin + Result := Style = tbsDropDown; +end; + +function TStyledToolButton.IsEnabledStored: Boolean; +begin + if IsSeparator then + Result := False + else + Result := inherited IsEnabledStored; +end; + +procedure TStyledToolButton.UpdateButtonContent; +begin + //Updates content of Button based on ShowCaptions and Style + if Assigned(FToolbar) then + begin + if FToolBar.ShowCaptions then + begin + if not FToolbar.List then + begin + inherited ImageAlignment := FImageAlignment; + //inherited ImageMargins.Left := 0; + //inherited ImageMargins.Right := 0; + end + else + begin + if IsRightToLeft then + begin + inherited ImageAlignment := iaRight; + //inherited ImageMargins.Right := DEFAULT_IMAGE_HMARGIN; + //inherited ImageMargins.Left := 0; + end + else + begin + inherited ImageAlignment := iaLeft; + //inherited ImageMargins.Left := DEFAULT_IMAGE_HMARGIN; + //inherited ImageMargins.Right := 0; + end; + end; + end + else + begin + inherited ImageAlignment := iaCenter; + end; + if IsSeparator then + begin + inherited Enabled := False; + inherited DisabledImages := nil; + inherited Images := nil; + inherited StyleRadius := 1; + end + else + begin + inherited Enabled := FEnabled; + inherited DisabledImages := FToolbar.DisabledImages; + inherited Images := FToolbar.Images; + end; + end; + Invalidate; +end; + +procedure TStyledToolButton.SetCaption(const AValue: TCaption); +begin + if AValue <> (inherited Caption) then + begin + inherited SetCaption(AValue); + Invalidate; + end; +end; + +procedure TStyledToolButton.UpAllPrevButtons(const AIndex: Integer); +var + LPrevBtn: TStyledToolButton; +begin + if Grouped and Assigned(FToolbar) then + begin + LPrevBtn := FToolBar.GetButton(AIndex); + if Assigned(LPrevBtn) and (LPrevBtn.Style = tbsCheck) and (LPrevBtn.Grouped) then + begin + LPrevBtn.Down := False; + LPrevBtn.UpAllPrevButtons(AIndex-1); + end; + end; +end; + +procedure TStyledToolButton.UpAllNextButtons(const AIndex: Integer); +var + LNextBtn: TStyledToolButton; +begin + if Grouped and Assigned(FToolbar) then + begin + LNextBtn := FToolBar.GetButton(AIndex); + if Assigned(LNextBtn) and (LNextBtn.Style = tbsCheck) and (LNextBtn.Grouped) then + begin + LNextBtn.Down := False; + LNextBtn.UpAllNextButtons(AIndex+1); + end; + end; +end; + +procedure TStyledToolButton.SetEnable(const AValue: Boolean); +begin + if FEnabled <> AValue then + begin + FEnabled := AValue; + UpdateButtonContent; + end; +end; + +procedure TStyledToolButton.UpdateGroupIndex; +begin + if Style = tbsCheck then + begin + if FGrouped then + Render.GroupIndex := -1 + else if Render.GroupIndex = -1 then + Render.GroupIndex := 0; + end; +end; + +procedure TStyledToolButton.SetGrouped(AValue: Boolean); +begin + if FGrouped <> AValue then + begin + FGrouped := AValue; + UpdateGroupIndex; + end; +end; + +procedure TStyledToolButton.SetHeight(const AValue: Integer); +begin + inherited Height := AValue; +end; + +procedure TStyledToolButton.SetImageAlignment(const AValue: TImageAlignment); +begin + if FImageAlignment <> AValue then + begin + FImageAlignment := AValue; + UpdateButtonContent; + end; +end; + +procedure TStyledToolButton.SetMarked(AValue: Boolean); +begin + FMarked := AValue; +end; + +procedure TStyledToolButton.SetMenuItem(const AValue: TMenuItem); +begin + { Copy all appropriate values from menu item } + if AValue <> nil then + begin + if FMenuItem <> AValue then + AValue.FreeNotification(Self); + Action := AValue.Action; + Caption := AValue.Caption; + Down := AValue.Checked; + Enabled := AValue.Enabled; + Hint := AValue.Hint; + ImageIndex := AValue.ImageIndex; +{$IFDEF D10_4+} + ImageName := AValue.ImageName; +{$ENDIF} + Visible := AValue.Visible; + end; + FMenuItem := AValue; +end; + +function TStyledToolButton.IsCustomRadius: boolean; +begin + Result := not IsSeparator; + if Result then + begin + if Assigned(FToolBar) then + Result := StyleRadius <> FToolBar.StyleRadius + else + Result := StyleRadius <> DEFAULT_RADIUS; + end; +end; + +function TStyledToolButton.IsCustomRoundedCorners: Boolean; +begin + Result := StyleRoundedCorners <> ALL_ROUNDED_CORNERS; +end; + +function TStyledToolButton.IsCustomDrawType: Boolean; +begin + if Assigned(FToolBar) then + Result := StyleDrawType <> FToolBar.StyleDrawType + else + Result := StyleDrawType <> btRoundRect; +end; + +function TStyledToolButton.IsStoredStyleFamily: Boolean; +begin + if Assigned(FToolBar) then + Result := not SameText(StyleFamily,FToolBar.StyleFamily) + else + Result := True; +end; + +function TStyledToolButton.IsStoredStyleClass: Boolean; +begin + if Assigned(FToolBar) then + Result := not SameText(StyleClass,FToolBar.StyleClass) + else + Result := inherited IsStoredStyleClass; +end; + +function TStyledToolButton.IsStoredFlat: Boolean; +begin + if Assigned(FToolBar) then + Result := Flat <> FToolBar.Flat + else + Result := True; +end; + +function TStyledToolButton.IsStoredCursor: Boolean; +begin + if Assigned(FToolBar) then + Result := Cursor <> FToolBar.FButtonsCursor + else + Result := Cursor <> DEFAULT_CURSOR; +end; + +function TStyledToolButton.IsStoredStyleAppearance: Boolean; +begin + if Assigned(FToolBar) then + Result := not SameText(StyleAppearance, FToolBar.StyleAppearance) + else + Result := True; +end; + +procedure TStyledToolButton.SetParent(AParent: TWinControl); +{$IFDEF D10_4+} +var + LToolBar: TStyledToolBar; +{$ENDIF} +begin + inherited; + {$IFDEF D10_4+} + if (AParent <> nil) and (AParent is TStyledToolBar) then + begin + LToolBar := TStyledToolBar(AParent); + if (LToolBar.Images <> nil) and LToolBar.Images.IsImageNameAvailable then + if (ImageIndex < 0) and (ImageName <> '') then + ImageIndex := LToolBar.Images.GetIndexByName(ImageName) + else + if (ImageIndex >= 0) and (ImageName = '') then + ImageName := LToolBar.Images.GetNameByIndex(ImageIndex); + end; + {$ENDIF} +end; + +procedure TStyledToolButton.SetStyle(AValue: TToolButtonStyle); +var + WasSeparator: Boolean; +begin + if AValue = tbsTextButton then + raise Exception.Create('tbsTextButton not available'); + WasSeparator := IsSeparator; + if FStyle <> AValue then + begin + FStyle := AValue; + UpdateGroupIndex; + if IsDropDown then + begin + inherited Style := TCustomButton.TButtonStyle.bsSplitButton; + if FToolBar.AutoSize then + FToolBar.ResizeButtons; + end + else + begin + inherited Style := TCustomButton.TButtonStyle.bsPushButton; + end; + if IsSeparator <> WasSeparator then + begin + Width := DEFAULT_SEP_WIDTH; + StyleDrawType := StyleDrawType; + end; + UpdateButtonContent; + end; +end; + +procedure TStyledToolButton.SetStyleDrawType( + const AValue: TStyledButtonDrawType); +begin + if not IsSeparator then + inherited StyleDrawType := AValue; +end; + +procedure TStyledToolButton.SetToolBar(AToolBar: TStyledToolBar); +begin + if FToolBar <> AToolBar then + begin + if FToolBar <> nil then + FToolBar.RemoveButton(Self); + Parent := AToolBar; + if AToolBar <> nil then + AToolBar.InsertButton(Self); + end; +end; + +procedure TStyledToolButton.SetWrap(const AValue: Boolean); +begin + inherited WordWrap := AValue; +end; + +procedure TStyledToolButton.ValidateContainer(AComponent: TComponent); +var + W: Integer; +begin + inherited ValidateContainer(AComponent); + { Update non-stored Width and Height if inserting into TStyledToolBar } + if (csLoading in ComponentState) and (AComponent is TStyledToolBar) then + begin + if IsSeparator then + W := DEFAULT_SEP_WIDTH else + W := TStyledToolBar(AComponent).ButtonWidth; + SetBounds(Left, Top, W, TStyledToolBar(AComponent).ButtonHeight); + end; +end; + +{ TStyledButtonToolbar } + +procedure TStyledToolbar.BeginUpdate; +begin + Inc(FUpdateCount); +end; + +procedure TStyledToolbar.CancelMenu; +begin + if FInMenuLoop then + begin + MouseCapture := False; + end; + FInMenuLoop := False; + FCaptureChangeCancels := False; +end; + +{$IFDEF D10_1+} +procedure TStyledToolbar.ChangeScale(M, D: Integer; isDpiChange: Boolean); +begin + FButtonWidth := MulDiv(FButtonWidth, M, D); + FButtonHeight := MulDiv(FButtonHeight, M, D); + inherited ChangeScale(M, D, isDpiChange); +end; +{$ENDIF} + + +procedure TStyledToolbar.ClearButtons; +var + LButton: TStyledToolButton; + LIndex: Integer; +begin + while FButtons.Count > 0 do + begin + LIndex := FButtons.Count-1; + LButton := GetButton(LIndex); + LButton.Free; + FButtons.Delete(LIndex); + end; +end; + +procedure TStyledToolbar.Click; +begin + inherited; + ; +end; + +procedure TStyledToolbar.ClickButton(Button: TStyledToolButton); +var + P: TPoint; + SmallPt: TSmallPoint; +begin + FCaptureChangeCancels := False; + P := Button.ClientToScreen(Point(0, 0)); + SmallPt := PointToSmallPoint(ScreenToClient(P)); + with SmallPt do + PostMessage(Handle, WM_LBUTTONDOWN, MK_LBUTTON, MakeLong(X, Y)); +end; + +constructor TStyledToolbar.CreateStyled(AOwner: TComponent; + const AFamily: TStyledButtonFamily; const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance); +begin + inherited Create(AOwner); + FButtons := TList.Create; + + ControlStyle := [csAcceptsControls, csCaptureMouse, csClickEvents, + csDoubleClicks, csMenuEvents, csSetCaption, csGestures]; + ShowCaption := False; + Width := 150; + Height := 29; + FButtonWidth := 23; + FButtonHeight := 22; + FButtonsCursor := DEFAULT_CURSOR; + BevelKind := bkNone; + BevelInner := bvNone; + BevelOuter := bvNone; + BevelEdges := []; + + Transparent := StyleServices.Enabled; + ParentBackground := True; + ParentColor := True; + BevelOuter := bvNone; + Flat := True; + + Align := alTop; + + FImageChangeLink := TChangeLink.Create; + FImageChangeLink.OnChange := ImageListChange; + + FDisabledImageChangeLink := TChangeLink.Create; + FDisabledImageChangeLink.OnChange := DisabledImageListChange; + + //FHotImageChangeLink := TChangeLink.Create; + //FHotImageChangeLink.OnChange := HotImageListChange; + + FGradientDrawingOptions := [gdoHotTrack,gdoGradient]; + FGradientDirection := gdVertical; + FDrawingStyle := TTBDrawingStyle.dsNormal; + FGradientEndColor := GetShadowColor(clBtnFace, -25); + FGradientStartColor := clWindow; + FStyleDrawType := _DefaultStyleDrawType; + FStyleRadius := _DefaultStyleRadius; + FStyleFamily := AFamily; + FStyleClass := AClass; + FStyleAppearance := AAppearance; + FButtonsCursor := _DefaultButtonsCursor; +end; + +constructor TStyledToolbar.Create(AOwner: TComponent); +begin + CreateStyled(AOwner, + _DefaultFamily, + _DefaultClass, + _DefaultAppearance); +end; + +destructor TStyledToolbar.Destroy; +begin + //FHotImageChangeLink.Free; + FreeAndNil(FDisabledImageChangeLink); + FreeAndNil(FImageChangeLink); + FreeAndNil(FButtons); + inherited Destroy; +end; + +procedure TStyledToolbar.DisabledImageListChange(Sender: TObject); +begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.DisabledImages := DisabledImages; + end + ); +end; + +procedure TStyledToolbar.EndUpdate; +begin + Dec(FUpdateCount); +end; + +procedure TStyledToolbar.ImageListChange(Sender: TObject); +begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.Images := Images; + end + ); +end; + +procedure TStyledToolbar.SetButtonsCursor(const AValue: TCursor); +begin + if FButtonsCursor <> AValue then + begin + FButtonsCursor := AValue; + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.Cursor := AValue; + end + ); + end; +end; + +procedure TStyledToolbar.AdjustSize; +var + LSize: Integer; +begin + inherited; + if not (csLoading in ComponentState) and HandleAllocated then + begin + //Recalc correct Size only for AutoSize and AutoWrap + if Assigned(Parent) and FAutoSize and AutoWrap and (FButtons.Count > 0) then + begin + if (Align in [alLeft, alRight]) then + begin + LSize := ControlsWidth; + if LSize > Parent.ClientWidth then + LSize := Parent.ClientWidth; + if (LSize <> Width) then + Width := LSize; + end + else if Align in [alTop, alBottom] then + begin + LSize := ControlsHeight; + if LSize > Parent.ClientHeight then + LSize := Parent.ClientHeight; + if LSize <> Height then + Height := LSize; + end; + end; + end; +end; + +procedure TStyledToolbar.SetWrapable(const AValue: Boolean); +begin + if AutoWrap <> AValue then + begin + if AValue then + begin + //FlowPanel AutoSize don't work correctly when AutoWrap is True + inherited AutoSize := False; + end; + inherited AutoWrap := AValue; + end; +end; + +procedure TStyledToolbar.SetAutoSize(AValue: Boolean); +begin + if AValue <> FAutoSize then + begin + FAutoSize := AValue; + //FlowPanel AutoSize don't work correctly when AutoWrap is True + if not AutoWrap then + inherited AutoSize := AValue + else + RequestAlign; + end; +end; + +procedure TStyledToolbar.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); +begin + inherited; +end; + +procedure TStyledToolbar.SetButtonHeight(const AValue: Integer); +begin + if FButtonHeight <> AValue then + begin + FButtonHeight := AValue; + if AutoSize and (Align in [alTop, alBottom]) and (Height < AValue) then + Height := AValue; + ResizeButtons; + end; +end; + +procedure TStyledToolbar.SetButtonWidth(const AValue: Integer); +begin + if FButtonWidth <> AValue then + begin + FButtonWidth := AValue; + if AutoSize and (Align in [alLeft, alRight]) and (Width < AValue) then + Width := AValue; + ResizeButtons; + end; +end; + +procedure TStyledToolBar.InsertButton(Control: TControl); +var + LButton: TStyledToolButton; +begin + if Control is TStyledToolButton then + begin + LButton := TStyledToolButton(Control); + LButton.BeginUpdate; + try + LButton.FToolBar := Self; + LButton.Images := Self.Images; + LButton.StyleRadius := FStyleRadius; + LButton.StyleDrawType := FStyleDrawType; + LButton.StyleFamily := FStyleFamily; + LButton.StyleClass := FStyleClass; + LButton.StyleAppearance := FStyleAppearance; + LButton.StyleElements := StyleElements; + LButton.Cursor := FButtonsCursor; + LButton.RescalingButton := True; + try + LButton.Height := FButtonHeight; + LButton.Flat := FFlat; + if not LButton.IsSeparator then + LButton.Width := FButtonWidth; + FButtons.Insert(FButtons.Count, LButton); + if Assigned(FOnCustomizeAdded) then + FOnCustomizeAdded(Self, LButton); + finally + LButton.RescalingButton := False; + end; + finally + LButton.EndUpdate; + end; + LButton.UpdateButtonContent; + end + else + begin + FButtons.Insert(FButtons.Count, Control); + end; + if Showing then + AdjustSize; +end; + +function TStyledToolbar.IsCustomDrawType: Boolean; +begin + Result := FCustomDrawType; +end; + +function TStyledToolbar.IsCustomRadius: Boolean; +begin + Result := StyleRadius <> DEFAULT_RADIUS; +end; + +function TStyledToolbar.IsGradientEndColorStored: Boolean; +begin + Result := FGradientEndColor <> GetShadowColor(clBtnFace, -25); +end; + +function TStyledToolbar.IsStoredStyleAppearance: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + Result := FStyleAppearance <> LAppearance; +end; + +function TStyledToolbar.IsStoredStyleClass: Boolean; +var + LClass: TStyledButtonClass; + LAppearance: TStyledButtonAppearance; + LButtonFamily: TButtonFamily; +begin + StyleFamilyCheckAttributes(FStyleFamily, LClass, LAppearance, LButtonFamily); + + if AsVCLStyle then + begin + Result := (FStyleClass <> GetActiveStyleName) + and not SameText(FStyleClass, 'Windows'); + end + else + Result := FStyleClass <> LClass; +end; + +function TStyledToolbar.IsStoredStyleFamily: Boolean; +begin + Result := FStyleFamily <> DEFAULT_CLASSIC_FAMILY; +end; + +procedure TStyledToolbar.Loaded; +begin + inherited; + ResizeButtons; +end; + +function TStyledToolbar.FindButtonFromAccel(Accel: Word): TStyledToolButton; +var + I: Integer; +begin + for I := 0 to FButtons.Count - 1 do + if TControl(FButtons[I]) is TStyledToolButton then + begin + Result := TStyledToolButton(FButtons[I]); + if Result.Visible and Result.Enabled and IsAccel(Accel, Result.Caption) then + Exit; + end; + Result := nil; +end; + +function TStyledToolbar.FindLastControl: TControl; +var + LLastRect: TRect; + LLastControl: TControl; +begin + LLastRect.Top := 0; + LLastRect.Left := 0; + LLastRect.Width := 0; + LLastRect.Height := 0; + LLastControl := nil; + ProcessControls( + procedure (AControl: TControl) + begin + if (AControl.Left > LLastRect.Left+LLastRect.Width) or + (AControl.Top > LLastRect.Top+LLastRect.Height) then + begin + LLastControl := AControl; + LLastRect := LLastControl.BoundsRect; + end; + end); + Result := LLastControl; +end; + +class procedure TStyledToolbar.RegisterDefaultRenderingStyle( + const ADrawType: TStyledButtonDrawType; const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; const AAppearance: TStyledButtonAppearance; + const AStyleRadius: Integer); +begin + _DefaultStyleDrawType := ADrawType; + _UseCustomDrawType := True; + _DefaultFamily := AFamily; + _DefaultClass := AClass; + _DefaultAppearance := AAppearance; + _DefaultStyleRadius := AStyleRadius; +end; + +procedure TStyledToolBar.RemoveButton(Control: TControl); +var + I: Integer; +begin + I := FButtons.IndexOf(Control); + if I >= 0 then + begin + if Control is TStyledToolButton then + begin + TStyledToolButton(Control).FToolBar := nil; + FButtons.Remove(Control); + end; + end; + if Showing then + AdjustSize; +end; + +procedure TStyledToolbar.SetCustomizable(const AValue: Boolean); +begin + FCustomizable := AValue; +end; + +procedure TStyledToolbar.SetImages(const AValue: TCustomImageList); +begin + if FImages <> AValue then + begin + FImages := AValue; + ImageListChange(Self); + end; +end; + +procedure TStyledToolbar.SetDisableButtonAlign(const AValue: Boolean); +begin + if AValue then + Inc(FDisableButtonAlign) + else + Dec(FDisableButtonAlign); +end; + +procedure TStyledToolbar.SetDisabledImages(const AValue: TCustomImageList); +begin + if FDisabledImages <> AValue then + begin + FDisabledImages := AValue; + DisabledImageListChange(Self); + end; +end; + +procedure TStyledToolbar.SetEdgeBorders(const AValue: TEdgeBorders); +var + LBevelEdges: TBevelEdges; +begin + LBevelEdges := []; + if ebLeft in AValue then + LBevelEdges := LBevelEdges + [beLeft]; + if ebTop in AValue then + LBevelEdges := LBevelEdges + [beTop]; + if ebRight in AValue then + LBevelEdges := LBevelEdges + [beRight]; + if ebBottom in AValue then + LBevelEdges := LBevelEdges + [beBottom]; + + inherited BevelEdges := LBevelEdges; + UpdateBevelKind; +end; + +procedure TStyledToolbar.UpdateBevelKind; +begin + if (BevelOuter <> bvNone) or (BevelInner <> bvNone) or + (BevelEdges <> []) then + BevelKind := bkFlat + else + BevelKind := bkNone; +end; + +procedure TStyledToolbar.SetEdgeInner(const AValue: TEdgeStyle); +begin + case AValue of + esNone: inherited BevelInner := bvNone; + esRaised: inherited BevelInner := bvRaised; + esLowered: inherited BevelInner := bvLowered; + end; + if BevelInner <> bvNone then + BevelKind := bkSoft + else + BevelKind := bkNone; + UpdateBevelKind; +end; + +procedure TStyledToolbar.SetEdgeOuter(const AValue: TEdgeStyle); +begin + case AValue of + esNone: inherited BevelOuter := bvNone; + esRaised: inherited BevelOuter := bvRaised; + esLowered: inherited BevelOuter := bvLowered; + end; + UpdateBevelKind; +end; + +procedure TStyledToolbar.SetFlat(const AValue: Boolean); +begin + if FFlat <> AValue then + begin + FFlat := AValue; + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.Flat := AValue; + end); + end; +end; + +procedure TStyledToolbar.SetHideClippedButtons(const AValue: Boolean); +begin + FHideClippedButtons := AValue; +end; + +procedure TStyledToolbar.SetIndent(const AValue: Integer); +begin + if AValue <> 0 then + begin + AlignWithMargins := True; + Margins.Left := AValue; + end; +end; + +procedure TStyledToolbar.UpdateButtons; +begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.UpdateButtonContent; + end); +end; + +procedure TStyledToolbar.Assign(Source: TPersistent); +var + LToolbar: TStyledToolbar; +begin + inherited Assign(Source); + if Source is TStyledToolbar then + begin + LToolbar := TStyledToolbar(Source); + FTransparent := LToolbar.FTransparent; + FShowCaptions := LToolbar.FShowCaptions; + FButtonsCursor := LToolbar.FButtonsCursor; + FButtonHeight := LToolbar.FButtonHeight; + FButtonWidth := LToolbar.FButtonWidth; + FCustomizable := LToolbar.FCustomizable; + DisabledImages := LToolbar.FDisabledImages; + FFlat := LToolbar.FFlat; + FHideClippedButtons := LToolbar.FHideClippedButtons; + Images := LToolbar.FImages; + FList := LToolbar.FList; + FStyleFamily := LToolbar.FStyleFamily; + FStyleClass := LToolbar.FStyleClass; + FStyleAppearance := LToolbar.FStyleAppearance; + FStyleRadius := LToolbar.FStyleRadius; + FStyleDrawType := LToolbar.FStyleDrawType; + Invalidate; + end; +end; + +function TStyledToolbar.AsVCLStyle: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements); +end; + +function TStyledToolbar.GetAsVCLComponent: Boolean; +begin + Result := (StyleFamily = DEFAULT_CLASSIC_FAMILY) and + (seClient in StyleElements) and + (FStyleClass = GetActiveStyleName); +end; + +procedure TStyledToolbar.SetAsVCLComponent(const AValue: Boolean); +begin + if AValue <> GetAsVCLComponent then + begin + if AValue then + begin + FStyleFamily := DEFAULT_CLASSIC_FAMILY; + FStyleClass := DEFAULT_WINDOWS_CLASS; + FStyleAppearance := DEFAULT_APPEARANCE; + StyleElements := StyleElements + [seClient]; + FCustomDrawType := False; + end + else if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + begin + StyleElements := StyleElements - [seClient]; + end; + UpdateStyleElements; + end; +end; + +procedure TStyledToolbar.UpdateStyleElements; +var + LStyleClass: TStyledButtonClass; +begin + if AsVCLStyle then + begin + //if StyleElements contains seClient then Update style + //as VCL Style assigned to Toolbar or Global VCL Style + if seBorder in StyleElements then + StyleAppearance := DEFAULT_APPEARANCE; + LStyleClass := GetActiveStyleName; + FStyleClass := LStyleClass; + StyleApplied := ApplyToolbarStyle; + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.UpdateStyleElements; + ABtn.StyleDrawType := Self.StyleDrawType; + end); + end; + inherited; +end; + +procedure TStyledToolbar.WMSysCommand(var Message: TWMSysCommand); + + function IsMenuBar: Boolean; + var + I: Integer; + begin + Result := False; + for I := 0 to FButtons.Count - 1 do + if (TControl(FButtons[I]) is TStyledToolButton) + and Assigned(TStyledToolButton(FButtons[I]).MenuItem) then + begin + Result := True; + Break; + end; + end; + +var + Button: TStyledToolButton; +begin + { Enter menu loop if only the Alt key is pressed -- ignore Alt-Space and let + the default processing show the system menu. } + if not FInMenuLoop and Enabled and Showing and (ShowCaptions) and IsMenuBar then + with Message do + if (CmdType and $FFF0 = SC_KEYMENU) and (Key <> VK_SPACE) and + (Key <> Word('-')) and (GetCapture = 0) then + begin + if Key = 0 then + Button := nil else + Button := FindButtonFromAccel(Key); + if (Key = 0) or ((Button <> nil) and (Button.ImageIndex > -1)) then + begin + TrackMenu(Button); + Result := 1; + Exit; + end; + end; +end; + +procedure TStyledToolbar.SetList(const AValue: Boolean); +begin + if FList <> AValue then + begin + FList := AValue; + UpdateButtons; + end; +end; + +procedure TStyledToolbar.SetParent(AParent: TWinControl); +begin + inherited; + if Assigned(Self.Parent) then + UpdateStyleElements; +end; + +procedure TStyledToolbar.SetShowCaptions(const AValue: Boolean); +begin + if FShowCaptions <> AValue then + begin + FShowCaptions := AValue; + UpdateButtons; + end; +end; + +procedure TStyledToolbar.AlignControls(AControl: TControl; var Rect: TRect); +var + LPoint: TPoint; + LRect: TRect; + I: Integer; + LButton, LSourceButton, LTargetButton: TStyledToolButton; +begin + if (AControl is TStyledToolButton) and not DisableButtonAlign then + begin + //Move Button selected in new position + LSourceButton := TStyledToolButton(AControl); + LPoint.Y := AControl.Top + (AControl.Height div 2); + LPoint.X := AControl.Left + (AControl.Width div 2); + LTargetButton := nil; + for I := 0 to FButtons.Count -1 do + begin + LButton := TStyledToolButton(FButtons[I]); + LRect := LButton.BoundsRect; + if (LButton <> LSourceButton) and PtInRect(LRect, LPoint) then + begin + LTargetButton := LButton; + Break; + end; + end; + if Assigned(LTargetButton) then + begin + //Replace index of Source Control to Target + SetControlIndex(AControl, GetControlIndex(LTargetButton)); + end; + end; + inherited; +end; + +function TStyledToolbar.ApplyToolbarStyle: Boolean; +var + LButtonFamily: TButtonFamily; + LAttributesNormal, LAttributesOther: TStyledButtonAttributes; +begin + Result := StyleFamilyCheckAttributes(FStyleFamily, + FStyleClass, FStyleAppearance, LButtonFamily); + if Result or (csDesigning in ComponentState) then + begin + LAttributesNormal := nil; + LAttributesOther := nil; + try + LAttributesNormal := TStyledButtonAttributes.Create(nil); + LAttributesOther := TStyledButtonAttributes.Create(nil); + StyleFamilyUpdateAttributes( + FStyleFamily, + FStyleClass, + FstyleAppearance, + LAttributesNormal, + LAttributesOther, + LAttributesOther, + LAttributesOther, + LAttributesOther); + finally + LAttributesNormal.Free; + LAttributesOther.Free; + end; + end; +end; + +procedure TStyledToolbar.SetStyleAppearance( + const AValue: TStyledButtonAppearance); +var + LValue: TStyledButtonAppearance; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_APPEARANCE; + if (FStyleAppearance <> LValue) or not FStyleApplied then + begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + if ABtn.StyleAppearance = StyleAppearance then + ABtn.StyleAppearance := LValue; + end); + FStyleAppearance := LValue; + StyleApplied := ApplyToolbarStyle; + end; +end; + +procedure TStyledToolbar.SetStyleApplied(const AValue: Boolean); +begin + FStyleApplied := AValue; +end; + +procedure TStyledToolbar.SetStyleClass(const AValue: TStyledButtonClass); +var + LValue: TStyledButtonClass; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_WINDOWS_CLASS; + if (LValue <> Self.FStyleClass) or not FStyleApplied then + begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + if ABtn.StyleClass = StyleClass then + ABtn.StyleClass := LValue; + end); + FStyleClass := LValue; + StyleApplied := ApplyToolbarStyle; + if (FStyleFamily = DEFAULT_CLASSIC_FAMILY) and + (LValue <> 'Windows') then + StyleElements := [seFont, seBorder]; + end; +end; + +procedure TStyledToolbar.SetStyleDrawType(const AValue: TStyledButtonDrawType); +begin + FCustomDrawType := True; + if FStyleDrawType <> AValue then + begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + if ABtn.StyleDrawType = StyleDrawType then + ABtn.StyleDrawType := AValue; + end); + FStyleDrawType := AValue; + StyleApplied := ApplyToolbarStyle; + end; +end; + +procedure TStyledToolbar.SetStyleFamily(const AValue: TStyledButtonFamily); +var + LValue: TStyledButtonFamily; +begin + LValue := AValue; + if LValue = '' then + LValue := DEFAULT_CLASSIC_FAMILY; + if (LValue <> Self.FStyleFamily) or not FStyleApplied then + begin + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + if ABtn.StyleFamily = FStyleFamily then + ABtn.StyleFamily := LValue; + end); + FStyleFamily := LValue; + StyleApplied := ApplyToolbarStyle; + end; + if FStyleFamily = DEFAULT_CLASSIC_FAMILY then + StyleElements := [seFont, seClient, seBorder]; +end; + +procedure TStyledToolbar.SetStyleRadius(const AValue: Integer); +begin + if FStyleRadius <> AValue then + begin + if AValue <= 0 then + raise EReadError.create(SInvalidProperty); + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + if ABtn.StyleRadius = FStyleRadius then + ABtn.StyleRadius := AValue; + end); + FStyleRadius := AValue; + StyleApplied := ApplyToolbarStyle; + end; +end; + +procedure TStyledToolbar.SetToolbarStyle( + const AStyleFamily: TStyledButtonFamily; + const AStyleClass: TStyledButtonClass; + const AStyleAppearance: TStyledButtonAppearance); +begin + StyleFamily := AStyleFamily; + StyleClass := AStyleClass; + StyleAppearance := AStyleAppearance; + if not ApplyToolbarStyle then + raise EStyledButtonError.CreateFmt(ERROR_SETTING_TOOLBAR_STYLE, + [AStyleFamily, AStyleClass, AStyleAppearance]); +end; + +procedure TStyledToolbar.SetTransparent(const AValue: Boolean); +begin + if FTransparent <> AValue then + begin + FTransparent := AValue; + if AValue then + ControlStyle := ControlStyle - [csOpaque] else + ControlStyle := ControlStyle + [csOpaque]; + end; +end; + +function TStyledToolbar.TrackMenu(Button: TStyledToolButton): Boolean; +begin + { Already in menu loop - click button to drop-down menu } + if FInMenuLoop then + begin + if Button <> nil then + begin + ClickButton(Button); + Result := True; + end + else + Result := False; + Exit; + end + else + Result := False; +end; + +procedure TStyledToolbar.GetButtonSize(var AWidth, AHeight: Integer); +var + LWidth, LHeight: Integer; +begin + LWidth := AWidth; + LHeight := AHeight; + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + LWidth := Max(LWidth, ABtn.Width); + LHeight := Max(LHeight, ABtn.Height); + end + ); + AWidth := LWidth; + AHeight := LHeight; +end; + +procedure TStyledToolbar.GetChildren(Proc: TGetChildProc; Root: TComponent); +var + I: Integer; + Control: TControl; +begin + for I := 0 to FButtons.Count - 1 do + Proc(TStyledButton(FButtons[I])); + for I := 0 to ControlCount - 1 do + begin + Control := Controls[I]; + if (Control.Owner = Root) and (FButtons.IndexOf(Control) = -1) then + Proc(Control); + end; +end; + +function TStyledToolbar.GetDisableButtonAlign: Boolean; +begin + Result := FDisableButtonAlign > 0; +end; + +function TStyledToolbar.GetEdgeBorders: TEdgeBorders; + +begin + Result := []; + if beLeft in BevelEdges then + Result := Result + [ebLeft]; + if beTop in BevelEdges then + Result := Result + [ebTop]; + if beTop in BevelEdges then + Result := Result + [ebTop]; + if beRight in BevelEdges then + Result := Result + [ebRight]; + if beBottom in BevelEdges then + Result := Result + [ebBottom]; +end; + +function TStyledToolbar.GetEdgeInner: TEdgeStyle; +begin + case BevelInner of + bvNone: Result := esNone; + bvLowered: Result := esLowered; + bvRaised: Result := esRaised; + else + Result := esNone; + end; +end; + +function TStyledToolbar.GetEdgeOuter: TEdgeStyle; +begin + case BevelOuter of + bvNone: Result := esNone; + bvLowered: Result := esLowered; + bvRaised: Result := esRaised; + else + Result := esNone; + end; +end; + +function TStyledToolbar.GetIndent: Integer; +begin + if AlignWithMargins then + Result := Margins.Left + else + Result := 0; +end; + +function TStyledToolbar.GetWrapable: Boolean; +begin + Result := inherited AutoWrap; +end; + +procedure TStyledToolbar.ResizeButtons; +begin + if (csLoading in ComponentState) then + Exit; + + DisableButtonAlign := True; + try + if (FButtonHeight <> 0) and (FButtonWidth <> 0) and + (FUpdateCount = 0) then + begin + BeginUpdate; + try + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.BeginUpdate; + try + if not ABtn.IsSeparator then + begin + if ABtn.IsDropDown then + ABtn.Width := FButtonWidth + ABtn.GetSplitButtonWidth + else + ABtn.Width := FButtonWidth; + end; + ABtn.Height := FButtonHeight; + finally + ABtn.EndUpdate; + end; + end + ); + finally + EndUpdate; + end; + end; + finally + DisableButtonAlign := False; + end; +end; + +function TStyledToolbar.GetActiveStyleName: string; +begin + Result := Vcl.ButtonStylesAttributes.GetActiveStyleName(Self); +end; + +function TStyledToolbar.GetAutoSize: Boolean; +begin + //FlowPanel AutoSize don't work correctly when AutoWrap is True + if not AutoWrap then + Result := inherited AutoSize + else + Result := FAutoSize; +end; + +function TStyledToolbar.GetAutoWrap: Boolean; +begin + Result := inherited AutoWrap; +end; + +function TStyledToolbar.GetButton(AIndex: Integer): TStyledToolButton; +var + LObject: TObject; +begin + Result := nil; + if (AIndex >= 0) and (AIndex <= FButtons.Count-1) then + begin + LObject := FButtons[AIndex]; + if LObject is TStyledToolButton then + Result := TStyledToolButton(LObject) + end; +end; + +function TStyledToolbar.GetButtonCount: Integer; +begin + if Assigned(FButtons) then + Result := FButtons.Count + else + Result := 0; +end; + +procedure TStyledToolBar.CMControlChange(var Message: TCMControlChange); +begin + inherited; + with Message do + if Inserting then + InsertButton(Control) + else + RemoveButton(Control); +end; + +procedure TStyledToolbar.CMFontChanged(var Message: TMessage); +begin + inherited; + //Apply the Font to every buttons + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.Font.Assign(Font); + end + ); +end; + +procedure TStyledToolbar.CMParentFontChanged(var Message: TCMParentFontChanged); +begin + inherited; + //Reset the Font of every buttons to Parent Font (of Toolbar) + if ParentFont then + ProcessButtons( + procedure (ABtn: TStyledToolButton) + begin + ABtn.ParentFont := True; + end + ); +end; + +procedure TStyledToolbar.CMStyleChanged(var Message: TMessage); +begin + inherited; + UpdateStyleElements; + Invalidate; +end; + +function TStyledToolbar.ControlsHeight: Integer; +var + LSize: Integer; +begin + if AlignWithMargins then + LSize := Margins.Top + Margins.Bottom + 1 + else + LSize := 1; + ProcessControls( + procedure (AControl: TControl) + begin + if AControl.Height > LSize then + LSize := LSize + AControl.Height; + end); + Result := LSize; +end; + +function TStyledToolbar.ControlsWidth: Integer; +var + LSize: Integer; +begin + if AlignWithMargins then + LSize := Margins.Left + Margins.Right + 1 + else + LSize := 1; + ProcessControls( + procedure (AControl: TControl) + begin + if AControl.Width > LSize then + LSize := AControl.Width; + end); + Result := LSize; +end; + +procedure TStyledToolbar.ProcessButtons( + AButtonProc: TButtonProc); +var + I: Integer; + LButton: TStyledToolButton; +begin + if not Assigned(FButtons) then + Exit; + for I := 0 to FButtons.Count -1 do + begin + if TObject(FButtons.Items[I]) is TStyledToolButton then + begin + LButton := TStyledToolButton(FButtons.Items[I]); + AButtonProc(LButton); + end; + end; +end; + +procedure TStyledToolbar.ProcessControls( + AControlProc: TControlProc); +var + I: Integer; + LControl: TControl; +begin + if not Assigned(FButtons) then + Exit; + for I := 0 to FButtons.Count -1 do + begin + if TObject(FButtons.Items[I]) is TControl then + begin + LControl := TControl(FButtons.Items[I]); + AControlProc(Lcontrol); + end; + end; +end; + +function TStyledToolbar.GetStyledToolButtonClass: TStyledToolButtonClass; +begin + Result := TStyledToolButton; +end; + +function TStyledToolbar.NewButton(out ANewToolButton: TStyledToolButton; + const AStyle: TToolButtonStyle = tbsButton): Boolean; +var + LLastControl: TControl; +begin + Result := False; + DisableButtonAlign := True; + try + if Assigned(FOnCustomizeNewButton) then + begin + FOnCustomizeNewButton(Self, + FButtons.Count, ANewToolButton); + Result := Assigned(ANewToolButton); + end; + if not Result then + begin + ANewToolButton := GetStyledToolButtonClass.Create(Self.Owner); + ANewToolButton.Style := AStyle; + ANewToolButton.Parent := Self; + ANewToolButton.FToolbar := Self; + ANewToolButton.SetButtonStyle(FStyleFamily, FStyleClass, FStyleAppearance); + LLastControl := FindLastControl; + if Assigned(LLastControl) then + begin + ANewToolButton.Left := LLastControl.Left+LLastControl.Width; + ANewToolButton.Top := LLastControl.Top+LLastControl.Height; + if LLastControl is TStyledToolButton then + ANewToolButton.ImageIndex := TStyledToolButton(LLastControl).ImageIndex + 1; + end + else + begin + ANewToolButton.Left := 0; + ANewToolButton.Top := 0; + end; + if Assigned(ANewToolButton) then + begin + if not ANewToolButton.IsSeparator then + ANewToolButton.Width := FButtonWidth; + ANewToolButton.Height := FButtonHeight; + Result := True; + end; + end; + finally + DisableButtonAlign := False; + end; +end; + +procedure TStyledToolbar.Notification(AComponent: TComponent; + AOperation: TOperation); +begin + inherited Notification(AComponent, AOperation); + if AOperation = opRemove then + begin + if AComponent = Images then + Images := nil; + if AComponent = DisabledImages then + DisabledImages := nil; + end; +end; + +initialization + TStyledToolbar._DefaultStyleDrawType := DEFAULT_STYLEDRAWTYPE; + TStyledToolbar._DefaultFamily := DEFAULT_CLASSIC_FAMILY; + TStyledToolbar._DefaultClass := DEFAULT_WINDOWS_CLASS; + TStyledToolbar._DefaultAppearance := DEFAULT_APPEARANCE; + TStyledToolbar._DefaultStyleRadius := DEFAULT_RADIUS; + TStyledToolbar._DefaultButtonsCursor := DEFAULT_CURSOR; + +end. diff --git a/Ext/StyledComponents/source/Vcl.TemplateButtonStyles.pas b/Ext/StyledComponents/source/Vcl.TemplateButtonStyles.pas new file mode 100644 index 0000000..0d2b874 --- /dev/null +++ b/Ext/StyledComponents/source/Vcl.TemplateButtonStyles.pas @@ -0,0 +1,274 @@ +{******************************************************************************} +{ } +{ TemplateButtonStyles: A base unit to create Button Styles attributes: } +{ family/classes/appearance } +{ In this simple example a "semaphore" Family with four classes: } +{ Green, Yellow, Red, Off in two appearance: Normal and Outline } +{ } +{ Copyright (c) 2022-2024 (Ethea S.r.l.) } +{ Author: Carlo Barazzetta } +{ Contributors: } +{ } +{ https://github.com/EtheaDev/StyledComponents } +{ } +{******************************************************************************} +{ } +{ Licensed under the Apache License, Version 2.0 (the "License"); } +{ you may not use this file except in compliance with the License. } +{ You may obtain a copy of the License at } +{ } +{ http://www.apache.org/licenses/LICENSE-2.0 } +{ } +{ Unless required by applicable law or agreed to in writing, software } +{ distributed under the License is distributed on an "AS IS" BASIS, } +{ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. } +{ See the License for the specific language governing permissions and } +{ limitations under the License. } +{ } +{******************************************************************************} +unit Vcl.TemplateButtonStyles; + +interface + +uses + Vcl.Graphics + , System.UITypes + , Vcl.ButtonStylesAttributes; + +const + //Name of Family + BTN_FAMILY = 'Semaphore'; + + //Name of Classes + BTN_OFF = 'SemOff'; + BTN_GREEN = 'SemGreen'; + BTN_YELLOW = 'SemYellow'; + BTN_RED = 'SemRed'; + + //Name of Appearance + BTN_NORMAL = 'Normal'; + BTN_OUTLINE = 'Outline'; + + //Defaults + BTN_BORDER_WIDTH = 2; + +Type + TSemaphoreButtonStyles = class(TInterfacedObject, IStyledButtonAttributes) + private + procedure UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, + AHotStyle, ADisabledStyle: TStyledButtonAttributes); + function ButtonFamilyName: string; + function GetButtonClasses: TButtonClasses; + function GetButtonAppearances: TButtonAppearances; + procedure GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); + end; + +implementation + +uses + System.SysUtils + , WinApi.Windows; + +var + ButtonClasses: TButtonClasses; + ButtonAppearances: TButtonAppearances; + +{ TSemaphoreButtonStyles } + +// Do not change this method +function TSemaphoreButtonStyles.ButtonFamilyName: string; +begin + Result := BTN_FAMILY; +end; + +// Do not change this method +function TSemaphoreButtonStyles.GetButtonAppearances: TButtonAppearances; +begin + Result := ButtonAppearances; +end; + +// Do not change this method +function TSemaphoreButtonStyles.GetButtonClasses: TButtonClasses; +begin + Result := ButtonClasses; +end; + +procedure TSemaphoreButtonStyles.GetStyleByModalResult( + const AModalResult: System.UITypes.TModalResult; + var AStyleClass: TStyledButtonClass; + var AStyleAppearance: TStyledButtonAppearance); +begin + //Define your button style based on ModalResult, used when you set ModalResult to your StyledButton + //or when your family is used inside a TStyledTaskDialog + case AModalResult of + mrNone : begin AStyleClass := BTN_OFF; AStyleAppearance := BTN_NORMAL; end; + mrYes : begin AStyleClass := BTN_GREEN; AStyleAppearance := BTN_NORMAL; end; + mrNo : begin AStyleClass := BTN_RED; AStyleAppearance := BTN_NORMAL; end; + mrOk : begin AStyleClass := BTN_GREEN; AStyleAppearance := BTN_NORMAL; end; + mrCancel : begin AStyleClass := BTN_RED; AStyleAppearance := BTN_NORMAL; end; + mrAbort : begin AStyleClass := BTN_RED; AStyleAppearance := BTN_NORMAL; end; + mrRetry : begin AStyleClass := BTN_YELLOW; AStyleAppearance := BTN_NORMAL; end; + mrIgnore : begin AStyleClass := BTN_GREEN; AStyleAppearance := BTN_NORMAL; end; + mrAll : begin AStyleClass := BTN_GREEN; AStyleAppearance := BTN_OUTLINE; end; + mrNoToAll : begin AStyleClass := BTN_RED; AStyleAppearance := BTN_OUTLINE; end; + mrYesToAll : begin AStyleClass := BTN_GREEN; AStyleAppearance := BTN_OUTLINE; end; + mrClose : begin AStyleClass := BTN_OFF; AStyleAppearance := BTN_NORMAL; end; + mrTryAgain : begin AStyleClass := BTN_GREEN; AStyleAppearance := BTN_NORMAL; end; + mrContinue : begin AStyleClass := BTN_YELLOW; AStyleAppearance := BTN_NORMAL; end; + mrHelp : begin AStyleClass := BTN_OFF; AStyleAppearance := BTN_NORMAL; end; + end; +end; + +procedure TSemaphoreButtonStyles.UpdateAttributes( + const AFamily: TStyledButtonFamily; + const AClass: TStyledButtonClass; + const AAppearance: TStyledButtonAppearance; + var ANormalStyle, APressedStyle, ASelectedStyle, AHotStyle, + ADisabledStyle: TStyledButtonAttributes); +var + LFontColor, LButtonColor: TColor; + LOutLine: Boolean; +begin + //Define AButtonColor and AFontColor for standard State button + if SameText(AClass, BTN_GREEN) then + begin + LButtonColor := clGreen; + LFontColor := clWhite; + end + else if SameText(AClass, BTN_YELLOW) then + begin + LButtonColor := clYellow; + LFontColor := clBlack; + end + else if SameText(AClass, BTN_RED) then + begin + LButtonColor := clRed; + LFontColor := clWhite; + end + else// BTN_OFF (default) + begin + LButtonColor := clSilver; + LFontColor := clGray; + end; + //Define outline attribute + LOutLine := SameText(AAppearance, BTN_OUTLINE); + + //Default Style Attributes for Semaphore Buttons + ANormalStyle.DrawType := btRounded; + ANormalStyle.BorderWidth := BTN_BORDER_WIDTH; + + //Style for Normal Style of Semaphore Button + if LOutLine then + begin + //Outline Appearance: Border and FontColor same as Button Color and Bold Font + ANormalStyle.ButtonDrawStyle := btnClear; + ANormalStyle.BorderDrawStyle := brdSolid; + ANormalStyle.FontStyle := [fsBold]; + ANormalStyle.FontColor := LButtonColor; + ANormalStyle.BorderColor := LightenColor(LButtonColor, 50); + end + else + begin + //Normal Appearance: Border and FontColor same as Button Color and Normal Font + ANormalStyle.ButtonDrawStyle := btnSolid; + ANormalStyle.BorderDrawStyle := brdClear; + ANormalStyle.FontStyle := []; + ANormalStyle.FontColor := LFontColor; + ANormalStyle.ButtonColor := LButtonColor; + ANormalStyle.BorderColor := LButtonColor; + end; + + //Clone all attributes of Normal "State" to Other "States" + CloneButtonStyle(ANormalStyle, APressedStyle); + CloneButtonStyle(ANormalStyle, ASelectedStyle); + CloneButtonStyle(ANormalStyle, AHotStyle); + CloneButtonStyle(ANormalStyle, ADisabledStyle); + + if LOutline then + begin + //Button Down: color as Button Color and more Border + with APressedStyle do + begin + ButtonDrawStyle := btnSolid; + ButtonColor := LButtonColor; + BorderColor := LightenColor(LButtonColor, 50); + BorderDrawStyle := brdSolid; + BorderWidth := BTN_BORDER_WIDTH+2; + FontColor := LFontColor; + end; + + //Button Hot: apply a Darken color to Button Color + with AHotStyle do + begin + ButtonDrawStyle := btnSolid; + ButtonColor := DarkenColor(LButtonColor, 50); + BorderDrawStyle := brdClear; + BorderWidth := BTN_BORDER_WIDTH; + FontColor := LFontColor; + end; + + //Button Focused + with ASelectedStyle do + begin +(* + if SameText(AClass, btn_dark) then + ButtonColor := LightenColor(LButtonColor, 20) + else + ButtonColor := DarkenColor(LButtonColor, 20); +*) + BorderDrawStyle := brdSolid; + BorderWidth := BTN_BORDER_WIDTH+2; + BorderColor := LightenColor(LButtonColor, 50); + ButtonDrawStyle := btnClear; + end; + + //Button Disabled + with ADisabledStyle do + begin + ButtonColor := LightenColor(ANormalStyle.ButtonColor, 70); + FontColor := LightenColor(LFontColor, 70); + end; + end + else + begin + //Button Down + APressedStyle.ButtonColor := DarkenColor(LButtonColor, 20); + APressedStyle.BorderColor := LightenColor(LButtonColor, 50); + APressedStyle.BorderDrawStyle := brdSolid; + APressedStyle.BorderWidth := BTN_BORDER_WIDTH; + + //Button Hot: color as Down but no Border + AHotStyle.ButtonColor := APressedStyle.ButtonColor; + + //Button Focused + ASelectedStyle.ButtonColor := DarkenColor(LButtonColor, 20); + ASelectedStyle.BorderDrawStyle := brdSolid; + ASelectedStyle.BorderWidth := BTN_BORDER_WIDTH; + + //Button Disabled + ADisabledStyle.ButtonColor := LightenColor(ANormalStyle.ButtonColor, 70);//ColortoGrayscale(LButtonColor); + ADisabledStyle.FontColor := LightenColor(LFontColor, 70); + end; +end; + +initialization + SetLength(ButtonClasses, 4); + ButtonClasses[0] := BTN_OFF; //Default + ButtonClasses[1] := BTN_GREEN; + ButtonClasses[2] := BTN_YELLOW; + ButtonClasses[3] := BTN_RED; + + SetLength(ButtonAppearances, 2); + ButtonAppearances[0] := BTN_NORMAL; //Default + ButtonAppearances[1] := BTN_OUTLINE; + + RegisterButtonFamily(TSemaphoreButtonStyles.Create); + +end. diff --git a/Ext/SynEdit/Packages/SynEdit_D11.dproj b/Ext/SynEdit/Packages/SynEdit_D11.dproj index 6f5ce3d..1df7812 100644 --- a/Ext/SynEdit/Packages/SynEdit_D11.dproj +++ b/Ext/SynEdit/Packages/SynEdit_D11.dproj @@ -7,8 +7,9 @@ 1 Package VCL - 19.5 + 20.1 Win32 + SynEdit_D11 true @@ -23,6 +24,11 @@ Base true + + true + Base + true + true Base @@ -71,6 +77,13 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + false 0 @@ -151,12 +164,12 @@ 1.0.0.0 - - + True False + False 12 diff --git a/Ext/SynEdit/Packages/SynEdit_D12.dproj b/Ext/SynEdit/Packages/SynEdit_D12.dproj index 915b4d5..9d3d42d 100644 --- a/Ext/SynEdit/Packages/SynEdit_D12.dproj +++ b/Ext/SynEdit/Packages/SynEdit_D12.dproj @@ -7,8 +7,9 @@ 1 Package VCL - 20.0 + 20.1 Win32 + SynEdit_D12 true @@ -23,6 +24,11 @@ Base true + + true + Base + true + true Base @@ -71,6 +77,13 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + false 0 @@ -151,12 +164,12 @@ 1.0.0.0 - - + True False + False 12 diff --git a/Ext/SynEdit/Packages/SynEdit_D12.res b/Ext/SynEdit/Packages/SynEdit_D12.res index 0a66bd5570535afbd3aba3067c79735129cdb114..4ea92b8ea31127c12db192f8bc54e5ab2798d4a4 100644 GIT binary patch delta 13 UcmX@3dPa3aj}Rlv1 Package VCL - 19.5 + 20.1 Win32 + SynEdit_R11 true @@ -23,6 +24,11 @@ Base true + + true + Base + true + true Base @@ -71,6 +77,13 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + false 0 @@ -262,6 +275,7 @@ True False + False False diff --git a/Ext/SynEdit/Packages/SynEdit_R12.dproj b/Ext/SynEdit/Packages/SynEdit_R12.dproj index 6a8cc0d..5a211f9 100644 --- a/Ext/SynEdit/Packages/SynEdit_R12.dproj +++ b/Ext/SynEdit/Packages/SynEdit_R12.dproj @@ -7,8 +7,9 @@ 1 Package VCL - 20.0 + 20.1 Win32 + SynEdit_R12 true @@ -23,6 +24,11 @@ Base true + + true + Base + true + true Base @@ -71,6 +77,13 @@ CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 1033 + + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + true + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + 1033 + false 0 @@ -262,6 +275,7 @@ True False + False False diff --git a/Ext/SynEdit/Packages/SynEdit_R12.res b/Ext/SynEdit/Packages/SynEdit_R12.res index 0a66bd5570535afbd3aba3067c79735129cdb114..4ea92b8ea31127c12db192f8bc54e5ab2798d4a4 100644 GIT binary patch delta 13 UcmX@3dPa3aj}Rlv 35)} + Vcl.StyleAPI, + Vcl.StyleBitmap, +{$IFEND} + Vcl.Styles.Utils.Misc, + Vcl.Styles.Utils.Graphics; {$IF (DEFINED (USE_VCL_STYLESAPI) AND (CompilerVersion >= 23))} -{$I 'StyleUtils.inc'} -{$I 'StyleAPI.inc'} + {$IF (CompilerVersion <= 35)} + {$I '..\source\vcl\StyleUtils.inc'} + {$I '..\source\vcl\StyleAPI.inc'} + {$ELSE} +// {$I 'StyleAPI.inc'} +// {$I 'StyleUtils.inc'} + {$IFEND} {$IFEND} type @@ -599,12 +610,14 @@ constructor TCustomStyleExt.Create(const FileName: string); end; procedure TCustomStyleExt.CopyToStream(Stream: TStream); +{$IF CompilerVersion < 36} var I: Integer; +{$IFEND} begin Stream.Size := 0; Stream.Position := 0; - + {$IF CompilerVersion < 36} TseStyle(Source).FCleanCopy.Name := TseStyle(Source).StyleSource.Name; TseStyle(Source).FCleanCopy.Author := TseStyle(Source).StyleSource.Author; TseStyle(Source).FCleanCopy.AuthorEMail := TseStyle(Source).StyleSource.AuthorEMail; @@ -630,6 +643,7 @@ procedure TCustomStyleExt.CopyToStream(Stream: TStream); TseStyle(Source).StyleSource.SysColors.Assign(TseStyle(Source).SysColors); TseStyle(Source).StyleSource.SaveToStream(Stream); } + {$IFEND} end; constructor TCustomStyleExt.Create(const Style: TCustomStyle); @@ -1861,14 +1875,14 @@ procedure TVclStylesPreview.Paint; initialization -{$IFDEF USE_VCL_STYLESAPI} +{$IF DEFINED (USE_VCL_STYLESAPI) AND (CompilerVersion < 36)} InitStyleAPI; -{$ENDIF} +{$IFEND} finalization -{$IFDEF USE_VCL_STYLESAPI} +{$IF DEFINED (USE_VCL_STYLESAPI) AND (CompilerVersion < 36)} FinalizeStyleAPI; -{$ENDIF} +{$IFEND} end. diff --git a/Ext/VCLStyleUtils/Common/Vcl.Styles.FormStyleHooks.pas b/Ext/VCLStyleUtils/Common/Vcl.Styles.FormStyleHooks.pas index 2546478..355baf6 100644 --- a/Ext/VCLStyleUtils/Common/Vcl.Styles.FormStyleHooks.pas +++ b/Ext/VCLStyleUtils/Common/Vcl.Styles.FormStyleHooks.pas @@ -1441,7 +1441,11 @@ function TFormStyleHookHelper._GetBorderSize: TRect; function TFormStyleHookHelper._GetBorderSizeAddr: Pointer; var + {$if compilerversion >35} + MethodAddr: function(UseActiveStyle: Boolean): TRect of object; + {$else} MethodAddr: function: TRect of object; + {$ifend} begin with Self do MethodAddr := GetBorderSize; diff --git a/Ext/VCLStyleUtils/Common/Vcl.Styles.OwnerDrawFix.pas b/Ext/VCLStyleUtils/Common/Vcl.Styles.OwnerDrawFix.pas index ee92c05..207d627 100644 --- a/Ext/VCLStyleUtils/Common/Vcl.Styles.OwnerDrawFix.pas +++ b/Ext/VCLStyleUtils/Common/Vcl.Styles.OwnerDrawFix.pas @@ -125,7 +125,6 @@ procedure TVclStylesOwnerDrawFix.ListViewDrawItem(Sender: TCustomListView; Item: LColor: TColor; ImageSize: Integer; begin - ImageSize := 0; LStyles := StyleServices; if not LStyles.GetElementColor(LStyles.GetElementDetails(ttItemNormal), ecTextColor, LColor) or (LColor = clNone) then LColor := LStyles.GetSystemColor(clWindowText); diff --git a/Ext/VCLStyleUtils/DDetours/Source/DDetours.pas b/Ext/VCLStyleUtils/DDetours/Source/DDetours.pas index 6682b64..79135fd 100644 --- a/Ext/VCLStyleUtils/DDetours/Source/DDetours.pas +++ b/Ext/VCLStyleUtils/DDetours/Source/DDetours.pas @@ -17,6 +17,7 @@ {define FIX_MADEXCEPT if you are using crash on buffer overrun/underrun feature from MadExcept } {.$DEFINE FIX_MADEXCEPT} +{.$define DEVMODE} {$IFDEF FPC} {$MODE DELPHI} @@ -591,7 +592,7 @@ function fDecodeInst(PInst: PInstruction): Integer; {$IFDEF CPUX64} IsNxtInstData := ((PInst^.Disp.Flags and (dfUsed or dfRip) = (dfUsed or dfRip)) and (PInst^.Disp.Value = 0)); {$ELSE !CPUX64} - IsNxtInstData := (PInst^.Disp.Value = UInt64(PInst^.NextInst)); + IsNxtInstData := (PInst^.Disp.Value = Int64(PInst^.NextInst)); {$ENDIF CPUX64} if IsNxtInstData then begin @@ -1037,7 +1038,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; GetMem(POpc, MAX_INST_LENGTH_N + 1); try // Opcsz := GetInstOpCodes(PInst, POpc); - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 6); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 6); Relsz := GetInt64Size(Offset); {$IFDEF CPUX64} if Relsz = ops16bits then @@ -1110,7 +1111,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; case Relsz of ops16bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 5); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 5); PQ^ := opPrfOpSize; Inc(PQ); PWord(PQ)^ := LOOP_To_JccZ[PInst^.OpCode and 3]; @@ -1120,7 +1121,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; end; ops32bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 6); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 6); PWord(PQ)^ := LOOP_To_JccZ[PInst^.OpCode and 3]; Inc(PQ, 2); PInt32(PQ)^ := Int32(Offset); @@ -1204,7 +1205,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; TEST CX,CX JZ @Dst } - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 5); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 5); PQ^ := opPrfOpSize; Inc(PQ); PQ^ := $0F; @@ -1220,7 +1221,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; TEST ECX,ECX JZ @Dst } - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 6); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 6); PQ^ := $0F; Inc(PQ); PQ^ := $84; // JZ ! @@ -1261,7 +1262,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; case Relsz of ops8bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 2); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 2); PInt8(PQ)^ := UInt8(NOpc); Inc(PQ); PInt8(PQ)^ := Int8(Offset); @@ -1269,7 +1270,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; end; ops16bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 5); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 5); PUInt32(PQ)^ := UInt32(NOpc); Inc(PQ, 3); PInt16(PQ)^ := Int16(Offset); @@ -1277,7 +1278,7 @@ function CorrectJ(PInst: PInstruction; NewAddr: PByte): Integer; end; ops32bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(PQ) - 6); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(PQ) - 6); PUInt16(PQ)^ := UInt16(NOpc); Inc(PQ, 2); PInt32(PQ)^ := Int32(Offset); @@ -1435,7 +1436,7 @@ function CorrectCallRel(PInst: PInstruction; NewAddr: PByte): Integer; P: PByte; begin P := NewAddr; - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(P) - 6); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(P) - 6); Relsz := GetInt64Size(Offset); {$IFDEF CPUX64} { Only 32-bits relative offset is supported on x64! } @@ -1449,7 +1450,7 @@ function CorrectCallRel(PInst: PInstruction; NewAddr: PByte): Integer; case Relsz of ops16bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(P) - 4); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(P) - 4); P^ := opPrfOpSize; Inc(P); P^ := $E8; @@ -1459,7 +1460,7 @@ function CorrectCallRel(PInst: PInstruction; NewAddr: PByte): Integer; end; ops32bits: begin - Offset := Int64(UInt64(PInst^.Branch.Target) - UInt64(P) - 5); + Offset := Int64(Int64(PInst^.Branch.Target) - Int64(P) - 5); P^ := $E8; Inc(P); PInt32(P)^ := Int32(Offset); diff --git a/Ext/dclFrameViewer11.dpk b/Ext/dclFrameViewer11.dpk deleted file mode 100644 index 60ef65c..0000000 --- a/Ext/dclFrameViewer11.dpk +++ /dev/null @@ -1,40 +0,0 @@ -package dclFrameViewer11_0; - -{$R *.res} -{$IFDEF IMPLICITBUILDING This IFDEF should not be used by users} -{$ALIGN 8} -{$ASSERTIONS ON} -{$BOOLEVAL OFF} -{$DEBUGINFO OFF} -{$EXTENDEDSYNTAX ON} -{$IMPORTEDDATA ON} -{$IOCHECKS ON} -{$LOCALSYMBOLS ON} -{$LONGSTRINGS ON} -{$OPENSTRINGS ON} -{$OPTIMIZATION ON} -{$OVERFLOWCHECKS OFF} -{$RANGECHECKS OFF} -{$REFERENCEINFO ON} -{$SAFEDIVIDE OFF} -{$STACKFRAMES OFF} -{$TYPEDADDRESS OFF} -{$VARSTRINGCHECKS ON} -{$WRITEABLECONST OFF} -{$MINENUMSIZE 1} -{$IMAGEBASE $400000} -{$DEFINE DEBUG} -{$ENDIF IMPLICITBUILDING} -{$DESCRIPTION 'THtmlViewer, TFrameViewer, and TFrameBrowser for D10.4'} -{$DESIGNONLY} -{$IMPLICITBUILD ON} - -requires - designide, - FrameViewer11_0; - -contains - FrameViewerReg in '..\source\FrameViewerReg.pas', - HTMLCompEdit in '..\source\HTMLCompEdit.pas'; - -end. diff --git a/Ext/dclFrameViewer11.dproj b/Ext/dclFrameViewer11.dproj deleted file mode 100644 index d7def4c..0000000 --- a/Ext/dclFrameViewer11.dproj +++ /dev/null @@ -1,153 +0,0 @@ - - - {5C98C35E-C14A-4F77-8AD2-A643542CFA0B} - dclFrameViewer11_0.dpk - Release - DCC32 - 19.3 - VCL - True - Win32 - 1 - Package - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - dclFrameViewer11_0 - ..\dcu\D11_0 - THtmlViewer, TFrameViewer, and TFrameBrowser for D10.3 - true - Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace) - 1040 - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= - true - true - true - 00400000 - x86 - - - rtl;vcl;vclimg;soaprtl;VclSmp;FrameViewerXE6;FrameViewerXE7;FrameViewer10_3;FrameViewer11_0;$(DCC_UsePackage) - true - 1033 - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - - - System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - Debug - CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= - 1033 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - DEBUG;$(DCC_Define) - - - 1033 - - - - MainSource - - - - - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - - - - - Delphi.Personality.12 - Package - - - - dclFrameViewer11_0.dpk - - - False - True - False - - - 1 - False - 1 - 0 - 0 - 0 - False - False - False - False - False - 1040 - 1252 - - - - - 1.0.0.0 - - - - - - 1.0.0.0 - - - - - - True - False - - - 12 - - - - diff --git a/Ext/dclFrameViewer11.res b/Ext/dclFrameViewer11.res deleted file mode 100644 index a64cea33b7bbf9c30d10d7750693ab849f870abc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 448 zcmZ9IO-chn5QV>ySr}Iy!G&uXVK#zb0{#&2k7USJhD0SG8Ax>JVZ4a9aqkTrzwWV# zNkPq2cfI%ObpafhZQG^gM)b4P-xuS-DCp%0)Xz%G31c4oUNEv6a>uRbq2EjE5TE(? z4+MUvk^X0~3qde-{;v3lcVk{zGH1cFYI9zARC&P@js5qCDJXSyVwQRcjtX|wOZbVL zB`evD%n-*MiAjl^fWH^jFyoD>Q@2^$oO5+DQMIfzY3&RS(}{ZZ$JhCs?d`I#(q~XNR794Q!+@VYBzevgndR9?Lh;aYp5rCfMvKO^ur-eu8N>nmU4~Ywg2LL`a!pQeks>a0gPdc(pRIU8K|_;CWf-K# zV}OB%=4LT1E+THHKn@fg6cY7uEt=3{dU(WIYj2DGQd=s$oPB<3bTv1M!@t3zEulEC zUSMWseSUs?bY)t9l)IT~r>CbcmXtiri01i9?$w(ZRd3(R@`T4-;ca8@ZZckfDIh*U z^N>`O;&6E|<4ek7FWu((7%6+l`$xpamcp*f8x6yrOrv9AZH;lByPKKG``y$Z-2E^u zMV}(CsHypWP$aFKm`F`6cno$zWMnhFJv8AI){bB>-q)w$8Tqj@v!sJ8?(psrNndM^ z!tadrXUxp1+#FPwfrSNLd8vjvP2wHbo9nN~TLi|#IEmynIPXKx*Yxhq=z;2Hv%`Wl zzo~Lrm|yeuT_}lyprdI ze37YWF@gR3fG<|2B$_cjXRzJ%jxWgU>}(0Lkbduaw|b)lArvmdPOT^burT`r-wYY{ z4B{K;^i`tjz1%0B_X}>T>I^%ihsaQcKg5$ih7-a`VY;*bDnDfcI4!MtUqA-4B>|jj zcwF4RgfXc^KVL~yrYS^|vw2$%M2X$ih5Eu$x_#=uZ3)%@s5#Q!mfz#!^C-{>;P<#X zpODIxFe~CR&<@iY64?g!l#oB=E!u*APp^ktaufV$AQKr*bu1xQs^8FAV$$ zh!0HlgR=p)_FyY1yi*aZCzoz7m%;MGXejH0ie}2JX%mK!1I8w|8w>iVD|B7o zlxb`y8+j-YxvlyKH=#ablW8bj{7iT}kqKjiW9>g5Bohq6nyo{xCVoUU?9};*B8(A1O3r{Dc{ThG8I}o5 zD>3=`qLvbv3`~ZR4ORZ*dmQFyHogB71UC&dXjW7z zZl^XTN>ASmxzJ->qGFFm3YZ4T4PmG4Nj&~?eiH}qIQ(yl1{J&8b`cOd^lZImUc+Y3 zeO%XRVQ5eRdpX43qm0Tj+R75);pj5TVwz>03d;i+P!m5cUB^X%x`H{mT)C4nJUec_ zZtQ$3P@_JKKx~p3QVqqE_vnYvvYJhPN9cKdVsLJWBG>%JOHSXJ9N!tWUk>d0;YI|= zX*nP6_s7|so=a6ea(2(amu!DtB(INDRh7kwk=jDKWPi>PaBau?YU!fIOS{(~^tI^s z)w-?zV@$Xxh+%IUTTyW2Vve`lBM~{=ePHsI6mk{lgp`x7?_)u6XfG(@@TcWlSHb)- z$)(-7u)Q!R-C8YaarM|La!UbRY_v@{O>k>ez$rPed> z0%$)ilN&L?V22Y7ag>c*DU`fEakIZNA+h@-mYPkzL$keXj*#Lzd| zlbKn}^VR{odid>dOr5HW^ad!;-FYFJO*L|1JHV6LkKVPka?B~_!p~#Sf z?`w+1X?1)1=l6#wIrIm?v9q(|dZ=amO)jsSId~9urKTz`la7dce!>dis*=NJb2;jx zHI+t&0;|Ny1jfBS2n_SQ&hR`~XmvcEa#D3~7yl2lzkrnD+JbCj?0%covs2~Ik|&1r z`drMON|V;BRA;B4YZlvBSeaYeTrZqGymfuG4WX%*fPQ16{~$YjE836O@QlsavCCre z!}dxGZWyEQ-M9CA_!~25QvYYnpoknOnG(rvec^GaYKgBJ{0IAAkX);>OWWb#qqQH9 z14w7)d-Uj1Y60KGAU~ZgppwM@mttr#fB%PHI1+)}g>;Jj5Dj~%r2i#Cb-O+N2KOZx zO+yrsTM3Y&=qk5tiA`E~O6vtO)CUom2FlQL@0d6MueRO9Ge7QYrHbC^*-cRzA8E`)*0KjFw0FbphJ=8$ z{Q+RZ9y&>%F$E}n`57j^N&t#6^66*DroHZ+dT{qhvaR}S(uZY0Hi6j?rVYADEL z5sW1r&e|9XnQ$*Yt(=l6@{#zZxb9}9!Kr=MX!n;+Spjd8C5KGL>AZUvTg{4hwCkn^`&usE}lbL8Ev(i+dHf9I~nOv zXrX>)q^hp>740_4U-;nG{8*cM;Aj+6|=fDYvgwP8f#VTdb$Ni9A`Tf2l)0bZ22-zA66y<}9;x+Tzu|IiQi?`H<%rTX^yerW) zmFYxTL#|A7-6ro51*wi%f4_w3{vLZ?tN8dV%q)+eS?P3pf5sAto-w!W)Ii?kym;Xf z9?vdXD6==rH8gLssQy8O#8<@MAz}?Ts+EI3T|2)MA^Cj3xXe1EG|4}%$tFVz_){E@ z-Q-izr$y9`po}E6#4wC3?|z+Uly^6C700I;@>)&g(sp+{j29gpt^0Ux{J!P(*!jG* zcU`2#rdj46}6)^s}S?(UA$Hhpd=8;*gP2JP(Oa7 zQ{qjWkoq$yYVLmM%R8Exoy%rrBE3~#;TwG@fEp!)tZ)VA!;GB*l~jl`iG!E4xW)>v zk(eD@j4>SaR=!FEVtciUAtEFUlsQ(%R0buLTKB7UO18$Zg-~A0BmIm-#14 z?{n-!5omsc!f~^2t8c44c7w@iLha=t;cC$ssdTNWJ%%+pJlLX*Bkgx!tXVOXe>>*A z-dDTp=iWZkqJl}L6na=kQ(S8siY8w#O_as9wyH!@72srM7~6Spgx5KSMXgV50L8`E zL$e&Ccs#_Q{23h`jZkR?YY(YQi0p#h(}vy6Yx?A>bAYKs`@;|{1#E7R;E#ecZTyg> zY}XNj9%#tMKqT60SN~aaQDs(AHIk9(n-$mfxRlC0DJa{TA}x}D2nl+aOxe@VqvUjQ zly3X=`8I4GD)i1}bFz3&+}jIEe<9`CIDFZC9bQ0{lvEvc-suK_EW$}*;MuFveVJtG zd-{WKFAyPzJ%E5jkI-j?TcSsB5vGMpNT82#b4f5sMYzc$Op6F#K9NV6KCuOlLtFs9 zt(V1Triw|35Ko(Sz3%MzK%`AsP^tHxCWXRfVp6rLb1|sOo@gbdKa`QWP8oV2{M>eL zCO5&|lV)J4Vvn1#UUjDpuRqzmm`|jO*p!jyw|lP!vKV@>F$t^MR_B(pqOpCX_!~hv z7`~pRbu*~Aleeh+yfgOCADM|K@S;^BU6*Wqa~_|wN1W>A#l^|@L9SS_24hK`(_C3O z3>@bEZdXOi_oYhB-!xioH#_{!j+DCS0bv(RQ@1)s&LnT$`9XM7f5myl4-{p&6O)pP z{!m+X+pQX~cvejR4n4SMaC1oYnE)wpw2c)KVf%xwp{vXF#G6N!1|IyhXedX8rkQ~* zS?Bduv~F1-8HinAl~YhqU}yLway_N3saIYH=FJjJ#qM0^dU>auW16_mc*)c!-qkD! z3;8LC1p{#`-*TIK*-wi+=)USy+sLCdja&9Lcd}^GaK3{hRsTts0V9Fn)n+(+?#1)n zjKG_BHFL32YuM`tR$nY@U4rSt9T-nYF4XpX@89lnxz_Qj9@lSJ3-MKJE{iNLucP9+ z3(H|KmC1k+2?qzq>*ZQeSXx`3pK0IF3zW%qd!{*YWQcAiD=nMNVZ8={=M|HXfbu7K zI+gKwZ!lc-+cq1YfskP}a%L z4A0vlkqjkhgJID1bCrBUmFq-^AaLV&gEe4f5=~oGg_KOwb_a*I>h9wpi&{pQ0H05E zB&!x|APT-9{zD#NSN6lo2!AOck4lvHbGW6%e)@a*9?$z@v;_+JxKeF#VXe*THH>xJ zi;={=Z`sFZ*dTYyaHo~XPYn$}l3TUTH^Q4Gw^&|2$_vR*I zP`@N(e>cv-L@MK7j!J8$xbc0*R{)r7QY@^&a9CER=2x3fJ|dVpE6h_Ff=WIo?Ko|-b%UDLKP<=f6Vl5gmi~Os zM(?2hu@8bSlNpE6W+8D7s9Ny&Qd=W-|Ev+%e+?eS>@y+#9Kxl)QSw#&KBIOal7-vh zf(6yT)m%k)HF*9OEmCH;+NqEF$~JZBZ#FCGmdcEde4O#>;?it>md;N*ED^2BczpGHMA26T~?*A1kw4^yaIvPWl zDkYGMxG{=MCi72AXR|RGk2JBE)crz{3MN$JOH$jJyCvK3whI3Tt9p04rV^WZaqBE3 z%A77gr9zn+Tve<$*+q`DKX>Y5S?Hfn%5^<|7aHQWXgZ`P3}Uw6g9U<%noL)3zm_6U z3t_g3C&pc95G1||w<|nzKg{vjRW=|apL-A6tmAMNGMLsYI|R{$k2VnVuhyYNAGzV^ zBkRD&<^f)5jii`eRlQ$(F2#&xzN)m6??vd{uB!4J-dqZtz1vaV6*@W)I5CN|4_h=3 zV&RWH=S(Q(P1d$6VuYhKKTg0+WcsA1u0y7DJ}8gI)mO*83=(aL9X?)eo436=1Lk%p zz`?-i!`--aw5+Ixo5T}RVrr~b>pDH3HQwOh+7Y09zH@}o&T8*#2421vySw~+jx8HL zcs)&l7Z)07cBG7CAYu__;P*Nzya(ru~OF=#2FbAWCTD~&&_p7qwMb=@7tPp zrU>6(-&J{x1dIwXRYS;-6KXtJLJWE^;DJ!_yJBK?>_JiipV~>9uUx4TSd)-m^LodK z#tigPX!jX$vCWGo?ZDSCng^)1Qx%S0INjsQsLIZdEr(F8@35`!Qib*Ptknz`{>xAf z@@q>zb>pjNeQ&Z3IlFbz`(ZHL=X%SZdesG=sJ}BW%$>jRDJU={cP{CBhAQVEEMsF9 z-``XQy@p) z1vB?kf$b*rT&))Fc3-9-jBU~H5Asw{%q?Xa64fKCetYBgd@_p^Oi4-33Xzf|Xwggv zh>`FJaMvy8qz~-BVVx239J`P1|B5DZQdwG&Z8*L4E7fF?OHIm#6OXL<>i>i{p4-cd z)BPJXR)=y`R{7g|Cq3TO*YQeRt2@o_PV&0qEq`~vdZ?WU2*7yl^L*}BuD9F$-PHF0 z&JevN+d%OCayL#(MnVb>3aaM=9X%{qe@SIShhz{-Sy2LM;S?YdaJs_<*s;YtKfgsLLd=^?wYio)2t%br z;%A|;AP3g`7)-4a@!(WBOTq~U!5Bm?mJqvs@*monNLAz)?1)3yi~ zxuVm@-B4~rgaA7+E7G^Hvda1VI~qAxC&5nW&fLMfSzfL)f>fDe!4Ak1--;Py7|mzA zC+m3t;2M2NYNo?mCr!-EBr_>VaDTKt7f}CCb z#JyaQ+)nMTVT&=@?n=N_kJ#xo@20{@;a|DTiLJTi!(#xG$G#7^@ICcro+n=REZ<=3@r;0X&fJce?mOqA4~^R z?2HsU7uCcr^+|b&T#x($ln`N{R8h_c-68ZKLNJ2uN(~T0tX9>aVs-fmED-?

^4M ztP4IbA-SW7JlEk)5%>`!lDHnQSex) zQ`>p*%FK7~=c%@^>EA6rKo8l>$bqM+ELLPddLvw1m-j>BM1vCPrdL!|T~%pk@p2<5 ztu%4;FwrU)yh5px_U2|~W#!@Fp+aebQHI=f2EG6Ear%=Z@ajb%4BEodl1w_wWi)Sv zSFSJ^uYzDUoXc+s2wbtL^ebfK(G=|Ar~#DL<7wzn0h3}E)%VZkNNYFq5 zb3?*xcQ=eXo$|%EaiKNNXIOanpTNJOmR5xzTssE`hlGU0(R6mV(P-RB3AtGw>mQ!4 zd0AdKSXe8|dWrqQMEFPD_I~)oxDDwoj9vlg4#bL~lBIFDyXp&x_C*PO*T*wmDioZcSH51?a3 z;2?KXTnH#AD1-=Sha$1SW@ou*Tz@!Yw$E2k|*O6eJ)am5~ygy!MogT#>}}+gzjVX zX#IT=A3ltm-@>JfxRmW&m{6dEvnIq&PbQIvG`>45EIG-fNNFlWNma_kenBxs&r05I z7mm^3FgrjR$CnllM2U%sdrwb);>p@WbY@+@G)^Lv(%N5XM>n^cHNh!t1ghnsYy0Bm z3(UR|o?OlBT|AeFz8mvsxm_k_;YP7CS~7>bZdivhPDi%kDA_{VjeHN(LR~Mnl#KX9 zcSPt!Y;MFtltJm+5taIU^+bK;zdsD_{0U`hdUXvEgV&Rd zd|nd*27G}q5W}983<**^)+~AS#>(X4Z`nS%Uf#|L!9P3;n*72H6@!4F)n$neAX1@) zi)w12M6T?w+SRM(o*WGSU9IEXh9_;r7%BuyAq`3P(T@6xC+&ZE$<*`%D3lBlsTug? zPaJz0^}8!6hyHg7A68uGJX>G^5MZB_&#ALwFGnk(b?1pEl-ZrP&~+F$e`inQldIa3 zc8t-(k-O7DUY{NwN|bIG(6Ypg280P}X9>(U^zxjsul={ZJr72H{WfR~Kax+m@?omE z5Cqbqb1DYHnF<&(aHv0u=I@L`0y2==Ii{-5sh0{MI{n-tpfcrB1OQ8& zz~xV}>BSfHh8Rmr70l${L!vX3p9F8R!tVH8#W~n`V3ILlxAukYBCEq@_G=U2?GpdeON1b-P<&{e7D|cH z)Uj#JjA@rWArH>3G>FMi4%ECWAEF1t?+NfwBf`N<^wiB>U}MNRqSh3 zbIp!CIT)LL*NZ|baSVa2pk(Oh1_6&u&qnN&ptk(wNZ1!sr3Y>=kW78Swx>Nob`BXq z_oR3oEA;PZqz*&my@{EY$X=4LYwgozlGM;^;cZWrXU$lKKhTI!D6nZW83rP9(;yZ^ z)eL&ik|BU)x9`_r1=IL?QUs$hwvaU&Mz-q>TTk@ExKX;R7aJy&5$5F3;#=ll2sn=W zodkh=B#;fz(uXafq~v5%6C?cfc~Iz4Z-AH~;|l^+fzZub_qX!7S3sY*ER1FcKn69k z*Ufy<0t4KZG#GSBCQ>IJN3U7z47gOxYAl~SN{IKFoD4HQJ6@(ZF{6{}^)+EVPP;oB zK|;m=G!16}l9-T@ek$79E&h$fra4Os3980x|NH5Bkns!+YG+hV8h?ZGjJ?VtY_1v9)i zo6{eoKbbkaaJej~>|EO3?1q?-ss3mpbtvrz9FE$ZANb`)l?4;g=V&xjD7{BY%k!cF4#g80otM^W;Zf%C*+1b1f|O@`W0U2Gq^RLD;Gox^G}UZ!zkS z06S66_)7&GRWOF89Hd-DNJ8`V2pKBzh#DVHB}T&nC0J*!=}Q9!drK1eh(U#e1gmEn zj2Z<>l}jHrs6!>-auiCPC}J9LXe3(CAFz@g_n$%sdA#E*r|~ zQ!jVTNGiM=n$^5at53yMz9y?r1&bNkAsi8f(z62^WU_r8-L~_Gj%k*LT%h%^M~4}W z7hAE7hw`F2hmLgImzc1Mt%~s%2iTOqF=g>c1zJbDKRGA(AHesRSwq^c{^Lq_0<^pJ zYiZCuSsG17ht5a5M&*LqJJjoyU36~_qAR9B{w=5vyNjUUNH3=VF>apd%wFDu#$VUJ z^~DGli|}#tXNO}z_7FgiAoD^zkWZXzE)a;?q`(6)J<~k;dR?ZekeT`_RJ{^1 zw?`M+hMB;K`0?;e+BExtpp*v;5@t+34q;jp))j1%(GkQ*klLM{`lF1i8#8V9#eS}mRsnQ^*#d3kRKWd#qyjmI)~Y)9PLX`IUSsyrfv>8?CZ9G98f zFbHVah|qxysTWG4e+squ4K*&0U+z8(pF9NLFb;VK`m zzt&a9$T5W z)mesJA^euOl(x=9XcLEjw&>IGHex8tM_Si-CBw$5Ru}_j&qfyY?X~@hKuqi2@^qB= zdVl;3``~la`#vZ`amJPwBN+|TQ^NCQEkq(I4X%}{+Mi<;7!Q75(566 zf&`>TwS{NQ^isp@p?K64ePd6++r^-3obom5%${JT$ih;YcIA(WX6Gr;GbX?bA`{i^ zP=USI4RqD1DhLJ9?rK9Fo>qaTlFReSN{JZzk9;th3UoRugZWlg$Eo?e@n@$Q^6Db7 z7MtypASK@1Sp(aC1X?uN!oq@*R$0i7=;^@D>|%%dbHwB*ocAQk}d61|deYU!XWYP%*Sky(2%dVH;8dW&>>Q((8#LY>OoC9 z*6kq=@!)fAYA)P=%f<)<@UI=kj0d{&YzpP_HG4Cfw^c`!9^n?BGwFMgRasft^ZCm& zryS>xuIueYov~zH=)Z&2%kQOfL{Q>#-dr!qI7dr zh;ZeMTvfR=aaDN|f`lf8%=OpJXQ5;gh4NVpVwFt!AI=XrRvL4@s*)D9*wob3`MDXl zeTDZ#Mpkdmwap~~d_rvK-sFVk4PEVoGh zY|iRKP~`N^sqf|_Tp>v}wR#?6Q4^+d`%p=r|{4LjOk`(?}tLK zMUV~m`PB`*=nMg8jY_3CX0`d5FTq+M!2oRl;D+oU3SZmb{HMpv_K0E9eZ%?RuMl?NodTswaF*A)&2?`^`uzO8{{;SSw?!7kk-=YiUYwfV zqIfK&k$Jy;^mouc#X^E6N{}d$C-Z)GluGqAq;h#bgwuA`nLHA?d-C9-qr1HpCNons zMurYlkLWyE#=72W)BQr6fYOW=jtOBasoL;5yS1Ofn% zV=I_tp-9PG!-Yps83Kpkp-#=4t-g^$3t}LnvBHW6qsBPw>e|US>K5Zd)=R8Lq{+KP(Ha zKOn_5&zUtvVo}aKq}v50$eQqO_V} zMwO|PT4nI|pfB5Sf0y04to47yg_rEl3zHhzB?*CO64yE;$l|wbb zK>z4_!{?b#Z2QQ&QA5S&`!%N%I9|;n4`u>CgD+50Qt;tM`*z!YPS<1NU5J|4&eNc; zF6Wo_tw=w4J0+keU@+xM>x3n?y;cv%rt=&n!;WxAD4i>FpJNt2eLNAj*$dU0XR9;9 zTu{RH%S+%F_jo<%u1{JO_>P@`{+5`A_z0{Tk6zzBS;iQBiajwx9XAn*wS#x_i2RtO zsw?9iw8%xiHmZ%1KqHQOe0JnE)dY17MWj9o2I!<+@|?AaJ|zOQP_t)Vab(B$8k_OB zd`5e(b_fbuUw&faI@r*K;Y|YE^V;4iPO=Z1(b)V%7L(wt7i8)1nIXEuDU|RT?0(HS z(-((~ZYz*>X=ads>b}-`oLPl(W#frnt3e#goXClR;mlQQX)c?kFUzGsY~UHU=~(`G zr*^$hGkWkoEhiiEnwr{ySp#|N24hPmD;QZ-qx%!O;ib!4Wo+slisUip^2|@ugeq^c7POX-X2+!M9QQqI8_M3k-W{O>pZZn6Q((4ZP z*+xg4Red6bXZtB@S>5OHm51vr*8FGooMEu2Qp2AIGrB}N@lSu}F36s0#{18F`n)B)uxcZpYcNnwxzO)+vVe@eCf%wRPR zC_Sc$HMry2Uy7EY*y9}p>^;Ik9g-CA#{k50XuFP$e>gh(@x;W{l*jVZbN+Ge`A zb%R#7SW{=l*8Fm9$^Na{hvlpF{K@CM>js?DB5GsyjPop{QJ$<1{g|---Y$R-YBAh5 z$#&~CLUYTq%K5mOL+tBOZ{GL5&E~%Q^UO1P?%VTjNUe9?<(loCbL$H0ps0Pt^`+PH zL)PQM)ni`YvIRVftmZ82l0bs@Mxf(KIO>qrH6+IWEpU^*OcK(P}TwMJb8N z-VVWp4{Ete34(nKXx)^Il_!^ib&27>gjwTHY?9gagG-8+UtxmJbD1!E0n*aw0us>) zew%ZnjI%6F*flGdR%8l<(;d&(A7wB1v-JmW&RF}XUoSnS-CE0Da0J=jPP?24&Rd5T zkJ;Jo+B$~KTdQ2pWz9p8Z^uK@lg9|zJIgn(-x(a~Y5^KxwX4MO4xuF-IpDg-7p$>`2B;lPU_jYUtM%7D%PGIhmNL zxrIyCJKy8kwGA7O6VJGvQ{Pqz+%#QR=;iixBDH&6yjz(47gUB>x z*ac+WEh(-pvaT`ib#ydIRHndu;P>Ie0?x$oxn&Ge0V@&D<3`q`=~&9}zr<5=HS+!t zB+hP?RwbBM(4rj`8g40gs=f%uhtabT2x1ad<>9Z$Y_xirhlI`MfAVGK_c=6j?+=ZufW0=loxwdTzg{%a)EVlGX zOV`$XZZykH<^XAA4H~1#p26}jmjPLYMxX5~+_dNj9^7IUIYVJqHWBJ2GwUxhVz}?g zf6&BtBf8&xqTBC`&J&m$0h9%*rk7xk%pwCo0+$naKcIsZQNz~3FM z)&L?BR=C-`U!I!~5ACSA9uZxJFMTMQ4_4y$Oyr^3?VqGFoNXJC3C=Qky!#0l+?HtU ziS!4*KF&M~-gQroeL8ph+&kB{V7lW^TV1Gj&tz>Zxm_PXECV`!%rqgsu%~M%5vz`F((i>phv;O{E1j@&#@`%2uM-Ks%`_7+GCIo5jiNV)3cZ& z0`tqL!3ILCW1s25uWFJud5k!YFAKw#;uED|tf9BdMGiIs8=3W&MElt(+Hex~Hd8&3 z-qJQAsAR;iCFZ{$1cOtfdDOSCsGW%(gfRUI2qV6={R@4IBqbzDIJ{z-cI=kv!_8~owgM*c*!2MOH8`3ndFm)!LY0FcAe z@h~R|s{X@*0uVc0B4d8uv8Y8gG$dRS{^TfaUNQdbQS<#-_8+R)f6Y+Z*bP9Zk-DxH z8WgRZ3OxW&!dgpGS6`hhC5!ATJ!FxBBe7^!Y7YR2CA1)oqBvMMDO71%stMLPS{c+- zTH6h25;C+L9jL{ApK3ZHy%GcTO4XZfHfgBOren$uUEJqT*!UD z^!2%^Dk@r(Y)y+eLl~xuC4@w;f1@9 zP-F>l0*Q&0h!XEEO9OwZxdQ7UiqSmkq=+`Dah(P>0|;0FdZ#Z#tX;J}-(Qwhtw&Lu zS1$+gvO3I$9IYF+b5g03cF~C%gM`Nwa?SVzu7%`C?VDF^+hrXzRr)KQ0`BwrtNKQ z9-f}1JafF$*}UKWcpp1Y>$W~ut;bfuLb7}X4{^8Ne;k}DGV!j6O22NACMoZo0NmW2 z_%4(1mzg>fv^4P1u7zzIn*n8(zGeEIoDhJTHFv*!o7bCugl5}qTnDlFs|oII+Afm~ zvJ7uJQ7k}>SE*YROCk?Nbc!~}&nqGPACjvFhV)~TiUm<@N}x69CUB1fQIpV7SU3{B zW)Wt`Y3S&}@8;Q^g3*^_Yf7B{O`_hH&&)xC@)q+GW;N!9WWk*kx9X^QOGeoaRw8j0 zAnAQY)XYC&{gED(E>UpBZW$mX$K2C;z6TrJdo^_2)STgiO*L}%%5=y;_~7)qIAr_U zTN`HrL4Q?{__HEQL{RTW{-p-SMmcGozE~**_I7>=C3qUX%q!UXYi>ENj+91WX-tBz zM2x+%_q)Wm539}kOx5|O_Oj$TE78dyVNQP>B;*gb#`exFDAlAN5?J_z#KVFHQ6c?9 zABY>#$<_B>0ktG6cVeu_kr$rQGa;}yVWOcqQZ%@8aSL42aqaJ6%KpT8iD${&IyWj+ z>_k?AQA&>VyK`Tfsq%>PoM)PXn#;x{Oe;y*;Lb=hr6H<)-D9K|(_y za1``hRms|l!fp8bn;>$m2LPBIX#Z_Km9xP`vMs1^c@YPLu8clO)xmMdw;mf50{z%& zK%~6l?b<{BT_7Ew)iJTT(HdtG!3^UtICw# zNQ?_^T|p*`YFEu51&@uiRRReMK=fBbQlHDDJYi;^=UhCTR;2KkK9O+^P&L~cADSxk zO(2Uo%U1A97r->jPOTt+w*YaX=0 z10V`eg<=<~FGR4)OrgFWgJto7Sy3q&q^Zl{AgNpYw{5v03LjoR6w>c<^Wv|oTQrl+ z85_w6^M8ZG9p^T=VKaBON*1Qa(M_F(=j{3P&VB#p|CQ!9uo*gA86CSta!iK+ z0H{D%;fYZ#nb6g)H5%sT=Cj)_u)8m}`!%&{uWq()^TarBkbH#$cj2JpQ36F!Z9m0X zq(P{7;Z*;5*#Xbf;-YyviWClQhRnrf>{4y+uWHH1$}LfL7Ay&+{Hr zLCr{~!8$p~(@wD`Shn% zo!*HO7LGWCAcJY+X{>_S+yVFF<=zQp)Q?BK`_%sn6fLhK8wHPJ47XX@FYM#ngu3`XeCNn|##g;-PMCxZ{jZ zP3QOm7-fwRAu%~V53H+P(+f?Mg83Z8+FSZfU~XR?lYv^~d>*|~-ZYp?gd&v76~jXB z0TZLZqv_2}Yw2{IrU?`Nf#visI<|@>h&8Q1q4@staX_VOl$B!mWb^NT9PO;uGpK+a4I`qk z_UtseKX%Zb`&2}$-*%Ln8_3ri`ru?aV_Ma3=p0uQxR4$7-uN^F&ZKbDPBR@M`G9qG zMa7N-IP3>r!GYA^7v6M?2>Po=Mk`)d{Vn=Wymi3QU|F6=&=V{*2-4?Bs_8hg@+^c= z6}GymIcwD4kX5+paRdQsK}rO%B9f3$jKwJ&Vnbn82O@!S(17XKh1rZ-eU}z6!H~+- zc1c&C8!4uPo3tW9q1)(?(-wkqMsDRW_&Te3Xq)#ISF@#yG5%?SMCvkV4Ac}IUdDJl za&{HlwPn`d`Hogm1b_-iibSz|k^wOd#$q-ZEmkmFreg#5&0(9~9F~GXA~-Ux=U|rV z%PKvGd=4eKMOf#Jn|)+L_pUp5U9lK?Y03_c;N$j;h}oSn0;alPvF#DaK-i!(N{)DB z;oy7SsGjBGKW+4eH4pN zL(D91y(ITG5swT4(}t3vZb_t2KR9>~1GtG9;9nx_B=k5p=uZ=X7(Ns)w(*N-jr0Bx zSMB;n)uBf(@s}oH=c)(PWCr>98YE?fhzW&J%3d;z6ikCG$OLNSrHWcHl11X*6t!z0 zKwk(+?1h0T?My4BdaM;NW@-pK*nGxC!Sj{_Z|aOu9nob4`DGV?d<*=c@~Se?eoBLf z6f?lrjQI%OB)h>xi$-*md%z z*lll+KQ$xq4ZbMtspykdfO8kg6*GrbJX*RK+40NI_+=|M!TEE2?Chb*sbJkp(jhoi zy(F;gihEK-uzXdu_^9!hmC}7B-J9h}@89SH7 zU5Y)(QYzk}=b%f1DYskS`*V|71L61tk>-a4(qFLl-ubkU17xNx`5RSlFtE|3Dfe1U zoSKl)(8>wO6$a=)Vsw(;K(iUfMmmO%6_s2v1z^eQeXZ!DQiUHoS<73)PDD?eP<-?A zyeR#?Fg;#VWJmx^fLk<^60c1U`_7Ue9`7=`O1p#@W9zRQ>`SFwA|4LX<*Th%D?BP= zBS)LO_)0?*6;roq&je&Bl6es5y;knVWc z&Jsl558p&<{+uLRb~P@@ZXOzS6DyBSe1%UTb)Gr`MbzUM0sQK|l!K%m8@IJ35RnR5 zSlHPGS{9+%--`j)#6-V%W9xiDOW4UtGpt9Rc&@qcx;j_2n)(G>1QgU3A@a z6!QTYVIvN~hjxDQoXY$a+i4rMs*wr$)3H{jG(jYdD5U!PnPT+Jdbd#Wdf_ z44Xt&~%P zpTiTgM|VKG>DIyL;|+2TwCqVcRjJZ9m>01&DCrV!UEq?y1(p)CaL({_cgh)ygE$1% z9g@3oQ%J4c-(y5N8S?@?@1)WW)>frKNK7*o8%;3!Pda!zMqbpp8N2M8x><@*aYyNN z{pDcR5wQUH=4EQ_L)vfdPdf{JdTss_j&OVJ9P5hzJJ=8=^ZtaSiNQeWN*(b$tQAk9 zqG?#@Wzj*&xXx~3t;9~$#N+IpLd(dlf@F@r&NL}B(pMPA05nDR63 z?<6eI34_M=qSe!>t+-h>!a?!P_rwca_odV)w>C%WQuSC=M*h2Bg%2GQ(vP7qfRM<) z3$+=^#F_*@$<)`Hnp@E{RBk}xL_8gA?g)a!7pIa@ofb&5$*c9n(BD8%bt#5N=yv}8 zvsbfZa#lXF0sx55G;lgjUx!y?JagalfIM{5c0MR{`fDMXL9_6`30@%p1Cj`+sj2^` zm8*)1>TCN)KoEqXTY3O#Bt=9@kVaq_x}>|Mq@+Po7`jusV@Lsop}RvVX>f=U5cuZ* zzUzyN_wu{j7iX<~&RYBY_VbJ9*`}{Y^UdDk_#qZHMl{<@;monA;ivg~yxhq4So@Q)Px%cQ`1Zk^tM{y6eBxhnP?SVvc z!=Inr*0mrX`AMt$r>2i4DWg2cK*jL>B6zg%;~L~?JxyO+V=?~|?+dZ{bS6{wpG(HiLBu5;8o$$ih)}&R#VxRI$Pb|IAEvl1 z{;Ng}1ZgXBM`dl*2vxwpmH3^eGqyPpepVOZTFn085U%=}4bu%H+xom`EsD1sL_F30 zHU2cs6q}T^Xq~IDO>CEfB!7-vDTwsgm025_C6MqAqgE-3H8BidCk|1W+Cg6CVCAkt zgXvDV3gNZ^$q#HsKfn_8B?=Uv#D}KrtP)8n@UOB;{-OPcu|oVxH5=w(;+^4opTks; z=HC|fq9D`&FyvD(n(St(KS(`22=S|~Y3V1Q%1jw)fU^ohCsv=lm#qz4CpUpHSP!IBQy1EcP zTBL}tG-*|cWS&;rZWus(Y8aJ3I_OY8b@x7=?ZoM2P=coPe_2x?AVN zrbuHr*YuZDaP|yP?MW!X>{p>@kxR4)Y)lxB`pe(_lZ9^r&ob8|t)I^ux{v0|M#RyH zU;f#QUj}`-ms(EWs`9_IQOLxl*x%~7FFp?~NcKct*bR}>u0_zf&};Y>PTm~_!GFgG z{@wf;!EpEAvPFFN?UD0%mY8hI#8I>ChLT0@xT#E&_n=R1jGV2AS#A316V@39U+bin z6L-cIS53@fjV=Jj2X=>M(sP7y^HbPXn2C&?%4AO;;1f(u(6P~iaCNd~Y7tQ(w;X-> z>>K{?Z%D^jf&+~J{;s?019Zr_(xf|wE&hC*;db|phqA&|D;MK60UIPH;v>q(W9?Zc z5$oCE)Ty7W%|u|In_cXg9x9(`)-Y@Im%Nf!+&ww z9lA~h#qw;MHKN1o)9(u56$YsMvgcq?s-0xwG$pEGXy3c6{O~GJ<3+v+qe5Z6d{20v zH**Ol9Sbpqic(G#KK>XB79Q?l7W%6OB=4Th4h<$Xbx~3u6XdI0!E$3?k;R75yido% z7xth98EC;t-VY<$DUh3x0=(J^Mc2#K_hZv0E*auPqqH)el(rwz zs&3vc&@>&o{pBWmS&HxTxQ50ccCfUFNiW{1jJWpasTVVC@G)J6u(<1lyMkp*xePpb zaysWRZM59KC?yzi*CRE9gsU?NzI7v{aS#+4 z$_>TZ*t3ogq(;-}&qPf=j$RK*iMIh*FqweSSngr7E?cuqIf^;#JOWFx1Ddrl65jVk zn$XYH)qBlHq>}FGSg@T1;i5PhM4_vXr|SL7_M2x%?)2&V*{%Z(V-+%j8&NnZ3&{3C zuhv@=wbSGa=M|4G;^4@Y6OfC=uoL?ll}HRsvfi|GVu zVGmPJv51rjT1H&`p*KnlDFft3=a_)*1!V7>)X`kSm>CW7T#?t~)enH6a8~Y^e)R2I zJ0$(T*#B?M>Oa>z(5%;UuKu+11+-cr4|JbFo+iQ*1GaZx-I^(DT@ik2*wSKt&1aax zwWHO$S^NC}J*o#5rv#qr<|aF+S^Z9aQJ3vuP>MV&$({*C zwBAi!SYh&ZR%L}=I%Oyx_iM`)63pdtW8=a*)^dEmS-FPY+Qovu;SHv1EspPa9@Nn< zGJjtIDzP{d2Y=MRb^BS?vt;~TF5}~4nZ3sv)UXmxLVs<(QjIQ>ysj)*i;kX9OqE~# zd`7aJb)u`=NJ+`eZ(@IHZlDJV9{Ij8CVs+QBjD*+^Vh|1Os|OJpJ4~560O`o8VSeOmntneG42LU$-S$2?R7hh(8y-pMn8olUHcBD&hzv~C+fQmahtKN<2D~{I5Z7)peVY(8mSdQCu4I7UFGfCwQgBdi7Y%)j8WXINV2kDBe z=`{u-lus*}d1f*)G(}oK>%qtA9+wwMd$v2%)Qc3k7`Bxbxcu^R?e^Z4f?IwFOGJ=< zazdPkt(5PAYY5O}1=z{YlC%lQH)DU+=bLmXKV_xPHYa_j)RdI{kn`E~O})T2yWYxY zL&M=a8aq!q!LTfvZ0;sKApw#(zaast;<_vZ@#4bOo%7sr2KPR{+-#x~7hP_OZT%gO zx7tua8C-5@T$<&pX2Qy51`W-kfFM)1B2Q;6(y4%{{Lzf0_{<5|#_4^DPJ#F)G}!XT z8@^q1xnVQxxl$YNF)J`NGv&glGZ@kU0YhSiT39XEb#YPA))I1o%D$y=O<8w1OMTVZ z>!==;A3z`F+n!Yr(mXy^P zvO*2l2u5AZ`H;&Z@r6!=6i#WmJZu_TJ$S6$sxJA#uayO9_$eSW_Gd=rn{WGs?n=i` zxZq4}a(Xq_7aDV)2A1+*5OAWhmBm3`=FE%2*X)rXt=qpKb{ zGA#!?JMV5nw#!_8^km($g#=a}HInNovX2gyNlhg@rfwdpxeqAbjC45oaHd1*rvH`x zbk_O0#U%?X8fo(CJ*z zP}7W2(gLJ#!7g(OfAyn5fjYa65ar;*k?+h)RowapT<~ znt>9ywF_l)IwvH_Z^5HYyDnYx@ zZI!UO7G1M7GpkgVamlFBka_kttQ9-)WJ6)FGlB1ld=qowxep;ul1{FwTN`?tJQf}v zQAi6TFjQ2>`A=;bExBccBm|(-OjQk6K}yuVLd%h)KOtX0I(WNK-q?L72EY@ zyM_{M8;X&WXw}s%v)s1cl%Qh|j)(9?lsY7BGF}^ch z0YRfGt|!h*hBhNkKp6gfIHFRe;GCza{}E(5 z@k~zylM9z8R3C@>wBl*&F>Cy;dLnyR4F`vxRG#2te*l?W!=mft%i3nY_qst8B+L9Z zQHqw1h{VSRvW{IVTU3DbrosNy2ww^h9FO|==e~EHrbd2hSbL+?=!nOgZJvkNv|~8( z!EvIFOyMWojz&uG*24>)ZGQr!NcFETgK8#4TKlTTt5tJ!@TD&9X^j#ne(PG_HL7eG ztg{UBI}N?;1c-9+vI3I5p8ug44c^XCt5>DuhLx$SDP zP>Hwys1D{t((0H`=8QZ|cTgA^voJg#l21RKfCzbp^(MPmRPOsvRy-!~gQ43^gXG#G#oSuAs6 zn2Huj1wsfo^uO>OKpUQq7Ie{hv48ud|Hm@@Kg%fZJsf3QOaLlqM&fh6JLwyN4mVz4 zVWKsiT8w{UW?TvAALRdc>86(@lWG!hwbW$aeKqPlC%%+|SiiqR)pT9&PZcX)fUp2A zba$BOn)l|cj)~EURQYxcU)LWr8(9y$zfId_0lST62#c<`^uaw3_Wg~y7|N3v{Ld%n zO#;ym1EZrA5~|G2SelQfZ)1x#|?YGLU5jXYDt@rCF9%*MvM zPV)ynvb!vF2OrR8D7p{Jr?c-11*eS=E*<9{@nLDj6t?JabC&J?se{&~&T$ z^Z8B(7WwoCWb+W|Tt*kAu+@2E+;&5VTJ62sYhRucj-v)9cKL~EnF__} z+~KX6yo4NV?qj}qS%2`XL}Vc6xa*s$JcEznoYm?W*P`zRZc9?BH{ZYS@a}WqbgDAWWj&C@00`E}!uLF{`z1Yxjr3scZhuXR6Dv zQ^>nT-Pdlrbq2co-h8TSIm~YYe23k?RE0+EXpP;m?9o{qASiR6Z%H0*#f(SsoUyA# z^9afMZ71@Kt&ti>mpDr9Xd@#ye&dkum(nX2t9#ELDo$cQwv5Ps@VC{Y^Co63nYjJDsE&YqtZq6uPeFx*kg3zy^mu|Y`uhuCf ze$;=oXklOFt@Xz?C3p3{e^77TjcRSX`Spxm;wEfXNcZIK>Q3V1*3N{ZzI;pJU7l)0 zrGben&KDu-gAxqng8!GkE=P6A%jsh;W1nBd8xGHA&(6ENvYFZApNLVn8P#qRw?JR? z23{}3X(D)h zz1~u4y3razx~g82)*hVevQPIA0NrPw@s_UDff3NLKo^;44Ih;q zSJfwF{I8mnKWyRB0f5j;W%k4|trH8eOAoIqlWH8G@?9_ee9s+CkaisZcGqEj@o+IL zJn-%;_nC6I;+BqyzxD~Kp6BbOe$3kBtXKXScPNAPYiK8?Vj2Oh2vOIJjs>EYA>uJ5 z?*td@E=WjNn5obZ!-hQ&4KWvS7(l#MshS3z9(tCNSNF}Ty5w!++D|Yr%1{H}FQ1!( zaylhe2qd^f73myCFa)&PPM4&lT8T0?w(RkV)GJK9od`_8A*4S%IB3t%I&n#QS%ZF| zrX}tqx4o(2&+O`&lVM78WaaT_$h%s@Pf_a9cski}zS8D?@rnbGTFv`1g;tFY=;Zuu9OlvSnzDai74_ku;cqVz(8**l zgsP@>BU(5&(8ske9OjFI&U(Z?B>#S)W7M?M8x}*W|4-TVBLr{r`a-8l>}Jne)Oi{1 zWaQqti6-3gW~*?|J;-v?yiv=}MsdwOax$H6xn*7)9s02$d+*TgdC;7hnK>`qWPI;f z-`XnCbWx#98Q*z(nQCHO=H-A+;fT)F7|eIw&b1%I55C_2Cdv%(Ke|{q1{Xyo(26v# zdEYkOpY*r?8q1aRI{sU%oVriPi5`(lY(HPUTAObvt32FXWuWvJ@<<)e94|+XL~29d`&wtGtKo8pesC4blTvae8!Od>h>FDPUgrxPO_+b#Ruk1bmShb NILoQMu9h+V_+P(-eG>ox literal 24004 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

S*#+iaI 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 Nq^O)om5_eme*q(uNB95$ diff --git a/Images/SettingsAnteprima.png b/Images/SettingsAnteprima.png index 785794bf8a6213ec995c7ccbb63ea6388fa55957..493a35831732036b12bf4d37a6775793bb2912f8 100644 GIT binary patch literal 29689 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 A?EnA( literal 21026 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 literal 22449 zcmce;byQqimoHjT5(puI03ld#m*7rLa1ZW~U?(R~+ zU7Yjvd))8}E;dP&_G#o_ij6XVW=X#L$)>;yx!L#9?Il1THt_$JNu^Vfdq@= z^~Hmxr8shz)|-hBwMD&?-b{TNFH4NUuXO+tV@1z>?8A~u#Zyy~HfJ=4Z2=HOr*8@!R z9JArz3s>g*>~b_~iGapjgDU^PF>szUN{TMyiRC4%yA}QiM>$ znPxlgWOVKUX>^Lf?v`0}?fN`(6R`zzGjT`WMo!aD31k2O;fwJY1~&{-b)Z0Ou^l=aiB;+Shi+L=^F z2!t+fC(80dp?`UKx#_&untUuMW}&FMAS4#iZlp86?|tH6-m$OTba~Y5o6?9Qd>M9g z(R)L}@3k>9`$bvZ#N`(aG?~Y?esiqp`gp#Dg=k%_SAykG)VB1*B<TfA=P5Y`>S4!-Es?-FcIEBt4x_vJ+5=bz=7td<5=?5T61;4SjyGf z&|ym1u7|_?O5TJawZ~2ihF2L%IHxa3(D~!W@K)Z$gmR92FTA#|mYVbFbls*(XLp79 zE@!b^f1Yl@SnSq#`e;tMh0eH_^3)ST-RQ^@%Ef!XgbFD~%?lKi96P0UsUUBqnY3WJ zd3jwg2Zn8^)dH&)in%7Q5?8Nntj=0K(rqYo1XT_D3VT>3Im$V+xW0E=iO0WelY%Dj z3<;hFYn*=Qjb(DSo`{4!O{lz>;8vq4sx)%ji|4MKPTmps;i4eE2bH?{yfb^yPAD@v zdo;&xwLWh|^vk`e9c*Mb(WwUaDwlW{o~ZP&)MWls|I=A_#Nk96mGi6@694+BQEXDU zyD|Lq#`WfGn$*jC8Fw&s)wM&HEWm)gM=VeJscGa`r!^CW~xnEmp_S!vY;d!Q)!j_o*p8_!?1P5iSgaZQWMd2 z^ag?fck0^jCmp5=qF6tUBDvnV?KY%!5DHHnfTVdS#C=5UQ@gULs1O{hs(b zkv|jvrgrj3fElacK3p<=l+#(F_)XEq4ilm?BwE7IhspWo({^){m!c=ttjm50{ww)} zqLGbrEwkEDyR2}j#9{kdx9f^BB-6*<@1sRuOvcvxO0}+o24h}B$6>Yt^l54twml;|&thbvfTcck`c@Fh*dt3)H6u%VSfoo?^^IXGi zBVQa^eXkqqgccdnc;gZvI2JN-?YAgdACaYQrDG&L`}UE=LarwtW~Pyq)xIyBRb=<* z+3LC(d?1&pNvewhPH9DZoJ7)@e1b(*`IddBQn_d}IQ+;RE`OP^qZK$PQ=XmpaQio^ zax&bkpsEvNV3L&R$FDcPoFsNQqS|bRvJpyHT<{#CD-5%dxlWdp7gu#g12T}$ilR*` zvczKi4r}kf;_5x8&~g<>)vG@{sS~kI@$5K5)a^Fxo?Z&q?B%&^Mq%J@ZJA99QaMYq zRE{RLvb(arBTjj*5QrDWzYt6-@41mH{h3U46S^p}%3c=H=X*`kgMkSJ`NjpSMw>AB|TitW%}oJ}lMx zDk%S}i}BiIY!AO6>CWNi7svTFQIJak~oC z2*ss881(YIG9sc1Y>@Jt``TDh=SARL)hc71Z+t1&6z;|#N9gfMz2Yn(U>Gl=Z()rJ z@)CFOin07i_(pb#HKILuEQyLLT`U=i+A`>qOC=Rv35=gm&NkAGazDi6mQQfm$p|Zs zXT6RkEKcPzKIk3Oz3ie{h0fRwrOGC5+-#L=Tq@nwI`ifIHJ3HC@zaN=A#W%R{v^sR zK5A+I1??E*xKQ8auy^F981*`r=B&K!qIphOy<|56X7}szlX=S+%0ARp^#NQj)m73n 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 diff --git a/Images/SettingsCarattere.png b/Images/SettingsCarattere.png index f3c04e877eaf3b0cce705edf062b3dcc8d1414a4..b06a1c058f8a1a6cc87dcb17775c548d64253081 100644 GIT binary patch literal 23450 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
S2-v9 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 P9CAb7L=SuQ&ZGYVFe)Cq literal 22541 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%0D1#b84=#M$_Ddk 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%0DZ*tujH8fj6oQHll=OX!@YncX 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 F{||}Rs(}Ci literal 58115 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 diff --git a/Images/SettingsPDFLayout.png b/Images/SettingsPDFLayout.png index f3d6eebfe30c3f1fe4f0f7db519967785a35ca41..c576f3f2839960310cccc042d4b898c88c6d00ce 100644 GIT binary patch literal 30559 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 literal 28646 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 E0aFS~zyJUM diff --git a/Images/SettingsTema.png b/Images/SettingsTema.png index 9e01ce43fad41b5e71703cd674fb9758ced6acc8..83e6b1085dd04f0af4c6a68f517c62a45540ac35 100644 GIT binary patch literal 53001 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 diff --git a/Images/Setup.png b/Images/Setup.png index 144a75a49453e659ae82978bf7f73e127f3a0de6..62241635178d3f477beae69d491ade8f98e7f15f 100644 GIT binary patch literal 37914 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 E0PP)w=>Px# diff --git a/README.htm b/README.htm new file mode 100644 index 0000000..a85c74a --- /dev/null +++ b/README.htm @@ -0,0 +1,180 @@ + +

+

Anteprima Fattura Elettronica (Viewer e Icone) integrato in Windows Explorer e Visualizzatore

+

Versione attuale 2.3

+

Una serie di strumenti per gestire i file xml contenenti Fatture Elettroniche in Windows:

+
    +
  • Un Preview handler che permette di vedere una anteprima della Fattura Elettronica nel “Pannello Anteprima” di Windows Explorer.

    +
  • +
  • Un Thumbnail handler che permette di vedere l'anteprina delle F.E. come icone dentro Windows Explorer

    +
  • +
  • Un Visualizzatore di F.E. che permette di visualizzarla in formati diversi e stamparla

    +
  • +
+

Funzionalità

+
    +
  • Possibilità di scegliere lo stile di visualizzazione della fattura (PA, AssoSoftware, Custom…)
  • +
  • Possibilità di associare colori diversi alle icone in base ai tipi di F.E. o ad altre regole
  • +
  • Supporta Windows Vista, 7, 8 and 10 (sia 32 bit che 64 bit).
  • +
  • Supporto dei temi (Scuro o Chiaro) in accordo con le preferenze dell'utente in Windows
  • +
  • Supporto ai file firmati digitalmente (p7m) grazie alla libreria PKCS7Extractor
  • +
+

Installazione semplice

+

Clicca per scaricare il Setup: FExplorerSetup.exe (che si trova anche nella “release area”).

+

Preview Thumbnails Dark

+

INFO: il setup è firmato con certificato!

+

Pannello Preview e Anteprima Icone in azione

+

Con Windows 10 e tema scuro:

+

Preview Thumbnails Dark

+

Visualizzatore della Fattura Elettronica

+

Un comodo visualizzatore della fattura elettronica per poterla anche stampare.

+

FEViewer

+

Build e Installazione manuale (per sviluppatori Delphi)

+

Se hai Delphi 11 o Delphi 12, puoi compilare manualmente il progetto.

+

Compilazione/Installazione packages di componenti di terze parti

+

Utilizzare il file {FExplorer}\Ext\AllPackagesGroup.groupproj per caricare nell'IDE tutti i package da compilare e installare

+

Utilizzare il file {FExplorer}\Source\FExplorerGroup.groupproj per caricare nell'IDE i 2 progetti da compilare

+

Per installare manualmente FExplorer.dll seguire questi step:

+
    +
  1. Chiudere tutte le istanze di Windows Explorer in cui è attivo il gestore di anteprima o è stato utilizzato il gestore di anteprima (ricorda che la dll rimane in memoria fino alla chiusura di Windows Explorer).

    +
  2. +
  3. Se hai già utilizzato il programma di installazione, disinstallare i componenti dal sistema.

    +
  4. +
  5. Per installare manualmente la dll modificare opportunamente il file Setup \ Register64bit.bat ed eseguirlo (run-as-administrator).

    +
  6. +
  7. Se si desidera disinstallare la dll, modificare opportunamente il file Setup \ UnRegister64Bit.bat` ed eseguirlo.

    +
  8. +
  9. Una volta registrato, puoi continuare a modificare il codice e ricompilare la dll (attenzione a chiudere tutte le istanze di Explorer ogni volta che si ricompila).

    +
  10. +
+

Release Notes

+

29 mag 2024 - Versione 2.3.0

+
    +
  • Finestre con bordo ombreggiato
  • +
  • Fogli di stile AssoSoftware e PA aggiornati
  • +
  • Corretto Layout per mancanza codice articolo
  • +
  • Aggiunta gestione pulsanti arrotondati
  • +
  • Aggiunte Dialog moderne con animazioni
  • +
  • Compilato con Delphi 12.1
  • +
+

12 Set 2023 - Versione 2.2.0

+
    +
  • Aggiornati fogli di stile Assosoftware e PA
  • +
  • Build con Delphi 12
  • +
  • Rimosso engine TSVG
  • +
  • Aggiunto pulsante di chiusura sui Tab
  • +
  • Aggiunto supporto a Delphi 12
  • +
+

23 Nov 2022 - Versione 2.1.0

+
    +
  • Aggiunto “Stile” SudTirolo (ITA/DEU)16
  • +
  • Aggiunta possibilità di spegnere pannello anteprima icona e testo XML nel Viewer
  • +
+

11 Sep 2022 - Versione 2.0.0

+
    +
  • Build con Delphi 11.2 Alexandria
  • +
  • Fixato errore in caricamento file con spazi
  • +
+

08 Ago 2022 - Versione 1.9.0

+
    +
  • Build con Delphi 11.1 Alexandria
  • +
  • Fix apertura file con estensioni in maiuscolo
  • +
  • Aggiornate librerie HTMLViewer, SynPDF, SVGIconImageList e Image32
  • +
+

23 Ott 2021 - Versione 1.8.0

+
    +
  • Aggiunti nuovi stili Windows 11
  • +
+

03 Set 2021 - Versione 1.7.0

+
    +
  • Aggiunto supporto Delphi 11
  • +
  • Build con Delphi 11
  • +
+

23 Lug 2021 - Versione 1.6.0

+
    +
  • Aggiunto supporto SVG con engine Image32
  • +
+

05 Lug 2021 - Versione 1.5.0

+
    +
  • Aggiunto supporto drag/drop files da Exporer al viewer/editor
  • +
  • Setup firmato con certificato
  • +
+

22 Giu 2021 - Versione 1.4.0

+
    +
  • Aggiunto supporto ai file encodati BASE64 con la libreria PKCS7Extractor
  • +
  • Aggiunta la stampa in PDF della fattura basata sul template HTML
  • +
  • Migliorato il template Assosoftware Custom per la visualizzazione
  • +
  • Fixati problemi con caricamento XML con BOM
  • +
  • Aggiunta pagina layout PDF in Settings
  • +
+

11 Giu 2021 - Versione 1.3.0

+
    +
  • Aggiunto supporto ai file firmati (p7m) con la libreria PKCS7Extractor
  • +
+

30 Apr 2021 - Versione 1.2.0

+
    +
  • Aggiunto supporto FExplorer a 32 Bit
  • +
+

23 Apr 2021 - Versione 1.1.0

+

Thumbnails:

+
    +
  • preview anche delle fatture elettroniche semplificate
  • +
  • preview di una generica icona XML per i file che non sono fatture
  • +
+

FExplorer:

+
    +
  • default apertura file “read-only”
  • +
  • Settings:
  • +
  • possibilità di abilitare l'editing dei file
  • +
  • possibilità di caricare anche file xsl
  • +
  • auto-riconoscimento xsl di trasformazione fatture*
  • +
  • auto-riconoscimento xsl di trasformazioni icone svg*
  • +
+

*queste due funzioni permettono di utilizzare l'editor per testare nuovi stili di trasformazione di fatture e di icone

+

Bug-fixing:

+
    +
  • impostazione stampante (AV in apertura)
  • +
  • preview di stampa corretta
  • +
  • alcuni messaggi in inglese
  • +
+

14 Apr 2021 - Versione 1.0.0

+

26 Mar 2021 - Creazione Repo

+

Credits

+

Grazie a * Rodrigo Ruz V. * (autore di theroadtodelphi.com Blog) per il suo ottimolavoro su delphi-preview-handler da cui questo progetto ha usato codice e ispirazione.

+

Grazie a * Carlo Barazzetta * per il suo ottimo lavoro su SvgShellExtensions da cui questo progetto ha usato molto codice e ispirazione.

+

Grazie ad * Andrea Magni * che ha collaborato alla realizzazione di questo progetto.

+

Licenza

+

Rilasciato sotto licenza Apache License, Version 2.0 (the “License”);

+

A meno che non sia richiesto dalla legge applicabile o concordato per iscritto, il software distribuito in base alla Licenza è distribuito “COSÌ COM'È”, SENZA GARANZIE O CONDIZIONI DI ALCUN TIPO, esplicite o implicite. Vedere la Licenza per la lingua specifica che regola le autorizzazioni e le limitazioni ai sensi della Licenza.

+

Delphi 12 Support

+

Related links: embarcadero.com - learndelphi.org

diff --git a/README.md b/README.md index b2c43f0..5a962bf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## **Anteprima Fattura Elettronica (Viewer e Icone) integrato in Windows Explorer e Visualizzatore** -### Versione attuale 2.2 ### +### Versione attuale 2.3 ### **Una serie di strumenti per gestire i file xml contenenti Fatture Elettroniche in Windows:** @@ -63,6 +63,14 @@ Per installare manualmente FExplorer.dll seguire questi step: ## Release Notes ## +29 mag 2024 - Versione 2.3.0 +- Finestre con bordo ombreggiato +- Fogli di stile AssoSoftware e PA aggiornati +- Corretto Layout per mancanza codice articolo +- Aggiunta gestione pulsanti arrotondati +- Aggiunte Dialog moderne con animazioni +- Compilato con Delphi 12.1 + 12 Set 2023 - Versione 2.2.0 - Aggiornati fogli di stile Assosoftware e PA - Build con Delphi 12 @@ -71,7 +79,7 @@ Per installare manualmente FExplorer.dll seguire questi step: - Aggiunto supporto a Delphi 12 23 Nov 2022 - Versione 2.1.0 -- Aggiunto "Stile" SudTirolo (ITA/DEU) [github.com/provbz/fatturapa-xsl-southtyrol][16] +- Aggiunto "Stile" SudTirolo (ITA/DEU)[16] - Aggiunta possibilità di spegnere pannello anteprima icona e testo XML nel Viewer 11 Sep 2022 - Versione 2.0.0 @@ -183,4 +191,4 @@ Related links: [embarcadero.com][11] - [learndelphi.org][12] [15]: http://www.angusj.com/delphi/image32/Docs/_Body.htm -[16]: https://github.com/provbz/fatturapa-xsl-southtyrol +[16]: https://github.com/provbz/fatturapa-xsl-southtyrol \ No newline at end of file diff --git a/Setup/FExplorer.iss b/Setup/FExplorer.iss index 6ca6aff..8ec466d 100644 --- a/Setup/FExplorer.iss +++ b/Setup/FExplorer.iss @@ -1,7 +1,7 @@ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName 'FExplorer (Fattura Elettronica Explorer e Visualizzatore)' -#define MyAppVersion '2.2.0' +#define MyAppVersion '2.3.0' [Setup] AppName={#MyAppName} @@ -31,7 +31,7 @@ AlwaysShowDirOnReadyPage=true AlwaysShowGroupOnReadyPage=true ShowTasksTreeLines=true DisableWelcomePage=False -AppCopyright=Copyright � 2021-2023 Ethea S.r.l. e Andrea Magni +AppCopyright=Copyright � 2021-2024 Ethea S.r.l. e Andrea Magni ArchitecturesInstallIn64BitMode=x64 MinVersion=0,6.1sp1 CloseApplications=force @@ -45,11 +45,15 @@ Name: ita; MessagesFile: compiler:Languages\Italian.isl; LicenseFile: .\Licenza_ Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; Components: Viewer [Files] +; 32 Bit files +Source: "..\Bin32\sk4d.dll"; DestDir: "{sys}"; Flags : sharedfile 32bit; Components: ShellExtensions Source: "..\Bin32\FEViewer.exe"; DestDir: "{app}"; Flags: ignoreversion 32bit; Components: Viewer Source: "..\Bin32\FExplorer32.dll"; DestDir: {app}; Flags : regserver sharedfile noregerror; Components: ShellExtensions Source: "..\Bin32\libeay32.dll"; DestDir: {app}; Components: ShellExtensions; Flags: ignoreversion 32bit Source: "..\Bin32\ssleay32.dll"; DestDir: {app}; Components: ShellExtensions; Flags: ignoreversion 32bit +; 64 Bit files +Source: "..\Bin64\sk4d.dll"; DestDir: "{sys}"; Flags : sharedfile 64bit; Components: ShellExtensions Source: "..\Bin64\FEViewer.exe"; DestDir: "{app}"; Flags: ignoreversion 64bit; Components: Viewer Source: "..\Bin64\FExplorer.dll"; DestDir: {app}; Flags : 64bit regserver sharedfile noregerror; Components: ShellExtensions Source: "..\Bin64\libeay32.dll"; DestDir: {app}; Components: ShellExtensions; Flags: ignoreversion 64bit @@ -73,6 +77,23 @@ Root: "HKCR"; Subkey: "OpenFEViewer\Shell\Open\Command"; ValueType: string; Valu Root: "HKCR"; Subkey: "OpenFEViewer\DefaultIcon"; ValueType: string; ValueData: "{app}\FEViewer.exe,0"; Flags: uninsdeletevalue [Code] + +function IsSilentMode(): Boolean; +var + j: Cardinal; +begin + Result := false; + begin + for j := 0 to ParamCount do + begin + Result := (ParamStr(j)='/verysilent') or (ParamStr(j)='/silent') or + (ParamStr(j)='/VERYSILENT') or (ParamStr(j)='/SILENT'); + if Result then + break; + end; + end; +end; + function InitializeSetup(): Boolean; begin Result:=True; @@ -114,7 +135,8 @@ begin // get the uninstall string of the old app sUnInstallString := GetUninstallString(); - if sUnInstallString <> '' then begin + if sUnInstallString <> '' then + begin sUnInstallString := RemoveQuotes(sUnInstallString); if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES', '', SW_HIDE, ewWaitUntilTerminated, iResultCode) then Result := 3 @@ -130,7 +152,8 @@ begin begin if (IsUpgrade()) then begin - MsgBox(ExpandConstant('Una vecchia versione di "Fattura Elettronica Explorer" � gi� installata: verr� eseguita la disinstallazione.'), mbInformation, MB_OK); + if not IsSilentMode() then + MsgBox(ExpandConstant('Una vecchia versione di "Fattura Elettronica Explorer" � gi� installata: verr� eseguita la disinstallazione.'), mbInformation, MB_OK); UnInstallOldVersion(); end; end; diff --git a/Setup/SupportingDelphi.jpg b/Setup/SupportingDelphi.jpg index 861120e50973a421655da7503c9cf416124db025..1e2f439ca772263f1e441a520f23b1db3a581151 100644 GIT binary patch delta 8159 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 SUs{4A4>msK8Qm77PX8~nhPA)| delta 8315 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 UEhBfg!uMB?W*>{?v5=?!3ydHL*8l(j diff --git a/Source/FEViewer.dpr b/Source/FEViewer.dpr index 27463b0..6cd70be 100644 --- a/Source/FEViewer.dpr +++ b/Source/FEViewer.dpr @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -32,10 +32,10 @@ program FEViewer; uses + System.SysUtils, Vcl.Forms, Vcl.Themes, Vcl.Styles, - System.SysUtils, dlgSearchText in 'dlgSearchText.pas' {TextSearchDialog}, dlgReplaceText in 'dlgReplaceText.pas' {TextReplaceDialog}, FExplorer.ViewerMainForm in 'FExplorer.ViewerMainForm.pas' {frmMain}, @@ -52,7 +52,9 @@ uses FExplorer.InvoiceToImage in 'FExplorer.InvoiceToImage.pas', FExplorer.ThumbnailResources in 'FExplorer.ThumbnailResources.pas' {dmThumbnailResources: TDataModule}, vmHtmlToPdf in 'vmHtmlToPdf.pas', - uDragDropUtils in 'uDragDropUtils.pas'; + uDragDropUtils in 'uDragDropUtils.pas', + Vcl.StyledTaskDialogFormUnit in '..\Ext\StyledComponents\source\Vcl.StyledTaskDialogFormUnit.pas' {StyledTaskDialogForm}, + Skia.Vcl.StyledTaskDialogAnimatedUnit in '..\Ext\StyledComponents\source\Skia.Vcl.StyledTaskDialogAnimatedUnit.pas' {StyledTaskDialogAnimated}; {$R *.res} @@ -60,16 +62,19 @@ begin Application.Initialize; Application.MainFormOnTaskBar := True; Application.ActionUpdateDelay := 50; - Application.Title := Title_FEViewer+'- � 2021-2023 Ethea S.r.l.'; + Application.Title := Title_FEViewer+'- � 2021-2024 Ethea S.r.l.'; + //Uses System Style for border / shadow of Forms + TStyleManager.FormBorderStyle := TStyleManager.TFormBorderStyle.fbsSystemStyle; with TSplashForm.Create(nil) do Try Show; Update; Application.HelpFile := ''; - Application.CreateForm(TdmResources, dmResources); - Application.CreateForm(TfrmMain, frmMain); - Application.CreateForm(TPageSetupDlg, PageSetupDlg); - Hide; + Application.CreateForm(TdmResources, dmResources); + Application.CreateForm(TfrmMain, frmMain); + Application.CreateForm(TPageSetupDlg, PageSetupDlg); + Application.OnException := frmMain.ManageExceptions; + Hide; Finally Free; End; diff --git a/Source/FEViewer.dproj b/Source/FEViewer.dproj index b69118f..03f4d85 100644 --- a/Source/FEViewer.dproj +++ b/Source/FEViewer.dproj @@ -5,13 +5,14 @@ Release DCC32 ..\..\exe\InstantXMLEditor.exe - 20.0 + 20.1 Debug VCL True Win32 3 Application + FEViewer true @@ -67,16 +68,17 @@ ..\Icons\logo.ico $(BDS)\bin\default_app.manifest 1040 - CompanyName=Ethea S.r.l.;FileDescription=Visualizzatore Fattura Elettronica;FileVersion=2.2.0.0;InternalName=;LegalCopyright=Copyright © 2021-2023 - Ethea S.r.l. & Andrea Magni;LegalTrademarks=;OriginalFilename=;ProductName=FExplorer Viewer;ProductVersion=2.2;Comments= + CompanyName=Ethea S.r.l.;FileDescription=Visualizzatore Fattura Elettronica;FileVersion=2.3.0.0;InternalName=;LegalCopyright=Copyright © 2021-2024 - Ethea S.r.l. & Andrea Magni;LegalTrademarks=;OriginalFilename=;ProductName=FExplorer Viewer;ProductVersion=2.3;Comments= Glow|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Glow.vsf;Sky|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Sky.vsf;Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf;"Windows10 Dark|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10Dark.vsf";"Windows10 SlateGray|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10SlateGray.vsf";"Windows11 Modern Dark|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows11_Modern_Dark.vsf";"Windows11 Modern Light|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows11_Modern_Light.vsf" 0 false false - ..\Ext\SynEdit\Source;..\Ext\SVGIconImageList\Source;..\Ext\SVGIconImageList\Svg;..\Ext\VCLStyleUtils\Common;..\Ext\VCLStyleUtils\DDetours\Source;..\Ext\HTMLViewer\Source;..\Ext\SynPDF;..\Ext\SVGIconImageList\Image32\Source;$(DCC_UnitSearchPath) + ..\Ext\SynEdit\Source;..\Ext\SVGIconImageList\Source;..\Ext\VCLStyleUtils\Common;..\Ext\VCLStyleUtils\DDetours\Source;..\Ext\HTMLViewer\Source;..\Ext\SynPDF;..\Ext\SVGIconImageList\Image32\Source;..\Ext\StyledComponents\source;$(DCC_UnitSearchPath) ..\Dcu\$(Platform)\$(Config) ..\..\exe\InstantXMLEditor.exe 2 - 2 + 3 + ITA_MESSAGES;SKIA;$(DCC_Define) System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Bde;$(DCC_Namespace) @@ -168,10 +170,13 @@ FEViewer.dpr - File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\CardTable_v3280.bpl not found - Componenti per corso Delphi - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Ethea InstantSolutions 8.5 Framework Library + Ethea InstantSolutions 8.6 Rtl Library + Ethea InstantSolutions 8.6 LibreOffice/OpenOffice Components + Ethea InstantSolutions 8.6 Vcl Library + Ethea InstantSolutions 8.6 Framework Library + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components @@ -179,8 +184,70 @@ True - - + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + + + + .\ + 0 + sk4d.dll + true + + 1 @@ -209,12 +276,6 @@ 1 - - - library\lib\armeabi-v7a - 1 - - library\lib\armeabi @@ -774,6 +835,9 @@ 1 + + 1 + @@ -1028,13 +1092,13 @@ - + 12 @@ -1084,6 +1148,12 @@ + +
StyledTaskDialogForm
+
+ +
StyledTaskDialogAnimated
+
Base diff --git a/Source/FEViewer.res b/Source/FEViewer.res index a5e06143db31734683810a56f3bc47327e1152b9..8be924007342bb044b4b6afa00f1a9c63f16f816 100644 GIT binary patch delta 125 zcmZ26GhoHcfC&Yh%nVEnAi%t_QlF90c=Afda7L5Kj7+N;jhojpwXbDj1Y!`)ynQVb z%l?CmEbX~RK$sPX*?^cGh&h0m6NtHhm>Yk98t*p?kx<%zQfCzsty(dyL}dp=rcg~O5)1P?$(OTl-M)3p=&`}Z zA74{RRILZ~RIkJ*RkLELnBc#u6^r{JmcuK+0vjA~!2=%x2qA(P5=bF~Tn}&2v>y^@ BEv*0m diff --git a/Source/FExplorer.About.dfm b/Source/FExplorer.About.dfm index 5cc56ed..811fb51 100644 --- a/Source/FExplorer.About.dfm +++ b/Source/FExplorer.About.dfm @@ -3,8 +3,8 @@ object FrmAbout: TFrmAbout Top = 323 BorderIcons = [biSystemMenu] BorderStyle = bsSingle - ClientHeight = 316 - ClientWidth = 446 + ClientHeight = 312 + ClientWidth = 436 Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -14,9 +14,10 @@ object FrmAbout: TFrmAbout Position = poDefault OnClose = FormClose OnCreate = FormCreate + OnShow = FormShow DesignSize = ( - 446 - 316) + 436 + 312) TextHeight = 13 object TitleLabel: TLabel Left = 190 @@ -28,10 +29,11 @@ object FrmAbout: TFrmAbout WordWrap = True end object LabelVersion: TLabel - Left = 229 + Left = 394 Top = 64 Width = 41 Height = 13 + Alignment = taRightJustify Caption = 'Versione' end object SVGIconImage1: TSVGIconImage @@ -185,42 +187,95 @@ object FrmAbout: TFrmAbout Height = 53 AutoSize = False SVGText = - ''#13#10' '#13#10' '#13#10' <' + - 'feGaussianBlur in="SourceAlpha" stdDeviation="2"/>'#13#10' '#13#10' '#13#10' '#13#10' '#13#10' '#13#10' '#13#10' '#13#10' '#13#10' '#13#10' '#13#10'' + ''#13#10''#13#10' '#13#10' '#13#10' '#13#10'' + + #13#10 end object Panel1: TPanel Left = 0 - Top = 265 - Width = 446 + Top = 261 + Width = 436 Height = 51 Align = alBottom BevelOuter = bvNone Color = clWindow ParentBackground = False TabOrder = 0 - object btnOK: TButton - Left = 360 + object btnOK: TStyledButton + Left = 351 Top = 16 Width = 75 Height = 25 - Caption = 'CLOSE' + Cancel = True + Caption = 'CHIUDI' Default = True TabOrder = 2 OnClick = btnOKClick end - object btnIssues: TButton + object btnIssues: TStyledButton Left = 8 Top = 16 Width = 125 @@ -230,7 +285,7 @@ object FrmAbout: TFrmAbout TabOrder = 0 OnClick = btnIssuesClick end - object btnCheckUpdates: TButton + object btnCheckUpdates: TStyledButton Left = 139 Top = 16 Width = 125 @@ -243,10 +298,10 @@ object FrmAbout: TFrmAbout end end object MemoCopyRights: TMemo - Left = 11 - Top = 87 + Left = 8 + Top = 89 Width = 427 - Height = 115 + Height = 109 Anchors = [akLeft, akTop, akBottom] Color = clBtnFace Lines.Strings = ( @@ -259,6 +314,9 @@ object FrmAbout: TFrmAbout 'SVGIconImageList' 'https://github.com/EtheaDev/SVGIconImageList/' '' + 'StyledComponents' + 'https://github.com/EtheaDev/StyledComponents' + '' 'PKCS7Extractor' 'https://github.com/DelphiClubItalia/PKCS7Extractor' 'Copyright '#169' 2018 Delphi Club Italia - LGPL v3' @@ -287,14 +345,9 @@ object FrmAbout: TFrmAbout 'Copyright '#169' Muzio Valerio.' '' - '- TSVG Library - http://www.mwcs.de Original version '#169' 2005, 200' + - '8 Martin ' - 'Walter.' - '' - - '- Image32 Library - http://www.angusj.com/delphi/image32/Docs/_B' + - 'ody.htm' - 'Copyright '#169'2019-2022 Angus Johnson.' + 'Image32 Library - http://www.angusj.com/delphi/image32/Docs/_Bod' + + 'y.htm' + 'Copyright '#169'2019-2023 Angus Johnson.' '' '- StyleSheet FatturaPA in South-Tyrol - https://github.com/provb' + @@ -304,11 +357,11 @@ object FrmAbout: TFrmAbout '' 'HTMLViewer - https://github.com/BerndGabriel/HtmlViewer' 'Copyright (c) 1995 - 2008 by L. David Baldwin' - 'Copyright (c) 1995 - 2008 by Anders Melander (DitherUnit.pas)' - 'Copyright (c) 1995 - 2008 by Ron Collins (HtmlGif1.pas)' + 'Copyright (c) 1995 - 2023 by Anders Melander (DitherUnit.pas)' + 'Copyright (c) 1995 - 2023 by Ron Collins (HtmlGif1.pas)' 'Copyright (c) 2008 - 2009 by Sebastian Zierer (Delphi 2009 Port)' 'Copyright (c) 2008 - 2010 by Arvid Winkelsdorf (Fixes)' - 'Copyright (c) 2009 - 2019 by HtmlViewer Team') + 'Copyright (c) 2009 - 2023 by HtmlViewer Team') ReadOnly = True ScrollBars = ssVertical TabOrder = 1 @@ -323,12 +376,12 @@ object FrmAbout: TFrmAbout 'om/EtheaDev/FExplorer' TabOrder = 2 UseVisualStyle = True - OnClick = LinkLabel1Click + OnLinkClick = LinkLabel1LinkClick end object panelLibrary: TGroupBox - Left = 11 + Left = 8 Top = 204 - Width = 415 + Width = 427 Height = 55 Anchors = [akLeft, akRight, akBottom] Caption = 'OpenSSL Library Info' diff --git a/Source/FExplorer.About.pas b/Source/FExplorer.About.pas index d5f4aaa..6726f96 100644 --- a/Source/FExplorer.About.pas +++ b/Source/FExplorer.About.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -36,22 +36,23 @@ interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, pngimage, Vcl.ImgList, System.ImageList, - Vcl.Imaging.GIFImg, SVGIconImage; + Vcl.Imaging.GIFImg, SVGIconImage, Vcl.ButtonStylesAttributes, Vcl.StyledButton; resourcestring Title_FEViewer = 'Visualizzatore Fattura Elettronica'; Title_SVGPreview = 'Anteprima Fattura Elettronica'; - FReeware_Caption = ' - Freeware'; +const + HELP_URL = 'https://github.com/EtheaDev/FExplorer/issues'; type TFrmAbout = class(TForm) Panel1: TPanel; - btnOK: TButton; + btnOK: TStyledButton; TitleLabel: TLabel; LabelVersion: TLabel; MemoCopyRights: TMemo; - btnIssues: TButton; - btnCheckUpdates: TButton; + btnIssues: TStyledButton; + btnCheckUpdates: TStyledButton; LinkLabel1: TLinkLabel; SVGIconImage1: TSVGIconImage; SVGIconImage2: TSVGIconImage; @@ -64,13 +65,14 @@ TFrmAbout = class(TForm) procedure FormCreate(Sender: TObject); procedure btnIssuesClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); - procedure LinkLabel1Click(Sender: TObject); procedure btnCheckUpdatesClick(Sender: TObject); + procedure LinkLabel1LinkClick(Sender: TObject; const Link: string; + LinkType: TSysLinkType); + procedure FormShow(Sender: TObject); private FTitle: string; procedure SetTitle(const Value: string); procedure RefreshSSLInfo; - { Private declarations } public procedure DisableButtons; property Title: string read FTitle write SetTitle; @@ -152,7 +154,7 @@ procedure TFrmAbout.btnOKClick(Sender: TObject); procedure TFrmAbout.btnIssuesClick(Sender: TObject); begin ShellExecute(Handle, 'open', - PChar('https://github.com/EtheaDev/FExplorer/issues'), + PChar(HELP_URL+'/issues'), nil, nil, SW_SHOW); end; @@ -183,17 +185,23 @@ procedure TFrmAbout.FormCreate(Sender: TObject); RefreshSSLInfo; end; -procedure TFrmAbout.LinkLabel1Click(Sender: TObject); +procedure TFrmAbout.FormShow(Sender: TObject); begin - ShellExecute(Handle, 'open', - PChar('https://github.com/EtheaDev/FExplorer'), nil, nil, SW_SHOW); + if btnOK.CanFocus then + btnOK.SetFocus; +end; + +procedure TFrmAbout.LinkLabel1LinkClick(Sender: TObject; const Link: string; + LinkType: TSysLinkType); +begin + ShellExecute(Handle, 'open', PChar(Link), nil, nil, SW_SHOW); end; procedure TFrmAbout.SetTitle(const Value: string); begin FTitle := Value; Caption := FTitle; - TitleLabel.Caption := Value + FReeware_Caption; + TitleLabel.Caption := Value; end; procedure TFrmAbout.RefreshSSLInfo; diff --git a/Source/FExplorer.ContextMenuHandler.pas b/Source/FExplorer.ContextMenuHandler.pas index bcf74a9..97e6223 100644 --- a/Source/FExplorer.ContextMenuHandler.pas +++ b/Source/FExplorer.ContextMenuHandler.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.InvoiceToImage.pas b/Source/FExplorer.InvoiceToImage.pas index 3f98108..bb9cce1 100644 --- a/Source/FExplorer.InvoiceToImage.pas +++ b/Source/FExplorer.InvoiceToImage.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.Main.pas b/Source/FExplorer.Main.pas index d700e56..df57030 100644 --- a/Source/FExplorer.Main.pas +++ b/Source/FExplorer.Main.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.Misc.pas b/Source/FExplorer.Misc.pas index 0e8f61d..69ea67b 100644 --- a/Source/FExplorer.Misc.pas +++ b/Source/FExplorer.Misc.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.PreviewForm.dfm b/Source/FExplorer.PreviewForm.dfm index 784a69e..2e7033a 100644 --- a/Source/FExplorer.PreviewForm.dfm +++ b/Source/FExplorer.PreviewForm.dfm @@ -5,6 +5,7 @@ inherited FrmPreview: TFrmPreview ClientWidth = 601 DoubleBuffered = True Font.Name = 'Segoe UI' + StyleElements = [seFont, seClient, seBorder] OnResize = FormResize ExplicitWidth = 617 ExplicitHeight = 652 @@ -19,7 +20,6 @@ inherited FrmPreview: TFrmPreview AutoSnap = False MinSize = 100 OnMoved = SplitterMoved - ExplicitWidth = 888 end object PanelTop: TPanel Left = 0 @@ -29,105 +29,90 @@ inherited FrmPreview: TFrmPreview Align = alTop BevelOuter = bvNone TabOrder = 2 - object ToolBar: TToolBar + object StyledToolBar: TStyledToolbar Left = 0 Top = 0 - Width = 605 + Width = 601 Height = 35 Align = alClient AutoSize = True ButtonHeight = 30 - ButtonWidth = 110 - EdgeInner = esNone - EdgeOuter = esNone + ButtonWidth = 30 Images = SVGIconImageList List = True TabOrder = 0 - object ToolButtonShowText: TToolButton + object ToolButtonShowText: TStyledToolButton Left = 0 Top = 0 - Cursor = crHandPoint - AutoSize = True + OnMouseEnter = ToolButtonMouseEnter + OnMouseLeave = ToolButtonMouseLeave + OnClick = ToolButtonShowTextClick + Visible = False Caption = 'Nascondi XML' ImageIndex = 1 ImageName = 'Hide-Text' - Visible = False - OnClick = ToolButtonShowTextClick - OnMouseEnter = ToolButtonMouseEnter - OnMouseLeave = ToolButtonMouseLeave end - object ToolButtonZoomIn: TToolButton - Left = 35 + object ToolButtonZoomIn: TStyledToolButton + Left = 30 Top = 0 - Cursor = crHandPoint Hint = 'Zoom + (aumento lo zoom)' - AutoSize = True + OnMouseEnter = ToolButtonMouseEnter + OnMouseLeave = ToolButtonMouseLeave + OnClick = ToolButtonZoomInClick Caption = 'Zoom +' ImageIndex = 6 ImageName = 'plus' - OnClick = ToolButtonZoomInClick - OnMouseEnter = ToolButtonMouseEnter - OnMouseLeave = ToolButtonMouseLeave end - object ToolButtonZoomOut: TToolButton - Left = 70 + object ToolButtonZoomOut: TStyledToolButton + Left = 60 Top = 0 - Cursor = crHandPoint Hint = 'Zoom - (diminuisce lo zoom)' - AutoSize = True + OnMouseEnter = ToolButtonMouseEnter + OnMouseLeave = ToolButtonMouseLeave + OnClick = ToolButtonZoomOutClick Caption = 'Zoom -' ImageIndex = 7 ImageName = 'minus' - OnClick = ToolButtonZoomOutClick - OnMouseEnter = ToolButtonMouseEnter - OnMouseLeave = ToolButtonMouseLeave end - object ToolButtonSettings: TToolButton - Left = 105 + object ToolButtonSettings: TStyledToolButton + Left = 90 Top = 0 - Cursor = crHandPoint Hint = 'Modifica impostazioni...' - AutoSize = True + OnMouseEnter = ToolButtonMouseEnter + OnMouseLeave = ToolButtonMouseLeave + OnClick = ToolButtonSettingsClick + Visible = False Caption = 'Impostazioni...' ImageIndex = 12 ImageName = 'preferences-desktop' - Visible = False - OnClick = ToolButtonSettingsClick - OnMouseEnter = ToolButtonMouseEnter - OnMouseLeave = ToolButtonMouseLeave end - object ToolButtonAbout: TToolButton - Left = 140 + object ToolButtonAbout: TStyledToolButton + Left = 120 Top = 0 - Cursor = crHandPoint Hint = 'Mostra info...' - AutoSize = True + OnMouseEnter = ToolButtonMouseEnter + OnMouseLeave = ToolButtonMouseLeave + OnClick = ToolButtonAboutClick + Visible = False Caption = 'Info...' ImageIndex = 2 ImageName = 'about' - Visible = False - OnClick = ToolButtonAboutClick - OnMouseEnter = ToolButtonMouseEnter - OnMouseLeave = ToolButtonMouseLeave end - object SeparatorEditor: TToolButton - Left = 175 + object SeparatorEditor: TStyledToolButton + Left = 150 Top = 0 - Width = 8 - ImageName = 'settings' Style = tbsSeparator end - object ToolButtonReformat: TToolButton - Left = 183 + object ToolButtonReformat: TStyledToolButton + Left = 156 Top = 0 Hint = 'Riformatta testo XML' - AutoSize = True + OnMouseEnter = ToolButtonMouseEnter + OnMouseLeave = ToolButtonMouseLeave + OnClick = ToolButtonReformatClick Caption = 'Formatta' ImageIndex = 10 ImageName = 'Reformat' - OnClick = ToolButtonReformatClick - OnMouseEnter = ToolButtonMouseEnter - OnMouseLeave = ToolButtonMouseLeave end end end @@ -143,7 +128,7 @@ inherited FrmPreview: TFrmPreview object SynEdit: TSynEdit Left = 0 Top = 0 - Width = 605 + Width = 601 Height = 110 Align = alClient Font.Charset = DEFAULT_CHARSET @@ -170,7 +155,6 @@ inherited FrmPreview: TFrmPreview Gutter.ShowLineNumbers = True ReadOnly = True FontSmoothing = fsmNone - ExplicitWidth = 601 end end object StatusBar: TStatusBar @@ -195,22 +179,19 @@ inherited FrmPreview: TFrmPreview Align = alBottom BevelOuter = bvNone TabOrder = 0 - object ToolBarAllegati: TToolBar + object ToolBarAllegati: TStyledToolbar Left = 0 Top = 0 - Width = 605 + Width = 601 Height = 30 Align = alClient AutoSize = True ButtonHeight = 30 ButtonWidth = 81 - EdgeInner = esNone - EdgeOuter = esNone Images = SVGIconImageList List = True + ShowCaptions = True TabOrder = 0 - Transparent = True - ExplicitWidth = 601 end end object HtmlViewer: THtmlViewer diff --git a/Source/FExplorer.PreviewForm.pas b/Source/FExplorer.PreviewForm.pas index 19de82f..f8cc86b 100644 --- a/Source/FExplorer.PreviewForm.pas +++ b/Source/FExplorer.PreviewForm.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -44,7 +44,9 @@ interface SVGIconImageList, SVGIconImageListBase, SVGIconImage, Vcl.VirtualImageList, Vcl.OleCtrls, SHDocVw, Xml.xmldom, Xml.XMLIntf, Xml.Win.msxmldom, Xml.XMLDoc, FExplorer.Resources, HTMLUn2, HtmlView, - UPreviewContainer; + UPreviewContainer, + Vcl.ButtonStylesAttributes, Vcl.StyledButton, + Vcl.StyledToolbar, Vcl.StyledButtonGroup; type TFrmPreview = class(TPreviewContainer) @@ -53,16 +55,16 @@ TFrmPreview = class(TPreviewContainer) PanelXML: TPanel; StatusBar: TStatusBar; SVGIconImageList: TVirtualImageList; - ToolButtonZoomIn: TToolButton; - ToolButtonZoomOut: TToolButton; - ToolBar: TToolBar; - ToolButtonSettings: TToolButton; - ToolButtonAbout: TToolButton; - SeparatorEditor: TToolButton; - ToolButtonShowText: TToolButton; - ToolButtonReformat: TToolButton; + ToolButtonZoomIn: TStyledToolButton; + ToolButtonZoomOut: TStyledToolButton; + StyledToolBar: TStyledToolbar; + ToolButtonSettings: TStyledToolButton; + ToolButtonAbout: TStyledToolButton; + ToolButtonShowText: TStyledToolButton; + SeparatorEditor: TStyledToolButton; + ToolButtonReformat: TStyledToolButton; Splitter: TSplitter; - ToolBarAllegati: TToolBar; + ToolBarAllegati: TStyledToolbar; HtmlViewer: THtmlViewer; procedure FormCreate(Sender: TObject); procedure ToolButtonZoomInClick(Sender: TObject); @@ -85,7 +87,7 @@ TFrmPreview = class(TPreviewContainer) FIconVisible: Boolean; FPreviewSettings: TPreviewSettings; FInvoice: TLegalInvoice; - FAllegatiButtons: TObjectList; + FAllegatiButtons: TObjectList; class var FExtensions: TDictionary; class var FAParent: TWinControl; @@ -212,7 +214,7 @@ procedure TFrmPreview.RenderAllegati; var LIndex: Integer; LAllegato: TLinkedDoc; - LButton: TToolButton; + LButton: TStyledToolButton; begin FAllegatiButtons.Clear; @@ -220,7 +222,7 @@ procedure TFrmPreview.RenderAllegati; begin LAllegato := FInvoice.Allegati[LIndex]; - LButton := TToolButton.Create(nil); + LButton := TStyledToolButton.Create(nil); try LButton.Cursor := crHandPoint; LButton.AutoSize := True; @@ -245,7 +247,7 @@ constructor TFrmPreview.Create(AOwner: TComponent); inherited; FPreviewSettings := TPreviewSettings.CreateSettings(SynEdit.Highlighter); dmResources := TdmResources.Create(nil); - FAllegatiButtons := TObjectList.Create(True); + FAllegatiButtons := TObjectList.Create(True); end; destructor TFrmPreview.Destroy; @@ -333,10 +335,16 @@ procedure TFrmPreview.FormResize(Sender: TObject); begin PanelXML.Height := Round(Self.Height * (FPreviewSettings.SplitterPos / 100)); Splitter.Top := PanelXML.Height; - if Self.Width < (550 * Self.ScaleFactor) then - ToolBar.ShowCaptions := False + if Self.Width < (560 * Self.ScaleFactor) then + begin + StyledToolBar.ShowCaptions := False; + StyledToolBar.ButtonWidth := Round(30 * Self.ScaleFactor); + end else - Toolbar.ShowCaptions := True; + begin + StyledToolbar.ShowCaptions := True; + StyledToolBar.ButtonWidth := Round(110 * Self.ScaleFactor); + end; UpdateGUI; end; @@ -434,7 +442,7 @@ procedure TFrmPreview.SetHTMLFontSize(const Value: Integer); procedure TFrmPreview.SplitterMoved(Sender: TObject); begin FPreviewSettings.SplitterPos := splitter.Top * 100 div - (Self.Height - Toolbar.Height); + (Self.Height - StyledToolbar.Height); SaveSettings; end; @@ -454,7 +462,7 @@ procedure TFrmPreview.ToolButtonAboutClick(Sender: TObject); procedure TFrmPreview.ToolButtonMouseEnter(Sender: TObject); begin - StatusBar.SimpleText := (Sender as TToolButton).Hint; + StatusBar.SimpleText := (Sender as TStyledToolButton).Hint; end; procedure TFrmPreview.ToolButtonMouseLeave(Sender: TObject); @@ -468,6 +476,8 @@ procedure TFrmPreview.ToolButtonReformatClick(Sender: TObject); end; procedure TFrmPreview.UpdateFromSettings(const Preview: Boolean); +var + LStyle: TStyledButtonDrawType; begin FPreviewSettings.ReadSettings(SynEdit.Highlighter, nil); if FPreviewSettings.XMLFontSize >= MinfontSize then @@ -476,6 +486,28 @@ procedure TFrmPreview.UpdateFromSettings(const Preview: Boolean); XMLFontSize := MinfontSize; SynEdit.Font.Name := FPreviewSettings.XMLFontName; + //Rounded Buttons for StyledButtons + if FPreviewSettings.ButtonDrawRounded then + LStyle := btRounded + else + LStyle := btRoundRect; + TStyledButton.RegisterDefaultRenderingStyle(LStyle); + + //Rounded Buttons for StyledToolbars + if FPreviewSettings.ToolbarDrawRounded then + LStyle := btRounded + else + LStyle := btRoundRect; + TStyledToolbar.RegisterDefaultRenderingStyle(LStyle); + StyledToolbar.StyleDrawType := LStyle; + + //Rounded Buttons for menus: StyledCategories and StyledButtonGroup + if FPreviewSettings.MenuDrawRounded then + LStyle := btRounded + else + LStyle := btRoundRect; + TStyledButtonGroup.RegisterDefaultRenderingStyle(LStyle); + if FPreviewSettings.HTMLFontSize >= MinfontSize then HTMLFontSize := FPreviewSettings.HTMLFontSize else @@ -504,7 +536,7 @@ procedure TFrmPreview.ToolButtonSettingsClick(Sender: TObject); procedure TFrmPreview.ToolButtonSelectModeClick(Sender: TObject); begin - TToolButton(Sender).CheckMenuDropdown; + //TStyledToolButton(Sender).CheckMenuDropdown; end; procedure TFrmPreview.ToolButtonZoomOutClick(Sender: TObject); diff --git a/Source/FExplorer.PreviewHandler.pas b/Source/FExplorer.PreviewHandler.pas index 7ca6bbe..ddbbcba 100644 --- a/Source/FExplorer.PreviewHandler.pas +++ b/Source/FExplorer.PreviewHandler.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.PreviewHandlerRegister.pas b/Source/FExplorer.PreviewHandlerRegister.pas index faaa071..a893ee3 100644 --- a/Source/FExplorer.PreviewHandlerRegister.pas +++ b/Source/FExplorer.PreviewHandlerRegister.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.Resources.dfm b/Source/FExplorer.Resources.dfm index 55d0eb4..4699b30 100644 --- a/Source/FExplorer.Resources.dfm +++ b/Source/FExplorer.Resources.dfm @@ -1782,7 +1782,7 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' #9'' ' ' ' ' @@ -1874,44 +1874,51 @@ object dmResources: TdmResources ' ' '' - ' ' + ' ' ' ' + 'CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' + 'YYY CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' + 'CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' + 'YYY CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' - ' ' - ' ' - ' ' - ' ' - ' ' + ' ' ' ' - ' ' - ' ' - ' ' - ' del ' - ' ' - ' ' - ' ' - ' ' - ' ' - ' CUP: ' - ' ' - ' ' - ' ' - ' CIG: ' - ' ' - ' ' + ' ' + ' ' + ' ' + ' del ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' CUP: ' + ' ' + ' ' + ' ' + ' CIG: ' + ' ' + ' ' + ' ' ' ' + '' + ' ' + ' ' + ' Commessa/convenzione: ' + + ' ' + ' ' + ' ' + '' ' ' ' ' @@ -1919,11 +1926,25 @@ object dmResources: TdmResources 'zione" />' ' ' ' ' + '' + ' ' + ' ' + + ' ' + ' ' + ' ' + '' + '' + ' ' + '' + ' ' + '' ' ' '' - ' ' + ' ' #9' ' - '' + #9#9 #9#9' DDT ' #9#9' ' #9#9' ' @@ -1932,7 +1953,7 @@ object dmResources: TdmResources #9#9#9' ' #9#9#9'' #9#9' ' - '' + #9' ' #9' ' '' #9' ' @@ -1943,7 +1964,7 @@ object dmResources: TdmResources #9#9'' #9' ' ' ' - '' + ' ' ' ' ' ' ' ' @@ -1954,9 +1975,9 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9#9 ' ' '' ' ' @@ -1968,20 +1989,20 @@ object dmResources: TdmResources '/>' ' ' ' ' - '' + ' ' ' ' - #9' ' - '' + #9' '#9' ' + #9' ' #9' ' + ') = $valNumeroLinea] ">'#9#9 #9#9#9#9''#9'' - ' ' - '' - ' ' + ' ' + #9#9 + ' '#9' ' ' ' '' '' @@ -1997,31 +2018,19 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9' ' #9' ' - #9#9#9'' + 'umeroLinea) = $valNumeroLinea] ">'#9#9 + #9#9#9'' ' ' - - ' ' - ' ' - - ' ' - - ' ' + '> ' ' ' - ' ' - '' - '' + ' '#9' ' #9' ' ' ' '' @@ -2037,29 +2046,20 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' #9#9'' - #9' ' + 'inea) = $valNumeroLinea] ">'#9#9 + #9' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' + ' ' ' ' - #9' ' - '' + #9' ' + #9' ' #9' ' ' ' '' @@ -2075,30 +2075,20 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9' ' #9' ' - ' ' + 'roLinea) = $valNumeroLinea] ">'#9#9 + ' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' ' ' ' ' - '' + #9' ' #9' ' ' ' '' @@ -2114,30 +2104,20 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9' ' #9' ' - ' ' + ' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' ' ' ' ' - '' + #9' ' #9' ' ' ' '' @@ -2154,30 +2134,20 @@ object dmResources: TdmResources '/>' ' ' ' ' - ' ' + ' ' ' ' - '' + #9' ' ' ' - ' ' + ' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' + #39'/> ' ' ' ' ' - '' + #9' ' #9' ' ' ' '' @@ -2249,8 +2219,8 @@ object dmResources: TdmResources ' '#39'abcdefghijklmnopqrstuvwxyz' + #39 - ' ) != '#39'aswrelstd'#39 - #9#9#9#9#9#9#9#9#9'and' + ' ) != '#39'aswrelstd'#39' ' + #9#9#9#9#9#9#9#9#9'and '#9#9#9#9#9#9#9#9#9 #9#9#9#9#9#9#9#9#9'translate( TipoDato,' ' '#39'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + @@ -2344,8 +2314,8 @@ object dmResources: TdmResources ' ) = '#39'aswlottsca'#39' ">' '' - ' Quantit'#224' del suddetto lotto: <' + - '/xsl:text>' + ' Quantit'#195#160' del suddetto lotto: ' + + '' ' ' ' ' ' Rif. numero: ' @@ -2490,8 +2460,8 @@ object dmResources: TdmResources ' ' '' - '' + ' ' '

FExplorer (Fattura Elettronica in Windows Explorer) License

' '' @@ -2638,7 +2608,7 @@ object dmResources: TdmResources '
' ' ' - '' + #9#9 ' ' '' ' ' @@ -2944,15 +2914,15 @@ object dmResources: TdmResources '">' ' nuove iniziative produtt' + - 'ive - Non pi'#249' valido in quanto abrogato dalla legge di stabilit'#224 + - ' 2015' + 'ive - Non pi'#195#185' valido in quanto abrogato dalla legge di stabilit' + + #195#160' 2015' ' ' ' ' - ' agricoltura e attivit'#224' c' + - 'onnesse e pesca' + ' agricoltura e attivit'#195#160' ' + + 'connesse e pesca' ' ' ' ' ' intrattenimenti, giochi ' + - 'e altre attivit'#224' di cui alla tariffa allegata al DPR 640/72' + 'e altre attivit'#195#160' di cui alla tariffa allegata al DPR 640/72' ' ' ' ' ' rivendita beni usati, og' + - 'getti d'#8217'arte, d'#8217'antiquariato o da collezione' + 'getti d'#226#8364#8482'arte, d'#226#8364#8482'antiquariato o da collezione' ' ' ' ' - ' agenzie di vendite all'#8217'a' + - 'sta di oggetti d'#8217'arte, antiquariato o da collezione' + ' agenzie di vendite all'#226#8364 + + #8482'asta di oggetti d'#226#8364#8482'arte, antiquariato o da collezione' ' ' ' ' + + ' ' + + ' ' '
' '' ' Denominazione:' @@ -3295,13 +3267,13 @@ object dmResources: TdmResources ' ' ' nuove iniziative produttiv' + - 'e - Non pi'#249' valido in quanto abrogato dalla legge di stabilit'#224' 2' + - '015' + 'e - Non pi'#195#185' valido in quanto abrogato dalla legge di stabilit'#195#160 + + ' 2015' ' ' ' ' - ' agricoltura e attivit'#224' con' + - 'nesse e pesca' + ' agricoltura e attivit'#195#160' co' + + 'nnesse e pesca' ' ' ' ' ' vendita sali e tabacchi' @@ -3325,7 +3297,7 @@ object dmResources: TdmResources ' ' ' intrattenimenti, giochi e ' + - 'altre attivit'#224' di cui alla tariffa allegata al DPR 640/72' + 'altre attivit'#195#160' di cui alla tariffa allegata al DPR 640/72' ' ' ' ' ' agenzie viaggi e turismo' @@ -3339,12 +3311,12 @@ object dmResources: TdmResources ' ' ' rivendita beni usati, ogge' + - 'tti d'#8217'arte, d'#8217'antiquariato o da collezione' + 'tti d'#226#8364#8482'arte, d'#226#8364#8482'antiquariato o da collezione' ' ' ' ' - ' agenzie di vendite all'#8217'ast' + - 'a di oggetti d'#8217'arte, antiquariato o da collezione' + ' agenzie di vendite all'#226#8364#8482'a' + + 'sta di oggetti d'#226#8364#8482'arte, antiquariato o da collezione' ' ' ' ' ' IVA per cassa P.A.' @@ -3456,7 +3428,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' ' ' @@ -3576,14 +3548,14 @@ object dmResources: TdmResources '' '' ' ' - '' - '' + ' ' + ' ' '' ' ' ' ' - '' + ' ' '
' ' ' '' @@ -3601,7 +3573,7 @@ object dmResources: TdmResources '
' ' ' ' ' ' ' '' - '' + ' ' '
' - '' + ' ' '
' '
' '' '' @@ -4013,7 +3985,7 @@ object dmResources: TdmResources '' '' ' ' - '' + ' ' ' ' @@ -4022,7 +3994,7 @@ object dmResources: TdmResources ' ' ' ' - '' + ' ' ' ' @@ -4150,7 +4122,7 @@ object dmResources: TdmResources #9#9#9#9#9#9'' #9#9#9#9#9#9#9'acquisti da San Marino con IVA (fattura cartacea)' #9#9#9#9#9#9'' - '' + #9#9#9#9#9#9 ' ' ' ' ' fattura semplificata' @@ -4352,7 +4324,7 @@ object dmResources: TdmResources ' ' ' Cod. articolo' ' Descrizione' - ' Quantit'#224'' + ' Quantit'#195#160'' ' Prezzo unitario' ' UM' ' Sconto o magg.' @@ -4367,7 +4339,7 @@ object dmResources: TdmResources ' ' '' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' ' ' '' @@ -4422,22 +4384,12 @@ object dmResources: TdmResources ' ' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' '' ' ' @@ -4451,22 +4403,13 @@ object dmResources: TdmResources ' ' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' + ' ' ' ' '' ' ' @@ -4479,22 +4422,12 @@ object dmResources: TdmResources ' ' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' '' ' ' @@ -4509,22 +4442,12 @@ object dmResources: TdmResources 'reCollegate[not(./RiferimentoNumeroLinea) or normalize-space(./R' + 'iferimentoNumeroLinea)='#39#39'] " >' '' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' '' ' ' @@ -4840,8 +4763,8 @@ object dmResources: TdmResources ' ' '' - ' esigibilit'#224' iva / riferimen' + - 'ti normativi' + ' esigibilit'#195#160' iva / riferime' + + 'nti normativi' ' %IVA' ' Spese accessorie' #9#9#9#9#9' Arr.' @@ -4874,10 +4797,10 @@ object dmResources: TdmResources ' ' ' ' ' ' - ' (esigibilit'#224' immediata)' + ' (esigibilit'#195#160' immediata)' ' ' ' ' - ' (esigibilit'#224' differita)' + ' (esigibilit'#195#160' differita)' ' ' ' ' ' (scissione dei pagamenti)' @@ -4987,7 +4910,7 @@ object dmResources: TdmResources ' Sconto/Maggiorazione' ' ' '' - '' + ' ' '' #9#9#9#9#9' Arr.' ' ' @@ -4999,7 +4922,7 @@ object dmResources: TdmResources '' ' ' ' ' - '' + #9#9#9#9#9 #9#9#9#9#9' ' @@ -5020,9 +4943,9 @@ object dmResources: TdmResources 'DatiBollo/BolloVirtuale" />' #9#9#9#9#9#9'' #9#9#9#9#9#9'' - #9#9#9#9#9' ' - ' ' - '' + #9#9#9#9#9' '#9#9#9#9#9#9 + ' '#9#9#9#9#9 + ' ' ' ' ' ' @@ -5046,8 +4969,8 @@ object dmResources: TdmResources ' ' '' '' - '' - '' + ' ' + #9#9#9#9#9 #9#9#9#9#9'' '' @@ -5089,7 +5012,7 @@ object dmResources: TdmResources ' ' '
' - '' + #9#9#9#9 #9#9#9#9' ' '' #9#9#9#9#9' ' @@ -5101,15 +5024,15 @@ object dmResources: TdmResources #9#9#9#9#9#9'' #9#9#9#9#9' ' #9#9#9#9#9' ' - '' + #9#9#9#9#9' ' #9#9#9#9#9' ' #9#9#9#9#9#9#9'' #9#9#9#9#9#9'' #9#9#9#9#9' ' - #9#9#9#9#9'
' - '' + #9#9#9#9#9''#9#9#9#9 + ' ' '
' ' ' '' @@ -5123,8 +5046,8 @@ object dmResources: TdmResources ' ' ' ' - ' Modalit'#224' pagamento' + ' Modalit'#195#160' pagamento<' + + '/th>' ' Dettagli' ' Scadenze' ' Importo' @@ -5204,7 +5127,7 @@ object dmResources: TdmResources ' ' ' Giroconto su conti di contabilit' + - #224' speciale' + #195#160' speciale' ' ' ' ' ' Domiciliazione bancaria' @@ -5225,7 +5148,9 @@ object dmResources: TdmResources ' SEPA Direct Debit B2B' ' ' ' ' - ' Trattenuta su somme gi'#224' riscosse' + + ' Trattenuta su somme gi'#195#160' riscoss' + + 'e' ' ' #9#9#9#9#9#9#9' ' #9#9#9#9#9#9#9#9' PagoPA' @@ -5244,7 +5169,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' '' ' ' ' ' @@ -5267,7 +5192,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' ' ' '' @@ -5379,7 +5304,7 @@ object dmResources: TdmResources '' ' ' '' - ' ' + ' ' '' ' ' '
' @@ -5451,7 +5376,7 @@ object dmResources: TdmResources ' .headBorder' ' {' ' ' @@ -5515,7 +5440,7 @@ object dmResources: TdmResources ' border-collapse: collapse;' ' word-wrap:break-word;' ' }' - '' + #9#9' ' ' table.tbFoglio th {' ' padding-left: 5px;' ' padding-right: 5px;' @@ -5648,13 +5573,13 @@ object dmResources: TdmResources '' #9#9' table.tbNoBorder' ' {' - #9#9#9' border-collapse: collapse;' - #9#9#9' margin-bottom: 5px;' + #9#9#9' border-collapse: collapse;'#9#9#9 + #9#9#9' margin-bottom: 5px;'#9#9#9' ' #9#9#9' font-size:small;' #9#9#9' text-align:center;' #9#9#9' width:800px;' ' }' - '' + #9#9' ' ' ' ' ' ' ' @@ -5756,7 +5681,7 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' #9'' ' ' ' ' @@ -5848,44 +5773,51 @@ object dmResources: TdmResources ' ' '' - ' ' + ' ' ' ' + 'CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' + 'YYY CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' + 'CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' + 'YYY CIG:ZZZZZZZ Codice commessa/convenzione:#cod-vvv#-->' ' ' - ' ' - ' ' - ' ' - ' ' - ' ' + ' ' ' ' - ' ' - ' ' - ' ' - ' del ' - ' ' - ' ' - ' ' - ' ' - ' ' - ' CUP: ' - ' ' - ' ' - ' ' - ' CIG: ' - ' ' - ' ' + ' ' + ' ' + ' ' + ' del ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' CUP: ' + ' ' + ' ' + ' ' + ' CIG: ' + ' ' + ' ' + ' ' ' ' + '' + ' ' + ' ' + ' Commessa/convenzione: ' + + ' ' + ' ' + ' ' + '' ' ' ' ' @@ -5893,11 +5825,25 @@ object dmResources: TdmResources 'zione" />' ' ' ' ' + '' + ' ' + ' ' + + ' ' + ' ' + ' ' + '' + '' + ' ' + '' + ' ' + '' ' ' '' - ' ' + ' ' #9' ' - '' + #9#9 #9#9' DDT ' #9#9' ' #9#9' ' @@ -5906,7 +5852,7 @@ object dmResources: TdmResources #9#9#9' ' #9#9#9'' #9#9' ' - '' + #9' ' #9' ' '' #9' ' @@ -5917,7 +5863,7 @@ object dmResources: TdmResources #9#9'' #9' ' ' ' - '' + ' ' ' ' ' ' ' ' @@ -5928,9 +5874,9 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9#9 ' ' '' ' ' @@ -5942,20 +5888,20 @@ object dmResources: TdmResources '/>' ' ' ' ' - '' + ' ' ' ' - #9' ' - '' + #9' '#9' ' + #9' ' #9' ' + ') = $valNumeroLinea] ">'#9#9 #9#9#9#9''#9'' - ' ' - '' - ' ' + ' ' + #9#9 + ' '#9' ' ' ' '' '' @@ -5971,31 +5917,19 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9' ' #9' ' - #9#9#9'' + 'umeroLinea) = $valNumeroLinea] ">'#9#9 + #9#9#9'' ' ' - - ' ' - ' ' - - ' ' - - ' ' + '> ' ' ' - ' ' - '' - '' + ' '#9' ' #9' ' ' ' '' @@ -6011,29 +5945,20 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' #9#9'' - #9' ' + 'inea) = $valNumeroLinea] ">'#9#9 + #9' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' + ' ' ' ' - #9' ' - '' + #9' ' + #9' ' #9' ' ' ' '' @@ -6049,30 +5974,20 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9' ' #9' ' - ' ' + 'roLinea) = $valNumeroLinea] ">'#9#9 + ' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' ' ' ' ' - '' + #9' ' #9' ' ' ' '' @@ -6088,30 +6003,20 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' + ' ' ' ' - '' + #9' ' #9' ' - ' ' + ' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' ' ' ' ' - '' + #9' ' #9' ' ' ' '' @@ -6128,30 +6033,20 @@ object dmResources: TdmResources '/>' ' ' ' ' - ' ' + ' ' ' ' - '' + #9' ' ' ' - ' ' + ' ' ' ' - - ' ' - ' ' - - ' ' - - ' ' + #39'/> ' ' ' ' ' - '' + #9' ' #9' ' ' ' '' @@ -6223,8 +6118,8 @@ object dmResources: TdmResources ' '#39'abcdefghijklmnopqrstuvwxyz' + #39 - ' ) != '#39'aswrelstd'#39 - #9#9#9#9#9#9#9#9#9'and' + ' ) != '#39'aswrelstd'#39' ' + #9#9#9#9#9#9#9#9#9'and '#9#9#9#9#9#9#9#9#9 #9#9#9#9#9#9#9#9#9'translate( TipoDato,' ' '#39'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + @@ -6464,8 +6359,8 @@ object dmResources: TdmResources ' ' '' - '' + ' ' ' ' ' ' '' @@ -6612,7 +6507,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' ' ' '' ' ' @@ -6757,10 +6652,10 @@ object dmResources: TdmResources ' ' '' '
' - '' + #9' ' ' ' ' ' - '' + #9#9#9 #9#9#9' ' @@ -6774,7 +6669,7 @@ object dmResources: TdmResources #9#9#9#9' ' #9#9#9#9' ' ' ' - '' + #9#9 ' ' '' ' ' @@ -7208,7 +7103,9 @@ object dmResources: TdmResources '' ' ' '' - ' ' + + ' ' + + ' ' '
' '' ' Denominazione:' @@ -7430,7 +7327,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' ' ' @@ -7550,14 +7447,14 @@ object dmResources: TdmResources '' '' ' ' - '' - '' + ' ' + ' ' '' ' ' ' ' - '' + ' ' '
' ' ' '' @@ -7575,7 +7472,7 @@ object dmResources: TdmResources '
' ' ' ' ' ' ' '' - '' + ' ' '
' - '' + ' ' '
' '
' '' '' @@ -7987,7 +7884,7 @@ object dmResources: TdmResources '' '' ' ' - '' + ' ' ' ' @@ -7996,7 +7893,7 @@ object dmResources: TdmResources ' ' ' ' - '' + ' ' ' ' @@ -8124,7 +8021,7 @@ object dmResources: TdmResources #9#9#9#9#9#9'' #9#9#9#9#9#9#9'acquisti da San Marino con IVA (fattura cartacea)' #9#9#9#9#9#9'' - '' + #9#9#9#9#9#9 ' ' ' ' ' fattura semplificata' @@ -8324,7 +8221,7 @@ object dmResources: TdmResources '' ' ' ' ' - ' Cod. articolo' + ' Cod. articolo' ' Descrizione' ' Quantit'#224'' ' Prezzo unitario' @@ -8341,7 +8238,7 @@ object dmResources: TdmResources ' ' '' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' ' ' '' @@ -8396,22 +8283,12 @@ object dmResources: TdmResources ' ' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' '' ' ' @@ -8425,22 +8302,13 @@ object dmResources: TdmResources ' ' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' + ' ' ' ' '' ' ' @@ -8453,22 +8321,12 @@ object dmResources: TdmResources ' ' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' '' ' ' @@ -8483,22 +8341,12 @@ object dmResources: TdmResources 'reCollegate[not(./RiferimentoNumeroLinea) or normalize-space(./R' + 'iferimentoNumeroLinea)='#39#39'] " >' '' - ' ' + + ' ' ' ' - - ' ' - - ' ' - - ' ' - - ' ' ' ' '' ' ' @@ -8961,7 +8809,7 @@ object dmResources: TdmResources ' Sconto/Maggiorazione' ' ' '' - '' + ' ' '' #9#9#9#9#9' Arr.' ' ' @@ -8973,7 +8821,7 @@ object dmResources: TdmResources '' ' ' ' ' - '' + #9#9#9#9#9 #9#9#9#9#9' ' @@ -8994,9 +8842,9 @@ object dmResources: TdmResources 'DatiBollo/BolloVirtuale" />' #9#9#9#9#9#9'' #9#9#9#9#9#9'' - #9#9#9#9#9' ' - ' ' - '' + #9#9#9#9#9' '#9#9#9#9#9#9 + '
'#9#9#9#9#9 + ' ' ' ' ' ' @@ -9020,8 +8868,8 @@ object dmResources: TdmResources ' ' '' '' - '' - '' + ' ' + #9#9#9#9#9 #9#9#9#9#9'' '' @@ -9063,7 +8911,7 @@ object dmResources: TdmResources ' ' '
' - '' + #9#9#9#9 #9#9#9#9' ' '' #9#9#9#9#9' ' @@ -9075,15 +8923,15 @@ object dmResources: TdmResources #9#9#9#9#9#9'' #9#9#9#9#9' ' #9#9#9#9#9' ' - '' + #9#9#9#9#9' ' #9#9#9#9#9' ' #9#9#9#9#9#9#9'' #9#9#9#9#9#9'' #9#9#9#9#9' ' - #9#9#9#9#9'
' - '' + #9#9#9#9#9''#9#9#9#9 + ' ' '
' ' ' '' @@ -9218,7 +9066,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' '' ' ' ' ' @@ -9241,7 +9089,7 @@ object dmResources: TdmResources ' ' '' ' ' - '' + ' ' ' ' '' @@ -9425,7 +9273,7 @@ object dmResources: TdmResources ' .headBorder' ' {' ' ' @@ -9488,7 +9336,7 @@ object dmResources: TdmResources ' border-collapse: collapse;' ' word-wrap:break-word;' ' }' - '' + #9#9' ' ' table.tbFoglio th {' ' padding-left: 5px;' ' padding-right: 5px;' @@ -9549,10 +9397,6 @@ object dmResources: TdmResources ' width:48%' ' }' '' - ' th.cod-articolo {' - ' min-width: 80px;' - ' }' - '' ' th.perc {' ' width:50px;' ' }' @@ -9577,7 +9421,7 @@ object dmResources: TdmResources '' ' th.import2' ' {' - ' width:40px;' + ' width:42px;' ' }' '' ' td.import2' @@ -9623,7 +9467,15 @@ object dmResources: TdmResources ' text-align:right;' ' }' '' - '' + #9#9' table.tbNoBorder' + ' {' + #9#9#9' border-collapse: collapse;'#9#9#9 + #9#9#9' margin-bottom: 5px;'#9#9#9' ' + #9#9#9' font-size:small;' + #9#9#9' text-align:center;' + #9#9#9' width:100%;' + ' }' + #9#9' ' ' ' ' ' ' ' @@ -9674,8 +9526,7 @@ object dmResources: TdmResources ' ' ' ' ' ' - '' - '') + '') Left = 62 Top = 131 DOMVendorDesc = 'MSXML' @@ -9712,9 +9563,9 @@ object dmResources: TdmResources Options = [doNodeAutoIndent] XML.Strings = ( '' - '' @@ -9914,7 +9765,7 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9'
  • ' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'Codice Amministrazione destinataria:' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'Codice identificativo destinatario:' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -10086,7 +9937,8 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(nuove iniziative produttive) - Non pi'#249' valido' + - ' in quanto abrogato dalla legge di stabilit'#224' 2015' + ' in quanto abrogato dalla legge di stabilit'#224' 2015'#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9 + + #9#9 #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(agricoltura e attivit'#224' connesse e pesca)' @@ -10708,7 +10560,7 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9'' - '' + #9#9#9#9#9#9#9#9#9#9#9 #9#9#9#9#9#9#9#9#9#9#9'' @@ -10716,7 +10568,7 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9'

    Dati del rappresentante fiscale del cessionario' + ' / committente

    ' - '' + #9#9 #9#9#9#9#9#9#9#9#9#9#9#9#9'
      ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione fattura' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione fattura ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'reverse charge interno)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione/autofattura per' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione/autofattura per ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'acquisto servizi da estero)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione per acquisto' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione per acquisto ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'beni intracomunitari)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione/autofattura per' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(integrazione/autofattura per ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'acquisto beni ex art.17 c.2 DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(autofattura per regolarizzazione e' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'integrazione delle fatture -' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'art.6 c.8 d.lgs.471/97 o art.46 c.5 D.L.331/93' + - ')' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(autofattura per regolarizzazione e integrazio' + + 'ne delle fatture ' + + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'- ex art.6 c.8 e 9-bis d.lgs. 471/97 o art.46 ' + + 'c.5 D.L. 331/93)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(autofattura per splafonamento)' @@ -11017,13 +10870,13 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(estrazione beni da Deposito IVA)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(estrazione beni da Deposito IVA' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(estrazione beni da Deposito IVA ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'con versamento IVA)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(fattura differita - art.21 c.4 terzo periodo ' + - 'lett. a - DPR 633/72)' + 'lett. a - DPR 633/72) ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -11031,11 +10884,11 @@ object dmResources: TdmResources 'lett. b - DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(cessione di beni ammortizzabili e per' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(cessione di beni ammortizzabili e per ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'passaggi interni - art.36 DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(fattura per autoconsumo o per cessioni' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(fattura per autoconsumo o per cessioni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'gratuite senza rivalsa)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -11119,14 +10972,14 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - '' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9 #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
    • ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'Causale:' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
    • ' - '' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9 #9#9#9#9#9#9#9#9#9#9#9#9#9#9'
      ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggette ad IVA - artt. da 7 a 7-septi' + - 'es' + 'es ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'del DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
      ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -11464,17 +11317,17 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - operazioni assimilate all' + - 'e' + 'e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'cessioni all'#39'esportazione)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - a seguito di dichiarazion' + - 'i' + 'i ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'd'#39'intento)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - altre operazioni che non' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - altre operazioni che non ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'concorrono alla formazione del plafond)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -11488,23 +11341,23 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile per le operazioni in ' + - 'reverse' + 'reverse ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'charge ovvero nei casi di autofatturazione ' + - 'per' + 'per ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'acquisti extra UE di servizi ovvero per imp' + - 'ortazioni' + 'ortazioni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'di beni nei soli casi previsti)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di rottami' + - ' e' + ' e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'altri materiali di recupero)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di oro e' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di oro e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'argento ai sensi della legge 7/2000 nonch'#233' ' + 'di oreficeria' @@ -11516,7 +11369,7 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - subappalto nel sett' + - 'ore' + 'ore ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'edile)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -11527,23 +11380,23 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di telefon' + - 'i' + 'i ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'cellulari)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di prodott' + - 'i' + 'i ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'elettronici)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - prestazioni compart' + - 'o' + 'o ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'edile e settori connessi)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - operazioni settore' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - operazioni settore ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'energetico)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -11552,10 +11405,10 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(IVA assolta in altro stato UE - prestazion' + - 'e di servizi di' + 'e di servizi di ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'telecomunicazioni, tele-radiodiffusione ed ' + - 'elettronici ex' + 'elettronici ex ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'art. 7-octies, comma 1 lett. a, b, art. 74-' + 'sexies DPR 633/72)' @@ -12226,7 +12079,8 @@ object dmResources: TdmResources 'atiTrasporto/PesoLordo or DatiGenerali/DatiTrasporto/PesoNetto o' + 'r DatiGenerali/DatiTrasporto/DataOraRitiro or DatiGenerali/DatiT' + 'rasporto/DataInizioTrasporto or DatiGenerali/DatiTrasporto/TipoR' + - 'esa or DatiGenerali/DatiTrasporto/IndirizzoResa">' + 'esa or DatiGenerali/DatiTrasporto/IndirizzoResa or DatiGenerali/' + + 'DatiTrasporto/DataOraConsegna">' #9#9#9#9#9#9#9#9#9#9#9#9#9#9'

      Altri dati

      ' '' #9#9#9#9#9#9#9#9#9#9#9#9#9#9'
        ' @@ -12383,6 +12237,19 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
      • ' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'Data e ora di consegna:' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
      • ' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
        ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9'
      ' #9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12665,7 +12532,9 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggetta)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'
      ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggette ad IVA - artt. da 7 a 7-septies' + + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggette ad IVA - artt. da 7 a 7-septies' + + ' ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'del DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12684,15 +12553,15 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - cessioni verso S.Marino)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - operazioni assimilate alle' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - operazioni assimilate alle ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'cessioni all'#39'esportazione)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - a seguito di dichiarazioni' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - a seguito di dichiarazioni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'd'#39'intento)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - altre operazioni che non' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - altre operazioni che non ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'concorrono alla formazione del plafond)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12706,21 +12575,23 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile per le operazioni in re' + - 'verse' + 'verse ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'charge ovvero nei casi di autofatturazione pe' + - 'r' + 'r ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'acquisti extra UE di servizi ovvero per impor' + - 'tazioni' + 'tazioni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'di beni nei soli casi previsti)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di rottami e' + + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di rottami e' + + ' ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'altri materiali di recupero)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di oro e' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di oro e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'argento ai sensi della legge 7/2000 nonch'#233' di' + ' oreficeria' @@ -12732,7 +12603,7 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - subappalto nel settor' + - 'e' + 'e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'edile)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12741,19 +12612,19 @@ object dmResources: TdmResources 'i)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di telefoni' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di telefoni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'cellulari)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di prodotti' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di prodotti ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'elettronici)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - prestazioni comparto' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - prestazioni comparto ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'edile e settori connessi)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - operazioni settore' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - operazioni settore ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'energetico)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12761,16 +12632,14 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(IVA assolta in altro stato UE - vendite a di' + - 'stanza' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(IVA assolta in altro stato UE - prestazione ' + + 'di servizi di ' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'ex art.40 c.3 e 4 e art.41 c.1 lett. b DL 331' + - '/93;' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'prestazione di servizi di telecomunicazioni,' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9' telecomunicazioni, tele-radiodiffusione ed e' + + 'lettronici ex ' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'tele-radiodiffusione ed elettronici ex art.7-' + - 'sexies' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'lett. f, g, e art.74-sexies DPR 633/72)' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9' art. 7-octies, comma 1 lett. a, b, art. 74-s' + + 'exies DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(!!! codice non previsto !!!)' @@ -12877,7 +12746,9 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggette)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggette ad IVA - artt. da 7 a 7-septies' + + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non soggette ad IVA - artt. da 7 a 7-septies' + + ' ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'del DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12896,15 +12767,15 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - cessioni verso S.Marino)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - operazioni assimilate alle' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - operazioni assimilate alle ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'cessioni all'#39'esportazione)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - a seguito di dichiarazioni' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - a seguito di dichiarazioni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'd'#39'intento)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - altre operazioni che non' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(non imponibili - altre operazioni che non ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'concorrono alla formazione del plafond)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12918,21 +12789,23 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile per le operazioni in re' + - 'verse' + 'verse ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'charge ovvero nei casi di autofatturazione pe' + - 'r' + 'r ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'acquisti extra UE di servizi ovvero per impor' + - 'tazioni' + 'tazioni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'di beni nei soli casi previsti)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di rottami e' + + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di rottami e' + + ' ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'altri materiali di recupero)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di oro e' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di oro e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'argento ai sensi della legge 7/2000 nonch'#233' di' + ' oreficeria' @@ -12944,7 +12817,7 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - subappalto nel settor' + - 'e' + 'e ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'edile)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12953,19 +12826,19 @@ object dmResources: TdmResources 'i)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di telefoni' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di telefoni ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'cellulari)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di prodotti' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - cessione di prodotti ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'elettronici)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - prestazioni comparto' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - prestazioni comparto ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'edile e settori connessi)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - operazioni settore' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(inversione contabile - operazioni settore ' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'energetico)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' @@ -12973,16 +12846,14 @@ object dmResources: TdmResources #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(IVA assolta in altro stato UE - vendite a di' + - 'stanza' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(IVA assolta in altro stato UE - prestazione ' + + 'di servizi di ' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'ex art.40 c.3 e 4 e art.41 c.1 lett. b DL 331' + - '/93;' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'prestazione di servizi di telecomunicazioni,' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9' telecomunicazioni, tele-radiodiffusione ed e' + + 'lettronici ex ' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'tele-radiodiffusione ed elettronici ex art.7-' + - 'sexies' - #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'lett. f, g, e art.74-sexies DPR 633/72)' + #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9' art. 7-octies, comma 1 lett. a, b, art. 74-s' + + 'exies DPR 633/72)' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'' #9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9'(!!! codice non previsto !!!)' @@ -13562,9 +13433,9 @@ object dmResources: TdmResources 'http://www.gnu.org/licenses/.' '' '-->' - '' @@ -13572,7 +13443,7 @@ object dmResources: TdmResources '' ' ' - '

      Stylesheet fatturapa_v1.2.1_de-it.xsl v20201125 ft -' + + '

      Stylesheet fatturapa_v1.2.1_de-it.xsl v20230608 ft -' + ' http://ti' + 'nyurl.com/fatturapa-xsl-southtyrol

      ' '
      ' @@ -13658,7 +13529,7 @@ object dmResources: TdmResources '
      Ausl'#228'ndischer Rechnungsempf'#228'ng' + 'er
      Destinatario non residenti
      ' - '' + ' ' ' ' @@ -13788,7 +13659,7 @@ object dmResources: TdmResources 'n:blink; }' #9#9#9#9'#fattura-elettronica div { padding: 0; margin: 0; }' #9#9#9#9'#fattura-elettronica' - '' + #9#9#9#9 #9#9#9#9'div.page {' #9#9#9#9'background-color: #fff !important;' #9#9#9#9'position: relative;' @@ -14541,7 +14412,7 @@ object dmResources: TdmResources ' ' + ' 1.2.6Referenz' + - '
      Riferimento' + '
      Riferimento ' ' ' + ' ' ' ' + - '1.6Austeller
      Sog' + - 'getto emittente' + '1.6Aussteller
      So' + + 'ggetto emittente' ' (Aufgeschobene Re' + 'chnung gem'#228#223' Artikel 21, Absatz 4, Dritter Satz Buchstabe b))(Fattura differita di cui all'#39'art. 21, comma 4, terzo perio' + - 'do lett. b))
      ' + 'do lett. b))
      ' #9#9#9#9#9#9#9#9#9#9#9' ('#220'bertragung von ' + 'abschreibungsf'#228'higen G'#252'tern und f'#252'r interner Transaktionen (Art.' + @@ -19161,7 +19032,7 @@ object dmResources: TdmResources ' ' '') Left = 63 - Top = 288 + Top = 292 DOMVendorDesc = 'MSXML' end end diff --git a/Source/FExplorer.Resources.pas b/Source/FExplorer.Resources.pas index 30c840a..689cd2c 100644 --- a/Source/FExplorer.Resources.pas +++ b/Source/FExplorer.Resources.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -451,6 +451,7 @@ class procedure TLegalInvoiceLoader.LoadFromFile( LOutStream.Free; LFileStream.Free; end; + ASynEditor.Modified := False; end; initialization diff --git a/Source/FExplorer.Settings.pas b/Source/FExplorer.Settings.pas index b1db6f9..4aceb1d 100644 --- a/Source/FExplorer.Settings.pas +++ b/Source/FExplorer.Settings.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -89,12 +89,18 @@ TSettings = class FHTMLFontSize: Integer; FHTMLFontName: string; FIconStylesheetName: string; + FButtonDrawRounded: Boolean; + FToolbarDrawRounded: Boolean; + FMenuDrawRounded: Boolean; function GetUseDarkStyle: Boolean; procedure SetSVGEngine(const Value: TSVGEngine); function GetThemeSectionName: string; function GetButtonTextColor: TColor; class function GetSettingsFileName: string; static; procedure UpdateEngine; + procedure SetButtonDrawRounded(const Value: Boolean); + procedure SetToolbarDrawRounded(const Value: Boolean); + procedure SetMenuDrawRounded(const Value: Boolean); protected FIniFile: TIniFile; public @@ -132,6 +138,9 @@ TSettings = class property ThemeSelection: TThemeSelection read FThemeSelection write FThemeSelection; property StylesheetName: string read FStylesheetName write FStylesheetName; property IconStylesheetName: string read FIconStylesheetName write FIconStylesheetName; + property ButtonDrawRounded: Boolean read FButtonDrawRounded write SetButtonDrawRounded; + property ToolbarDrawRounded: Boolean read FToolbarDrawRounded write SetToolbarDrawRounded; + property MenuDrawRounded: Boolean read FMenuDrawRounded write SetMenuDrawRounded; end; TPreviewSettings = class(TSettings) @@ -356,6 +365,9 @@ procedure TSettings.ReadSettings(const ASynEditHighilighter: TSynCustomHighlight FStylesheetName := FIniFile.ReadString('Global', 'StylesheetName', 'Custom'); FIconStylesheetName := FIniFile.ReadString('Global', 'IconStylesheetName', 'Default'); FThemeSelection := TThemeSelection(FIniFile.ReadInteger('Global', 'ThemeSelection', 0)); + FToolbarDrawRounded := FIniFile.ReadBool('Global', 'ToolbarDrawRounded', false); + FButtonDrawRounded := FIniFile.ReadBool('Global', 'ButtonDrawRounded', false); + FMenuDrawRounded := FIniFile.ReadBool('Global', 'MenuDrawRounded', false); //Select Style by default on Actual Windows Theme if FThemeSelection = tsAsWindows then begin @@ -443,6 +455,10 @@ procedure TSettings.WriteSettings(const ASynEditHighilighter: TSynCustomHighligh FIniFile.WriteString('Global', 'IconStylesheetName', FIconStylesheetName); FIniFile.WriteInteger('Global', 'ThemeSelection', Ord(FThemeSelection)); + FIniFile.WriteBool('Global', 'ToolbarDrawRounded', ToolbarDrawRounded); + FIniFile.WriteBool('Global', 'ButtonDrawRounded', ButtonDrawRounded); + FIniFile.WriteBool('Global', 'MenuDrawRounded', MenuDrawRounded); + if (FUseDarkStyle and (LightBackground <> default_darkbackground)) or (not FUseDarkStyle and (LightBackground <> default_lightbackground)) then FIniFile.WriteInteger('Global', 'LightBackground', LightBackground); @@ -468,6 +484,22 @@ procedure TSettings.WriteSettings(const ASynEditHighilighter: TSynCustomHighligh FIniFile.WriteFloat('PDFPageSettins', 'MarginRight', PDFPageSettings.MarginRight); end; +procedure TSettings.SetToolbarDrawRounded( + const Value: Boolean); +begin + FToolbarDrawRounded := Value; +end; + +procedure TSettings.SetMenuDrawRounded(const Value: Boolean); +begin + FMenuDrawRounded := Value; +end; + +procedure TSettings.SetButtonDrawRounded(const Value: Boolean); +begin + FButtonDrawRounded := Value; +end; + { TPreviewSettings } constructor TPreviewSettings.CreateSettings( diff --git a/Source/FExplorer.SettingsForm.dfm b/Source/FExplorer.SettingsForm.dfm index e6d22fd..ad3502e 100644 --- a/Source/FExplorer.SettingsForm.dfm +++ b/Source/FExplorer.SettingsForm.dfm @@ -34,15 +34,13 @@ object SVGSettingsForm: TSVGSettingsForm Align = alClient Images = SettingsImageList TabOrder = 0 - ExplicitWidth = 658 - ExplicitHeight = 450 object stGeneral: TTabSheet Caption = 'Anteprima' ImageIndex = 4 ImageName = 'eye-settings' object PreviewStyleGroupBox: TGroupBox Left = 3 - Top = 168 + Top = 98 Width = 310 Height = 62 Caption = 'Stile anteprima fattura' @@ -66,25 +64,25 @@ object SVGSettingsForm: TSVGSettingsForm end end object GUIElementsGroupBox: TGroupBox - Left = 2 - Top = 236 + Left = 3 + Top = 166 Width = 310 - Height = 147 + Height = 125 Caption = 'Visualizzazione elementi interfaccia utente' TabOrder = 2 DesignSize = ( 310 - 147) + 125) object IconStyleLabel: TLabel Left = 14 - Top = 74 + Top = 71 Width = 111 Height = 15 Caption = 'Stile anteprima Icona' end object ShowIconCheckBox: TCheckBox Left = 14 - Top = 52 + Top = 49 Width = 280 Height = 18 Caption = 'Mostra anteprima icona' @@ -92,7 +90,7 @@ object SVGSettingsForm: TSVGSettingsForm end object IconStyleSheetComboBox: TComboBox Left = 14 - Top = 95 + Top = 92 Width = 280 Height = 23 Anchors = [akLeft, akTop, akRight] @@ -103,7 +101,7 @@ object SVGSettingsForm: TSVGSettingsForm end object ShowXMLCheckBox: TCheckBox Left = 14 - Top = 25 + Top = 22 Width = 280 Height = 17 Caption = 'Mostra testo originale (XML)' @@ -112,9 +110,9 @@ object SVGSettingsForm: TSVGSettingsForm end object EngineRadioGroup: TRadioGroup Left = 3 - Top = 16 + Top = 3 Width = 310 - Height = 129 + Height = 89 Caption = 'Opzioni di rendering SVG' ItemIndex = 0 Items.Strings = ( @@ -122,6 +120,39 @@ object SVGSettingsForm: TSVGSettingsForm 'Windows Direct 2D') TabOrder = 0 end + object RoundedButtonsGroupBox: TGroupBox + AlignWithMargins = True + Left = 3 + Top = 297 + Width = 310 + Height = 97 + Caption = 'Pulsanti arrotondati' + TabOrder = 3 + object ToolbarRoundedCheckBox: TCheckBox + Left = 14 + Top = 24 + Width = 240 + Height = 17 + Caption = 'Applica alle Toolbar' + TabOrder = 0 + end + object ButtonsRoundedCheckBox: TCheckBox + Left = 14 + Top = 47 + Width = 240 + Height = 17 + Caption = 'Applica ai pulsanti' + TabOrder = 1 + end + object MenuRoundedCheckBox: TCheckBox + Left = 14 + Top = 70 + Width = 240 + Height = 17 + Caption = 'Applica ai pulsanti del menu' + TabOrder = 2 + end + end end object stTheme: TTabSheet Caption = 'Tema' @@ -292,8 +323,6 @@ object SVGSettingsForm: TSVGSettingsForm Width = 4 Height = 402 MinSize = 100 - ExplicitLeft = 143 - ExplicitHeight = 366 end object paLeft: TPanel Left = 0 @@ -393,7 +422,7 @@ object SVGSettingsForm: TSVGSettingsForm DesignSize = ( 193 42) - object ResetButton: TButton + object ResetButton: TStyledButton Left = 9 Top = 6 Width = 174 @@ -704,10 +733,8 @@ object SVGSettingsForm: TSVGSettingsForm ParentFont = True SimplePanel = True UseSystemFont = False - ExplicitTop = 491 - ExplicitWidth = 811 end - object MenuButtonGroup: TButtonGroup + object MenuButtonGroup: TStyledButtonGroup Left = 0 Top = 41 Width = 153 @@ -756,7 +783,6 @@ object SVGSettingsForm: TSVGSettingsForm end> TabOrder = 2 OnButtonClicked = MenuButtonGroupButtonClicked - ExplicitHeight = 450 end object TitlePanel: TPanel Left = 0 @@ -768,7 +794,6 @@ object SVGSettingsForm: TSVGSettingsForm BevelOuter = bvNone Caption = 'Impostazioni' TabOrder = 3 - ExplicitWidth = 811 end object OpenDialog: TOpenDialog Left = 634 diff --git a/Source/FExplorer.SettingsForm.pas b/Source/FExplorer.SettingsForm.pas index 135ae3e..cd90217 100644 --- a/Source/FExplorer.SettingsForm.pas +++ b/Source/FExplorer.SettingsForm.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -37,7 +37,8 @@ interface ActnList, SynEditHighlighter, SynUnicode, System.ImageList, Vcl.ImgList, SVGIconImageListBase, SVGIconImageList, FExplorer.Settings, Vcl.ButtonGroup, Vcl.ToolWin, FExplorer.Resources, Vcl.VirtualImageList, FExplorer.About, Vcl.WinXCtrls, - SVGIconImage, Vcl.NumberBox; + SVGIconImage, Vcl.NumberBox, Vcl.ButtonStylesAttributes, + Vcl.StyledButtonGroup, Vcl.StyledButton; type TSVGSettingsForm = class(TForm) @@ -70,14 +71,14 @@ TSVGSettingsForm = class(TForm) ForegroundColorLabel: TLabel; BackgroundColorLabel: TLabel; BackgroundColorBox: TColorBox; - MenuButtonGroup: TButtonGroup; + MenuButtonGroup: TStyledButtonGroup; TitlePanel: TPanel; ThemeLeftPanel: TPanel; ThemesRadioGroup: TRadioGroup; SelectThemeRadioGroup: TRadioGroup; ThemeClientPanel: TPanel; ResetPanel: TPanel; - ResetButton: TButton; + ResetButton: TStyledButton; PreviewStyleGroupBox: TGroupBox; StylesheetComboBox: TComboBox; XMLGroupBox: TGroupBox; @@ -117,6 +118,10 @@ TSVGSettingsForm = class(TForm) IconStyleLabel: TLabel; ShowXMLCheckBox: TCheckBox; EngineRadioGroup: TRadioGroup; + RoundedButtonsGroupBox: TGroupBox; + ToolbarRoundedCheckBox: TCheckBox; + ButtonsRoundedCheckBox: TCheckBox; + MenuRoundedCheckBox: TCheckBox; procedure BoxElementsClick(Sender: TObject); procedure cbForegroundClick(Sender: TObject); procedure cbBackgroundClick(Sender: TObject); @@ -575,6 +580,10 @@ procedure TSVGSettingsForm.AssignSettings(ASettings: TSettings); HTMLFontComboBox.ItemIndex := HTMLFontComboBox.Items.IndexOf(ASettings.HTMLFontName); HTMLUpDown.Position := ASettings.HTMLFontSize; + ToolbarRoundedCheckBox.Checked := ASettings.ToolbarDrawRounded; + ButtonsRoundedCheckBox.Checked := ASettings.ButtonDrawRounded; + MenuRoundedCheckBox.Checked := ASettings.MenuDrawRounded; + EngineRadioGroup.Enabled := WinSvgSupported; EngineRadioGroup.ItemIndex := Ord(ASettings.SVGEngine); StylesheetComboBox.ItemIndex := StylesheetComboBox.Items.IndexOf(ASettings.StylesheetName); @@ -644,6 +653,10 @@ procedure TSVGSettingsForm.UpdateSettings(ASettings: TSettings); ASettings.StylesheetName := StylesheetComboBox.Text; ASettings.IconStylesheetName := IconStyleSheetComboBox.Text; + ASettings.ToolbarDrawRounded := ToolbarRoundedCheckBox.Checked; + ASettings.ButtonDrawRounded := ButtonsRoundedCheckBox.Checked; + ASettings.MenuDrawRounded := MenuRoundedCheckBox.Checked; + ASettings.PDFPageSettings.PrintOrientation := TPrinterOrientation(OrientationRadioGroup.ItemIndex); ASettings.PDFPageSettings.PaperSize := PaperSizeRadioGroup.ItemIndex; ASettings.PDFPageSettings.MarginLeft := MarginLeftEdit.ValueFloat; diff --git a/Source/FExplorer.Splash.pas b/Source/FExplorer.Splash.pas index 3ed4dcf..a8e0775 100644 --- a/Source/FExplorer.Splash.pas +++ b/Source/FExplorer.Splash.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.ThumbnailHandler.pas b/Source/FExplorer.ThumbnailHandler.pas index 8597de5..0c3fd43 100644 --- a/Source/FExplorer.ThumbnailHandler.pas +++ b/Source/FExplorer.ThumbnailHandler.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.ThumbnailHandlerRegister.pas b/Source/FExplorer.ThumbnailHandlerRegister.pas index 1a2ea80..4b0ab1d 100644 --- a/Source/FExplorer.ThumbnailHandlerRegister.pas +++ b/Source/FExplorer.ThumbnailHandlerRegister.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.ThumbnailResources.pas b/Source/FExplorer.ThumbnailResources.pas index ffa048e..a535229 100644 --- a/Source/FExplorer.ThumbnailResources.pas +++ b/Source/FExplorer.ThumbnailResources.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer.ViewerMainForm.dfm b/Source/FExplorer.ViewerMainForm.dfm index 5b3cb13..31e7c6f 100644 --- a/Source/FExplorer.ViewerMainForm.dfm +++ b/Source/FExplorer.ViewerMainForm.dfm @@ -5,12 +5,15 @@ object frmMain: TfrmMain ClientHeight = 590 ClientWidth = 944 Color = clWindow + Constraints.MinHeight = 600 + Constraints.MinWidth = 800 Ctl3D = False Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -12 Font.Name = 'Segoe UI' Font.Style = [] + KeyPreview = True Position = poScreenCenter ShowHint = True OnAfterMonitorDpiChanged = FormAfterMonitorDpiChanged @@ -56,15 +59,16 @@ object frmMain: TfrmMain OnMouseMove = PageControlMouseMove end object PanelCloseButton: TPanel - Left = 122 - Top = 16 + Left = 20 + Top = 32 Width = 22 Height = 22 Cursor = crHandPoint BevelOuter = bvNone - ParentBackground = False + ParentColor = True TabOrder = 1 Visible = False + StyleElements = [seFont, seBorder] object SVGIconImageCloseButton: TSVGIconImage Left = 0 Top = 0 @@ -253,8 +257,8 @@ object frmMain: TfrmMain AlignWithMargins = True Left = 36 Top = 4 - Width = 4 - Height = 4 + Width = 210 + Height = 34 Align = alClient Alignment = taCenter TabOrder = 0 @@ -264,12 +268,13 @@ object frmMain: TfrmMain object SV: TSplitView Left = 0 Top = 36 - Width = 160 + Width = 44 Height = 535 CloseStyle = svcCompact Color = clHighlight CompactWidth = 44 DisplayMode = svmOverlay + Opened = False OpenedWidth = 160 ParentDoubleBuffered = True Placement = svpLeft @@ -278,10 +283,10 @@ object frmMain: TfrmMain OnClosing = SVClosing OnOpened = SVOpened OnOpening = SVOpening - object catMenuItems: TCategoryButtons + object catMenuItems: TStyledCategoryButtons Left = 0 Top = 0 - Width = 160 + Width = 44 Height = 535 Align = alClient BackgroundGradientDirection = gdVertical @@ -398,95 +403,80 @@ object frmMain: TfrmMain TabOrder = 2 object lblTitle: TLabel AlignWithMargins = True - Left = 41 + Left = 40 Top = 3 Width = 170 Height = 30 Align = alLeft Caption = 'Visualizzatore Fattura Elettronica' Layout = tlCenter + ExplicitHeight = 15 end - object SettingsToolBar: TToolBar + object SettingsToolBar: TStyledToolbar AlignWithMargins = True Left = 741 Top = 3 Width = 200 Height = 30 Align = alRight - AutoSize = True ButtonHeight = 32 ButtonWidth = 32 - Color = clYellow - DrawingStyle = dsGradient - GradientEndColor = clBtnFace - GradientStartColor = clBtnFace Images = VirtualImageList - ParentColor = False + Indent = 3 TabOrder = 0 - Transparent = True - object ColorSettingsToolButton: TToolButton + object ColorSettingsToolButton: TStyledToolButton Left = 0 Top = 0 Action = actnColorSettings end - object EditOptionsToolButton: TToolButton + object EditOptionsToolButton: TStyledToolButton Left = 32 Top = 0 Action = actnEditOptions end - object PageSetupToolButton: TToolButton + object PageSetupToolButton: TStyledToolButton Left = 64 Top = 0 Action = actnPageSetup end - object PrinterSetupToolButton: TToolButton + object PrinterSetupToolButton: TStyledToolButton Left = 96 Top = 0 Action = actnPrinterSetup end - object SepToolButton: TToolButton + object SepToolButton: TStyledToolButton Left = 128 Top = 0 - Width = 8 - ImageName = 'Informazioni' Style = tbsSeparator end - object AboutToolButton: TToolButton - Left = 136 + object AboutToolButton: TStyledToolButton + Left = 134 Top = 0 Action = acAbout end - object QuitToolButton: TToolButton - Left = 168 + object QuitToolButton: TStyledToolButton + Left = 166 Top = 0 Action = acQuit ImageName = 'Exit' end end - object MenuButtonToolbar: TToolBar + object MenuButtonToolbar: TStyledToolbar AlignWithMargins = True Left = 3 Top = 3 - Width = 32 + Width = 31 Height = 30 Align = alLeft - AutoSize = True ButtonHeight = 32 ButtonWidth = 32 - Color = clYellow - DrawingStyle = dsGradient - GradientEndColor = clBtnFace - GradientStartColor = clBtnFace Images = VirtualImageList - ParentColor = False + Indent = 3 TabOrder = 1 - Transparent = True - object MenuToolButton: TToolButton - AlignWithMargins = True + object MenuToolButton: TStyledToolButton Left = 0 Top = 0 Action = actMenu - AutoSize = True end end end @@ -766,6 +756,7 @@ object frmMain: TfrmMain ImageIndex = 26 ImageName = 'plus' OnExecute = acZoomExecute + OnUpdate = acHTMLViewerUpdate end object acZoomOut: TAction Category = 'HTMLViewer' @@ -773,6 +764,7 @@ object frmMain: TfrmMain ImageIndex = 25 ImageName = 'Minus' OnExecute = acZoomExecute + OnUpdate = acHTMLViewerUpdate end object acSaveHTMLFile: TAction Category = 'HTMLViewer' @@ -781,6 +773,7 @@ object frmMain: TfrmMain ImageIndex = 51 ImageName = 'save_html' OnExecute = acSaveHTMLFileExecute + OnUpdate = acHTMLViewerUpdate end object acSavePDFFile: TAction Category = 'HTMLViewer' @@ -789,6 +782,7 @@ object frmMain: TfrmMain ImageIndex = 52 ImageName = 'save_pdf' OnExecute = acSavePDFFileExecute + OnUpdate = acHTMLViewerUpdate end end object SaveDialog: TSaveDialog @@ -1214,4 +1208,16 @@ object frmMain: TfrmMain Left = 448 Top = 368 end + object LoadTimer: TTimer + Enabled = False + OnTimer = LoadTimerTimer + Left = 272 + Top = 352 + end + object CheckFileChangedTimer: TTimer + Interval = 3000 + OnTimer = CheckFileChangedTimerTimer + Left = 144 + Top = 352 + end end diff --git a/Source/FExplorer.ViewerMainForm.pas b/Source/FExplorer.ViewerMainForm.pas index 32df3cd..eb6aa94 100644 --- a/Source/FExplorer.ViewerMainForm.pas +++ b/Source/FExplorer.ViewerMainForm.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } @@ -40,6 +40,7 @@ interface , System.Generics.Collections , FExplorer.ThumbnailResources , Vcl.PlatformVclStylesActnCtrls + {$IFNDEF NO_VCL_STYLES} , Vcl.Styles.Fixes , Vcl.Styles.FormStyleHooks , Vcl.Styles.NC @@ -54,9 +55,16 @@ interface , Vcl.Styles.Utils.ComCtrls , Vcl.Styles.Utils.StdCtrls , Vcl.Styles.Ext + {$ENDIF} , HTMLUn2 + , HtmlGlobals , HtmlView , uDragDropUtils + , Vcl.StyledButton + , Vcl.StyledToolbar + , Vcl.ButtonStylesAttributes + , Vcl.StyledButtonGroup + , Vcl.StyledCategoryButtons ; const @@ -74,7 +82,10 @@ interface STATE_INSERT = 'Inserimento'; STATE_OVERWRITE = 'Sovrascrittura'; CLOSING_PROBLEMS = 'Problemi in chiusura!'; + STR_ERROR = 'ERRORE!'; + STR_UNEXPECTED_ERROR = 'ERRORE NON PREVISTO!'; CONFIRM_CHANGES = 'ATTENZIONE: il contenuto del file "%s" � cambiato: vuoi salvare il file?'; + FILE_CHANGED_RELOAD = 'La Data/Ora del File "%s" � cambiata! Vuoi ricaricarlo?'; FILE_SAVED = 'File "%s" salvato correttamente: vuoi aprirlo subito?'; SVG_PARSING_OK = 'Il parsing SVG � corretto.'; @@ -83,16 +94,18 @@ TEditingFile = class private FIcon : TIcon; FFileName : string; + FFileAge: TDateTime; FName : string; FExtension: string; FInvoice: TLegalInvoice; - FAllegatiButtons: TObjectList; + FAllegatiButtons: TObjectList; FFileContentType: TFileContentType; procedure ReadFromFile; procedure SaveToFile; function GetFileName: string; function GetName: string; procedure SetFileName(const Value: string); + procedure LoadFromFile(const AFileName: string); procedure RenderAllegati; procedure AllegatoButtonClick(Sender: TObject); procedure UpdateContentType; @@ -101,7 +114,7 @@ TEditingFile = class EditFileType: TEditFileType; SynEditor: TSynEdit; HTMLViewer: THTMLViewer; - ToolbarAllegati: TToolBar; + ToolbarAllegati: TStyledToolBar; TabSheet: TTabSheet; Splitter: TSplitter; Constructor Create(const EditFileName : string); @@ -163,21 +176,21 @@ TfrmMain = class(TForm, IDragDrop) RightSplitter: TSplitter; panelPreview: TPanel; SV: TSplitView; - catMenuItems: TCategoryButtons; + catMenuItems: TStyledCategoryButtons; panlTop: TPanel; lblTitle: TLabel; - SettingsToolBar: TToolBar; - ColorSettingsToolButton: TToolButton; - EditOptionsToolButton: TToolButton; + SettingsToolBar: TStyledToolbar; + ColorSettingsToolButton: TStyledToolButton; + EditOptionsToolButton: TStyledToolButton; VirtualImageList: TVirtualImageList; actMenu: TAction; - MenuButtonToolbar: TToolBar; - MenuToolButton: TToolButton; - PageSetupToolButton: TToolButton; - PrinterSetupToolButton: TToolButton; - AboutToolButton: TToolButton; - QuitToolButton: TToolButton; - SepToolButton: TToolButton; + MenuButtonToolbar: TStyledToolbar; + MenuToolButton: TStyledToolButton; + PageSetupToolButton: TStyledToolButton; + PrinterSetupToolButton: TStyledToolButton; + AboutToolButton: TStyledToolButton; + QuitToolButton: TStyledToolButton; + SepToolButton: TStyledToolButton; FlowPanel: TFlowPanel; SVGIconImage16: TSVGIconImage; SVGIconImage32: TSVGIconImage; @@ -216,6 +229,8 @@ TfrmMain = class(TForm, IDragDrop) VirtualImageList20: TVirtualImageList; PanelCloseButton: TPanel; SVGIconImageCloseButton: TSVGIconImage; + LoadTimer: TTimer; + CheckFileChangedTimer: TTimer; procedure WMGetMinMaxInfo(var Message: TWMGetMinMaxInfo); message WM_GETMINMAXINFO; procedure acOpenFileExecute(Sender: TObject); procedure acSaveExecute(Sender: TObject); @@ -297,7 +312,13 @@ TfrmMain = class(TForm, IDragDrop) procedure PageControlMouseEnter(Sender: TObject); procedure PageControlMouseLeave(Sender: TObject); procedure SVGIconImageCloseButtonClick(Sender: TObject); + procedure CheckFileChangedTimerTimer(Sender: TObject); + procedure LoadTimerTimer(Sender: TObject); + procedure acHTMLViewerUpdate(Sender: TObject); + procedure AppDeactivate(Sender: TObject); + procedure AppActivate(Sender: TObject); private + FEditingInProgress: Boolean; FirstAction: Boolean; MinFormWidth, MinFormHeight, MaxFormWidth, MaxFormHeight: Integer; FThumbnailResource: TdmThumbnailResources; @@ -331,6 +352,7 @@ TfrmMain = class(TForm, IDragDrop) procedure UpdateFromSettings(AEditor: TSynEdit); function DialogPosRect: TRect; procedure AdjustCompactWidth; + procedure AdjustViewerWidth; function OpenFile(const FileName: string; const ARaiseError: Boolean = True): Boolean; function AddEditingFile(EditingFile: TEditingFile): Integer; @@ -360,11 +382,15 @@ TfrmMain = class(TForm, IDragDrop) procedure ShowXMLEditor(AEditingFile: TEditingFile; const AVisible: Boolean); procedure ConfirmChanges(EditingFile: TEditingFile); procedure ShowTabCloseButtonOnHotTab; + procedure UpdateTabsheetImage(ATabSheet: TTabSheet; AModified: Boolean; + const AImageName: string); property XMLFontSize: Integer read FXMLFontSize write SetXMLFontSize; property HTMLFontSize: Integer read FHTMLFontSize write SetHTMLFontSize; protected procedure CreateWindowHandle(const Params: TCreateParams); override; procedure DestroyWindowHandle; override; + public + procedure ManageExceptions(Sender: TObject; E: Exception); end; var @@ -394,6 +420,7 @@ implementation , SynPDF , vmHtmlToPdf , uLogExcept + , Vcl.StyledTaskDialog , PKCS7Extractor ; @@ -493,7 +520,7 @@ procedure TEditingFile.RenderAllegati; var LIndex: NativeInt; LAllegato: TLinkedDoc; - LButton: TToolButton; + LButton: TStyledToolButton; begin FAllegatiButtons.Clear; @@ -501,7 +528,7 @@ procedure TEditingFile.RenderAllegati; begin LAllegato := FInvoice.Allegati[LIndex]; - LButton := TToolButton.Create(nil); + LButton := TStyledToolButton.Create(nil); try LButton.Cursor := crHandPoint; LButton.AutoSize := True; @@ -523,16 +550,15 @@ procedure TEditingFile.RenderAllegati; procedure TEditingFile.ReadFromFile; begin - TLegalInvoiceLoader.LoadFromFile(FFileName, - SynEditor); + LoadFromFile(FileName); end; procedure TEditingFile.AllegatoButtonClick(Sender: TObject); var - LButton: TToolButton; + LButton: TStyledToolButton; LAllegato: TLinkedDoc; begin - LButton := Sender as TToolButton; + LButton := Sender as TStyledToolButton; LAllegato := FInvoice.Allegati[LButton.Tag]; LAllegato.DumpAndOpen; end; @@ -542,7 +568,7 @@ constructor TEditingFile.Create(const EditFileName: string); Filter : Word; begin inherited Create; - FAllegatiButtons := TObjectList.Create(True); + FAllegatiButtons := TObjectList.Create(True); if not IsStyleHookRegistered(TCustomSynEdit, TScrollingStyleHook) then TStyleManager.Engine.RegisterStyleHook(TCustomSynEdit, TScrollingStyleHook); @@ -594,6 +620,12 @@ destructor TEditingFile.Destroy; inherited; end; +procedure TEditingFile.LoadFromFile(const AFileName: string); +begin + TLegalInvoiceLoader.LoadFromFile(FFileName, SynEditor); + FileAge(AFileName, FFileAge); +end; + procedure TEditingFile.UpdateContentType; var LContent: string; @@ -625,6 +657,7 @@ procedure TEditingFile.SaveToFile; begin SynEditor.Lines.SaveToFile(Self.FileName); SynEditor.Modified := False; + FileAge(Self.FileName, FFileAge); SynEditor.OnChange(SynEditor); end; @@ -741,6 +774,16 @@ procedure TfrmMain.acSaveExecute(Sender: TObject); CurrentEditFile.SaveToFile; end; +procedure TfrmMain.AppActivate(Sender: TObject); +begin + CheckFileChangedTimerTimer(CheckFileChangedTimer); +end; + +procedure TfrmMain.AppDeactivate(Sender: TObject); +begin + CheckFileChangedTimer.Enabled := False; +end; + procedure TfrmMain.FormDestroy(Sender: TObject); begin FreeAndNil(FThumbnailResource); @@ -754,26 +797,43 @@ procedure TfrmMain.FormDestroy(Sender: TObject); procedure TfrmMain.FormMouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin - if Shift = [ssCtrl] then + if (Shift = [ssCtrl]) and (CurrentEditFile <> nil) then begin - actnReduceFont.Execute; - Handled := True; + if CurrentEditFile.SynEditor.Focused then + begin + actnReduceFont.Execute; + Handled := True; + end + else if CurrentEditFile.HTMLViewer.Focused then + begin + acZoomOut.Execute; + Handled := True; + end; end; end; procedure TfrmMain.FormMouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); begin - if Shift = [ssCtrl] then + if (Shift = [ssCtrl]) and (CurrentEditFile <> nil) then begin - actnEnlargeFont.Execute; - Handled := True; + if CurrentEditFile.SynEditor.Focused then + begin + actnEnlargeFont.Execute; + Handled := True; + end + else if CurrentEditFile.HTMLViewer.Focused then + begin + acZoomIn.Execute; + Handled := True; + end; end; end; procedure TfrmMain.FormResize(Sender: TObject); begin AdjustCompactWidth; + AdjustViewerWidth; end; procedure TfrmMain.ShowSRDialog(aReplace: boolean); @@ -1018,11 +1078,28 @@ procedure TfrmMain.LoadOpenedFiles; UpdateInvoiceViewer; end; +procedure TfrmMain.LoadTimerTimer(Sender: TObject); +begin + if FEditingInProgress then + begin + FEditingInProgress := False; + UpdateInvoiceViewer; + end; +end; + procedure TfrmMain.FormCreate(Sender: TObject); var FileVersionStr: string; begin + //To check Application Focus + Application.OnActivate := AppActivate; + Application.OnDeactivate := AppDeactivate; + FThumbnailResource := TdmThumbnailResources.Create(nil); + //Initialize AnimatedTaskDialog font size + Screen.MessageFont.Size := Round(Screen.MessageFont.Size*1.2); + InitializeStyledTaskDialogs(True, Screen.MessageFont); + //creo la lista dei files aperti EditFileList := TObjectList.Create(True); FEditorOptions := TSynEditorOptionsContainer.create(self); @@ -1140,10 +1217,8 @@ procedure TfrmMain.acEditUndoUpdate(Sender: TObject); procedure TfrmMain.UpdateContentType; begin CurrentEditFile.UpdateContentType; - if CurrentEditor.Modified then - pageControl.ActivePage.Imagename := CurrentEditFile.ImageName - else - pageControl.ActivePage.Imagename := CurrentEditFile.ImageName+'-gray'; + UpdateTabsheetImage(pageControl.ActivePage, CurrentEditor.Modified, + CurrentEditFile.ImageName); case CurrentEditFile.ContentType of fcLegalInvoice: FXMLInvoice := CurrentEditFile; @@ -1152,10 +1227,27 @@ procedure TfrmMain.UpdateContentType; end; end; +procedure TfrmMain.acHTMLViewerUpdate(Sender: TObject); +begin + (Sender as TAction).Enabled := + (CurrentEditFile <> nil) and (CurrentEditFile.HTMLViewer <> nil); +end; + +procedure TfrmMain.UpdateTabsheetImage(ATabSheet: TTabSheet; + AModified: Boolean; const AImageName: string); +begin + if AModified then + ATabSheet.ImageName := AImageName + else + ATabSheet.ImageName := AImageName+'-gray'; +end; + procedure TfrmMain.SynEditChange(Sender: TObject); begin if Sender = CurrentEditor then begin + FEditingInProgress := True; + LoadTimer.Enabled := False; UpdateContentType; UpdateInvoiceViewer; end; @@ -1171,7 +1263,7 @@ function TfrmMain.AddEditingFile(EditingFile: TEditingFile): Integer; LTabSheet: TTabSheet; LEditor: TSynEdit; LFEViewer: THtmlViewer; - LToolBarAllegati: TToolbar; + LToolBarAllegati: TStyledToolbar; LSplitter: TSplitter; begin //lo aggiungo alla lista dei file aperti @@ -1213,11 +1305,13 @@ function TfrmMain.AddEditingFile(EditingFile: TEditingFile): Integer; LFEViewer.Parent := LTabSheet; LFEViewer.PopupMenu := PopHTMLViewer; - LToolBarAllegati := TToolbar.Create(LTabSheet); + LToolBarAllegati := TStyledToolbar.Create(LTabSheet); LToolBarAllegati.Align := alTop; LToolBarAllegati.List := True; LToolBarAllegati.ShowCaptions := True; - LToolBarAllegati.Height := 30; + LToolBarAllegati.ButtonWidth := 260; + LToolBarAllegati.ButtonHeight := 38; + LToolBarAllegati.Height := 40; LToolBarAllegati.Parent := LTabSheet; LToolBarAllegati.Images := VirtualImageList; @@ -1366,6 +1460,7 @@ procedure TfrmMain.PageControlChange(Sender: TObject); FXMLInvoice := CurrentEditFile; end; UpdateInvoiceViewer; + AdjustViewerWidth; end; procedure TfrmMain.PageControlMouseMove(Sender: TObject; Shift: TShiftState; X, @@ -1410,6 +1505,38 @@ procedure TfrmMain.acSaveUpdate(Sender: TObject); acSave.Enabled := (CurrentEditor <> nil) and (CurrentEditor.Modified); end; +procedure TfrmMain.CheckFileChangedTimerTimer(Sender: TObject); +var + LFileAge: TDateTime; +begin + CheckFileChangedTimer.Enabled := False; + Try + //Check if opened files are changed on Disk + for var I := 0 to EditFileList.Count -1 do + begin + var LEditFile := TEditingFile(EditFileList.items[I]); + if FileAge(LEditFile.FileName, LFileAge) then + begin + if LFileAge <> LEditFile.FFileAge then + begin + var LConfirm := StyledMessageDlg(Format(FILE_CHANGED_RELOAD,[LEditFile.FileName]), + mtWarning, [mbYes, mbNo], 0); + if LConfirm = mrYes then + begin + LEditFile.ReadFromFile; + UpdateTabsheetImage(LEditFile.TabSheet, False, LEditFile.ImageName); + SynEditChange(LEditFile.SynEditor); + end + else + LEditFile.FFileAge := LFileAge; + end; + end; + end; + Finally + CheckFileChangedTimer.Enabled := True; + End; +end; + procedure TfrmMain.CloseSplitViewMenu; begin SV.Close; @@ -1444,7 +1571,7 @@ procedure TfrmMain.ConfirmChanges(EditingFile: TEditingFile); //Confirm save changes if EditingFile.SynEditor.Modified then begin - LConfirm := MessageDlg(Format(CONFIRM_CHANGES,[EditingFile.FileName]), + LConfirm := StyledMessageDlg(Format(CONFIRM_CHANGES,[EditingFile.FileName]), mtWarning, [mbYes, mbNo], 0); if LConfirm = mrYes then EditingFile.SaveToFile @@ -1642,7 +1769,7 @@ procedure TfrmMain.SetXMLFontSize(const Value: Integer); procedure TfrmMain.FileSavedAskToOpen(const AFileName: string); begin - if MessageDlg(Format(FILE_SAVED,[AFileName]), + if StyledMessageDlg(Format(FILE_SAVED,[AFileName]), TMsgDlgType.mtInformation, [mbYes, MbNo], 0) = mrYes then begin ShellExecute(handle, 'open', PChar(AFilename), nil, nil, SW_SHOWNORMAL); @@ -1694,7 +1821,7 @@ procedure TfrmMain.SetHTMLFontSize(const Value: Integer); LScaleFactor := CurrentEditFile.HTMLViewer.DefFontSize / FXMLFontSize else LScaleFactor := 1; - CurrentEditFile.HTMLViewer.DefFontSize := Round(Value * LScaleFactor); + CurrentEditFile.HTMLViewer.DefFontSize := Round(Value * LScaleFactor * Self.ScaleFactor); FEditorSettings.HTMLFontSize := Value; end; FHTMLFontSize := Value; @@ -1745,6 +1872,7 @@ procedure TfrmMain.UpdateEditorsOptions; procedure TfrmMain.UpdateFromSettings(AEditor: TSynEdit); var + LStyle: TStyledButtonDrawType; LEditingFile: TEditingfile; begin if AEditor <> nil then @@ -1756,6 +1884,32 @@ procedure TfrmMain.UpdateFromSettings(AEditor: TSynEdit); end else FEditorSettings.ReadSettings(nil, self.FEditorOptions); + + //Rounded Buttons for StyledButtons + if FEditorSettings.ButtonDrawRounded then + LStyle := btRounded + else + LStyle := btRoundRect; + TStyledButton.RegisterDefaultRenderingStyle(LStyle); + + //Rounded Buttons for StyledToolbars + if FEditorSettings.ToolbarDrawRounded then + LStyle := btRounded + else + LStyle := btRoundRect; + TStyledToolbar.RegisterDefaultRenderingStyle(LStyle); + SettingsToolBar.StyleDrawType := LStyle; + + //Rounded Buttons for menus: StyledCategories and StyledButtonGroup + if FEditorSettings.MenuDrawRounded then + LStyle := btRounded + else + LStyle := btRoundRect; + TStyledCategoryButtons.RegisterDefaultRenderingStyle(LStyle); + TStyledButtonGroup.RegisterDefaultRenderingStyle(LStyle); + catMenuItems.StyleDrawType := LStyle; + MenuButtonToolbar.StyleDrawType := LStyle; + if FEditorSettings.XMLFontSize >= MinfontSize then XMLFontSize := FEditorSettings.XMLFontSize else @@ -1959,10 +2113,18 @@ procedure TfrmMain.ActionListUpdate(Action: TBasicAction; InitialDir : string; LFileName: string; begin + if CurrentEditFile <> nil then + Caption := Application.Title+' - '+CurrentEditFile.FileName + else + Caption := Application.Title; + UpdateStatusBarPanels; if not FirstAction then begin FirstAction := True; + //Load previous opened-files + LoadOpenedFiles; + //Initialize Open and Save Dialog with application path LFileName := ParamStr(1); if LFileName <> '' then @@ -1978,10 +2140,8 @@ procedure TfrmMain.ActionListUpdate(Action: TBasicAction; OpenDialog.InitialDir := InitialDir; SaveDialog.InitialDir := InitialDir; - - //Load previous opened-files - LoadOpenedFiles; end; + LoadTimer.Enabled := True; end; procedure TfrmMain.actMenuExecute(Sender: TObject); @@ -2049,6 +2209,21 @@ procedure TfrmMain.AddOpenedFile(const AFileName: string); FEditorSettings.HistoryFileList.Insert(0, AFileName); end; +procedure TfrmMain.AdjustViewerWidth; +begin + if CurrentEditFile <> nil then + begin + var LImagePanelWidth := ImagePanel.Width; + var LMinWidth := Self.Width div 3; + if LImagePanelWidth > LMinWidth then + ImagePanel.width := LMinWidth; + if CurrentEditFile.SynEditor.Width > LMinWidth then + CurrentEditFile.SynEditor.Width := LMinWidth + else + CurrentEditFile.SynEditor.Width := (Self.Width - ImagePanel.Width) div 2; + end; +end; + procedure TfrmMain.AdjustCompactWidth; begin //Change size of compact because Scrollbars appears @@ -2056,6 +2231,8 @@ procedure TfrmMain.AdjustCompactWidth; SV.CompactWidth := Round(44 * ScaleFactor) else SV.CompactWidth := Round(66 * ScaleFactor); + if (CurrentEditFile <> nil) and (CurrentEditFile.HTMLViewer <> nil) and (CurrentEditFile.HTMLViewer.Width > CurrentEditFile.TabSheet.Width) then + CurrentEditFile.HTMLViewer.Width := width div 3; end; procedure TfrmMain.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI, @@ -2199,14 +2376,16 @@ procedure TfrmMain.ShowTabCloseButtonOnHotTab; rectOver := PageControl.TabRect(iot); PanelCloseButton.Left := rectOver.Right - PanelCloseButton.Width; - PanelCloseButton.Top := rectOver.Top + ((rectOver.Height div 2) - (PanelCloseButton.Height div 2)) + 1; + PanelCloseButton.Top := rectOver.Top + ((rectOver.Height div 2) - (PanelCloseButton.Height div 2)); PanelCloseButton.Tag := iot; + PanelCloseButton.Color := StyleServices.GetSystemColor(clWindow); PanelCloseButton.Show; end else begin PanelCloseButton.Tag := -1; + PanelCloseButton.Color := StyleServices.GetSystemColor(clBtnFace); PanelCloseButton.Hide; end; end; @@ -2225,6 +2404,27 @@ procedure TfrmMain.PageControlMouseLeave(Sender: TObject); end; end; +procedure TfrmMain.ManageExceptions(Sender: TObject; E: Exception); +begin + //This is an event-handler for exceptions that replace Delphi standard handler + if E is EAccessViolation then + begin + if StyledMessageDlg(STR_UNEXPECTED_ERROR, + Format('Unexpected Error: %s%s',[sLineBreak,E.Message]), + TMsgDlgType.mtError, + [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbAbort], 0) = mrAbort then + Application.Terminate; + end + else + begin + + StyledMessageDlg(STR_ERROR, + Format('Error: %s%s',[sLineBreak,E.Message]), + TMsgDlgType.mtError, + [TMsgDlgBtn.mbOK, TMsgDlgBtn.mbHelp], 0); + end; +end; + initialization {$IFDEF DEBUG} ReportMemoryLeaksOnShutdown := True; diff --git a/Source/FExplorer.dproj b/Source/FExplorer.dproj index 352f293..d602f5f 100644 --- a/Source/FExplorer.dproj +++ b/Source/FExplorer.dproj @@ -3,13 +3,14 @@ {0f4263a8-1a99-480e-92d7-cf95d010b435} Debug DCC32 - 20.0 + 20.1 VCL True Win64 2 Library FExplorer.dpr + FExplorer true @@ -58,17 +59,17 @@ ..\Icons\logo.ico $(BDS)\bin\default_app.manifest 1040 - CompanyName=Ethea S.r.l.;FileDescription=Fattura Elettronica Explorer 64bit;FileVersion=2.2.0.0;InternalName=;LegalCopyright=Copyright © 2021-2023 Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProductName=Fattura Elettronica Explorer 64bit;ProductVersion=2.2;Comments= + CompanyName=Ethea S.r.l.;FileDescription=Fattura Elettronica Explorer 64bit;FileVersion=2.3.0.0;InternalName=;LegalCopyright=Copyright © 2021-2024 Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProductName=Fattura Elettronica Explorer 64bit;ProductVersion=2.3;Comments= Glow|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Glow.vsf;Sky|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Sky.vsf;Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf;"Windows10 Dark|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10Dark.vsf";"Windows10 SlateGray|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10SlateGray.vsf";"Windows11 Modern Dark|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows11_Modern_Dark.vsf";"Windows11 Modern Light|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows11_Modern_Light.vsf" rtl;vcl;vclx;vclactnband;xmlrtl;VclSmp;vclimg;svnui;svn;bdertl;TeeUI;TeeDB;Tee;vcldb;dbrtl;vcldbx;vcltouch;dsnap;dsnapcon;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_110_150;Intraweb_110_150;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapClient;dbxcds;DataSnapServer;AzureCloud;DBXInterBaseDriver;DBXMySQLDriver;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;Hydra_Core_D15;SynEdit_RXE;mbColorLibDXE;JclDeveloperTools;Jcl;JclVcl;JclContainers;JvCore;JvSystem;JvStdCtrls;JvAppFrm;JvBands;JvDB;JvDlgs;JvBDE;JvControls;JvCmp;JvCrypt;JvCustom;JvDocking;JvDotNetCtrls;JvGlobus;JvHMI;JvJans;JvManagedThreads;JvMM;JvNet;JvPageComps;JvPascalInterpreter;JvPluginSystem;JvPrintPreview;JvRuntimeDesign;JvTimeFramework;JvWizards;JvXPCtrls;WinSkinDXE;bsfd2011;IceTabSet;$(DCC_UsePackage) ..\Dcu\$(Platform)\$(Config) true 00400000 - ..\Ext\SynEdit\Source;..\Ext\SVGIconImageList\Source;..\Ext\SVGIconImageList\SVG;..\Ext\VCLStyleUtils\Common;..\Ext\VCLStyleUtils\DDetours\Source;..\Ext\HTMLViewer\Source;..\Ext\SVGIconImageList\Image32\Source;$(DCC_UnitSearchPath) + ..\Ext\SynEdit\Source;..\Ext\SVGIconImageList\Source;..\Ext\VCLStyleUtils\Common;..\Ext\VCLStyleUtils\DDetours\Source;..\Ext\HTMLViewer\Source;..\Ext\SVGIconImageList\Image32\Source;..\Ext\StyledComponents\source;$(DCC_UnitSearchPath) ..\Bin64 true 2 - 2 + 3 D:\ETHEA\FExplorer\Debug\Preview Handlers\OpenDialog\OpenDialogTest.exe @@ -203,876 +204,20 @@ c:\temp - File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\CardTable_v3280.bpl not found - Componenti per corso Delphi - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Ethea InstantSolutions 8.5 Framework Library + Ethea InstantSolutions 8.6 Rtl Library + Ethea InstantSolutions 8.6 LibreOffice/OpenOffice Components + Ethea InstantSolutions 8.6 Vcl Library + Ethea InstantSolutions 8.6 Framework Library + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components False True - - - - - - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v21 - 1 - - - res\drawable-anydpi-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values-v31 - 1 - - - res\values-v31 - 1 - - - - - res\drawable-anydpi-v26 - 1 - - - res\drawable-anydpi-v26 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v33 - 1 - - - res\drawable-anydpi-v33 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-night-v21 - 1 - - - res\values-night-v21 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable-anydpi-v24 - 1 - - - res\drawable-anydpi-v24 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-night-anydpi-v21 - 1 - - - res\drawable-night-anydpi-v21 - 1 - - - - - res\drawable-anydpi-v31 - 1 - - - res\drawable-anydpi-v31 - 1 - - - - - res\drawable-night-anydpi-v31 - 1 - - - res\drawable-night-anydpi-v31 - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - 12 - diff --git a/Source/FExplorer.res b/Source/FExplorer.res index ba083e9cfa7845dd552d564f8b283052c46e86ee..b6ab9be656822602bbdc93beb62c27f011c44b09 100644 GIT binary patch delta 125 zcmWl~I}SiV6h>k9&Un9Bh+=d$pw!t0rCOnts4PJuk*Sm-u`vIf=faKHr*dE0x4vWLjfgJ*ZkI9{{be$ BE)4(x diff --git a/Source/FExplorer32.dpr b/Source/FExplorer32.dpr index f4ef9e7..36202e5 100644 --- a/Source/FExplorer32.dpr +++ b/Source/FExplorer32.dpr @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/FExplorer32.dproj b/Source/FExplorer32.dproj index 742743d..598d281 100644 --- a/Source/FExplorer32.dproj +++ b/Source/FExplorer32.dproj @@ -3,13 +3,14 @@ {95d663b8-387e-46f6-b1bb-c52302c593dc} Debug DCC32 - 20.0 + 20.1 VCL True Win32 1 Library FExplorer32.dpr + FExplorer32 true @@ -58,17 +59,17 @@ ..\Icons\logo.ico $(BDS)\bin\default_app.manifest 1040 - CompanyName=Ethea S.r.l.;FileDescription=Fattura Elettronica Explorer 32bit;FileVersion=2.2.0.0;InternalName=;LegalCopyright=Copyright © 2021-2023 Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProductName=Fattura Elettronica Explorer 32bit;ProductVersion=2.2;Comments= + CompanyName=Ethea S.r.l.;FileDescription=Fattura Elettronica Explorer 32bit;FileVersion=2.3.0.0;InternalName=;LegalCopyright=Copyright © 2021-2024 Ethea S.r.l.;LegalTrademarks=;OriginalFilename=;ProductName=Fattura Elettronica Explorer 32bit;ProductVersion=2.3;Comments= Glow|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Glow.vsf;Sky|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Sky.vsf;Windows10|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10.vsf;"Windows10 Dark|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10Dark.vsf";"Windows10 SlateGray|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows10SlateGray.vsf";"Windows11 Modern Dark|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows11_Modern_Dark.vsf";"Windows11 Modern Light|VCLSTYLE|$(BDSCOMMONDIR)\Styles\Windows11_Modern_Light.vsf" rtl;vcl;vclx;vclactnband;xmlrtl;VclSmp;vclimg;svnui;svn;bdertl;TeeUI;TeeDB;Tee;vcldb;dbrtl;vcldbx;vcltouch;dsnap;dsnapcon;vclib;ibxpress;adortl;IndyCore;IndySystem;IndyProtocols;inet;intrawebdb_110_150;Intraweb_110_150;vclie;websnap;webdsnap;inetdb;inetdbbde;inetdbxpress;soaprtl;vclribbon;dbexpress;DbxCommonDriver;DataSnapIndy10ServerTransport;DataSnapProviderClient;DbxClientDriver;DataSnapClient;dbxcds;DataSnapServer;AzureCloud;DBXInterBaseDriver;DBXMySQLDriver;DBXFirebirdDriver;DBXSybaseASEDriver;DBXSybaseASADriver;DBXOracleDriver;DBXMSSQLDriver;DBXInformixDriver;DBXDb2Driver;Hydra_Core_D15;SynEdit_RXE;mbColorLibDXE;JclDeveloperTools;Jcl;JclVcl;JclContainers;JvCore;JvSystem;JvStdCtrls;JvAppFrm;JvBands;JvDB;JvDlgs;JvBDE;JvControls;JvCmp;JvCrypt;JvCustom;JvDocking;JvDotNetCtrls;JvGlobus;JvHMI;JvJans;JvManagedThreads;JvMM;JvNet;JvPageComps;JvPascalInterpreter;JvPluginSystem;JvPrintPreview;JvRuntimeDesign;JvTimeFramework;JvWizards;JvXPCtrls;WinSkinDXE;bsfd2011;IceTabSet;$(DCC_UsePackage) ..\Dcu\$(Platform)\$(Config) true 00400000 - ..\Ext\SynEdit\Source;..\Ext\SVGIconImageList\Source;..\Ext\SVGIconImageList\SVG;..\Ext\VCLStyleUtils\Common;..\Ext\VCLStyleUtils\DDetours\Source;..\Ext\HTMLViewer\Source;..\Ext\SVGIconImageList\Image32\Source;$(DCC_UnitSearchPath) + ..\Ext\SynEdit\Source;..\Ext\SVGIconImageList\Source;..\Ext\VCLStyleUtils\Common;..\Ext\VCLStyleUtils\DDetours\Source;..\Ext\HTMLViewer\Source;..\Ext\SVGIconImageList\Image32\Source;..\Ext\StyledComponents\source;$(DCC_UnitSearchPath) ..\Bin32 true 2 - 2 + 3 D:\ETHEA\FExplorer\Debug\Preview Handlers\OpenDialog\OpenDialogTest.exe @@ -203,878 +204,20 @@ c:\temp - File C:\Users\Public\Documents\Embarcadero\Studio\22.0\Bpl\CardTable_v3280.bpl not found - Componenti per corso Delphi - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Ethea InstantSolutions 8.5 Framework Library + Ethea InstantSolutions 8.6 Rtl Library + Ethea InstantSolutions 8.6 LibreOffice/OpenOffice Components + Ethea InstantSolutions 8.6 Vcl Library + Ethea InstantSolutions 8.6 Framework Library + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components True False - - - - - - - - 1 - - - 0 - - - - - classes - 64 - - - classes - 64 - - - - - res\xml - 1 - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - library\lib\armeabi - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\mips - 1 - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v21 - 1 - - - res\drawable-anydpi-v21 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-v21 - 1 - - - res\values-v21 - 1 - - - - - res\values-v31 - 1 - - - res\values-v31 - 1 - - - - - res\drawable-anydpi-v26 - 1 - - - res\drawable-anydpi-v26 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-anydpi-v33 - 1 - - - res\drawable-anydpi-v33 - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\values-night-v21 - 1 - - - res\values-night-v21 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - res\values - 1 - - - - - res\drawable-anydpi-v24 - 1 - - - res\drawable-anydpi-v24 - 1 - - - - - res\drawable - 1 - - - res\drawable - 1 - - - - - res\drawable-night-anydpi-v21 - 1 - - - res\drawable-night-anydpi-v21 - 1 - - - - - res\drawable-anydpi-v31 - 1 - - - res\drawable-anydpi-v31 - 1 - - - - - res\drawable-night-anydpi-v31 - 1 - - - res\drawable-night-anydpi-v31 - 1 - - - - - 1 - - - 1 - - - 0 - - - - - 1 - .framework - - - 1 - .framework - - - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 1 - - - 1 - - - - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - library\lib\arm64-v8a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - 0 - - - - - library\lib\armeabi-v7a - 1 - - - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - - - - 1 - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset - 1 - - - - - - - - - - - - - - - 12 - diff --git a/Source/FExplorer32.res b/Source/FExplorer32.res index a2eddaab13697c63f1652f8a16df3e29fb03e77b..1dbf9c4a67601ec071ab3183223f18deae9a654b 100644 GIT binary patch delta 125 zcmWl~I}SiV6h>k9&Un9Bh+=d$pw!t0rCOnts4PJuk*Sm-u`vIf=faKHr*dE0x4vWLjfgJ*ZkI9{{be$ BE)4(x diff --git a/Source/dlgReplaceText.pas b/Source/dlgReplaceText.pas index 045c1d9..ec9d7c2 100644 --- a/Source/dlgReplaceText.pas +++ b/Source/dlgReplaceText.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/uFilePreviewHandler.pas b/Source/uFilePreviewHandler.pas index 06e9909..04d1024 100644 --- a/Source/uFilePreviewHandler.pas +++ b/Source/uFilePreviewHandler.pas @@ -39,7 +39,8 @@ implementation Windows, PropSys, SysUtils, - uLogExcept; + uLogExcept, + uMisc; type TComFilePreviewHandler = class(TComPreviewHandler, IInitializeWithFile) @@ -66,6 +67,7 @@ function TComFilePreviewHandler.GetPreviewHandler: TFilePreviewHandler; function TComFilePreviewHandler.IInitializeWithFile_Initialize(pszFilePath: LPCWSTR; grfMode: DWORD): HRESULT; begin FFilePath := pszFilePath; + Initialize_GDI; FMode := grfMode; Result := S_OK; end; diff --git a/Source/uMisc.pas b/Source/uMisc.pas index 7542bbf..6281988 100644 --- a/Source/uMisc.pas +++ b/Source/uMisc.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/uPreviewContainer.pas b/Source/uPreviewContainer.pas index 918d6a0..c5c9c93 100644 --- a/Source/uPreviewContainer.pas +++ b/Source/uPreviewContainer.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/uPreviewHandler.pas b/Source/uPreviewHandler.pas index 73fb73d..0d86708 100644 --- a/Source/uPreviewHandler.pas +++ b/Source/uPreviewHandler.pas @@ -117,9 +117,9 @@ implementation destructor TComPreviewHandler.Destroy; begin TLogPreview.Add('Destroy Init'); + inherited Destroy; FreeAndNil(FContainer); FreeAndNil(FPreviewHandler); - inherited Destroy; TLogPreview.Add('Destroy Done'); end; @@ -216,7 +216,6 @@ function TComPreviewHandler.GetWindow(out wnd: HWND): HRESULT; function TComPreviewHandler.IPreviewHandler_DoPreview: HRESULT; begin - Result := S_OK; TLogPreview.Add('IPreviewHandler_DoPreview Init'); try CheckPreviewHandler; @@ -226,6 +225,7 @@ function TComPreviewHandler.IPreviewHandler_DoPreview: HRESULT; TLogPreview.Add(Format('Error in TComPreviewHandler.IPreviewHandler_DoPreview - Message: %s: Trace %s', [E.Message, E.StackTrace])); end; + Result := S_OK; TLogPreview.Add('IPreviewHandler_DoPreview Done'); end; @@ -270,7 +270,6 @@ function TComPreviewHandler.SetFocus: HRESULT; TLogPreview.Add('SetFocus Init'); if Container <> nil then begin - Container.Visible := True; if GetKeyState(VK_SHIFT) < 0 then Container.SetFocusTabLast else diff --git a/Source/uPreviewHandlerRegister.pas b/Source/uPreviewHandlerRegister.pas index f164916..422f7e4 100644 --- a/Source/uPreviewHandlerRegister.pas +++ b/Source/uPreviewHandlerRegister.pas @@ -3,7 +3,7 @@ { FExplorer: Shell extensions per Fattura Elettronica } { (Preview Panel, Thumbnail Icon, F.E.Viewer) } { } -{ Copyright (c) 2021-2023 (Ethea S.r.l.) } +{ Copyright (c) 2021-2024 (Ethea S.r.l.) } { Author: Carlo Barazzetta } { } { https://github.com/EtheaDev/FExplorer } diff --git a/Source/uStreamPreviewHandler.pas b/Source/uStreamPreviewHandler.pas index 2e2355c..f6deb2b 100644 --- a/Source/uStreamPreviewHandler.pas +++ b/Source/uStreamPreviewHandler.pas @@ -41,7 +41,8 @@ implementation uses PropSys, SysUtils, - uLogExcept; + uLogExcept, + uMisc; type TComStreamPreviewHandler = class(TComPreviewHandler, IInitializeWithStream) @@ -72,6 +73,7 @@ function TComStreamPreviewHandler.GetPreviewHandler: TStreamPreviewHandler; function TComStreamPreviewHandler.IInitializeWithStream_Initialize(const pstream: IStream; grfMode: Cardinal): HRESULT; begin TLogPreview.Add('TComStreamPreviewHandler.IInitializeWithStream_Initialize Init'); + Initialize_GDI; FIStream := pstream; FMode := grfMode; Result := S_OK; @@ -106,3 +108,4 @@ class function TStreamPreviewHandler.GetComClass: TComClass; end; end. +