From cee8821399c9624c157ba58b0b5e1ddbb35daadb Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Fri, 20 Dec 2019 20:18:05 +0100 Subject: [PATCH 001/129] Upgrade to 1.0 Major upgrade. Lots of bugs fixed. Added new datatypes: Int and Int64 Restructored source code Seperated parser logic from GUI logic --- JsonToDelphiClass.dpr | 3 +- JsonToDelphiClass.dproj | 871 ++++++++--- JsonToDelphiClass.res | Bin 10188 -> 11660 bytes JsonToDelphiClass.skincfg | 57 + Pkg.Json.Mapper.pas | 1009 ++++++------- Pkg.Json.Visualizer.pas | 139 ++ RootUnit.pas | 174 +++ Win32/Debug/Pkg.Json.DTO.pas | 71 + Win32/Debug/Project38.dpr | 16 + Win32/Debug/Project38.dproj | 843 +++++++++++ Win32/Debug/Project38.res | Bin 0 -> 59520 bytes Win32/Debug/Root.pas | 218 +++ Win32/Debug/Unit38.dfm | 25 + Win32/Debug/Unit38.pas | 51 + uGitHub.pas | 542 ++++--- uMainForm.fmx | 319 ++-- uMainForm.pas | 421 +++--- uSaveUnitForm.fmx | 2710 +++++++++++++++++----------------- uSaveUnitForm.pas | 29 +- uUpdate.pas | 32 +- 20 files changed, 4757 insertions(+), 2773 deletions(-) create mode 100644 JsonToDelphiClass.skincfg create mode 100644 Pkg.Json.Visualizer.pas create mode 100644 RootUnit.pas create mode 100644 Win32/Debug/Pkg.Json.DTO.pas create mode 100644 Win32/Debug/Project38.dpr create mode 100644 Win32/Debug/Project38.dproj create mode 100644 Win32/Debug/Project38.res create mode 100644 Win32/Debug/Root.pas create mode 100644 Win32/Debug/Unit38.dfm create mode 100644 Win32/Debug/Unit38.pas diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr index 3580445..c7d70ce 100644 --- a/JsonToDelphiClass.dpr +++ b/JsonToDelphiClass.dpr @@ -9,7 +9,8 @@ uses uGitHub in 'uGitHub.pas', FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {/ IdSSLOpenSSLHeaders,}, uUpdate in 'uUpdate.pas', - uUpdateForm in 'uUpdateForm.pas' {UpdateForm}; + uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, + Pkg.Json.Visualizer in 'Pkg.Json.Visualizer.pas'; {$R *.res} diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index 00cadd5..068aef2 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -1,23 +1,18 @@  {FC0815BD-2831-42AD-BC2C-0CC105026B1F} - 18.1 + 18.8 FMX JsonToDelphiClass.dpr True Debug Win32 - 7 + 3 Application true - - true - Base - true - true Base @@ -33,14 +28,14 @@ Base true - - true + + true Cfg_1 true true - - true + + true Cfg_1 true true @@ -68,24 +63,23 @@ false false - - true - FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;tethering;DBXInterBaseDriver;xmlrtl;DbxCommonDriver;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;bindcompdbx;bindengine;soaprtl;FMXTee;fmxFireDAC;emsclient;CustomIPTransport;FireDAC;dsnap;fmxase;IndyCore;IndyIPServer;IndyIPCommon;CloudService;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;soapmidas;soapserver;inetdbxpress;dsnapxml;fmxdae;RESTComponents;dbexpress;IndyIPClient;$(DCC_UsePackage) - CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user - 1033 TAutomagicFormInterceptorPkg;madBasic_;FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;tethering;TeeDB;tsc;DBXInterBaseDriver;Tee;log4delphi_D7_PROF;vclFireDAC;madDisAsm_;xmlrtl;svnui;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;MetropolisUILiveTile;TMSFMXPackPkgDXE7;bindcompdbx;bindengine;vclactnband;vcldb;soaprtl;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;madExcept_;emsclient;CustomIPTransport;vclribbon;VCLRESTComponents;FireDAC;VclSmp;dsnap;Intraweb;fmxase;vcl;IndyCore;IndyIPServer;TMSFMXPackPkgDEDXE7;IndyIPCommon;CloudService;CodeSiteExpressPkg;dsnapcon;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;soapserver;inetdbxpress;svn;ChromiumFMX;dsnapxml;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;adortl;IndyIPClient;$(DCC_UsePackage) true Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 1033 FireDACASADriver;FireDACSqliteDriver;bindcompfmx;DBXSqliteDriver;FireDACPgDriver;FireDACODBCDriver;RESTBackendComponents;emsclientfiredac;fmx;rtl;dbrtl;DbxClientDriver;IndySystem;FireDACCommon;bindcomp;inetdb;tethering;TeeDB;DBXInterBaseDriver;Tee;vclFireDAC;xmlrtl;DbxCommonDriver;vclimg;IndyProtocols;dbxcds;DBXMySQLDriver;FireDACCommonDriver;MetropolisUILiveTile;bindcompdbx;bindengine;vclactnband;vcldb;soaprtl;vcldsnap;bindcompvcl;FMXTee;TeeUI;vclie;fmxFireDAC;FireDACADSDriver;vcltouch;emsclient;CustomIPTransport;vclribbon;VCLRESTComponents;FireDAC;VclSmp;dsnap;Intraweb;fmxase;vcl;IndyCore;IndyIPServer;IndyIPCommon;CloudService;dsnapcon;FireDACIBDriver;FmxTeeUI;inet;fmxobj;FireDACMySQLDriver;soapmidas;vclx;soapserver;inetdbxpress;dsnapxml;fmxdae;RESTComponents;FireDACMSAccDriver;dbexpress;adortl;IndyIPClient;$(DCC_UsePackage) true Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) - CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png DEBUG;$(DCC_Define) @@ -95,9 +89,6 @@ true true - - Debug - JsonToDelphiClass_Icon1.ico $(BDS)\bin\delphi_PROJECTICNS.icns @@ -107,6 +98,10 @@ 3 1 false + Debug + + + Debug false @@ -146,6 +141,7 @@
UpdateForm
fmx + Cfg_2 Base @@ -171,61 +167,41 @@ Microsoft Office XP Sample Automation Server Wrapper Components - + true - - + + + JsonToDelphiClass.exe true - + true - - - JsonToDelphiClass.exe - true - - - - - JsonToDelphiClass.exe + + + true - - - 0 - .dll;.bpl - - + + + + 1 - .dylib Contents\MacOS 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - - Contents\Resources - 1 + + 0 @@ -233,241 +209,216 @@ classes 1 - - - - res\drawable-xxhdpi + + classes 1 - - - Contents\MacOS - 0 - - + + + res\xml 1 - - Contents\MacOS + + res\xml 1 - + - library\lib\mips + library\lib\armeabi-v7a 1 - - - 1 - - + + + library\lib\armeabi 1 - + + library\lib\armeabi 1 - - - 0 - - + + + library\lib\armeabi-v7a 1 - - Contents\MacOS + + + + library\lib\mips 1 - + + library\lib\mips 1 + + library\lib\armeabi-v7a 1 - + + library\lib\arm64-v8a 1 - - - 0 - - - Contents\MacOS + + + library\lib\armeabi-v7a 1 - .framework - - - 1 - - + + + res\drawable 1 - + + res\drawable 1 - + - library\lib\x86 - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + res\values 1 - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + + res\values 1 - - - 1 - - + + + res\values-v21 1 - + + res\values-v21 1 - - - 1 - - + + + res\values 1 - + + res\values 1 - - - 1 - - + + + res\drawable 1 - + + res\drawable 1 - + - library\lib\armeabi - 1 - - - - - 0 - - + res\drawable-xxhdpi 1 - - Contents\MacOS + + res\drawable-xxhdpi 1 - - - 1 - - + + + res\drawable-ldpi 1 - + + res\drawable-ldpi 1 - + - res\drawable-normal + res\drawable-mdpi 1 - - - - res\drawable-xhdpi + + res\drawable-mdpi 1 - + - res\drawable-large + res\drawable-hdpi 1 - - - + + res\drawable-hdpi 1 - + + + + res\drawable-xhdpi 1 - + + res\drawable-xhdpi 1 - - - ../ + + + res\drawable-mdpi 1 - - ../ + + res\drawable-mdpi 1 - + - library\lib\armeabi-v7a + res\drawable-hdpi 1 - - - + res\drawable-hdpi 1 - - - Contents + + + res\drawable-xhdpi 1 - - - - ../ + + res\drawable-xhdpi 1 - - - 1 - - + + + res\drawable-xxhdpi 1 - + + res\drawable-xxhdpi 1 - + - res\values + res\drawable-xxxhdpi + 1 + + + res\drawable-xxxhdpi 1 @@ -476,121 +427,599 @@ res\drawable-small 1 - - - - res\drawable + + res\drawable-small 1 - - - 1 - - + + + res\drawable-normal 1 - + + res\drawable-normal 1 - + + res\drawable-large 1 - - - - res\drawable + + res\drawable-large 1 - + + + res\drawable-xlarge + 1 + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + 0 - + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + 0 + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + - Contents\Resources\StartUp\ + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + 0 + .dll;.bpl + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + 0 + .bpl + + 0 + + 0 + + + 0 + + + 0 + 0 + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + - - - library\lib\armeabi-v7a + + + 1 + + + 1 + + 1 - - - 0 - .bpl + + + 1 1 - .dylib - - Contents\MacOS + 1 - .dylib + + 1 - .dylib + + + 1 1 - .dylib - - - res\drawable-mdpi + + + 1 + + + 1 + + 1 - - - res\drawable-xlarge + + + 1 + + + 1 + + 1 - + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + - res\drawable-ldpi + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1 + + 1 + + + 1 + + + + + ..\ + 1 + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a 1 1 + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + - True True True diff --git a/JsonToDelphiClass.res b/JsonToDelphiClass.res index faba279228f2587c8304b89dedd2a14326a82b93..6415e2672104ceb2507717939f1314aa16152111 100644 GIT binary patch literal 11660 zcmeHNQE%H+6h7H1K_-n&hzB$tW~?FcavM8#(qu|kO>{#+W1F^69@&k3-B~zxu#;{R zLhL8-4|tn+LHq(FehLq054_OFA)$ru-o&kAnx$E@t{HK4eSGdY=R4myzPVA`OGKn$ z3KHaSNJa*|jo8$G z3o$Vzh>j2`FOyc`lMX_R^uGZCY^hF!;3_N0@+_|WvGUVLL>e*<2B-Jd)A{rJ>*-_I z42*ji1?7o{OGLkXFdWd-HNb*hj{kQLun->0v54zn#2vdX$+1v1oyhgW?REW&)^%3XwWP;Gmj_WO*7Zjs(KoJ~J=5SxB0BBh zkp_S;S=akls_$zv?(5L4Q0RBx2uGN>emS6Z1DpS+0%JUdgim z=xmqw{I(yUmgzkhbC<8i&IeW5iswYCVN2bv$c(m^B| ze6^(C?M87=^P*V$5~k=uqHXzDAR1#}RV+3}9>TqKS8KZK`nRHNn5JD>V`jy!GTU-0 zj8{Ct45Q`>AuQMOjPLZ)OQ&C(oZ70GR;^vd-htYWq6%(iWlwRzoPZnf^(+~!qb)sB*R)tsE$^r~xBXRXR=hA^33 zw(6{2X}4L;at*KQ8ZKWuN^aAboVq3qZ;hK}*7n*K8ZK%K?XNJq=D8Jvn-yMH4KEgp za`lyR%db%yTc&cEm(qO(3U)6Xm8J&9U~mQ}iEm(6Y^n3lcd$dYpxvQQaXPt$6V1ab JyVsq@)W4bL0mA?Q delta 70 zcmeB)KI1<@LCJxUfkA; + FItems: TObjectList; + FComplexItems, FArrayItems: TList; FName: string; FComparison: TComparison; FComparer: IComparer; @@ -72,549 +68,454 @@ TStubClass = class procedure SetName(const Value: string); procedure SetPureClassName(const Value: string); public - constructor Create(AParentClass: TStubClass; AClassName: string; AMapper: TPkgJsonMapper; AArrayProperty: string = ''); - destructor Destroy; override; - property Name: string read FName write SetName; - property Items: TList read FItems write FItems; - function GetDeclarationPart: string; - function GetImplementationPart: string; - property PureClassName: string read FPureClassName write SetPureClassName; - property ArrayProperty: string read FArrayProperty write FArrayProperty; - + constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); + destructor Destroy; override; + property name: string read FName write SetName; + property Items: TObjectList read FItems write FItems; + function GetDeclarationPart(const BaseClass: string): string; + function GetImplementationPart: string; + property PureClassName: string read FPureClassName write SetPureClassName; + property ArrayProperty: string read FArrayProperty write FArrayProperty; end; TPkgJsonMapper = class - private - FTreeView: TTreeView; - FClasses: TList; - FRootClass: TStubClass; - FUnitName: string; - procedure SetUnitName(const Value: string); - protected - function GetJsonType(AJsonValue: TJsonValue): TJsonType; - function GetFirstArrayItem(AJsonValue: TJsonValue): TJsonValue; - procedure ProcessJsonObject(AJsonValue: TJsonValue; AParentClass: TStubClass); - procedure ClearClasses; - procedure InternalFormatTreeViewFields(AItem: TTreeViewItem); - procedure FormatFields(ATreeView: TTreeView); - procedure InternalVisualize(ATreeViewItem: TTreeViewItem; AClass: TStubClass; AItemStyleLookup: string); - function SuggestClassName(ASuggestedClassName: string): string; - public - constructor Create(ATreeView: TTreeView); - destructor Destroy; override; - // Parses a JSON string and creates internal stub class structure - procedure Parse(AJsonString: string; ARootClassName: string = 'Root'); - // Generates resultant unit - function GenerateUnit: string; - procedure Debug(ALines: TStrings); - // Visualizes stub class structure in a treeview - procedure Visualize(ATreeView: TTreeView; AItemStyleLookup: string); - property DestinationUnitName: string read FUnitName write SetUnitName; + private + FStubClasses: TObjectList; + FRootClass: TStubClass; + FUnitName: string; + FClassName: string; + procedure SetUnitName(const Value: string); + protected + function GetJsonType(aJsonValue: TJsonValue): TJsonType; + function GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; + procedure ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); + function SuggestClassName(aSuggestedClassName: string): string; + public + constructor Create; + destructor Destroy; override; + // Parses a JSON string and creates internal stub class structure + function Parse(aJsonString: string): TPkgJsonMapper; + // Generates result unit + function GenerateUnit: string; + procedure Debug(aLines: TStrings); + property DestinationClassName: string read FClassName write FClassName; + property DestinationUnitName: string read FUnitName write SetUnitName; + property RootClass: TStubClass read FRootClass; end; -procedure PrettyPrintJSON(JSONValue: TJSONValue; OutputStrings: TStrings; indent: integer = 0); - -var - PointDsFormatSettings: TFormatSettings; +procedure PrettyPrintJSON(JSONValue: TJsonValue; OutputStrings: TStrings; Indent: Integer = 0); implementation -uses uUpdate; +uses + System.RegularExpressions, System.StrUtils, + uUpdate; var ReservedWords: TList; -const INDENT_SIZE = 2; +const + INDENT_SIZE = 2; -// http://stackoverflow.com/a/12198174 -procedure PrettyPrintPair(JSONValue: TJSONPair; OutputStrings: TStrings; last: boolean; indent: integer); -const TEMPLATE = '%s:%s'; +type + TStringsHelper = class helper for TStrings + public + procedure AddFormat(const aFormat: string; const Args: array of const); + end; + + { TStringsHelper } + +procedure TStringsHelper.AddFormat(const aFormat: string; const Args: array of const); +begin + Add(Format(aFormat, Args)); +end; + +function CapitaiazeFirst(const Value: string): string; var - line: string; - newList: TStringList; + List: TStringList; + s: string; + i: Integer; begin - newList := TStringList.Create; + List := TStringList.Create; try - PrettyPrintJSON(JSONValue.JsonValue, newList, indent); - line := format(TEMPLATE, [JSONValue.JsonString.ToString, Trim(newList.Text)]); + ExtractStrings(['_'], [], PChar(Value), List); + for i := 0 to List.Count - 1 do + begin + s := List[i]; + if s.StartsWith('&') then + s[2] := s.ToUpper[2] + else + s[1] := s.ToUpper[1]; + List[i] := s; + end; + + List.Delimiter := '_'; + Result := List.DelimitedText; finally - newList.Free; + List.Free; end; +end; - line := StringOfChar(' ', indent + INDENT_SIZE) + line; - if not last then - line := line + ','; - OutputStrings.add(line); +// http://stackoverflow.com/a/12198174 +procedure PrettyPrintPair(JSONValue: TJSONPair; OutputStrings: TStrings; Last: Boolean; Indent: Integer); +const + TEMPLATE = '%s:%s'; +var + Line: string; + NewList: TStringList; +begin + NewList := TStringList.Create; + try + PrettyPrintJSON(JSONValue.JSONValue, NewList, Indent); + Line := Format(TEMPLATE, [JSONValue.JsonString.ToString, Trim(NewList.Text)]); + finally + NewList.Free; + end; + + Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; + if not Last then + Line := Line + ','; + OutputStrings.Add(Line); end; -procedure PrettyPrintArray(JSONValue: TJSONArray; OutputStrings: TStrings; last: boolean; indent: integer); -var i: integer; +procedure PrettyPrintArray(JSONValue: TJSONArray; OutputStrings: TStrings; Last: Boolean; Indent: Integer); +var + i: Integer; begin - OutputStrings.add(StringOfChar(' ', indent + INDENT_SIZE) + '['); + OutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); + for i := 0 to JSONValue.Count - 1 do - begin - PrettyPrintJSON(JSONValue.Items[i], OutputStrings, indent); - if i < JSONValue.Count - 1 then - OutputStrings[OutputStrings.Count-1] := OutputStrings[OutputStrings.Count-1] + ','; - end; - OutputStrings.add(StringOfChar(' ', indent + INDENT_SIZE - 2) + ']'); + begin + PrettyPrintJSON(JSONValue.Items[i], OutputStrings, Indent); + if i < JSONValue.Count - 1 then + OutputStrings[OutputStrings.Count - 1] := OutputStrings[OutputStrings.Count - 1] + ','; + end; + + OutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); end; -procedure PrettyPrintJSON(JSONValue: TJSONValue; OutputStrings: TStrings; indent: integer = 0); +procedure PrettyPrintJSON(JSONValue: TJsonValue; OutputStrings: TStrings; Indent: Integer = 0); var - i: integer; - LIdent: integer; + i: Integer; + Ident: Integer; begin - LIdent := indent + INDENT_SIZE; + Ident := Indent + INDENT_SIZE; i := 0; if JSONValue is TJSONObject then begin - OutputStrings.add(StringOfChar(' ', LIdent) + '{'); + OutputStrings.Add(StringOfChar(' ', Ident) + '{'); for i := 0 to TJSONObject(JSONValue).Count - 1 do - PrettyPrintPair(TJSONObject(JSONValue).Pairs[i], OutputStrings, i = TJSONObject(JSONValue).Count - 1, LIdent); - OutputStrings.add(StringOfChar(' ', LIdent) + '}'); + PrettyPrintPair(TJSONObject(JSONValue).Pairs[i], OutputStrings, i = TJSONObject(JSONValue).Count - 1, Ident); + + OutputStrings.Add(StringOfChar(' ', Ident) + '}'); end else if JSONValue is TJSONArray then - PrettyPrintArray(TJSONArray(JSONValue), OutputStrings, i = TJSONObject(JSONValue).Count - 1, LIdent) - else OutputStrings.add(StringOfChar(' ', LIdent) + JSONValue.ToString); + PrettyPrintArray(TJSONArray(JSONValue), OutputStrings, i = TJSONObject(JSONValue).Count - 1, Ident) + else + OutputStrings.Add(StringOfChar(' ', Ident) + JSONValue.ToString); end; - { TPkgJsonMapper } - -procedure TPkgJsonMapper.ProcessJsonObject(AJsonValue: TJsonValue; AParentClass: TStubClass); +procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); var - LJsonObj: TJSONObject; - LJsonPair: TJSONPair; - LJsonVal, - LJsonVal2: TJSONValue; - LJsonType, - LJsonType2: TJsonType; - LClass: TStubClass; + JSONObject: TJSONObject; + JsonPair: TJSONPair; + JSONValue, JsonValue2: TJsonValue; + JsonType, JsonType2: TJsonType; + StubClass: TStubClass; begin - LJsonObj := AJsonValue as TJSONObject; + JSONObject := aJsonValue as TJSONObject; - for LJsonPair in LJsonObj do + for JsonPair in JSONObject do begin - LJsonVal := LJsonPair.JsonValue; - LJsonType := GetJsonType(LJsonVal); + JSONValue := JsonPair.JSONValue; + JsonType := GetJsonType(JSONValue); - case LJsonType of + case JsonType of + jtUnknown: + { do nothing }; jtObject: - begin - LClass := TStubClass.Create(AParentClass, LJsonPair.JsonString.Value, self); - TStubObjectField.Create(AParentClass, LJsonPair.JsonString.Value, LClass); - ProcessJsonObject(LJsonVal, LClass); - end; + begin + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + TStubObjectField.Create(aParentClass, JsonPair.JsonString.Value, StubClass); + ProcessJsonObject(JSONValue, StubClass); + end; jtArray: - begin - LClass := nil; - LJsonType2 := jtUnknown; - - LJsonVal2 := GetFirstArrayItem(LJsonVal); - if LJsonVal2 <> nil then begin - LJsonType2 := GetJsonType(LJsonVal2); - case LJsonType2 of - jtObject: - begin - LClass := TStubClass.Create(AParentClass, LJsonPair.JsonString.Value, self); - ProcessJsonObject(LJsonVal2, LClass); + StubClass := nil; + JsonType2 := jtUnknown; + + JsonValue2 := GetFirstArrayItem(JSONValue); + if JsonValue2 <> nil then + begin + JsonType2 := GetJsonType(JsonValue2); + case JsonType2 of + jtObject: + begin + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + ProcessJsonObject(JsonValue2, StubClass); + end; + jtArray: + raise EJsonMapper.Create('Nested Arrays are not supported!'); end; - jtArray: raise EJsonMapper.Create('Nested Arrays are not supported!'); end; - end; - - TStubArrayField.Create(AParentClass, LJsonPair.JsonString.Value, LJsonType2, LClass); - end; - jtNumber, - jtString, - jtDate, - jtDateTime, - jtTrue, - jtFalse: TStubField.Create(AParentClass, LJsonPair.JsonString.Value, LJsonType); + TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType2, StubClass); + end; + else + TStubField.Create(aParentClass, JsonPair.JsonString.Value, JsonType); end; end; - AParentClass.SortFields; + aParentClass.SortFields; end; - function TPkgJsonMapper.GenerateUnit: string; var - LClass: TStubClass; - k: integer; - LList: TStringList; + StubClass: TStubClass; + k: Integer; + StringList: TStringList; begin - LList := TStringList.Create; + StringList := TStringList.Create; try - - LList.Add('unit ' + FUnitName + ';'); - LList.Add(''); - LList.Add('// *************************************************'); - LList.Add('// Generated By: JsonToDelphiClass - ' + FloatToStr(ProgramVersion, PointDsFormatSettings)); - LList.Add('// Project link: https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass'); - LList.Add('// Generated On: ' + FormatDateTime('yyyy-mm-dd hh:nn:ss', now)); - LList.Add('// *************************************************'); - LList.Add('// Created By : Petar Georgiev - 2014'); - LList.Add('// WebSite : http://pgeorgiev.com'); - LList.Add('// *************************************************'); - LList.Add(''); - LList.Add('interface'); - LList.Add(''); - LList.Add('uses Generics.Collections, Rest.Json;'); - LList.Add(''); - LList.Add('type'); - - for k := FClasses.Count - 1 downto 0 do + StringList.Add('unit ' + FUnitName + ';'); + StringList.Add(''); + StringList.Add('interface'); + StringList.Add(''); + StringList.Add('uses'); + StringList.Add(' Pkg.Json.DTO;'); + StringList.Add(''); + StringList.Add('{$M+}'); + StringList.Add(''); + StringList.Add('type'); + + for k := FStubClasses.Count - 1 downto 1 do begin - LClass := FClasses[k]; - LList.Add(LClass.GetDeclarationPart.TrimRight); - end; + StubClass := FStubClasses[k]; + StringList.Add(StubClass.GetDeclarationPart('').TrimRight); + StringList.Add(''); + end; - LList.Add(''); - LList.Add('implementation'); + StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO').TrimRight + sLineBreak); + StringList.Add('implementation'); - for k := FClasses.Count - 1 downto 0 do + for k := FStubClasses.Count - 1 downto 0 do begin - LClass := FClasses[k]; - LList.Add(LClass.GetImplementationPart.TrimRight); + StubClass := FStubClasses[k]; + if k = 0 then + StringList.Add(''); + StringList.Add(StubClass.GetImplementationPart.TrimRight); end; - LList.Add(''); - LList.Add('end.'); + StringList.Add(''); + StringList.Add('end.'); - result := LList.Text; - + Result := StringList.Text; finally - LList.Free; + StringList.Free; end; - end; -procedure TPkgJsonMapper.Visualize(ATreeView: TTreeView; AItemStyleLookup: string); +function TPkgJsonMapper.GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; var - LItem: TTreeViewItem; + JsonArray: TJSONArray; begin - ATreeView.Clear; - if FRootClass <> nil then - begin - ATreeView.BeginUpdate; - LItem := TTreeViewItem.Create(ATreeView); - LItem.Text := FRootClass.Name; - LItem.TagObject := FRootClass; - LItem.WordWrap := false; - ATreeView.AddObject(LItem); - InternalVisualize(LItem, FRootClass, AItemStyleLookup); - FormatFields(ATreeView); - ATreeView.EndUpdate; - ATreeView.ExpandAll; - end; -end; - -function TPkgJsonMapper.GetFirstArrayItem(AJsonValue: TJsonValue): TJsonValue; -var - LJsonArray: TJsonArray; - LJsonValue: TJSONValue; -begin - result := nil; - LJsonArray := AJsonValue as TJsonArray; - for LJsonValue in LJsonArray do - begin - result := LJsonValue; - break; - end; -end; - -procedure TPkgJsonMapper.ClearClasses; -var - LClass: TStubClass; -begin - for LClass in FClasses do - begin - LClass.Free; - end; - - FClasses.Clear; + JsonArray := aJsonValue as TJSONArray; + if JsonArray.Count = 0 then + exit(nil) + else + exit(JsonArray.Items[0]); end; -constructor TPkgJsonMapper.Create(ATreeView: TTreeView); +constructor TPkgJsonMapper.Create; begin inherited Create; - FTreeView := ATreeView; - FClasses := TList.Create; + FStubClasses := TObjectList.Create; + FClassName := 'Root'; end; -procedure TPkgJsonMapper.Debug(ALines: TStrings); +procedure TPkgJsonMapper.Debug(aLines: TStrings); var - LClass: TStubClass; - LField: TStubField; + StubClass: TStubClass; + StubField: TStubField; begin - ALines.Clear; + aLines.Clear; - for LClass in FClasses do + for StubClass in FStubClasses do begin - ALines.Add('-------'); - ALines.Add(LClass.Name); - for LField in LClass.FItems do - begin - ALines.Add(format('%-15s | %s', [LField.FieldName, LField.GetTypeAsString])); - end; + aLines.Add('-------'); + aLines.Add(StubClass.Name); + for StubField in StubClass.FItems do + aLines.AddFormat('%-15s | %s', [StubField.FieldName, StubField.GetTypeAsString]); end; end; destructor TPkgJsonMapper.Destroy; begin - ClearClasses; - FreeAndNil(FClasses); + FreeAndNil(FStubClasses); inherited; end; -procedure TPkgJsonMapper.FormatFields(ATreeView: TTreeView); -begin - if ATreeView.Count = 1 then - begin - InternalFormatTreeViewFields(ATreeView.Items[0]); - end; -end; - procedure TPkgJsonMapper.SetUnitName(const Value: string); begin FUnitName := Value; end; -function TPkgJsonMapper.SuggestClassName(ASuggestedClassName: string): string; +function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; var - LClass: TStubClass; - LMax, LVal: integer; - LString: string; + StubClass: TStubClass; + MaxValue, i: Integer; + s: string; begin - result := ASuggestedClassName; - LMax := 0; - for LClass in FClasses do + Result := aSuggestedClassName; + MaxValue := 0; + + for StubClass in FStubClasses do begin - if LClass.Name.StartsWith(ASuggestedClassName, true) then + if StubClass.Name.StartsWith(aSuggestedClassName, True) then begin - LString := Copy(LClass.Name, length(ASuggestedClassName) + 2); - if (LString.Length = 3) then + s := Copy(StubClass.Name, length(aSuggestedClassName) + 2); + + if (s.length = 3) then begin - if TryStrToInt(LString, LVal) then + if TryStrToInt(s, i) then begin - inc(LVal); - if LVal > LMax then - LMax := LVal; + inc(i); + if i > MaxValue then + MaxValue := i; end; end else - LMax := 1; + MaxValue := 1; end; end; - if LMax > 0 then - result := format('%s_%0.3d', [ASuggestedClassName, LMax]); -end; - -function TPkgJsonMapper.GetJsonType(AJsonValue: TJsonValue): TJsonType; -var - LJsonString: TJSONString; -begin - if AJsonValue is TJSONObject then - result := jtObject - else - if AJsonValue is TJSONArray then - result := jtArray - else - if (AJsonValue is TJSONNumber) then - result := jtNumber - else - if AJsonValue is TJSONTrue then - result := jtTrue - else - if AJsonValue is TJSONFalse then - result := jtFalse - else - if AJsonValue is TJSONString then - begin - LJsonString := (AJsonValue as TJSONString); - if TRegEx.IsMatch(LJsonString.Value, '^([0-9]{4})-?(1[0-2]|0[1-9])-?(3[01]|0[1-9]|[12][0-9])(T| )(2[0-3]|[01][0-9]):?([0-5][0-9]):?([0-5][0-9])$') then - result := jtDateTime - else - if TRegEx.IsMatch(LJsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then - result := jtDate - else - result := jtString - end - else - result := jtUnknown; + if MaxValue > 0 then + Result := Format('%s_%0.3d', [aSuggestedClassName, MaxValue]); end; -procedure TPkgJsonMapper.InternalFormatTreeViewFields(AItem: TTreeViewItem); +function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; var - LItem: TTreeViewItem; - k: Integer; - LSize, LPos: integer; -begin - LSize := 0; - - // Find max len - for k := 0 to AItem.Count - 1 do - begin - LItem := AItem.Items[k]; - LPos := Pos(':', LItem.Text); - if (LPos > 0) AND (LPos > LSize) then - LSize := LPos; - end; - - for k := 0 to AItem.Count - 1 do + JsonString: TJSONString; + i: Integer; + j: Int64; + b: Boolean; +begin + if aJsonValue is TJSONObject then + Result := jtObject + else if aJsonValue is TJSONArray then + Result := jtArray + else if (aJsonValue is TJSONNumber) then begin - LItem := AItem.Items[k]; - LPos := LSize - Pos(':', LItem.Text); - if (LPos > 0) then - LItem.Text := LItem.Text.Replace(':', StringOfChar(' ', LPos) + ':'); - - InternalFormatTreeViewFields(LItem); - end; - -end; - -procedure TPkgJsonMapper.InternalVisualize(ATreeViewItem: TTreeViewItem; - AClass: TStubClass; AItemStyleLookup: string); -var - LField: TStubField; - LItem: TTreeViewItem; -begin - for LField in AClass.FItems do + if TryStrToInt(aJsonValue.Value, i) then + Result := jtInteger + else if TryStrToInt64(aJsonValue.Value, j) then + Result := jtInteger64 + else + Result := jtNumber + end + else if aJsonValue is TJSONTrue then + Result := jtTrue + else if aJsonValue is TJSONFalse then + Result := jtFalse + else if aJsonValue is TJSONString then begin - - LItem := TTreeViewItem.Create(ATreeViewItem); - LItem.StyleLookup := AItemStyleLookup; - LItem.TagObject := LField; - LItem.WordWrap := false; - - case LField.FieldType of - jtObject: - begin - LItem.Text := LField.Name + ': {} ' + LField.GetTypeAsString; - InternalVisualize(LItem, (LField as TStubObjectField).FieldClass, AItemStyleLookup); - end; - - jtArray: - begin - LItem.Text := LField.Name + ': [] ' + LField.GetTypeAsString; - if (LField as TStubArrayField).ContainedType = jtObject then - begin - InternalVisualize(LItem, (LField as TStubArrayField).FieldClass, AItemStyleLookup); - end; - end; - + JsonString := (aJsonValue as TJSONString); + if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then + Result := jtDateTime + else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then + Result := jtDate + else if TryStrToBool(JsonString.Value, b) then + begin + if b then + Result := jtTrue else - begin - LItem.Text := LField.Name + ': ' + LField.GetTypeAsString; - end; - end; - - ATreeViewItem.AddObject(LItem); - - end; + Result := jtFalse + end + else + Result := jtString + end + else + Result := jtUnknown; end; -procedure TPkgJsonMapper.Parse(AJsonString: string; ARootClassName: string); +function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; var - LJsonValue, - LJsonValue2: TJSONValue; - LJsonType: TJsonType; - LClass: TStubClass; + JSONValue, JsonValue2: TJsonValue; + JsonType: TJsonType; + StubClass: TStubClass; begin + Result := Self; + FStubClasses.Clear; - ClearClasses; - - LJsonValue := TJSONObject.ParseJSONValue(AJsonString); - if LJsonValue <> nil then + JSONValue := TJSONObject.ParseJSONValue(aJsonString); + if JSONValue <> nil then begin try - FRootClass := TStubClass.Create(nil, ARootClassName, self); + FRootClass := TStubClass.Create(nil, FClassName, Self); - case GetJsonType(LJsonValue) of + case GetJsonType(JSONValue) of jtObject: - begin - ProcessJsonObject(LJsonValue, FRootClass); - end; + ProcessJsonObject(JSONValue, FRootClass); jtArray: - begin - LJsonType := jtUnknown; - LClass := nil; - - LJsonValue2 := GetFirstArrayItem(LJsonValue); - if LJsonValue2 <> nil then begin - LJsonType := GetJsonType(LJsonValue2); - LClass := TStubClass.Create(FRootClass, 'Item', self); - end; + JsonType := jtUnknown; + StubClass := nil; - FRootClass.ArrayProperty := 'Items'; - TStubArrayField.Create(FRootClass, 'Items', LJsonType, LClass); - ProcessJsonObject(LJsonValue2, LClass); - end; + JsonValue2 := GetFirstArrayItem(JSONValue); + if JsonValue2 <> nil then + begin + JsonType := GetJsonType(JsonValue2); + StubClass := TStubClass.Create(FRootClass, 'Item', Self); + end; + + FRootClass.ArrayProperty := 'Items'; + TStubArrayField.Create(FRootClass, 'Items', JsonType, StubClass); + ProcessJsonObject(JsonValue2, StubClass); + end; end; finally - LJsonValue.Free; + JSONValue.Free; end; end else raise EJsonMapper.Create('Unable to parse the JSON String!'); - - FTreeView.ExpandAll; end; -{ TVirtualClass } - -constructor TStubClass.Create(AParentClass: TStubClass; AClassName: string; AMapper: TPkgJsonMapper; AArrayProperty: string); +constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string); begin inherited Create; - FMapper := AMapper; - Name := AClassName; + FMapper := aMapper; + name := aClassName; - FItems := TList.Create; + FItems := TObjectList.Create; FComplexItems := TList.Create; FArrayItems := TList.Create; - FMapper.FClasses.Add(self); - FArrayProperty := AArrayProperty; + FMapper.FStubClasses.Add(Self); + FArrayProperty := aArrayProperty; - FParentClass := AParentClass; + FParentClass := aParentClass; - FComparison := - function(const Left, Right: TStubField): Integer + FComparison := function(const Left, Right: TStubField): Integer begin if Left.FName > Right.FName then - result := 1 + Result := 1 + else if Left.FName < Right.FName then + Result := -1 else - if Left.FName < Right.FName then - result := -1 - else - result := 0; - end; + Result := 0; + end; FComparer := TComparer.Construct(FComparison); - end; destructor TStubClass.Destroy; -var - LItem: TStubField; begin - - // ToArray is needed because stub field remove themselves from FItems - for LItem in FItems.ToArray do - begin - LItem.Free; - end; - FreeAndNil(FComplexItems); FreeAndNil(FItems); FreeAndNil(FArrayItems); @@ -623,89 +524,67 @@ destructor TStubClass.Destroy; function TStubClass.GetImplementationPart: string; var - LLines: TStringList; - LString: string; - LClassName: string; - LItem: TStubField; + Lines: TStringList; + ClassName: string; + StubField: TStubField; begin - LLines := TStringList.Create; + Lines := TStringList.Create; try - LClassName := format('%s', [FName]); - LLines.Add(''); - LLines.Add(format('{%s}', [LClassName])); - LLines.Add(''); - if FComplexItems.Count > 0 then + ClassName := Format('%s', [FName]); + + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin + Lines.AddFormat('{ %s }', [ClassName]); + Lines.Add(''); + end; - LLines.Add(format('constructor %s.Create;', [LClassName])); - LLines.Add('begin'); - LLines.Add(' inherited;'); + if FComplexItems.Count > 0 then + begin + Lines.Add(Format('constructor %s.Create;', [ClassName])); + Lines.Add('begin'); + Lines.Add(' inherited;'); - for LItem in FComplexItems do - begin - LString := format(' %s := %s.Create();', [LItem.FieldName, (LItem).GetTypeAsString]); - LLines.Add(LString); - end; + for StubField in FComplexItems do + Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, (StubField).GetTypeAsString]); - LLines.Add('end;'); - LLines.Add(''); + Lines.Add('end;'); + Lines.Add(''); end; - if (FComplexItems.Count > 0) OR (FArrayItems.Count > 0) then + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin - - LLines.Add(format('destructor %s.Destroy;', [LClassName])); + Lines.Add(Format('destructor %s.Destroy;', [ClassName])); if FArrayItems.Count > 0 then begin - LLines.Add('var'); - for LItem in FArrayItems do - begin - LString := format(' L%sItem: %s;', [LItem.FName, (LItem as TStubContainerField).FFieldClass.Name]); - LLines.Add(LString); - end; + Lines.Add('var'); + for StubField in FArrayItems do + Lines.AddFormat(' %sItem: %s;', [StubField.FName, (StubField as TStubContainerField).FFieldClass.Name]); end; - - LLines.Add('begin'); + Lines.Add('begin'); if FArrayItems.Count > 0 then begin - LLines.Add(''); - for LItem in FArrayItems do + for StubField in FArrayItems do begin - LLines.Add(format(' for L%sItem in %s do', [LItem.FName, LItem.FieldName])); - LLines.Add(format(' L%sItem.free;', [LItem.FName])); + Lines.AddFormat(' for %sItem in %s do', [StubField.FName, StubField.FieldName]); + Lines.AddFormat(' %sItem.Free;', [StubField.FName]); end; - LLines.Add(''); + Lines.Add(''); end; + for StubField in FComplexItems do + Lines.AddFormat(' %s.Free;', [StubField.FieldName]); - for LItem in FComplexItems do - begin - LString := format(' %s.free;', [LItem.FieldName]); - LLines.Add(LString); - end; - - LLines.Add(' inherited;'); - LLines.Add('end;') + Lines.Add(' inherited;'); + Lines.Add('end;') end; - LLines.Add(''); - LLines.Add(format('function %s.ToJsonString: string;', [LClassName])); - LLines.Add('begin'); - LLines.Add(' result := TJson.ObjectToJsonString(self);'); - LLines.Add('end;'); - - LLines.Add(''); - LLines.Add(format('class function %s.FromJsonString(AJsonString: string): %s;', [LClassName, LClassName])); - LLines.Add('begin'); - LLines.Add(format(' result := TJson.JsonToObject<%s>(AJsonString)', [LClassName])); - LLines.Add('end;'); - - result := LLines.Text; + Lines.TrailingLineBreak := False; + Result := Lines.Text; finally - LLines.Free; + Lines.Free; end; end; @@ -713,10 +592,8 @@ procedure TStubClass.SetName(const Value: string); var LName: string; begin - FPureClassName := String(Copy(Value, 1, 1)).ToUpper + Copy(Value, 2); - - LName := 'T' + FPureClassName + 'Class'; - + FPureClassName := string(Copy(Value, 1, 1)).ToUpper + Copy(Value, 2); + LName := 'T' + FPureClassName + 'DTO'; FName := FMapper.SuggestClassName(LName); end; @@ -730,127 +607,131 @@ procedure TStubClass.SortFields; FItems.Sort(FComparer); end; -function TStubClass.GetDeclarationPart: string; +function TStubClass.GetDeclarationPart(const BaseClass: string): string; var - LLines: TStringList; - LString: string; - LItem: TStubField; + Lines: TStringList; + s: string; + StubField: TStubField; + i: Integer; begin - LLines := TStringList.Create; + Lines := TStringList.Create; try - LLines.Add(''); - LLines.Add(FName + ' = class'); - LLines.Add('private'); + Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); + Lines.Add('strict private'); - for LItem in FItems do + for StubField in FItems do begin - LString := format(' %s: %s;', [LItem.FieldName, LItem.GetTypeAsString]); - LLines.Add(LString); + s := Format(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); + Lines.Add(s); end; - LLines.Add('public'); + Lines.Add('published'); - for LItem in FItems do + for StubField in FItems do begin - if (LItem.FieldType = jtUnknown) OR ((LItem is TStubContainerField) AND ((LItem as TStubContainerField).ContainedType = jtUnknown)) then - raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [LItem.PropertyName]); + if (StubField.FieldType = jtUnknown) or ((StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = jtUnknown)) then + raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [StubField.PropertyName]); - LString := format(' property %s: %s read %s write %s;', [LItem.PropertyName, LItem.GetTypeAsString, LItem.FieldName, LItem.FieldName]); - LLines.Add(LString); + s := Format(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.GetTypeAsString, StubField.FieldName, StubField.FieldName]); + Lines.Add(s); end; + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + Lines.Add('public'); + if FComplexItems.Count > 0 then - begin - LLines.Add(' constructor Create;'); - end; + Lines.Add(' constructor Create;'); - if (FComplexItems.Count > 0) OR (FArrayItems.Count > 0) then - begin - LLines.Add(' destructor Destroy; override;'); - end; + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + Lines.Add(' destructor Destroy; override;'); - LLines.Add(' function ToJsonString: string;'); - LLines.Add(format(' class function FromJsonString(AJsonString: string): %s;', [FName])); + Lines.Add('end;'); + Lines.Add(''); - LLines.Add('end;'); + for i := 0 to Lines.Count - 1 do + Lines[i] := ' ' + Lines[i]; - result := LLines.Text; + Result := Lines.Text; finally - LLines.Free; + Lines.Free; end; end; { TVirtualClassItemBase } -constructor TStubField.Create(AParentClass: TStubClass; AItemName: string; AFieldType: TJsonType); +constructor TStubField.Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); begin inherited Create; - if AItemName.Contains('-') then - raise EJsonMapper.CreateFmt('%s: Hyphens are not allowed!', [AItemName]); + if aItemName.Contains('-') then + raise EJsonMapper.CreateFmt('%s: Hyphens are not allowed!', [aItemName]); - FParentClass := AParentClass; - FFieldType := AFieldType; - Name := AItemName; + FParentClass := aParentClass; + FFieldType := aFieldType; - if FParentClass <> nil then - FParentClass.FItems.Add(self); -end; + aItemName[1] := aItemName.ToUpper[1]; + name := aItemName; -destructor TStubField.Destroy; -begin if FParentClass <> nil then - FParentClass.FItems.Remove(self); - inherited; + FParentClass.FItems.Add(Self); end; class function TStubField.GetTypeAsString(AType: TJsonType): string; begin case AType of - jtUnknown: result := 'Unknown'; - jtString: result := 'String'; - jtTrue, - jtFalse: result := 'Boolean'; - jtNumber: result := 'Extended'; - jtDate: result := 'TDate'; - jtDateTime: result := 'TDateTime'; - jtBytes: result := 'Byte'; + jtUnknown: + Result := 'Unknown'; + jtString: + Result := 'String'; + jtTrue, jtFalse: + Result := 'Boolean'; + jtNumber: + Result := 'Double'; + jtDate: + Result := 'TDate'; + jtDateTime: + Result := 'TDateTime'; + jtBytes: + Result := 'Byte'; + jtInteger: + Result := 'Integer'; + jtInteger64: + Result := 'Int64'; end; end; procedure TStubField.SetName(const Value: string); begin - - if (FParentClass.FArrayProperty <> '') AND (FParentClass.FArrayProperty = FName) then + if (FParentClass.FArrayProperty <> '') and (FParentClass.FArrayProperty = FName) then FParentClass.FArrayProperty := Value; FName := Value; - FFieldName := 'F' + String(Copy(Value, 1, 1)).ToUpper + Copy(Value, 2); + FFieldName := 'F' + string(Copy(Value, 1, 1)).ToUpper + Copy(Value, 2); if ReservedWords.Contains(Value.ToLower) then FPropertyName := '&' + Value else FPropertyName := Value; - - + FFieldName := CapitaiazeFirst(FFieldName); + FPropertyName := CapitaiazeFirst(FPropertyName); end; function TStubField.GetTypeAsString: string; begin - result := GetTypeAsString(FFieldType); + Result := GetTypeAsString(FFieldType); end; { TArrayItem } -constructor TStubArrayField.Create(AClass: TStubClass; AItemName: string; AItemSubType: TJsonType; AItemClass: TStubClass); +constructor TStubArrayField.Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); begin - inherited Create(AClass, AItemName, jtArray); - FContainedType := AItemSubType; - FFieldClass := AItemClass; + inherited Create(aClass, aItemName, jtArray); + FContainedType := aItemSubType; + FFieldClass := aItemClass; if FContainedType = TJsonType.jtObject then - AClass.FArrayItems.Add(self); + aClass.FArrayItems.Add(Self); end; function TStubArrayField.GetTypeAsString: string; @@ -858,51 +739,49 @@ function TStubArrayField.GetTypeAsString: string; LSubType: string; begin case FContainedType of - jtObject: LSubType := FFieldClass.Name; - jtArray: raise EJsonMapper.Create('Nested arrays are not supported!'); - else - LSubType := GetTypeAsString(FContainedType); + jtObject: + LSubType := FFieldClass.Name; + jtArray: + raise EJsonMapper.Create('Nested arrays are not supported!'); + else + LSubType := GetTypeAsString(FContainedType); end; - result := format('TArray<%s>', [LSubType]); + Result := Format('TArray<%s>', [LSubType]); end; { TStubObjectField } -constructor TStubObjectField.Create(AParentClass: TStubClass; AItemName: string; AItemClass: TStubClass); +constructor TStubObjectField.Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); begin - inherited Create(AParentClass, AItemName, jtObject); - FFieldClass := AItemClass; - AParentClass.FComplexItems.Add(self); + inherited Create(aParentClass, aItemName, jtObject); + FFieldClass := aItemClass; + aParentClass.FComplexItems.Add(Self); FContainedType := jtObject; end; function TStubObjectField.GetTypeAsString: string; begin - result := FFieldClass.Name; + Result := FFieldClass.Name; end; initialization - PointDsFormatSettings := TFormatSettings.Create(); - PointDsFormatSettings.DecimalSeparator := '.'; - - ReservedWords := TList.Create; - ReservedWords.Add('type'); - ReservedWords.Add('for'); - ReservedWords.Add('var'); - ReservedWords.Add('begin'); - ReservedWords.Add('end'); - ReservedWords.Add('function'); - ReservedWords.Add('procedure'); - ReservedWords.Add('class'); - ReservedWords.Add('record'); - ReservedWords.Add('string'); - ReservedWords.Add('initialization'); - ReservedWords.Add('finalization'); - +ReservedWords := TList.Create; +ReservedWords.Add('type'); +ReservedWords.Add('for'); +ReservedWords.Add('var'); +ReservedWords.Add('begin'); +ReservedWords.Add('end'); +ReservedWords.Add('function'); +ReservedWords.Add('procedure'); +ReservedWords.Add('class'); +ReservedWords.Add('record'); +ReservedWords.Add('string'); +ReservedWords.Add('initialization'); +ReservedWords.Add('finalization'); finalization - FreeAndNil(ReservedWords); +FreeAndNil(ReservedWords); end. diff --git a/Pkg.Json.Visualizer.pas b/Pkg.Json.Visualizer.pas new file mode 100644 index 0000000..cf5af8c --- /dev/null +++ b/Pkg.Json.Visualizer.pas @@ -0,0 +1,139 @@ +unit Pkg.Json.Visualizer; + +interface + +uses + FMX.TreeView, + + Pkg.Json.Mapper; + +Type + JsonVisualizer = class + private + class procedure InternalFormatTreeViewFields(AItem: TTreeViewItem); + class procedure FormatFields(aTreeView: TTreeView); + class procedure InternalVisualize(aTreeViewItem: TTreeViewItem; aClass: TStubClass; AItemStyleLookup: string); + + public + // Visualizes stub class structure in a treeview + class procedure Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aJsonString: string); overload; + class procedure Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aMapper: TPkgJsonMapper); overload; + end; + +implementation + +uses + System.Sysutils; + +{ TJsonVisualizer } + +class procedure JsonVisualizer.Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aJsonString: string); +var + JsonMapper: TPkgJsonMapper; +begin + JsonMapper := TPkgJsonMapper.Create; + try + JsonMapper.Parse(aJsonString); + Visualize(aTreeView, AItemStyleLookup, JsonMapper); + finally + JsonMapper.Free; + end; + +end; + +class procedure JsonVisualizer.FormatFields(aTreeView: TTreeView); +begin + if aTreeView.Count = 1 then + InternalFormatTreeViewFields(aTreeView.Items[0]); +end; + +class procedure JsonVisualizer.InternalFormatTreeViewFields(AItem: TTreeViewItem); +var + LItem: TTreeViewItem; + k: Integer; + LSize, LPos: Integer; +begin + LSize := 0; + + // Find max len + for k := 0 to AItem.Count - 1 do + begin + LItem := AItem.Items[k]; + LPos := Pos(':', LItem.Text); + if (LPos > 0) AND (LPos > LSize) then + LSize := LPos; + end; + + for k := 0 to AItem.Count - 1 do + begin + LItem := AItem.Items[k]; + LPos := LSize - Pos(':', LItem.Text); + if (LPos > 0) then + LItem.Text := LItem.Text.Replace(':', StringOfChar(' ', LPos) + ':'); + + InternalFormatTreeViewFields(LItem); + end; + +end; + +class procedure JsonVisualizer.InternalVisualize(aTreeViewItem: TTreeViewItem; aClass: TStubClass; AItemStyleLookup: string); +var + StubField: TStubField; + TreeViewItem: TTreeViewItem; +begin + for StubField in aClass.Items do + begin + TreeViewItem := TTreeViewItem.Create(aTreeViewItem); + TreeViewItem.StyleLookup := AItemStyleLookup; + TreeViewItem.TagObject := StubField; + TreeViewItem.WordWrap := false; + + case StubField.FieldType of + jtObject: + begin + TreeViewItem.Text := StubField.Name + ': {} ' + StubField.GetTypeAsString; + InternalVisualize(TreeViewItem, (StubField as TStubObjectField).FieldClass, AItemStyleLookup); + end; + + jtArray: + begin + TreeViewItem.Text := StubField.Name + ': [] ' + StubField.GetTypeAsString; + if (StubField as TStubArrayField).ContainedType = jtObject then + InternalVisualize(TreeViewItem, (StubField as TStubArrayField).FieldClass, AItemStyleLookup); + end; + + else + TreeViewItem.Text := StubField.Name + ': ' + StubField.GetTypeAsString; + end; + + aTreeViewItem.AddObject(TreeViewItem); + end; +end; + +class procedure JsonVisualizer.Visualize(aTreeView: TTreeView; AItemStyleLookup: string; aMapper: TPkgJsonMapper); +var + TreeViewItem: TTreeViewItem; + RootClass: TStubClass; +begin + aTreeView.Clear; + try + RootClass := aMapper.RootClass; + if RootClass = nil then + exit; + + aTreeView.BeginUpdate; + TreeViewItem := TTreeViewItem.Create(aTreeView); + TreeViewItem.Text := RootClass.Name; + TreeViewItem.TagObject := RootClass; + TreeViewItem.WordWrap := false; + aTreeView.AddObject(TreeViewItem); + InternalVisualize(TreeViewItem, RootClass, AItemStyleLookup); + FormatFields(aTreeView); + finally + aTreeView.ExpandAll; + aTreeView.EndUpdate; + end; + +end; + +end. diff --git a/RootUnit.pas b/RootUnit.pas new file mode 100644 index 0000000..e098755 --- /dev/null +++ b/RootUnit.pas @@ -0,0 +1,174 @@ +unit RootUnit; + +interface + +uses + Generics.Collections, Rest.Json; + +{$M+} + +type + + TProductsDTO = class + strict private + FActivationDate: String; + FCampaignPrice: Extended; + FDiscountCode: String; + FFrame: String; + FGlassType: String; + FInsurance: String; + FLeftGlass: String; + FOpusNr: String; + FReason: String; + FRightGlass: String; + FSalesPrice: Extended; + FState: String; + FSubscriptionPrice: Extended; + published + property ActivationDate: String read FActivationDate write FActivationDate; + property CampaignPrice: Extended read FCampaignPrice write FCampaignPrice; + property DiscountCode: String read FDiscountCode write FDiscountCode; + property Frame: String read FFrame write FFrame; + property GlassType: String read FGlassType write FGlassType; + property Insurance: String read FInsurance write FInsurance; + property LeftGlass: String read FLeftGlass write FLeftGlass; + property OpusNr: String read FOpusNr write FOpusNr; + property Reason: String read FReason write FReason; + property RightGlass: String read FRightGlass write FRightGlass; + property SalesPrice: Extended read FSalesPrice write FSalesPrice; + property State: String read FState write FState; + property SubscriptionPrice: Extended read FSubscriptionPrice write FSubscriptionPrice; + public + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TProductsDTO; + end; + + TSubscriptionsDTO = class + strict private + FCountryCode: String; + FCreatedDate: String; + FCustomerId: String; + FEarliestSubscriptionEndDate: String; + FPOSUserId: String; + FProducts: TArray; + FShopNumber: String; + FSubscriptionId: String; + FSubscriptionStartDate: String; + FSubscriptionState: String; + published + property CountryCode: String read FCountryCode write FCountryCode; + property CreatedDate: String read FCreatedDate write FCreatedDate; + property CustomerId: String read FCustomerId write FCustomerId; + property EarliestSubscriptionEndDate: String read FEarliestSubscriptionEndDate write FEarliestSubscriptionEndDate; + property POSUserId: String read FPOSUserId write FPOSUserId; + property Products: TArray read FProducts write FProducts; + property ShopNumber: String read FShopNumber write FShopNumber; + property SubscriptionId: String read FSubscriptionId write FSubscriptionId; + property SubscriptionStartDate: String read FSubscriptionStartDate write FSubscriptionStartDate; + property SubscriptionState: String read FSubscriptionState write FSubscriptionState; + public + destructor Destroy; override; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TSubscriptionsDTO; + end; + + TRootDTO = class + strict private + FCode: Extended; + FMessage: String; + FSubscriptions: TArray; + private + function GetAsJson: string; + procedure SetAsJson(const Value: string); + published + property Code: Extended read FCode write FCode; + property Message: String read FMessage write FMessage; + property Subscriptions: TArray read FSubscriptions write FSubscriptions; + public + destructor Destroy; override; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TRootDTO; + + property AsJson: string read GetAsJson write SetAsJson; + end; + +implementation + +uses + System.Json; +{ TProductsDTO } + +function TProductsDTO.ToJsonString: string; +begin + Result := TJson.ObjectToJsonString(Self); +end; + +class function TProductsDTO.FromJsonString(AJsonString: string): TProductsDTO; +begin + Result := TJson.JsonToObject(AJsonString) +end; + +{ TSubscriptionsDTO } + +destructor TSubscriptionsDTO.Destroy; +var + LProductsItem: TProductsDTO; +begin + + for LProductsItem in FProducts do + LProductsItem.Free; + + inherited; +end; + +function TSubscriptionsDTO.ToJsonString: string; +begin + Result := TJson.ObjectToJsonString(Self); +end; + +class function TSubscriptionsDTO.FromJsonString(AJsonString: string): TSubscriptionsDTO; +begin + Result := TJson.JsonToObject(AJsonString) +end; + +{ TRootDTO } + +destructor TRootDTO.Destroy; +var + LSubscriptionsItem: TSubscriptionsDTO; +begin + + for LSubscriptionsItem in FSubscriptions do + LSubscriptionsItem.Free; + + inherited; +end; + +function TRootDTO.ToJsonString: string; +begin + Result := TJson.ObjectToJsonString(Self); +end; + +class function TRootDTO.FromJsonString(AJsonString: string): TRootDTO; +begin + Result := TJson.JsonToObject(AJsonString) +end; + +function TRootDTO.GetAsJson: string; +begin + Result := TJson.ObjectToJsonString(Self); +end; + +procedure TRootDTO.SetAsJson(const Value: string); +var + LJSONValue: TJSONValue; +begin + LJSONValue := TJSONObject.ParseJSONValue(Value); + try + TJson.JsonToObject(Self, LJSONValue); + finally + LJSONValue.Free; + end; +end; + +end. diff --git a/Win32/Debug/Pkg.Json.DTO.pas b/Win32/Debug/Pkg.Json.DTO.pas new file mode 100644 index 0000000..4193f90 --- /dev/null +++ b/Win32/Debug/Pkg.Json.DTO.pas @@ -0,0 +1,71 @@ +unit Pkg.Json.DTO; + +interface + +uses + Rest.Json; + +type + TJsonDTO = class + private + FOptions: TJsonOptions; + function GetAsJson: string; + procedure SetAsJson(const Value: string); + public + constructor Create; overload; + constructor Create(const aJson: string; AOptions: TJsonOptions = [joDateIsUTC, joDateFormatISO8601]); overload; + property AsJson: string read GetAsJson write SetAsJson; + end; + +implementation + +uses + System.Json, System.Sysutils, Rest.JsonReflect, System.JSONConsts; + +{ TJsonDTO } + +constructor TJsonDTO.Create(const aJson: string; AOptions: TJsonOptions); +begin + inherited Create; + FOptions := AOptions; + AsJson := aJson; +end; + +constructor TJsonDTO.Create; +begin + inherited; + FOptions := [joDateIsUTC, joDateFormatISO8601]; +end; + +function TJsonDTO.GetAsJson: string; +begin + Result := TJson.ObjectToJsonString(Self, FOptions); +end; + +procedure TJsonDTO.SetAsJson(const Value: string); +var + LJson: string; + LJSONValue: TJSONValue; + LJSONObject: TJSONObject; +begin + LJSONValue := TJSONObject.ParseJSONValue(Value); + try + if Assigned(LJSONValue) and (LJSONValue is TJSONObject) then + LJSONObject := LJSONValue as TJSONObject + else + begin + LJson := Value.Trim; + if (LJson = '') and not Assigned(LJSONValue) or (LJson <> '') and Assigned(LJSONValue) and LJSONValue.Null then + Exit + else + raise EConversionError.Create(SCannotCreateObject); + end; + + TJson.JsonToObject(Self, LJSONObject, FOptions); + + finally + LJSONValue.Free; + end; +end; + +end. diff --git a/Win32/Debug/Project38.dpr b/Win32/Debug/Project38.dpr new file mode 100644 index 0000000..04c2d6b --- /dev/null +++ b/Win32/Debug/Project38.dpr @@ -0,0 +1,16 @@ +program Project38; + +uses + Vcl.Forms, + Unit38 in 'Unit38.pas' {Form38}, + Root in 'Root.pas', + Pkg.Json.DTO in 'Pkg.Json.DTO.pas'; + +{$R *.res} + +begin + Application.Initialize; + Application.MainFormOnTaskbar := True; + Application.CreateForm(TForm38, Form38); + Application.Run; +end. diff --git a/Win32/Debug/Project38.dproj b/Win32/Debug/Project38.dproj new file mode 100644 index 0000000..cd70f88 --- /dev/null +++ b/Win32/Debug/Project38.dproj @@ -0,0 +1,843 @@ + + + {1300D295-9935-41DA-98C8-36A156A06F11} + 18.7 + VCL + Project38.dpr + True + Debug + Win32 + 1 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\bin\delphi_PROJECTICON.ico + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + Project38 + + + DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;rbBDE2026;rbRAP2026;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;rbRest2026;FireDACMSSQLDriver;vcltouch;vcldb;svn;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPDFViewerRS26;dxPsPrVwAdvRS26;vclx;dxPScxTLLnkRS26;rbRIDE2026;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;rbRCL2026;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dclRBE2026;dxFireDACServerModeRS26;bindcompdbx;dclRBFireDAC2026;IndyIPServer;DBXSybaseASEDriver;cxPivotGridRS26;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;rbADO2026;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;rbTCUI2026;dclRBDBE2026;emshosting;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;rbUSERDesign2026;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;rbFireDAC2026;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;svnui;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;rbDBE2026;bindcompfmx;DBXOracleDriver;inetdb;rbDB2026;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;rbTC2026;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;rbCIDE2026;rbDIDE2026;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;dxPSRichEditControlLnkRS26;FireDACASADriver;cxPivotGridChartRS26;rbRTL2026;dxPSDBTeeChartRS26;Tee;DataSnapServer;rbDAD2026;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;rbUSER2026;dclRBADO2026;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;rbIDE2026;fmxase;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(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 + $(BDS)\bin\default_app.manifest + + + DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;FireDACMSSQLDriver;vcltouch;vcldb;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPDFViewerRS26;dxPsPrVwAdvRS26;vclx;dxPScxTLLnkRS26;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dxFireDACServerModeRS26;bindcompdbx;IndyIPServer;DBXSybaseASEDriver;cxPivotGridRS26;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;DBXOracleDriver;inetdb;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;dxPSRichEditControlLnkRS26;FireDACASADriver;cxPivotGridChartRS26;dxPSDBTeeChartRS26;Tee;DataSnapServer;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;fmxase;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + true + PerMonitorV2 + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + true + PerMonitorV2 + + + + MainSource + + +
Form38
+ dfm +
+ + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + +
+ + Delphi.Personality.12 + Application + + + + Project38.dpr + + + + + + Project38.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + + + res\xml + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + library\lib\armeabi + 1 + + + + + library\lib\mips + 1 + + + + + library\lib\armeabi-v7a + 1 + + + + + res\drawable + 1 + + + + + res\values + 1 + + + + + res\values-v21 + 1 + + + + + res\values + 1 + + + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-ldpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-mdpi + 1 + + + + + res\drawable-hdpi + 1 + + + + + res\drawable-xhdpi + 1 + + + + + res\drawable-xxhdpi + 1 + + + + + res\drawable-xxxhdpi + 1 + + + + + res\drawable-small + 1 + + + + + res\drawable-normal + 1 + + + + + res\drawable-large + 1 + + + + + res\drawable-xlarge + 1 + + + + + res\values + 1 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + True + False + + + 12 + + + + +
diff --git a/Win32/Debug/Project38.res b/Win32/Debug/Project38.res new file mode 100644 index 0000000000000000000000000000000000000000..23497de5f7cc857f26ab67b71bc721c4ee5fb91d GIT binary patch literal 59520 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 literal 0 HcmV?d00001 diff --git a/Win32/Debug/Root.pas b/Win32/Debug/Root.pas new file mode 100644 index 0000000..ab574cd --- /dev/null +++ b/Win32/Debug/Root.pas @@ -0,0 +1,218 @@ +unit Root; + +interface + +uses + Pkg.Json.DTO; + +{$M+} + +type + TUploaderDTO = class + strict private + FAvatar_Url: String; + FEvents_Url: String; + FFollowers_Url: String; + FFollowing_Url: String; + FGists_Url: String; + FGravatar_Id: String; + FHtml_Url: String; + FId: Integer; + FLogin: String; + FOrganizations_Url: String; + FReceived_Events_Url: String; + FRepos_Url: String; + FSite_Admin: Boolean; + FStarred_Url: String; + FSubscriptions_Url: String; + FType: String; + FUrl: String; + published + property Avatar_Url: String read FAvatar_Url write FAvatar_Url; + property Events_Url: String read FEvents_Url write FEvents_Url; + property Followers_Url: String read FFollowers_Url write FFollowers_Url; + property Following_Url: String read FFollowing_Url write FFollowing_Url; + property Gists_Url: String read FGists_Url write FGists_Url; + property Gravatar_Id: String read FGravatar_Id write FGravatar_Id; + property Html_Url: String read FHtml_Url write FHtml_Url; + property Id: Integer read FId write FId; + property Login: String read FLogin write FLogin; + property Organizations_Url: String read FOrganizations_Url write FOrganizations_Url; + property Received_Events_Url: String read FReceived_Events_Url write FReceived_Events_Url; + property Repos_Url: String read FRepos_Url write FRepos_Url; + property Site_Admin: Boolean read FSite_Admin write FSite_Admin; + property Starred_Url: String read FStarred_Url write FStarred_Url; + property Subscriptions_Url: String read FSubscriptions_Url write FSubscriptions_Url; + property &Type: String read FType write FType; + property Url: String read FUrl write FUrl; + end; + + TAssetsDTO = class + strict private + FBrowser_Download_Url: String; + FContent_Type: String; + FCreated_At: String; + FDownload_Count: Integer; + FId: Integer; + FName: String; + FSize: Integer; + FState: String; + FUpdated_At: String; + FUploader: TUploaderDTO; + FUrl: String; + published + property Browser_Download_Url: String read FBrowser_Download_Url write FBrowser_Download_Url; + property Content_Type: String read FContent_Type write FContent_Type; + property Created_At: String read FCreated_At write FCreated_At; + property Download_Count: Integer read FDownload_Count write FDownload_Count; + property Id: Integer read FId write FId; + property Name: String read FName write FName; + property Size: Integer read FSize write FSize; + property State: String read FState write FState; + property Updated_At: String read FUpdated_At write FUpdated_At; + property Uploader: TUploaderDTO read FUploader write FUploader; + property Url: String read FUrl write FUrl; + public + constructor Create; + destructor Destroy; override; + end; + + TAuthorDTO = class + strict private + FAvatar_Url: String; + FEvents_Url: String; + FFollowers_Url: String; + FFollowing_Url: String; + FGists_Url: String; + FGravatar_Id: String; + FHtml_Url: String; + FId: Integer; + FLogin: String; + FOrganizations_Url: String; + FReceived_Events_Url: String; + FRepos_Url: String; + FSite_Admin: Boolean; + FStarred_Url: String; + FSubscriptions_Url: String; + FType: String; + FUrl: String; + published + property Avatar_Url: String read FAvatar_Url write FAvatar_Url; + property Events_Url: String read FEvents_Url write FEvents_Url; + property Followers_Url: String read FFollowers_Url write FFollowers_Url; + property Following_Url: String read FFollowing_Url write FFollowing_Url; + property Gists_Url: String read FGists_Url write FGists_Url; + property Gravatar_Id: String read FGravatar_Id write FGravatar_Id; + property Html_Url: String read FHtml_Url write FHtml_Url; + property Id: Integer read FId write FId; + property Login: String read FLogin write FLogin; + property Organizations_Url: String read FOrganizations_Url write FOrganizations_Url; + property Received_Events_Url: String read FReceived_Events_Url write FReceived_Events_Url; + property Repos_Url: String read FRepos_Url write FRepos_Url; + property Site_Admin: Boolean read FSite_Admin write FSite_Admin; + property Starred_Url: String read FStarred_Url write FStarred_Url; + property Subscriptions_Url: String read FSubscriptions_Url write FSubscriptions_Url; + property &Type: String read FType write FType; + property Url: String read FUrl write FUrl; + end; + + TItemDTO = class + strict private + FAssets: TArray; + FAssets_Url: String; + FAuthor: TAuthorDTO; + FBody: String; + FCreated_At: String; + FDraft: Boolean; + FHtml_Url: String; + FId: Integer; + FName: String; + FPrerelease: Boolean; + FPublished_At: String; + FTag_Name: String; + FTarball_Url: String; + FTarget_Commitish: String; + FUpload_Url: String; + FUrl: String; + FZipball_Url: String; + published + property Assets: TArray read FAssets write FAssets; + property Assets_Url: String read FAssets_Url write FAssets_Url; + property Author: TAuthorDTO read FAuthor write FAuthor; + property Body: String read FBody write FBody; + property Created_At: String read FCreated_At write FCreated_At; + property Draft: Boolean read FDraft write FDraft; + property Html_Url: String read FHtml_Url write FHtml_Url; + property Id: Integer read FId write FId; + property Name: String read FName write FName; + property Prerelease: Boolean read FPrerelease write FPrerelease; + property Published_At: String read FPublished_At write FPublished_At; + property Tag_Name: String read FTag_Name write FTag_Name; + property Tarball_Url: String read FTarball_Url write FTarball_Url; + property Target_Commitish: String read FTarget_Commitish write FTarget_Commitish; + property Upload_Url: String read FUpload_Url write FUpload_Url; + property Url: String read FUrl write FUrl; + property Zipball_Url: String read FZipball_Url write FZipball_Url; + public + constructor Create; + destructor Destroy; override; + end; + + TRootDTO = class(TJsonDTO) + strict private + FItems: TArray; + published + property Items: TArray read FItems write FItems; + public + destructor Destroy; override; + end; + +implementation + +{ TAssetsDTO } + +constructor TAssetsDTO.Create; +begin + inherited; + FUploader := TUploaderDTO.Create; +end; + +destructor TAssetsDTO.Destroy; +begin + FUploader.Free; + inherited; +end; + +{ TItemDTO } + +constructor TItemDTO.Create; +begin + inherited; + FAuthor := TAuthorDTO.Create; +end; + +destructor TItemDTO.Destroy; +var + AssetsItem: TAssetsDTO; +begin + for AssetsItem in FAssets do + AssetsItem.Free; + + FAuthor.Free; + inherited; +end; + +{ TRootDTO } + +destructor TRootDTO.Destroy; +var + ItemsItem: TItemDTO; +begin + for ItemsItem in FItems do + ItemsItem.Free; + + inherited; +end; + +end. + diff --git a/Win32/Debug/Unit38.dfm b/Win32/Debug/Unit38.dfm new file mode 100644 index 0000000..6e4b6ca --- /dev/null +++ b/Win32/Debug/Unit38.dfm @@ -0,0 +1,25 @@ +object Form38: TForm38 + Left = 0 + Top = 0 + Caption = 'Form38' + ClientHeight = 411 + ClientWidth = 852 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + OldCreateOrder = False + PixelsPerInch = 96 + TextHeight = 13 + object Button1: TButton + Left = 400 + Top = 216 + Width = 75 + Height = 25 + Caption = 'Button1' + TabOrder = 0 + OnClick = Button1Click + end +end diff --git a/Win32/Debug/Unit38.pas b/Win32/Debug/Unit38.pas new file mode 100644 index 0000000..1f8d7fa --- /dev/null +++ b/Win32/Debug/Unit38.pas @@ -0,0 +1,51 @@ +unit Unit38; + +interface + +uses + Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, + Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; + +type + TForm38 = class(TForm) + Button1: TButton; + procedure Button1Click(Sender: TObject); + private + { Private declarations } + public + { Public declarations } + end; + +var + Form38: TForm38; + +implementation + +{$R *.dfm} + +uses + Rest.Json, + Root; + +procedure TForm38.Button1Click(Sender: TObject); + +begin + + with TStringList.Create do + try + LoadFromFile('C:\aa\Text.json'); + + with TJson.JsonToObject(Text) do +// with TRootClass.FromJsonString(Text) do + try + Caption := Items[0].Assets[0].Browser_download_url; + finally + Free; + end; + finally + Free; + end; + +end; + +end. diff --git a/uGitHub.pas b/uGitHub.pas index ac2b26e..301ea87 100644 --- a/uGitHub.pas +++ b/uGitHub.pas @@ -1,228 +1,226 @@ unit uGitHub; -// ************************************************* -// Generated By: JsonToDelphiClass - 0.64 -// Generated On: 2015-01-03 15:32:27 -// ************************************************* -// Created By : Petar Georgiev - 2014 -// Web Site : http://pgeorgiev.com -// ************************************************* +// ************************************************* +// Generated By: JsonToDelphiClass - 0.64 +// Generated On: 2015-01-03 15:32:27 +// ************************************************* +// Created By : Petar Georgiev - 2014 +// Web Site : http://pgeorgiev.com +// ************************************************* interface uses Generics.Collections, Rest.Json, IdUri, IdHttp, - IdSSLOpenSSL, System.JSON, SysUtils, Classes; + IdSSLOpenSSL, System.Json, SysUtils, Classes; type -// Represents a serializable object with HTTP/REST capabilities (via Indy) -// HTTPS connections require OpenSSL binaries! -// Use the "AOnBeforeRequest" event to setup HTTP client's parameters like timeout, encoding etc. -// -TUGitHubSerializableObject = class abstract -protected - // As per http://www.restapitutorial.com/lessons/httpmethods.html - class procedure EnsureHttpResponseCode(AHttpResponseCode: integer; AUrl: string; AValidValues: array of integer); - class procedure EnsureHttpContentType(AHttp: TIdHttp); -public - // Generic Web Request method - class function WebRequest(AUrl: string; AOnRequest: TProc): integer; - // Returns an instance of T from a JSON string via GET request. AArrayProperty is intended for internal use only! - // HttpGet is reintroduced in descendant classes to return concrete instance - class function HttpGet - (AUrl: string; AOnBeforeRequest: TProc = nil; AArrayProperty: string = ''): T; - // Performs POST request, sends the current object as JSON string and returns server's response as text. - function HttpPost (AUrl: string; AOnBeforeRequest: TProc = nil): string; - // Performs PUT request, sends the current object as JSON string and returns server's response as text. - function HttpPut (AUrl: string; AOnBeforeRequest: TProc = nil): string; - // Performs DELETE request and returns server's response as text. This method exists just REST compliance. - function HttpDelete(AUrl: string; AOnBeforeRequest: TProc = nil): string; -end; + // Represents a serializable object with HTTP/REST capabilities (via Indy) + // HTTPS connections require OpenSSL binaries! + // Use the "AOnBeforeRequest" event to setup HTTP client's parameters like timeout, encoding etc. + // + TUGitHubSerializableObject = class abstract + protected + // As per http://www.restapitutorial.com/lessons/httpmethods.html + class procedure EnsureHttpResponseCode(AHttpResponseCode: integer; AUrl: string; AValidValues: array of integer); + class procedure EnsureHttpContentType(AHttp: TIdHttp); + public + // Generic Web Request method + class function WebRequest(AUrl: string; AOnRequest: TProc): integer; + // Returns an instance of T from a JSON string via GET request. AArrayProperty is intended for internal use only! + // HttpGet is reintroduced in descendant classes to return concrete instance + class function HttpGet(AUrl: string; AOnBeforeRequest: TProc = nil; AArrayProperty: string = ''): T; + // Performs POST request, sends the current object as JSON string and returns server's response as text. + function HttpPost(AUrl: string; AOnBeforeRequest: TProc = nil): string; + // Performs PUT request, sends the current object as JSON string and returns server's response as text. + function HttpPut(AUrl: string; AOnBeforeRequest: TProc = nil): string; + // Performs DELETE request and returns server's response as text. This method exists just REST compliance. + function HttpDelete(AUrl: string; AOnBeforeRequest: TProc = nil): string; + end; -TUploaderClass = class -private - FAvatar_url: String; - FEvents_url: String; - FFollowers_url: String; - FFollowing_url: String; - FGists_url: String; - FGravatar_id: String; - FHtml_url: String; - FId: Extended; - FLogin: String; - FOrganizations_url: String; - FReceived_events_url: String; - FRepos_url: String; - FSite_admin: Boolean; - FStarred_url: String; - FSubscriptions_url: String; - FType: String; - FUrl: String; -public - property avatar_url: String read FAvatar_url write FAvatar_url; - property events_url: String read FEvents_url write FEvents_url; - property followers_url: String read FFollowers_url write FFollowers_url; - property following_url: String read FFollowing_url write FFollowing_url; - property gists_url: String read FGists_url write FGists_url; - property gravatar_id: String read FGravatar_id write FGravatar_id; - property html_url: String read FHtml_url write FHtml_url; - property id: Extended read FId write FId; - property login: String read FLogin write FLogin; - property organizations_url: String read FOrganizations_url write FOrganizations_url; - property received_events_url: String read FReceived_events_url write FReceived_events_url; - property repos_url: String read FRepos_url write FRepos_url; - property site_admin: Boolean read FSite_admin write FSite_admin; - property starred_url: String read FStarred_url write FStarred_url; - property subscriptions_url: String read FSubscriptions_url write FSubscriptions_url; - property &type: String read FType write FType; - property url: String read FUrl write FUrl; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TUploaderClass; -end; + TUploaderClass = class + private + FAvatar_url: String; + FEvents_url: String; + FFollowers_url: String; + FFollowing_url: String; + FGists_url: String; + FGravatar_id: String; + FHtml_url: String; + FId: Extended; + FLogin: String; + FOrganizations_url: String; + FReceived_events_url: String; + FRepos_url: String; + FSite_admin: Boolean; + FStarred_url: String; + FSubscriptions_url: String; + FType: String; + FUrl: String; + public + property avatar_url: String read FAvatar_url write FAvatar_url; + property events_url: String read FEvents_url write FEvents_url; + property followers_url: String read FFollowers_url write FFollowers_url; + property following_url: String read FFollowing_url write FFollowing_url; + property gists_url: String read FGists_url write FGists_url; + property gravatar_id: String read FGravatar_id write FGravatar_id; + property html_url: String read FHtml_url write FHtml_url; + property id: Extended read FId write FId; + property login: String read FLogin write FLogin; + property organizations_url: String read FOrganizations_url write FOrganizations_url; + property received_events_url: String read FReceived_events_url write FReceived_events_url; + property repos_url: String read FRepos_url write FRepos_url; + property site_admin: Boolean read FSite_admin write FSite_admin; + property starred_url: String read FStarred_url write FStarred_url; + property subscriptions_url: String read FSubscriptions_url write FSubscriptions_url; + property &type: String read FType write FType; + property url: String read FUrl write FUrl; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TUploaderClass; + end; -TAssetsClass = class -private - FBrowser_download_url: String; - FContent_type: String; - FCreated_at: String; - FDownload_count: Extended; - FId: Extended; - FName: String; - FSize: Extended; - FState: String; - FUpdated_at: String; - FUploader: TUploaderClass; - FUrl: String; -public - property browser_download_url: String read FBrowser_download_url write FBrowser_download_url; - property content_type: String read FContent_type write FContent_type; - property created_at: String read FCreated_at write FCreated_at; - property download_count: Extended read FDownload_count write FDownload_count; - property id: Extended read FId write FId; - property name: String read FName write FName; - property size: Extended read FSize write FSize; - property state: String read FState write FState; - property updated_at: String read FUpdated_at write FUpdated_at; - property uploader: TUploaderClass read FUploader write FUploader; - property url: String read FUrl write FUrl; - constructor Create; - destructor Destroy; override; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TAssetsClass; -end; + TAssetsClass = class + private + FBrowser_download_url: String; + FContent_type: String; + FCreated_at: String; + FDownload_count: Extended; + FId: Extended; + FName: String; + FSize: Extended; + FState: String; + FUpdated_at: String; + FUploader: TUploaderClass; + FUrl: String; + public + property browser_download_url: String read FBrowser_download_url write FBrowser_download_url; + property content_type: String read FContent_type write FContent_type; + property created_at: String read FCreated_at write FCreated_at; + property download_count: Extended read FDownload_count write FDownload_count; + property id: Extended read FId write FId; + property name: String read FName write FName; + property size: Extended read FSize write FSize; + property state: String read FState write FState; + property updated_at: String read FUpdated_at write FUpdated_at; + property uploader: TUploaderClass read FUploader write FUploader; + property url: String read FUrl write FUrl; + constructor Create; + destructor Destroy; override; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TAssetsClass; + end; -TAuthorClass = class -private - FAvatar_url: String; - FEvents_url: String; - FFollowers_url: String; - FFollowing_url: String; - FGists_url: String; - FGravatar_id: String; - FHtml_url: String; - FId: Extended; - FLogin: String; - FOrganizations_url: String; - FReceived_events_url: String; - FRepos_url: String; - FSite_admin: Boolean; - FStarred_url: String; - FSubscriptions_url: String; - FType: String; - FUrl: String; -public - property avatar_url: String read FAvatar_url write FAvatar_url; - property events_url: String read FEvents_url write FEvents_url; - property followers_url: String read FFollowers_url write FFollowers_url; - property following_url: String read FFollowing_url write FFollowing_url; - property gists_url: String read FGists_url write FGists_url; - property gravatar_id: String read FGravatar_id write FGravatar_id; - property html_url: String read FHtml_url write FHtml_url; - property id: Extended read FId write FId; - property login: String read FLogin write FLogin; - property organizations_url: String read FOrganizations_url write FOrganizations_url; - property received_events_url: String read FReceived_events_url write FReceived_events_url; - property repos_url: String read FRepos_url write FRepos_url; - property site_admin: Boolean read FSite_admin write FSite_admin; - property starred_url: String read FStarred_url write FStarred_url; - property subscriptions_url: String read FSubscriptions_url write FSubscriptions_url; - property &type: String read FType write FType; - property url: String read FUrl write FUrl; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TAuthorClass; -end; + TAuthorClass = class + private + FAvatar_url: String; + FEvents_url: String; + FFollowers_url: String; + FFollowing_url: String; + FGists_url: String; + FGravatar_id: String; + FHtml_url: String; + FId: Extended; + FLogin: String; + FOrganizations_url: String; + FReceived_events_url: String; + FRepos_url: String; + FSite_admin: Boolean; + FStarred_url: String; + FSubscriptions_url: String; + FType: String; + FUrl: String; + public + property avatar_url: String read FAvatar_url write FAvatar_url; + property events_url: String read FEvents_url write FEvents_url; + property followers_url: String read FFollowers_url write FFollowers_url; + property following_url: String read FFollowing_url write FFollowing_url; + property gists_url: String read FGists_url write FGists_url; + property gravatar_id: String read FGravatar_id write FGravatar_id; + property html_url: String read FHtml_url write FHtml_url; + property id: Extended read FId write FId; + property login: String read FLogin write FLogin; + property organizations_url: String read FOrganizations_url write FOrganizations_url; + property received_events_url: String read FReceived_events_url write FReceived_events_url; + property repos_url: String read FRepos_url write FRepos_url; + property site_admin: Boolean read FSite_admin write FSite_admin; + property starred_url: String read FStarred_url write FStarred_url; + property subscriptions_url: String read FSubscriptions_url write FSubscriptions_url; + property &type: String read FType write FType; + property url: String read FUrl write FUrl; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TAuthorClass; + end; -TReleaseClass = class(TUGitHubSerializableObject) -private - FAssets: TArray; - FAssets_url: String; - FAuthor: TAuthorClass; - FBody: String; - FCreated_at: String; - FDraft: Boolean; - FHtml_url: String; - FId: Extended; - FName: String; - FPrerelease: Boolean; - FPublished_at: String; - FTag_name: String; - FTarball_url: String; - FTarget_commitish: String; - FUpload_url: String; - FUrl: String; - FZipball_url: String; -public - property assets: TArray read FAssets write FAssets; - property assets_url: String read FAssets_url write FAssets_url; - property author: TAuthorClass read FAuthor write FAuthor; - property body: String read FBody write FBody; - property created_at: String read FCreated_at write FCreated_at; - property draft: Boolean read FDraft write FDraft; - property html_url: String read FHtml_url write FHtml_url; - property id: Extended read FId write FId; - property name: String read FName write FName; - property prerelease: Boolean read FPrerelease write FPrerelease; - property published_at: String read FPublished_at write FPublished_at; - property tag_name: String read FTag_name write FTag_name; - property tarball_url: String read FTarball_url write FTarball_url; - property target_commitish: String read FTarget_commitish write FTarget_commitish; - property upload_url: String read FUpload_url write FUpload_url; - property url: String read FUrl write FUrl; - property zipball_url: String read FZipball_url write FZipball_url; - constructor Create; - destructor Destroy; override; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TReleaseClass; - class function HttpGet(AUrl: string; AOnBeforeRequest: TProc = nil): TReleaseClass; -end; + TReleaseClass = class(TUGitHubSerializableObject) + private + FAssets: TArray; + FAssets_url: String; + FAuthor: TAuthorClass; + FBody: String; + FCreated_at: String; + FDraft: Boolean; + FHtml_url: String; + FId: Extended; + FName: String; + FPrerelease: Boolean; + FPublished_at: String; + FTag_name: String; + FTarball_url: String; + FTarget_commitish: String; + FUpload_url: String; + FUrl: String; + FZipball_url: String; + public + property assets: TArray read FAssets write FAssets; + property assets_url: String read FAssets_url write FAssets_url; + property author: TAuthorClass read FAuthor write FAuthor; + property body: String read FBody write FBody; + property created_at: String read FCreated_at write FCreated_at; + property draft: Boolean read FDraft write FDraft; + property html_url: String read FHtml_url write FHtml_url; + property id: Extended read FId write FId; + property name: String read FName write FName; + property prerelease: Boolean read FPrerelease write FPrerelease; + property published_at: String read FPublished_at write FPublished_at; + property tag_name: String read FTag_name write FTag_name; + property tarball_url: String read FTarball_url write FTarball_url; + property target_commitish: String read FTarget_commitish write FTarget_commitish; + property upload_url: String read FUpload_url write FUpload_url; + property url: String read FUrl write FUrl; + property zipball_url: String read FZipball_url write FZipball_url; + constructor Create; + destructor Destroy; override; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TReleaseClass; + class function HttpGet(AUrl: string; AOnBeforeRequest: TProc = nil): TReleaseClass; + end; -TGitReleasesClass = class -private - FReleases: TArray; -public - property Releases: TArray read FReleases write FReleases; - constructor Create; - destructor Destroy; override; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TGitReleasesClass; - class function FromUrl(AUrl: string; ATimeout: integer): TGitReleasesClass; -end; + TGitReleasesClass = class + private + FReleases: TArray; + public + property Releases: TArray read FReleases write FReleases; + constructor Create; + destructor Destroy; override; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TGitReleasesClass; + class function FromUrl(AUrl: string; ATimeout: integer): TGitReleasesClass; + end; -TErrorClass = class -private - FDocumentation_url: String; - FMessage: String; -public - property documentation_url: String read FDocumentation_url write FDocumentation_url; - property message: String read FMessage write FMessage; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TErrorClass; -end; + TErrorClass = class + private + FDocumentation_url: String; + FMessage: String; + public + property documentation_url: String read FDocumentation_url write FDocumentation_url; + property message: String read FMessage write FMessage; + function ToJsonString: string; + class function FromJsonString(AJsonString: string): TErrorClass; + end; implementation -{TUploaderClass} - +{ TUploaderClass } function TUploaderClass.ToJsonString: string; begin @@ -234,7 +232,7 @@ class function TUploaderClass.FromJsonString(AJsonString: string): TUploaderClas result := TJson.JsonToObject(AJsonString) end; -{TAssetsClass} +{ TAssetsClass } constructor TAssetsClass.Create; begin @@ -258,8 +256,7 @@ class function TAssetsClass.FromJsonString(AJsonString: string): TAssetsClass; result := TJson.JsonToObject(AJsonString) end; -{TAuthorClass} - +{ TAuthorClass } function TAuthorClass.ToJsonString: string; begin @@ -271,7 +268,7 @@ class function TAuthorClass.FromJsonString(AJsonString: string): TAuthorClass; result := TJson.JsonToObject(AJsonString) end; -{TReleaseClass} +{ TReleaseClass } constructor TReleaseClass.Create; begin @@ -284,8 +281,8 @@ destructor TReleaseClass.Destroy; LassetsItem: TAssetsClass; begin - for LassetsItem in FAssets do - LassetsItem.free; + for LassetsItem in FAssets do + LassetsItem.free; FAuthor.free; inherited; @@ -306,7 +303,7 @@ class function TReleaseClass.HttpGet(AUrl: string; AOnBeforeRequest: TProc(AUrl, AOnBeforeRequest); end; -{TGitReleasesClass} +{ TGitReleasesClass } constructor TGitReleasesClass.Create; begin @@ -318,8 +315,8 @@ destructor TGitReleasesClass.Destroy; LReleasesItem: TReleaseClass; begin - for LReleasesItem in FReleases do - LReleasesItem.free; + for LReleasesItem in FReleases do + LReleasesItem.free; inherited; end; @@ -334,9 +331,7 @@ class function TGitReleasesClass.FromJsonString(AJsonString: string): TGitReleas result := TJson.JsonToObject(AJsonString) end; - -class function TGitReleasesClass.FromUrl(AUrl: string; - ATimeout: integer): TGitReleasesClass; +class function TGitReleasesClass.FromUrl(AUrl: string; ATimeout: integer): TGitReleasesClass; var LUri: TIdUri; LHttp: TIdHttp; @@ -346,9 +341,9 @@ class function TGitReleasesClass.FromUrl(AUrl: string; LJsonObject: TJsonObject; begin result := nil; - LUri := TIdURI.Create(AUrl); + LUri := TIdUri.Create(AUrl); try - LHttp := TIdHTTP.Create; + LHttp := TIdHttp.Create; try LHttp.ConnectTimeout := ATimeout; LHttp.ReadTimeout := ATimeout; @@ -365,7 +360,7 @@ class function TGitReleasesClass.FromUrl(AUrl: string; if LHttp.ResponseCode <> 200 then raise Exception.CreateFmt('Error getting JSON string from %s. Http error code: %d', [AUrl, LHttp.ResponseCode]); - LJsonValue := TJSONObject.ParseJSONValue(LString); + LJsonValue := TJsonObject.ParseJSONValue(LString); if LJsonValue = nil then raise Exception.Create('Unable to parse JSON string!'); @@ -374,29 +369,29 @@ class function TGitReleasesClass.FromUrl(AUrl: string; LJsonValue.Owned := false; if LJsonValue is TJSONArray then begin - LJsonObject := TJSONObject.Create; + LJsonObject := TJsonObject.Create; try LJsonObject.AddPair('Releases', LJsonValue); LString := LJsonObject.ToJSON; finally - LJsonObject.Free; + LJsonObject.free; end; end; result := TGitReleasesClass.FromJsonString(LString); finally - LJsonValue.Free; + LJsonValue.free; end; finally - LHttp.Free; + LHttp.free; end; finally - LUri.Free; + LUri.free; end; end; -{TErrorClass} +{ TErrorClass } function TErrorClass.ToJsonString: string; begin @@ -410,26 +405,24 @@ class function TErrorClass.FromJsonString(AJsonString: string): TErrorClass; { TUGitHubSerializableObject } -class procedure TUGitHubSerializableObject.EnsureHttpContentType( - AHttp: TIdHttp); +class procedure TUGitHubSerializableObject.EnsureHttpContentType(AHttp: TIdHttp); begin if AHttp.Response.ContentType <> 'application/json' then raise Exception.CreateFmt('Invalid content type %s!', [AHttp.Response.ContentType]); end; -class procedure TUGitHubSerializableObject.EnsureHttpResponseCode( - AHttpResponseCode: integer; AUrl: string; AValidValues: array of integer); +class procedure TUGitHubSerializableObject.EnsureHttpResponseCode(AHttpResponseCode: integer; AUrl: string; AValidValues: array of integer); var LValue: integer; begin for LValue in AValidValues do - if LValue = AHttpResponseCode then exit; + if LValue = AHttpResponseCode then + exit; raise Exception.CreateFmt('The request to %s has failed with code %d', [AUrl, AHttpResponseCode]); end; -function TUGitHubSerializableObject.HttpDelete(AUrl: string; - AOnBeforeRequest: TProc): string; +function TUGitHubSerializableObject.HttpDelete(AUrl: string; AOnBeforeRequest: TProc): string; var LResult: string; begin @@ -437,16 +430,15 @@ function TUGitHubSerializableObject.HttpDelete(AUrl: string; WebRequest(AUrl, procedure(LHttp: TIdHttp) begin - - // Allow HTTP client pre-configuration + + // Allow HTTP client pre-configuration if assigned(AOnBeforeRequest) then AOnBeforeRequest(LHttp); - LResult := LHttp.Delete(AUrl); + LResult := LHttp.Delete(AUrl); EnsureHttpResponseCode(LHttp.ResponseCode, AUrl, [200, 204]); - end - ); + end); result := LResult; end; @@ -456,15 +448,15 @@ class function TUGitHubSerializableObject.HttpGet(AUrl: string; AOnBeforeRequ LResult: T; begin - WebRequest(AUrl, + WebRequest(AUrl, procedure(LHttp: TIdHttp) var LString: string; LJsonValue: TJsonValue; LJsonObject: TJsonObject; begin - - // Allow HTTP client pre-configuration + + // Allow HTTP client pre-configuration if assigned(AOnBeforeRequest) then AOnBeforeRequest(LHttp); @@ -472,40 +464,38 @@ class function TUGitHubSerializableObject.HttpGet(AUrl: string; AOnBeforeRequ EnsureHttpResponseCode(LHttp.ResponseCode, AUrl, [200, 304]); EnsureHttpContentType(LHttp); - LJsonValue := TJSONObject.ParseJSONValue(LString); - + LJsonValue := TJsonObject.ParseJSONValue(LString); + if LJsonValue = nil then - raise Exception.Create('Unable to parse JSON string!'); + raise Exception.Create('Unable to parse JSON string!'); try LJsonValue.Owned := false; if LJsonValue is TJSONArray then if (AArrayProperty <> '') then begin - LJsonObject := TJSONObject.Create; + LJsonObject := TJsonObject.Create; try LJsonObject.AddPair(AArrayProperty, LJsonValue); LString := LJsonObject.ToJSON; finally - LJsonObject.Free; + LJsonObject.free; end; end else raise Exception.CreateFmt('The class %s does not accept array values!', [LResult.className]); finally - LJsonValue.Free; - end; + LJsonValue.free; + end; - LResult := TJson.JsonToObject(LString); + LResult := TJson.JsonToObject(LString); - end - ); + end); result := LResult; end; -function TUGitHubSerializableObject.HttpPost(AUrl: string; - AOnBeforeRequest: TProc): string; +function TUGitHubSerializableObject.HttpPost(AUrl: string; AOnBeforeRequest: TProc): string; var LResult: string; begin @@ -515,12 +505,12 @@ function TUGitHubSerializableObject.HttpPost(AUrl: string; var LStringStream: TStringStream; begin - - // Allow HTTP client pre-configuration + + // Allow HTTP client pre-configuration if assigned(AOnBeforeRequest) then AOnBeforeRequest(LHttp); - LResult := TJson.ObjectToJsonString(self); + LResult := TJson.ObjectToJsonString(self); LStringStream := TStringStream.Create(LResult, TEncoding.GetEncoding(LHttp.Request.ContentEncoding)); try @@ -528,17 +518,15 @@ function TUGitHubSerializableObject.HttpPost(AUrl: string; EnsureHttpResponseCode(LHttp.ResponseCode, AUrl, [200, 201, 202, 204]); EnsureHttpContentType(LHttp); finally - LStringStream.Free; + LStringStream.free; end; - end - ); + end); result := LResult; end; -function TUGitHubSerializableObject.HttpPut(AUrl: string; - AOnBeforeRequest: TProc): string; +function TUGitHubSerializableObject.HttpPut(AUrl: string; AOnBeforeRequest: TProc): string; var LResult: string; begin @@ -548,12 +536,12 @@ function TUGitHubSerializableObject.HttpPut(AUrl: string; var LStringStream: TStringStream; begin - - // Allow HTTP client pre-configuration + + // Allow HTTP client pre-configuration if assigned(AOnBeforeRequest) then AOnBeforeRequest(LHttp); - LResult := TJson.ObjectToJsonString(self); + LResult := TJson.ObjectToJsonString(self); LStringStream := TStringStream.Create(LResult, TEncoding.GetEncoding(LHttp.Request.ContentEncoding)); try @@ -561,33 +549,31 @@ function TUGitHubSerializableObject.HttpPut(AUrl: string; EnsureHttpResponseCode(LHttp.ResponseCode, AUrl, [200, 204]); EnsureHttpContentType(LHttp); finally - LStringStream.Free; + LStringStream.free; end; - end - ); + end); result := LResult; end; - class function TUGitHubSerializableObject.WebRequest(AUrl: string; AOnRequest: TProc): integer; var LUri: TIdUri; LHttp: TIdHttp; LSslIoHandler: TIdSSLIOHandlerSocketOpenSSL; begin - LUri := TIdURI.Create(AUrl); + LUri := TIdUri.Create(AUrl); try - LHttp := TIdHTTP.Create; + LHttp := TIdHttp.Create; try LHttp.HandleRedirects := true; - // Default encoding + // Default encoding LHttp.Request.ContentEncoding := 'utf-8'; - // Specify Content-Type header + // Specify Content-Type header LHttp.Request.ContentType := 'application/json'; - // Replace default IOHandler with TIdSSLIOHandlerSocketOpenSSL if the connection is SSL based + // Replace default IOHandler with TIdSSLIOHandlerSocketOpenSSL if the connection is SSL based if LUri.Protocol.ToLower = 'https' then begin LSslIoHandler := TIdSSLIOHandlerSocketOpenSSL.Create(LHttp); @@ -601,13 +587,11 @@ class function TUGitHubSerializableObject.WebRequest(AUrl: string; AOnRequest: T end; finally - LHttp.Free; + LHttp.free; end; finally - LUri.Free; + LUri.free; end; end; end. - - diff --git a/uMainForm.fmx b/uMainForm.fmx index 72faef3..da4e398 100644 --- a/uMainForm.fmx +++ b/uMainForm.fmx @@ -1505,8 +1505,9 @@ object MainForm: TMainForm Text = '-' end object MenuItem3: TMenuItem - Text = 'Rename Property' - OnClick = MenuItem3Click + Action = actRenameProperty + Enabled = True + ImageIndex = -1 end object MenuItem5: TMenuItem Text = 'Change Class Name' @@ -1514,47 +1515,11 @@ object MainForm: TMainForm end object MenuItem6: TMenuItem Text = 'Change Type' + Visible = False end object MenuItem7: TMenuItem Text = 'Rename Node' - end - end - object Panel1: TPanel - Align = Left - Padding.Left = 6.000000000000000000 - Padding.Top = 2.000000000000000000 - Padding.Right = 6.000000000000000000 - Padding.Bottom = 6.000000000000000000 - Position.X = 3.000000000000000000 - Position.Y = 3.000000000000000000 - Size.Width = 345.000000000000000000 - Size.Height = 532.000000000000000000 - Size.PlatformDefault = False - StyleLookup = 'Panel2Style1' - TabOrder = 7 - OnResize = Panel1Resize - object tv: TTreeView - Align = Client - PopupMenu = MainPopupMenu - Size.Width = 333.000000000000000000 - Size.Height = 507.000000000000000000 - Size.PlatformDefault = False - TabOrder = 0 - OnDblClick = tvDblClick - OnKeyDown = tvKeyDown - Viewport.Width = 329.000000000000000000 - Viewport.Height = 503.000000000000000000 - end - object Label3: TLabel - Align = Top - Margins.Left = 2.000000000000000000 - Position.X = 8.000000000000000000 - Position.Y = 2.000000000000000000 - Size.Width = 331.000000000000000000 - Size.Height = 17.000000000000000000 - Size.PlatformDefault = False - StyleLookup = 'Label3Style1' - Text = 'Treeview output:' + Visible = False end end object Panel2: TPanel @@ -1564,7 +1529,7 @@ object MainForm: TMainForm Padding.Right = 6.000000000000000000 Padding.Bottom = 6.000000000000000000 Size.Width = 669.000000000000000000 - Size.Height = 532.000000000000000000 + Size.Height = 479.000000000000000000 Size.PlatformDefault = False StyleLookup = 'Panel2Style1' TabOrder = 8 @@ -1703,6 +1668,7 @@ object MainForm: TMainForm ']') StyledSettings = [Size, Style, FontColor] TextSettings.Font.Family = 'Consolas' + OnChange = Memo1Change Align = Client Margins.Bottom = 6.000000000000000000 PopupMenu = MemoPopupMenu @@ -1711,97 +1677,9 @@ object MainForm: TMainForm Size.PlatformDefault = False StyleLookup = 'Memo1Style1' TabOrder = 0 - OnDblClick = Memo1DblClick Viewport.Width = 637.000000000000000000 Viewport.Height = 428.000000000000000000 end - object Panel3: TPanel - Align = Bottom - Padding.Left = 6.000000000000000000 - Padding.Top = 6.000000000000000000 - Padding.Right = 6.000000000000000000 - Padding.Bottom = 6.000000000000000000 - Position.X = 6.000000000000000000 - Position.Y = 473.000000000000000000 - Size.Width = 657.000000000000000000 - Size.Height = 53.000000000000000000 - Size.PlatformDefault = False - TabOrder = 1 - object btnVisualize: TButton - Align = Right - Margins.Right = 9.000000000000000000 - Position.X = 482.000000000000000000 - Position.Y = 6.000000000000000000 - Size.Width = 80.000000000000000000 - Size.Height = 41.000000000000000000 - Size.PlatformDefault = False - TabOrder = 0 - Text = 'Visualize' - OnClick = btnVisualizeClick - end - object btnOnlineJsonValidator: TButton - Align = Right - Margins.Right = 9.000000000000000000 - Position.X = 216.000000000000000000 - Position.Y = 6.000000000000000000 - Size.Width = 144.000000000000000000 - Size.Height = 41.000000000000000000 - Size.PlatformDefault = False - TabOrder = 2 - Text = 'Online JSON Validator' - OnClick = btnOnlineJsonValidatorClick - end - object btnExit: TButton - Align = Right - Position.X = 571.000000000000000000 - Position.Y = 6.000000000000000000 - Size.Width = 80.000000000000000000 - Size.Height = 41.000000000000000000 - Size.PlatformDefault = False - TabOrder = 3 - Text = 'Exit' - OnClick = btnExitClick - end - object Panel4: TPanel - Align = Client - Margins.Right = 6.000000000000000000 - Size.Width = 204.000000000000000000 - Size.Height = 41.000000000000000000 - Size.PlatformDefault = False - StyleLookup = 'Panel4Style1' - TabOrder = 6 - object Label5: TLabel - Position.X = 3.000000000000000000 - Position.Y = -1.000000000000000000 - Size.Width = 182.000000000000000000 - Size.Height = 17.000000000000000000 - Size.PlatformDefault = False - Text = 'Destination Unit Name:' - end - object Edit2: TEdit - Touch.InteractiveGestures = [LongTap, DoubleTap] - TabOrder = 1 - Text = 'RootUnit' - Position.X = 3.000000000000000000 - Position.Y = 17.000000000000000000 - Size.Width = 182.000000000000000000 - Size.Height = 22.000000000000000000 - Size.PlatformDefault = False - end - end - object btnGenerateUnit: TButton - Align = Right - Margins.Right = 9.000000000000000000 - Position.X = 369.000000000000000000 - Position.Y = 6.000000000000000000 - Size.Width = 104.000000000000000000 - Size.Height = 41.000000000000000000 - Size.PlatformDefault = False - TabOrder = 1 - Text = 'Preview Unit' - OnClick = PreviewUnitClick - end - end object Label4: TLabel Align = Top Margins.Left = 2.000000000000000000 @@ -1820,19 +1698,194 @@ object MainForm: TMainForm Position.X = 348.000000000000000000 Position.Y = 3.000000000000000000 Size.Width = 4.000000000000000000 - Size.Height = 532.000000000000000000 + Size.Height = 479.000000000000000000 Size.PlatformDefault = False end object MemoPopupMenu: TPopupMenu Left = 272 Top = 32 + object MenuItem8: TMenuItem + Action = actPrettyPrintJSON + Enabled = True + ImageIndex = -1 + end object MenuItem4: TMenuItem + Action = actValidateJSON + Enabled = True + ImageIndex = -1 + end + end + object Panel3: TPanel + Align = Bottom + Padding.Left = 6.000000000000000000 + Padding.Top = 6.000000000000000000 + Padding.Right = 6.000000000000000000 + Padding.Bottom = 6.000000000000000000 + Position.X = 3.000000000000000000 + Position.Y = 482.000000000000000000 + Size.Width = 1018.000000000000000000 + Size.Height = 53.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + object btnVisualize: TButton + Align = Right + Margins.Right = 9.000000000000000000 + Position.X = 843.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + Text = 'Visualize' + OnClick = btnVisualizeClick + end + object btnOnlineJsonValidator: TButton + Action = actValidateJSON + Align = Right + Enabled = True + ImageIndex = -1 + Margins.Right = 9.000000000000000000 + Position.X = 552.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 169.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + TabOrder = 2 + end + object btnExit: TButton + Align = Right + Position.X = 932.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 80.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + TabOrder = 3 + Text = 'Exit' + OnClick = btnExitClick + end + object Panel4: TPanel + Align = Client + Margins.Right = 6.000000000000000000 + Size.Width = 540.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Panel4Style1' + TabOrder = 6 + object Label5: TLabel + Position.X = 203.000000000000000000 + Position.Y = -1.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + Text = 'Destination Unit Name:' + end + object Edit2: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 2 + Text = 'RootU' + Position.X = 203.000000000000000000 + Position.Y = 17.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + end + object Label2: TLabel + Position.X = 3.000000000000000000 + Position.Y = -1.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + Text = 'Destination Class Name:' + TabOrder = 3 + end + object Edit1: TEdit + Touch.InteractiveGestures = [LongTap, DoubleTap] + TabOrder = 1 + Text = 'Root' + Position.X = 3.000000000000000000 + Position.Y = 17.000000000000000000 + Size.Width = 182.000000000000000000 + Size.Height = 22.000000000000000000 + Size.PlatformDefault = False + OnChange = Edit1Change + end + end + object btnGenerateUnit: TButton + Align = Right + Margins.Right = 9.000000000000000000 + Position.X = 730.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 104.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + TabOrder = 1 + Text = 'Preview Unit' + OnClick = PreviewUnitClick + end + end + object Panel1: TPanel + Align = Left + Padding.Left = 6.000000000000000000 + Padding.Top = 2.000000000000000000 + Padding.Right = 6.000000000000000000 + Padding.Bottom = 6.000000000000000000 + Position.X = 3.000000000000000000 + Position.Y = 3.000000000000000000 + Size.Width = 345.000000000000000000 + Size.Height = 479.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Panel2Style1' + TabOrder = 7 + OnResize = Panel1Resize + object TreeView: TTreeView + Align = Client + PopupMenu = MainPopupMenu + Size.Width = 333.000000000000000000 + Size.Height = 454.000000000000000000 + Size.PlatformDefault = False + TabOrder = 0 + OnDblClick = TreeViewDblClick + OnKeyDown = TreeViewKeyDown + Viewport.Width = 329.000000000000000000 + Viewport.Height = 450.000000000000000000 + end + object Label3: TLabel + Align = Top + Margins.Left = 2.000000000000000000 + Position.X = 8.000000000000000000 + Position.Y = 2.000000000000000000 + Size.Width = 331.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'Label3Style1' + Text = 'Treeview output:' + end + object Button1: TButton + Position.X = 136.000000000000000000 + Position.Y = 256.000000000000000000 + TabOrder = 1 + Text = 'Button1' + Visible = False + end + end + object ActionList1: TActionList + OnUpdate = ActionList1Update + Left = 168 + Top = 248 + object actPrettyPrintJSON: TAction + Category = 'Memo Actions' Text = 'Pretty Print JSON string' - OnClick = Memo1DblClick + OnExecute = actPrettyPrintJSONExecute end - object MenuItem8: TMenuItem + object actValidateJSON: TAction + Category = 'Memo Actions' Text = 'Validate JSON string Online' - OnClick = MenuItem8Click + OnExecute = actValidateJSONExecute + end + object actRenameProperty: TAction + Category = 'Main Actions' + Text = 'Rename Property' + OnExecute = actRenamePropertyExecute end end end diff --git a/uMainForm.pas b/uMainForm.pas index 4732427..9f22169 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -4,20 +4,22 @@ interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, - FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, - FMX.Layouts, FMX.Memo, System.Json, Rest.Json, FMX.TreeView, TypInfo, RTTI, + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.DialogService, FMX.Dialogs, + FMX.Layouts, FMX.TreeView, FMX.Edit, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, + FMX.Menus, FMX.Controls.Presentation, + System.Json, Rest.Json, TypInfo, RTTI, regularexpressions, generics.collections, Pkg.Json.Mapper, NetEncoding, - FMX.Menus, FMX.Controls.Presentation, FMX.Edit, FMX.ConstrainedForm, REST.Client, + FMX.ConstrainedForm, Rest.Client, uUpdate, System.Threading, uGitHub, FMX.Objects, uUpdateForm, SyncObjs, - FMX.ScrollBox; + System.Actions, FMX.ActnList; -const JsonValidatorUrl = 'http://jsonlint.com'; +const + JsonValidatorUrl = 'http://jsonlint.com'; type TMainForm = class(TConstrainedForm) Memo1: TMemo; - tv: TTreeView; StyleBook1: TStyleBook; StatusBar1: TStatusBar; Label1: TLabel; @@ -25,60 +27,68 @@ TMainForm = class(TConstrainedForm) MenuItem1: TMenuItem; MenuItem2: TMenuItem; MenuItem3: TMenuItem; - Panel1: TPanel; Panel2: TPanel; Splitter1: TSplitter; - Panel3: TPanel; - btnVisualize: TButton; - btnOnlineJsonValidator: TButton; - btnExit: TButton; - Label3: TLabel; Label4: TLabel; - Edit2: TEdit; - Label5: TLabel; MemoPopupMenu: TPopupMenu; - MenuItem4: TMenuItem; MenuItem5: TMenuItem; MenuItem6: TMenuItem; MenuItem7: TMenuItem; - Panel4: TPanel; MenuItem8: TMenuItem; + Panel3: TPanel; + btnVisualize: TButton; + btnOnlineJsonValidator: TButton; + btnExit: TButton; + Panel4: TPanel; + Label5: TLabel; + Edit2: TEdit; btnGenerateUnit: TButton; + Panel1: TPanel; + TreeView: TTreeView; + Label3: TLabel; + Button1: TButton; + Label2: TLabel; + Edit1: TEdit; + ActionList1: TActionList; + actPrettyPrintJSON: TAction; + actValidateJSON: TAction; + MenuItem4: TMenuItem; + actRenameProperty: TAction; procedure btnVisualizeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure PreviewUnitClick(Sender: TObject); procedure btnExitClick(Sender: TObject); procedure MainPopupMenuPopup(Sender: TObject); - procedure tvDblClick(Sender: TObject); - procedure Memo1DblClick(Sender: TObject); - procedure MenuItem3Click(Sender: TObject); + procedure TreeViewDblClick(Sender: TObject); procedure MenuItem5Click(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure Label1Click(Sender: TObject); - procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; - Shift: TShiftState); - procedure tvKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; - Shift: TShiftState); + procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); + procedure TreeViewKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure Panel1Resize(Sender: TObject); - procedure MenuItem8Click(Sender: TObject); - procedure btnOnlineJsonValidatorClick(Sender: TObject); + procedure Edit1Change(Sender: TObject); + procedure actPrettyPrintJSONExecute(Sender: TObject); + procedure Memo1Change(Sender: TObject); + procedure actValidateJSONExecute(Sender: TObject); + procedure actRenamePropertyExecute(Sender: TObject); + procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean); private { Private declarations } + FJsonMapper: TPkgJsonMapper; + FCheckVersionResponse: TObject; + FChanged: Boolean; + // 0: Active + // 1: Terminating + // >=2: Terminated + FApplicationStatus: Integer; + FUpdateCheckEvent: TEvent; procedure DisableMenuItems; procedure VisualizeClass; procedure PrepareMenu; procedure DisableGuiElements; public { Public declarations } - jm: TPkgJsonMapper; - FCheckVersionResponse: TObject; - FChanged: boolean; - // 0: Active - // 1: Terminating - // >=2: Terminated - FApplicationStatus: integer; - FUpdateCheckEvent: TEvent; end; var @@ -88,39 +98,34 @@ implementation {$R *.fmx} -uses uSaveUnitForm, +uses + uSaveUnitForm, Pkg.Json.Visualizer, {$IFDEF MSWINDOWS} Winapi.ShellAPI, Winapi.Windows; {$ENDIF MSWINDOWS} {$IFDEF POSIX} - Posix.Stdlib; +Posix.Stdlib; {$ENDIF POSIX} -procedure TMainForm.btnOnlineJsonValidatorClick(Sender: TObject); -begin - MenuItem8Click(nil); -end; - procedure TMainForm.btnVisualizeClick(Sender: TObject); begin if FChanged then - MessageDlg('You made changes to the structure. Do you want to load original class?', TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], 0, + TDialogService.MessageDialog('You made changes to the structure. Do you want to load original class?', TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbYes, 0, procedure(const AResult: TModalResult) begin if AResult = mrYes then VisualizeClass; - end - ) + end) else VisualizeClass; end; procedure TMainForm.DisableGuiElements; begin - edit2.Enabled := false; + Edit2.Enabled := false; Memo1.Enabled := false; - tv.Enabled := false; - tv.PopupMenu := nil; + TreeView.Enabled := false; + TreeView.PopupMenu := nil; btnExit.Enabled := false; btnVisualize.Enabled := false; btnGenerateUnit.Enabled := false; @@ -128,36 +133,109 @@ procedure TMainForm.DisableGuiElements; procedure TMainForm.DisableMenuItems; var - k: integer; + k: Integer; begin for k := 0 to MainPopupMenu.ItemsCount - 1 do - begin MainPopupMenu.Items[k].Enabled := false; - end; +end; + +procedure TMainForm.Edit1Change(Sender: TObject); +begin + Edit2.Text := Edit1.Text + 'U'; end; procedure TMainForm.PreviewUnitClick(Sender: TObject); begin - if tv.Count = 0 then - btnVisualizeClick(self); + if TreeView.Count = 0 then + VisualizeClass; - jm.DestinationUnitName := edit2.Text; - SaveUnitForm.sd.FileName := jm.DestinationUnitName + '.pas'; + FJsonMapper.DestinationClassName := Edit1.Text; + FJsonMapper.DestinationUnitName := Edit2.Text; + FJsonMapper.Parse(Memo1.Lines.Text); + SaveUnitForm.sd.FileName := FJsonMapper.DestinationUnitName + '.pas'; - SaveUnitForm.Memo1.DeleteSelection; - SaveUnitForm.Memo1.Text := jm.GenerateUnit; + SaveUnitForm.Memo1.Text := FJsonMapper.GenerateUnit; SaveUnitForm.Caption := 'Preview Delphi Unit - ' + SaveUnitForm.sd.FileName; - // ShowModal bug - QC129552 - // The same is declared in the SaveUnitForm's OnShow event - SaveUnitForm.width := MainForm.Width - 50; - SaveUnitForm.height := MainForm.Height - 50; - SaveUnitForm.left := MainForm.Left + 25; - SaveUnitForm.top := MainForm.Top + 25; + // ShowModal bug - QC129552 + // The same is declared in the SaveUnitForm's OnShow event + SaveUnitForm.Width := MainForm.Width - 50; + SaveUnitForm.Height := MainForm.Height - 50; + SaveUnitForm.Left := MainForm.Left + 25; + SaveUnitForm.Top := MainForm.Top + 25; SaveUnitForm.ShowModal; end; +procedure TMainForm.ActionList1Update(Action: TBasicAction; var Handled: Boolean); +var + StubContainerField: TStubContainerField; +begin + actRenameProperty.Enabled := false; + + if TreeView.Selected = nil then + exit; + + if TreeView.Selected = TreeView.Items[0] then + exit; + + if not(TreeView.Selected.TagObject is TStubField) then + exit; + + if TreeView.Selected.TagObject is TStubContainerField then + StubContainerField := TStubField(TreeView.Selected.TagObject) as TStubContainerField + else + StubContainerField := nil; + + actRenameProperty.Enabled := (StubContainerField <> nil) and (StubContainerField.FieldType = jtObject); +end; + +procedure TMainForm.actPrettyPrintJSONExecute(Sender: TObject); +var + StringList: TStringList; + JsonValue: TJSONValue; +begin + StringList := TStringList.Create; + try + JsonValue := TJSONObject.ParseJSONValue(Memo1.Text); + try + if JsonValue <> nil then + PrettyPrintJSON(JsonValue, StringList); + finally + JsonValue.Free; + end; + + Memo1.Text := StringList.Text; + finally + StringList.Free; + end; +end; + +procedure TMainForm.actRenamePropertyExecute(Sender: TObject); +var + s: string; + StubField: TStubField; +begin + StubField := (Sender as TFmxObject).TagObject as TStubField; + s := InputBox('Rename Property ' + StubField.Name, 'Enter new Property name', StubField.Name); + if (s <> '') and (s.ToLower <> StubField.Name.ToLower) then + begin + FChanged := True; + StubField.Name := s; + JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); + end; +end; + +procedure TMainForm.actValidateJSONExecute(Sender: TObject); +begin +{$IFDEF MSWINDOWS} + ShellExecute(0, 'OPEN', PChar(JsonValidatorUrl), '', '', SW_SHOWNORMAL); +{$ENDIF MSWINDOWS} +{$IFDEF POSIX} + _system(PAnsiChar('open ' + AnsiString(JsonValidatorUrl))); +{$ENDIF POSIX} +end; + procedure TMainForm.btnExitClick(Sender: TObject); begin Close; @@ -166,7 +244,7 @@ procedure TMainForm.btnExitClick(Sender: TObject); procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if FUpdateCheckEvent.WaitFor(0) = wrSignaled then - CanClose := true + CanClose := True else begin CanClose := false; @@ -177,32 +255,31 @@ procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); TInterlocked.Increment(FApplicationStatus); DisableGuiElements; - label1.Text := 'Terminating application, please wait...'; + Label1.Text := 'Terminating application, please wait...'; - // We start a termination task. - // This way the main thread will not freeze + // We start a termination task. + // This way the main thread will not freeze TTask.Run( procedure begin FUpdateCheckEvent.WaitFor(); - // Indicate next stage + // Indicate next stage TInterlocked.Increment(FApplicationStatus); - // We enqueue the handler + // We enqueue the handler TThread.Queue(nil, procedure begin Close; - end - ); - end - ); + end); + end); end; - 1: ; - else - CanClose := true; + 1: + ; + else + CanClose := True; end; end; end; @@ -210,16 +287,16 @@ procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure TMainForm.FormCreate(Sender: TObject); begin FApplicationStatus := 0; - FUpdateCheckEvent := TEvent.Create(nil, true, false, ''); + FUpdateCheckEvent := TEvent.Create(nil, True, false, ''); self.Constraints.MinWidth := 1024; self.Constraints.MinHeight := 560; Caption := 'JsonToDelphiClass - ' + FloatToStr(ProgramVersion, PointDsFormatSettings) + ' | By Petar Georgiev'; - jm := TPkgJsonMapper.Create(tv); + FJsonMapper := TPkgJsonMapper.Create; - label1.Text := 'Checking for update...'; + Label1.Text := 'Checking for update...'; NewCheckForUpdateTask( procedure(ARelease: TObject) @@ -227,41 +304,38 @@ procedure TMainForm.FormCreate(Sender: TObject); FCheckVersionResponse := ARelease; if FCheckVersionResponse is TReleaseClass then begin - label1.StyleLookup := 'LabelLinkStyle'; - label1.Text := 'Version ' + (FCheckVersionResponse as TReleaseClass).tag_name + ' is available! Click here to download!'; - (label1.FindStyleResource('text') as TText).OnClick := label1Click; - label1.HitTest := true; + Label1.StyleLookup := 'LabelLinkStyle'; + Label1.Text := 'Version ' + (FCheckVersionResponse as TReleaseClass).tag_name + ' is available! Click here to download!'; + (Label1.FindStyleResource('text') as TText).OnClick := Label1Click; + Label1.HitTest := True; + end + else if FCheckVersionResponse is TErrorClass then + begin + Label1.StyleLookup := 'LabelErrorStyle'; + Label1.Text := 'Error checking for new version: ' + (FCheckVersionResponse as TErrorClass).message; end else - if FCheckVersionResponse is TErrorClass then - begin - label1.StyleLookup := 'LabelErrorStyle'; - label1.Text := 'Error checking for new version: ' + (FCheckVersionResponse as TErrorClass).message; - end - else - begin - label1.StyleLookup := 'LabelGreenStyle'; - label1.Text := 'Your version ' + FloatToStr(uUpdate.ProgramVersion, PointDsFormatSettings) + ' is up to date! For more information about JsonToDelphiClass click here!'; - (label1.FindStyleResource('text') as TText).OnClick := label1Click; - end; - FUpdateCheckEvent.SetEvent; - end - ); + begin + Label1.StyleLookup := 'LabelGreenStyle'; + Label1.Text := 'Your version ' + FloatToStr(uUpdate.ProgramVersion, PointDsFormatSettings) + ' is up to date! For more information about JsonToDelphiClass click here!'; + (Label1.FindStyleResource('text') as TText).OnClick := Label1Click; + end; + FUpdateCheckEvent.SetEvent; + end); end; procedure TMainForm.FormDestroy(Sender: TObject); begin FreeAndNil(FUpdateCheckEvent); - FreeAndNil(jm); + FreeAndNil(FJsonMapper); FreeAndNil(FCheckVersionResponse); end; -procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; - var KeyChar: Char; Shift: TShiftState); +procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = 27 then - close; + Close; end; procedure TMainForm.Label1Click(Sender: TObject); @@ -273,157 +347,116 @@ procedure TMainForm.Label1Click(Sender: TObject); end else begin - {$IFDEF MSWINDOWS} +{$IFDEF MSWINDOWS} ShellExecute(0, 'OPEN', PChar(ProgramUrl), '', '', SW_SHOWNORMAL); - {$ENDIF MSWINDOWS} - {$IFDEF POSIX} +{$ENDIF MSWINDOWS} +{$IFDEF POSIX} _system(PAnsiChar('open ' + AnsiString(ProgramUrl))); - {$ENDIF POSIX} - end; -end; - -procedure TMainForm.Memo1DblClick(Sender: TObject); -var - LTsl: TStringList; - LJsonValue: TJSONValue; -begin - LTsl := TStringList.Create; - try - LJsonValue := TJSONObject.ParseJSONValue(memo1.Text); - try - if LJsonValue <> nil then - PrettyPrintJSON(LJsonValue, LTsl); - finally - LJsonValue.Free; - end; - memo1.Text := LTsl.Text; - finally - LTsl.Free; +{$ENDIF POSIX} end; end; -procedure TMainForm.MenuItem3Click(Sender: TObject); -var - LString: string; - LField: TStubField; +procedure TMainForm.Memo1Change(Sender: TObject); begin - LField := (Sender as TFmxObject).TagObject as TStubField; - LString := InputBox('Rename Property ' + LField.Name, 'Enter new Property name', LField.Name); - if (LString <> '') AND (LString.ToLower <> LField.Name.ToLower) then - begin - FChanged := true; - LField.Name := LString; - jm.Visualize(tv, 'TreeViewItem1Style1'); - end; + actPrettyPrintJSON.Execute; end; procedure TMainForm.MenuItem5Click(Sender: TObject); var - LString: string; - LClass: TStubClass; + s: string; + StubClass: TStubClass; begin - LClass := (Sender as TFmxObject).TagObject as TStubClass; - LString := InputBox('Rename Class ' + LClass.Name, 'Enter new Class name', LClass.PureClassName); - if (LString <> '') AND (LString.ToLower <> LClass.PureClassName.ToLower) then + StubClass := (Sender as TFmxObject).TagObject as TStubClass; + s := InputBox('Rename Class ' + StubClass.Name, 'Enter new Class name', StubClass.PureClassName); + if (s <> '') and (s.ToLower <> StubClass.PureClassName.ToLower) then begin - FChanged := true; - LClass.Name := LString; - jm.Visualize(tv, 'TreeViewItem1Style1'); + FChanged := True; + StubClass.Name := s; + JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); end; end; -procedure TMainForm.MenuItem8Click(Sender: TObject); -begin - {$IFDEF MSWINDOWS} - ShellExecute(0, 'OPEN', PChar(JsonValidatorUrl), '', '', SW_SHOWNORMAL); - {$ENDIF MSWINDOWS} - {$IFDEF POSIX} - _system(PAnsiChar('open ' + AnsiString(JsonValidatorUrl))); - {$ENDIF POSIX} -end; - procedure TMainForm.Panel1Resize(Sender: TObject); begin if Panel1.Width < 200 then Panel1.Width := 200 - else - if Panel1.Width > (MainForm.Width - 20) div 2 then - Panel1.Width := (MainForm.Width - 20) div 2; + else if Panel1.Width > (MainForm.Width - 20) div 2 then + Panel1.Width := (MainForm.Width - 20) div 2; end; procedure TMainForm.MainPopupMenuPopup(Sender: TObject); var - LItem: TTreeViewItem; - LPoint: TPointF; + Item: TTreeViewItem; + Point: TPointF; begin - DisableMenuItems; + // DisableMenuItems; MainPopupMenu.Items[0].Text := '---'; - LPoint := tv.AbsoluteToLocal(ScreenToClient(MainPopupMenu.PopupPoint)); - LItem := tv.ItemByPoint(LPoint.X, LPoint.Y); - if LItem <> nil then - LItem.Select; - + Point := TreeView.AbsoluteToLocal(ScreenToClient(MainPopupMenu.PopupPoint)); + Item := TreeView.ItemByPoint(Point.X, Point.Y); + if Item <> nil then + Item.Select; + // PrepareMenu; end; procedure TMainForm.PrepareMenu; var - LField: TStubField; + StubField: TStubField; begin - if tv.Selected <> nil then - begin - MainPopupMenu.Items[0].Text := tv.Selected.Text; + if TreeView.Selected = nil then + exit; - if tv.Selected <> tv.Items[0] then - begin - LField := tv.Selected.TagObject as TStubField; + MainPopupMenu.Items[0].Text := TreeView.Selected.Text; + exit; + if TreeView.Selected <> TreeView.Items[0] then + begin + StubField := TreeView.Selected.TagObject as TStubField; - MainPopupMenu.Items[2].Enabled := true; - MainPopupMenu.Items[2].TagObject := LField; + MainPopupMenu.Items[2].Enabled := True; + MainPopupMenu.Items[2].TagObject := StubField; - if (LField is TStubContainerField) AND ((LField as TStubContainerField).ContainedType = TJsonType.jtObject) then - begin - MainPopupMenu.Items[3].Enabled := true; - MainPopupMenu.Items[3].TagObject := (LField as TStubContainerField).FieldClass; - end; - end - else + if (StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = TJsonType.jtObject) then begin - MainPopupMenu.Items[3].Enabled := true; - MainPopupMenu.Items[3].TagObject := tv.Selected.TagObject; + MainPopupMenu.Items[3].Enabled := True; + MainPopupMenu.Items[3].TagObject := (StubField as TStubContainerField).FieldClass; end; + end + else + begin + MainPopupMenu.Items[3].Enabled := True; + MainPopupMenu.Items[3].TagObject := TreeView.Selected.TagObject; end; end; -procedure TMainForm.tvDblClick(Sender: TObject); +procedure TMainForm.TreeViewDblClick(Sender: TObject); begin - if tv.Selected <> nil then - tv.Selected.IsExpanded := not tv.Selected.IsExpanded; + if TreeView.Selected <> nil then + TreeView.Selected.IsExpanded := not TreeView.Selected.IsExpanded; end; -procedure TMainForm.tvKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; - Shift: TShiftState); +procedure TMainForm.TreeViewKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin - if ((KeyChar = #0) AND (Key = 113)) AND (tv.Selected <> nil) then + if ((KeyChar = #0) and (Key = 113)) and (TreeView.Selected <> nil) then begin PrepareMenu; - if tv.Selected = tv.Items[0] then + if TreeView.Selected = TreeView.Items[0] then MenuItem5Click(MenuItem5) else - MenuItem3Click(MenuItem3); + actRenameProperty.Execute; + // MenuItem3Click(MenuItem3); end; - end; procedure TMainForm.VisualizeClass; begin FChanged := false; - jm.Parse(memo1.Text, 'Root'); - jm.Visualize(tv, 'TreeViewItem1Style1'); + FJsonMapper.DestinationUnitName := Edit1.Text; + FJsonMapper.Parse(Memo1.Text); + + JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); - // Workarround for QC129540 Panel1.Width := Panel1.Width + 1; Panel1.Width := Panel1.Width - 1; end; diff --git a/uSaveUnitForm.fmx b/uSaveUnitForm.fmx index ab95cdc..ccc1d97 100644 --- a/uSaveUnitForm.fmx +++ b/uSaveUnitForm.fmx @@ -18,6 +18,11 @@ object SaveUnitForm: TSaveUnitForm DesignerMasterStyle = 0 object Memo1: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + ReadOnly = True + StyledSettings = [Style, FontColor] + TextSettings.Font.Family = 'Consolas' + TextSettings.Font.Size = 14.000000000000000000 Align = Client Margins.Bottom = 4.000000000000000000 Size.Width = 917.000000000000000000 @@ -25,10 +30,8 @@ object SaveUnitForm: TSaveUnitForm Size.PlatformDefault = False StyleLookup = 'Memo1Style1' TabOrder = 1 - ReadOnly = True - TextSettings.Font.Family = 'Consolas' - TextSettings.Font.Size = 14.000000000000000000 - StyledSettings = [Style, FontColor] + Viewport.Width = 917.000000000000000000 + Viewport.Height = 551.000000000000000000 end object Panel1: TPanel Align = Bottom @@ -68,6 +71,7 @@ object SaveUnitForm: TSaveUnitForm end end object sd: TSaveDialog + Filter = 'Delphi Source File|*,pas|All Files|*.*' Left = 88 Top = 40 end @@ -82,1354 +86,1358 @@ object SaveUnitForm: TSaveUnitForm Text = 'This unit is generated based on the JSON string:' end object StyleBook1: TStyleBook + Styles = < + item + ResourcesBin = { + 464D585F5354594C4520322E350106265374796C65426F6F6B315374796C6542 + 6F6F6B3157696E646F777320377374796C652E706E670444910000060C50616E + 656C315374796C653103D800060B4D656D6F315374796C6531033E09061A4D65 + 6D6F314D656D6F315363726F6C6C4261725374796C65313103690406144D656D + 6F315363726F6C6C4261725374796C6531036304061F4D656D6F314D656D6F31 + 536D616C6C5363726F6C6C4261725374796C65313103AC0106194D656D6F3153 + 6D616C6C5363726F6C6C4261725374796C653103A60100545046300654496D61 + 676500095374796C654E616D6506265374796C65426F6F6B315374796C65426F + 6F6B3157696E646F777320377374796C652E706E670E4D756C74695265734269 + 746D61700E010557696474680390010648656967687403580203504E470ACC90 + 000089504E470D0A1A0A0000000D49484452000001900000025808060000004C + ECB088000000017352474200AECE1CE90000000467414D410000B18F0BFC6105 + 0000907649444154785EED9D078014D5FDC77FBB7BB757813B8E8E059122448D + 050D120DD841516CD8A548A251A3422CD1FCA38831D1D8301AB1244AB1077B03 + 3B58D0287605B152A4C315B87E5BFEBFEFEC7BCBECDC6CBD6D77FBFBC0F7E6BD + 3775DFCCBCEFBCF7A69020088220088220088220088220088220084207C4A186 + 82207410EEB9E71EBF0A0A162EB8E082B065DEF537DE21F916866BAF9E6A9B6F + B689B5B5B5929149A6B4B434A259FFE3D6BB732ECFFF74F9457201931C908FC1 + E3070672C61967A898A079ECB1C7A21AC835575DAA6282E6AF37FD530C24D3C4 + 6220575E76A18A757C6EBE6D961848F2D0F9689CB76220F688812446240371AA + A12008ED17316221238881088220080921062208ED1F398F858C20079E20741C + A4294B482B622082200842428881088220080921062208822024841888909578 + 3C5E3FF0F9446601E48DCA2641C82862204256C265254B0F453B14C81341C806 + C44084ACC4E3F15153B38F9A5B4466214F903761106711D28A18889095B478FD + D4E2F1B27CA210719EB46EC10AEB2882904AC44084AC0457D9B8E26E11850879 + 12A106220869450C44C84ABC3ED440B8D0F48A42C47982BC11846C400C44C84A + FC7EBF28826C105711D28E18889095A08C1485970569D3123282188890956CAB + 6DA2CAEA46AAAA1199853C41DE08423620062264250E8743144182900D888108 + 5989D3E12487536427E48D20640372240A590B9795C6012A32097F04214B90C3 + 51C84AD04A631498188A7648E58D20640362204256E23435D9884285BC11846C + 408E44212BC1D5B68BFF885A8BFF0B42562006226425B8D3C8A9EE3812ED90CE + 1341C806C44084ACC45A708A422508D9801888909538BC9E16878345A210214F + 386F5436094246B1BD94A9ADAD6DFDB204A14D94969646BC6CFCC7AD77FBAFBC + EC4215EBF8DC7CDB2CFAD3E51785CD9377DEFFCA5F55534779792E9522008FC7 + 4BE55D4AE89083F60C9B77F7DC738FFF8C33CE503141F3D8638FD105175C1036 + DFAEBFF10EFF35575DAA6282E6AF37FD93AEBD7AAA6DBED9268A81241F319050 + A219881C839189743C8981D823069218910C449AB084AC0405A428BC54360942 + 4611031104411012420C44C826E4788C0DC927212B900351C826E4788C0DB71A + 0A4246B16D4B950ECCE413ADDD5A3AD10DF2581E04AAAAAAA6FE549D3F73FD76 + 17357991929B14B8887A77F2D26E652DD3CACBCBFFA5920B59B581606BA413DD + 1EE9444F0CB90B2B0B100309259A817CFC53ADDFE9CCA7DD2A028568AE02F3FC + 692B91CFD742FBEF565AA0925103110389133190C490BBB084F642F0785CC735 + 0F9887CBE1A316AF376785DF8F7C407E30A546E6048C5610328E18889095B4F0 + 95773E97993E9FDFF69BE0B922FC7EE403F2836964E19C95F356C80AE44014B2 + 1A2E43735E8290AD888108D98D5D899A6BDA819CAF42562107A490B5D895A5B9 + 2A41C846C44084EC854B4E6B419A8B0AFC31F0A9A1206405622042361152401A + 0528FFC97905B2C38C71ABB320641A3110217B518567AE2BF027084C566A2242 + 56200622642DC1C233C78581428C43C82AC440846C420AC8C8E8DA8734610959 + 81188890D5582EC6735226B4C18AD10A5981188890B5180528FFC97905B24323 + E621640D62204236115238EAC233E7853F0174FE4813969015888108594DC895 + 788ECA06A985085981188820B42FC43C84AC410C44C85A8C2B700C735DF81340 + CC43C82AC44084ACC6DC9493AB12846C450C44C84AF00D8C662F1FA0CE881F72 + ECF0E0F7231F901F82906D8881085949EF522FADAE2672389C54E876E5ACF0FB + 910FC80F41C8366C2FEFC27D13DD91DB17836DA2A444BE896E26CC37D1835455 + 554DFDBE327FE6C63A9771059EABB08750CF122F0DE8DA32ADBCBCFC0E951C11 + F926BA3DF24DF4C488F44D74DB443190E42306124A34031112470CC41E3190C4 + 886420D284250882202484188820088290106220822008424288810882200809 + 21062208822024846DCFBADC85957CE42EAC5022DD85B568D1A23FF2E0B6404C + B0C3EFF7D3A1871E6A9B7F7217963D72175662C86DBC5980184828910CC4E7F3 + FDD1E17088814481F3C836FFC440EC1103490CB98D576857389DCEDB51385A70 + 8A42A5B24B1032861C8442B6822B1EB30441C832C440846CC36A186613C955E5 + B3F03A45B3902E0819450C44C83674E1A8A531A769E1F8CD15E52999D30421A3 + C475105ABF53208A5D424CE078D41F4DD285A42E3871150E1598E4EEE0D2BF1D + 7902E15BE87A28DF4517320EAEE25A11EE2E2C21714A4BE52E2C3361EEC2321B + 889020B80B4B05050BD1EEC25241C142526EE31512470C241431104110842401 + 03C925F07BD54F3703031104A19D2027AC904D48ED4310DA1162208220084242 + 8881088220080911B16357481FD2892E0899A5A9B9C5FFE6E71B68D9EA1AAAAE + 6B56A9B94959899B86EED2850EFB652F2A70E7873D4FE504CE12C4400421B33C + FDDE4ABFC3E9A27D76EF4EA5C578E42877A9AD6FA1CF7ED84C7E9F974EFA753F + 31906C27CC5D491D1A319000CB96AFF07FBDEC5B151352C52F860EA2A1430687 + 3DE6FEFAD8E7FE29A37F41CD3E224F8EDFCE91E72472B31E58F8355D73C62FC5 + 40B2946CEC83923BA1D2CCEA359BFC3BEFD45DC58464E353AF8258BB760BEDB2 + 738FB065DE35F33EF15F7CE22FA9A6411E83035D8A1C74D7339FD35F27EC2706 + 22B42FAAAAAA465556569EE1F1788ECECBCBDB55256725BC8DAB781B5FE9DAB5 + EB63E5E5E58B5472CC8881A4162FE4F5D2C6F59531194855BD1808282F160311 + DA21CA3C6EEDDFBFFFFE2AA95DF0E38F3F7ECC267279BC262206925AC4401243 + 0CA41DF1FAEBAFE7D4517BC41147843DF67EF8E187FBD83CCEABAEAEFEC0EFF7 + DFCB85F25C352A2B61B39BE870387E5F5656369C4DE4FEDD77DFFD7C352A26C4 + 40524B5C0672821888C6309067C5408476C68A152B560E1A346857AE894CCA76 + F3D0C044B8E631E7DB6FBF5D3578F0E07E2A3926C440528BD9401EF84F77D78C + 190EDB7E3E319050623110799050C83A749F477B310FA0B735DBFB6B729D65BF + F81AAFC78F08EC43141B62208220E40CDBD7BB23B6BAC45A70E602B1E4851888 + 20088209F355782E2B166CDDF8E0E9CFC53A7F467977C6B8885713EDE5E1BC68 + 0FD47594DF112B3FFCF083BF7FFFFEE4605452BB00AFA9FFF1C71F69F7DD778F + 6BBBA50F24B598FB40CE7BBABA70E1A5839A026342411FC81FC6FD92B6CA7320 + 0615450EFAD7730974A2C340DEBCF63815CB4E0EBBFE85980C24DB5F0F12CB2B + 3DF03B2E9B1AD78D3D69E7B63BEE13031103C94AE231908BD8402AC5400CBAB2 + 81DC1DC5402236615537F9B352B94A535353564A103A0AB83D0B0FAE8B627B25 + 455803E1F9B35AB988C7E3C94A094287810B17BBC23417154B411BB1060207CA + 46E52A68D1C946094247C2AE30CD45C5427803B15960B62817AB207EFEE1D92C + 41E828E82226D7150B119BB0F016CB6C54AC3FAEA3615770678304A1A3A00B4F + 5140D1886220D929FE2F0882206498887D205E2EA9B351B98ACFE7CB4A094247 + C1285EF047640CA2219DE8ED04BBA6A36C9220B4130AD4302C389C452A33A210 + BE09CB6681D9A45CC4AEE0CE060942470287B44865461422D64084ECC2AEF0CE + 060942470187338E68110B7FA210D6405A78E69F6A1D59296C5BAE81BE866DDB + B665A5A41F44682FB84BA2F7A21A85A72826C21A88D72813EC169B7905B62DB7 + 30775A67A304A13DE0AE2989F8EA04A306220A2A1A119BB0EC9A2BB241822008 + 89509BD728573B49247C273ACBEE21BE6C50AE5A889D99668304A12381235A14 + 1B110DC4FAFC45B688FFE71C7605773649103A02389271388B58812C8948C426 + AC162EADB351B9080A697CD3201B250622741470248B76281AE16B2028B07CD9 + A95C2DB0EC0AEF6C90206433C671EA89ADEBC35A80E6BAA261FB2E6E7C91F0E9 + 3F8DA5B7D735AB94ECE2377DDC74D23F5ECCA92F125EF4FB8984AFDD6523F87A + E0DDF7CE952F1232897C9170CDC62ABFBFB945C58454E170E7D3EF1EDF1CF18B + 84E71EFB4BDAB82D96A2B3E3D3B3B3831E7C29C14FDA3EC506B2786D767E6D6E + 64DF023A39C70CE4C2F32764B581CCBA6F9E18488206226407DA40D68B8118F4 + 8EC140C2F781F8EDEF80CA0661DB721134DD65A304A1C380C359B44351B07516 + A30672E5B1F4E6CFD95903396C27AE81DCFC52CED540BEFFFE7B95925D0C1830 + 406A200C9B6942359065CB57F8CF7FF82B151352C57D67EF4943870C0EBB6F8C + 1AC831BFA475520331E8831AC8CB093461094226C9350379E9D3F5FE63F6E9A5 + 6242B2315A2D98859F6FA463F7ED2D061223B11848C4DB78054110DA3B7EBE0E + F1C4F8BA1DA3E586FF8858812C89881888906CA4562BB45B5070FA44869017D1 + 10031104411012420C4410849C61FA747FD832AFB8C0458DCD5ECAE329429A72 + 7250C803E405F22412D2DCD0469A7DBEE10B5F7EF9F76FBCF6FAC48D1B37AAD4 + D4D2B3674F3AFCC823E68E3EE6987BDD4EE7072A99CE3DF7DC631D0EC7012A9A + 36FC7EFF470F3EF8E04B2A8A638A0FC1C4914E742199E05D09781AFDF52F37D3 + 9CEFB616CC3F754FDB27A49F7F7F95BFC9EFA23DFBF7E20234B78B468FCF4F5F + FDB881F239F74E18B16BD8CCC8ED5C4A024F3DF5CC9C850B174EDC73AFBDA873 + E7CE2A35B5E0234E1F7EF83F3AE9C493E69E7CF2899390A6CDE3CF7FB996FAF4 + EA634C970ED66D58477FBFE17AB389E00AAF4DAFCC1603119289D940EE7A7B7B + D827D1EB1B9BFD0B96AEA3656B6AA8B925B75FD1E3CE77D1D09DBBD098617DA8 + B8D02D06922A7E7FE11FFC43860CA11E3D7A52972E5D546A6A71B95CB4ECEBAF + 69C5B72BE8DE59FF32F6E1942953AEBB8ACDA3578F1E545BDF684C970E4A8B0B + 69C3A64D74139BC8030F3C701D27898188816415B11A88103F61DB0385D8D8BC + 6933959575A5B2F20AEADAB57B7A54D1830E1A7188B16E33DDBAF5A02D95B5D4 + D8E8499BB03EAC571084DC430CA48DF87C7EAE11E493DB5D444E973B2D7238F2 + C8955760ACDB848BAFFB5D3E9F2FEDC27A8DF50B829053C040A03C2326C40D8A + 7087D369C8E974A5450E47607D66FBF0FBFD25CD1E56B327FDE2F562FD6A5304 + 41C811601E6E56BE116B5FC0F432BEDDCDCDDE4081AE0AF574885766AC0FEB16 + 0441C814E8EC2B667958D9F9F18FF0C0F832BECDC78C3DD97FDA9913A957EF9D + A9B4537AEEC2D2FCEDBA2BE9E5179F0A76A29F72FAB954595D6F8C4B275DCB8A + E9C9C71FD49DE86D463AD18564229DE8A903077A290B5FB30966EAAD77DFBD73 + BEC773B2CFE1389A337F7FA4B9883E76FAFDAFB4E4E53D75F94517AD3126B470 + DAAD8FEDECE0F9F8FAF86872F88DF9C8EFF8D84FFE57FC3CDF13979F613B5F82 + EB2BE0F5F548647DC9E4D8E34EF69F71F664EADD67173690F4DC85A5B9FE9A3F + D24B2F040DE496534F9F425B6AEA8C71E9A45B9712FAEFE30FC040AE50496D62 + C58A152B070D1AB46B5555D5A4AE5DBBCE55C9594D6565E5C4F2F2F239DF7EFB + EDAAC18307F753C9312106925A72C8405016B4E919AC78411316561ABC629A79 + D75D07B9BCDEBBBA5654CCFCD5B061A3279C7E7A770861A4611CA651930739E3 + E6470E72787D77F5EE5E3EF3E8437E39FA4FBF3DBE3B8430D2300ED3A8C98324 + BABE13AEB97B38963960975E33CF3CEED7A367FCE194EE10C2480BB7BEE4E3C0 + 9527F97C3EF2F1419A0EF9795D9069B7611BEA9D4E47BDCBE14CBBB05EAC5F6D + CA8E8D4A10AE7DBC822B79AE80FC1E05B34ACE5AB08DD8566C33B65D250BD949 + 811A0A4900277B190B8EDC809A000AECFEBBEE3AEEE0830FA115DFFF445535DB + 301D559477A181BBF7A377DF79877E5CB5EA39AFCB75B1AE1918350F2EB0F71C + D077DCB8A347D0076BFCB4B1D6988D7A75221ABE93839E7D65097DF5FDDAE7FC + 2EE7C5BA66605DDF17CBBEA5A55F7F67CC77E05E8368CF2103C3AFAFA565D6F0 + 7D078D3DFCE0FDE8AD6FB6D3E75F7E6BCCB7CFDE83E8D0C19DE8F5773FA10F3E + FF21647DA960ECF1A7F84F3F7322D74076A64EE9AE814CBF825E7CFE49A3C03E + F7DC736F3F7BC2F95459D3608C4B275DBB14D1C3F3EEA3071F7CF08F1CC5F6B4 + E92A886B1EA33A75EA74EBAA55AB02B5CA76C2AEBBEEFAF1F6EDDB2FE79AC822 + 9514135203492D961A4817AE81040AB58E479BCFBD7809A981A019A95BD7AEE3 + 861F3482967CF4293534355345450575EBD68D77808F0BE9E534E2D7BF264C83 + 69310F403352EF6E5DC61D7BC4087A6A999F5A3C4E1AD4358F06B37C5E273DFF + AD9F8E3D7204611A4CAB660B59DFC3CFBD42BFBFE15E7AE3A3AF69FE2BEFD0C4 + FF9B49F35F7C23ECFA06ECDA7BECC883F6A3BB9EF982FEF5972BE8E7F75EA02F + 5E984BB75C7631DDF9CCA73472C47E3460E71E21EB4B1578B00F72A649E81AB0 + 760F707C9BC395B7CDE174A55F582FAF5F6D4A9B41018C82B85FBF7EF7EFBCF3 + CEABD01F92CDC236625B13310F4168CF38F94ACFD9BD7B771809A10F62C0EEBB + D3F73FAEA2929252EADCA933B9F3F3A9B4B8887AF6E846DD2BBA12DEF7846930 + ADB104067D10FB0CE9471FADF353AF1227F52D7552A18BA8D44DD4BFCC49FD3A + 3BE98B4D7EC234467F8542AFEFEB6FBEA7BB1E7D992EBCE83C9A7ED3DF68FF69 + 97502DE5D1DF1F789256FFFCB3EDFA86EF3390DEFE6E3BBD3EF74EFAD36517D1 + BCBB6EA063FEF5776A7017D382FFCCA40F57D511A631AF2F15A020773A03B7F0 + E6E5E5A545DA4020336EB79B559C01E17E86E48282984DF97C5E763FFE9D590D + B611DB2AE621E41A4EBFDF1F2C85D081BD3B17D6553535D4A573272A2CC8A74E + 2585D4A5B4888745D4BD5B57F278BCB8CBC49856CDC6A5A87FFF5F0EDE99D66D + 27EA59E4A47C368FA27CA2621686BB757152A3C7419826D8D9CDE8F52DF9EC6B + 2A2D70927FF75D69D69A95F4D64A2FB98EB9889A6B6BE8C32FBEB35DDFA05D7B + D2474BBFA04E3C5FB75FEF45B7143AE8859FCBA9F0B73379BE6AFAF293CF09D3 + 98D7972A5C6C20792E16866990D309D30A350F50E82E64B933A042B5050669AD + 420B4207A0F5C9DC4ED04D58211470ADA3B8A8C0308DCEA5C55C1B29A6828202 + 4308A33DD18E3C368E82BC8069A0F6D18D0BF5EEAC72B7837A15398C8E663BF2 + F3F269C3860D74E7ABABE89D4F6B0977A2363407CAA1C2C282B0EB43198AF9AE + 7EB5915E7C8F684B2D516D5360BE2EBC0DDE18BF42D6165009E08BD0B42A50E3 + 7172586D84228F0BF24C491084DCC3515A5ADABDA8A8A861F3E6CDB533EFBC73 + C141071E38BAA0A8C468BAEA56516E344FE473180557535313353737D3CA952B + E9FD0F3F5C38ED924BC6602167DCF4F0823123F719EDED36900AB960DBADB393 + 3AB36994B299B8B890DBCE66B0CDEBA36FBE5D410B167FB6F0B1ABCE36E6D3EB + F339F3E9F42B6EA61A3CDA71C485E4610F70BC368B2A9C2DB468DECDB471FDBA + 56EB3B7BDC21A37F6A28A67F4CBB986ADD5DC879CEADD40CBF78E8722AF7D4D0 + 9CB9F75043C3367AF8B97782EB4B0593A75CE83FF4F0A368D0E0A1D4B933EE47 + 483DB8EB0BDCFA8F1934FB8159868D4C9E3C79EAD9675F58D6A3CF4EB46D5BFA + 1E8FE9DCD94DF5B5DBE8FE7B6F4EDA7320B98674A2A7165C7EC6DA89FECF7FFE + 536AD061B8F4D24B2D97AC81DA47050BAF6FADE3CC9B8A5B67C78C1E43AB56AF + A66EDD2AA84BE7CE46BB3B7600CC03B590E79E7F9E2AB76E9DC60BBC030B39FD + A687A6F6E9D175E639A71C49EFACF1D31E652EEAD7C949C55C2369E1427D7B8B + 9F8A8ABC74CF63AFD1BA4D95D31EBFEA1C633EF3FA162C7A8FFE7CE723D4D2B0 + 9D1CBC0BF38B3BD17F6E9846C3F7196ABBBE81BBF69E79D2B1BFA1392F7F4A4F + CD9A491E9E0FE41775A2E97FB99C461EB237CD7BF66DFA6ED5FAE0FA52C103B3 + 9F9AF3FE078B269E74F219B46BBFDD556A6AA9AEAAA4271E9B4BBFFCE50173A7 + 4C3ED9789D3B1BC8C15C2B39E2F77FB88ACA3A7735A64B07D5DB2AE9DE7FDD04 + 53337F134488033190D4623690FB3EAEEEFCFC6F87040A0B1BF8381603090357 + 22221B88F9B6DA912347D1B6EDDBC8E97052BE3BDF6866CACFCFA337DF7C33E2 + 6DBC278F1941EBB63988EB2CD439DF4105F97EAEC5F8E8B19722DFC68BF56DD8 + BC99967DB79A5CBC9EFD860EE482B034FCFAD46DBC47FF663FFAE6E7EDF4D38A + EFA938CF41BFDC7300F5E85E4A2F2C4ACF6DBC2FBFBA74F8920F16FDFE8B4F3E + 9AB86D5BB54A4D2DA8E9ECBDDF0173470C1F75EF31470DCBB60F4A0971220692 + 5ACC0632FBCD96E2272FDB25ECBDEE355BB78A8184A14B4585AD81E0E105B479 + 18996A3CB4E7F7FF09B7CEEEDEBF3F0D1A3408C9F4DD77DFD1F73FFC405B2A2B + 9F632BFAC7B48B2F7EDF18A1C0437BECDD7FEAD3BD6CDCDE8377A1FD7F117818 + F79365ABE8F36F56D1BACDD5CFB17FFDE3B12BCF0A992FD1F58DFBBFBB461575 + EE3A75E02E3DC71DB8F7EE3474F7C0479496FFB89EFEF7F9F7F4DDEA8DB6EB13 + 846C430C24B5589AB0223E892E06129E7006821738C140825F214AF0D522E97E + 954921AFAF7B22EB13846C420C24B5980DE4D87D7BB72A04CD888184279C81E0 + D1FEF6F86E98F6BADD82108218486A1103490E760682DB78F359EDF1FD30621E + 82204405E6E1F5A4FE96FE5C048E829BF8F16D0DF5F62A211BF9C7AD77B78B2B + A33F5D7E51C42B3CA135A881A8A09062A4069238E19AB0F01E0AD44450D3335E + 69C2205D4F8CA139537518968E71A8C16088B88B8557C303EB7CFA12400F310E + D2CBD1E9820D30902B2FBB50C5B2939B6F9B250622B46BC440C213CE40B40158 + 0D44A3C3BAC03783B8FE1C2EA683F0712A609DCF3C2FC2E6A7E011D606126E7D + 588F8EEB21A6C5769B31CFA3411AA6D5432C0BDBA9B735EBD106F2DCCAECFCEE + D7B87E6E3110A1DD2306129E700682C214436B0DC03CB13553314EA7A1D6A141 + BAB940B7DB193A4D9B15302F0FD8AD4F1B8E1E8721E2E6EDB69BCF3A3D8069B6 + 5B0341619D4DE86D120311DA3B6220E10967205AEDB109C95C730987FED1EDFA + C01003E9B878BD5EBFCBE5721C3CFDB9848FD14165AEC5E3470DBD7BCCBEFDE7 + 23BEE7B9B724BCACEE79B58B4F1A39FCEE8BCF1A632C2B971003094F2403914C + CB72C4403A3E309037AF3D4EC5E263EA9CF7A857312DBEF68C4346210E03F9E3 + F1BF34C6C5CBDCF92FD1803DF658FCC0351718CBCA25C440C213D5406E9F3933 + EECCFBE3B4698EF17F7F28EEF9E6FFF91C47475F9F0A260531908E8F36906AF5 + 46E978282B70D061D7BF40EFCE1867E43F0CE482317BD198C37E638C8F8745EF + BC4BB73FFF397DF5E01539B72FC540C213CE4082A0803DEF77BF53B1E8DCFFEF + 7F070BD87F5C769A4A8DCE9F6E7B2258A0475A9FFE7812EEE3C6ABE0635D5F67 + 97930A78BEED5E1F35E2FD2A31AECF4A5B7F9F8A260531908E8F3690CA040CA4 + AB8D815C7BE6C1346CDFBD8DF1F1B0F4D32FE8FA47DF15031142B03310734776 + 9057DF7ACF56AF2D5A428BDEFB1FBDFFE1C76ACA50FEFDB1DF5E9FF8E9C1CFFC + 34EF0BFB7D63B72E7CA5F091673EA06B6F7B9ED66DAC348CC48ADDBABEDDE0A4 + 271E799F2EBCEC51CADBDE18D2C3AF39E092FBE8C04BEE57BA8F0EB8F85E1AF6 + 875934ECC2BB68FFF3EFA0FD7E77AB9A3294632FB88BC65EF02FA5BBE8D8DFDF + 49C7F0F4C7FCEE361A73EECD347AD2DFD5948290383E3E4DE2951DEE820272E6 + E5C72DCC2708B1606B2060E79D760A51FF7EBBD2A001FD6930CB9DAFEFDC6DCD + F0DE7921FA75DF3CFACD4E793492E5B22BCD15E675EDB2F3CE34A0FF6EF4EA3B + 3FD0C75FADA71F566EB13510605ED7883E7974686FA2DBFEFD163DF6FC27F4D1 + E7ABA9C0E6CB7D60FC79A7D289934FA663CF3E818E3CF5381A356E0C0D1F7324 + ED77D828F279C3DF9C75DA8C2974D25F26D1D83F9D43474F3B930EBBF0341A31 + E554DAFFEC9322CE2708B1E2E35A73BCB2037797787954BC6A8F77D3089921AC + 8168F0E9D402773E1516BA8D4FDC229C8F4F0F4601C53626C3E76DDD6A18A62C + 0F01EBEBD6B58CDEFEF047AAACAEA3DD76AEA0BDF7E815F66B861A2C7AF72E0E + AEB52CA5D5EBAA68CFC1BD69D84143A8DEEEF2CCEF234FB3875E5C5B4BAF6EA8 + A7455B1BE8BDEA46FA685B1335D43590DF13E6590B9EAFA5D94B0B9AFCF4BAC7 + 498B298F96B80A68A9BB881AEB9AC3CF2708716057A847931D787B07BEC713AF + E4AD1F42AC8435107C3215DFFF80611415B2D83C6020A87DB8392D1CA828B878 + A9DA38B479E4715A49F8D9A8B8B890BA5594F13ADCD4B5BC333DF3CA17C6369C + 36765FAAAD0BFF96958A42A281650E2AE44AD1A04E7EFAC7BD6F18E9575F7424 + 7D5D657DC630809FCDA8A90905BE877C9E16F2353591AFB181554F0DB5F5E46D + 0EBE983804CCD7DCC4D3F319E66FF1F27C5EF236F2321A5AA8617B53D8F90421 + 1EEC0C229AEC0818883F6E898108B1626B20795C7580591473ADA3940B767C1B + BDA4B888D30A8CCFDB161616A92943E1F2DE300B7C179D6737BE8DDED9CDC290 + 5551605F05E9D9A31B71B94DEF2E5D43BD7A74A50F3E59459BB7D6D1CE7DCAE9 + E003FA73A16D7F65BF6F775EE1CFABE8E5F98B68685707FDF7A5CFE887555B68 + 50FF1E74F2E8BD695D9DFD99E5F779A8A9B1997C5CE0FB1AEAC9575F475E96A7 + 763B1B411DA7DB7F6FC698AF810DA3C9435E1E7AEB59752D3C5F0BD56FE76585 + 994F68FF5C70C105FE701A3E7CF8483599191C7CE1D49F15162EC3E3961D1E1E + D1C2EE12AF309F20C482AD81B8B58114B95905C6676CF5B7D1030682F72FB606 + 350F5DEB28661329773BA88C852F1396E439A83C8C81F4EED98D1E79F6637AF8 + 69343FD5D2530B50FB70D0C963F6319AAE0AC2ACEF57BD5CF47FB7BC4857DDF4 + 02AD5CB6926EBCFB3523FDF2DF1D4AD51E5E7798F5F9BD6C04F55CE3A8E7DA06 + D76E3CB5DBC8B3AD9ABCDB6AA87E5B2DD724C21888311FD756601C6C1A9E6D4D + E4A9696635F17CA88188817454EEB9E71EDB83E9D34F3F1DF5C1071F2C565133 + F6071F11BE7BFC6320680F97E171CB0EC34012901888102B616B2068AACACF43 + C7B7CB109A93F4104D5B76A00682A6AA023690229EA41066025351C22767EDA8 + AAAAA6A9E78E343ACAFFCC86F0F3866AEA51D1890E1D31D0309070EB5BBAD94B + 0FDC7C86111E75DA5DB4FCFB8DB40BD75ACE3A7118357AC3AFCFD7D24C0DB50D + 01F3D8CEE651534D2DD555868934D6710DA4C5FE4DF181F9D830A06D01E3F054 + 371AC3C65A369630F3091D03AB8944300F8DF5008C6A1E606DBD236ED9E1F1DB + 1B4434613E4188052ED65B63F473B0F01C86360D0805BC61209C6E87AE8118E6 + C135887C8EA30C87A940A895D8D1D4D444A5250574F8C183F88CE37FBC9E7147 + EDC5217FC4F5ADACF551E74E8534E1E41D9F019F3A6524353BD8EC22AC0F9DDD + 8D75F534D0DB42FD9A9AA937D72A2AEABDD4B91EDB62DF6F0202F335D1C08D5B + 6997751BA9E7EAF5D475F53AEAB4666DC4F9848EC3C71F7F6C343F7DFEF9E7E7 + 44310F4D57351CC68A6A1EC0EE2EAB68B2E3C7EA66FA6A4B53DCC27C82100B5C + CCB6061DD99B376FA1CACA2AAAAEA9A16DDBB7532D5F99D7D5D7531D17BC2E97 + 7DC90CE3F8B6DA4B2BB7F9E8672EDCD7D7F96873839FB6B0B6B2C2DD529BC7A5 + 7D75E5663A65CCDE74D888DDE9888307F270206DAFAD8DB83E9C361FD517D2F4 + A9A3E9B7A71F44E79F35C218AEA98DBC3EDC6EFBE182E7E9F3375FA065EFBE44 + 3F7EFC3AAD5FF6366DFD6E09D5AEFA9F9AAA3598EF8307EEA34F1FB987BE9E3F + 8B7E7CE93E5AFBE683B4E59D79B4FD7F8FA8A9848ECC871F7EF8136A224B962C + 79582545A38A8503D1FEE1291BBC5C0B88577604FA347C09486A20426CD81AC8 + D0217B50BF7EBB52EFDEBDA85B45055FE577A2E2A2222A2A2CA4A2A2422A2929 + 56538672D260071DB20BD15EBDFCB45B371F75EFE2A3D2522F159704D4A593FD + 553AD6D7A74F6FEA51514A174F1A49BF3FEBD75C83F01B9DF6D1D637A4879F5C + DD3BD1CD7F3D99FE7EDD4954E972506171E4F57DF9E85FD9006EA6E5CFDE45DF + BEFC6FFAEE95D901BDAAC4613BDE98FF0F7AEBD93B68311BC7BBAFCDA5F7DE7C + 24A0B794382C086D054D48F1CA0E984193277E613E418885904BF48EFE6EAA74 + AF4F059382BCCAA4E3A35F65B2708DFE265BEC8CDE39BFD5AB4C0E19398C761E + 38C4181F0F6BBE5B4EEF2C5E2AAF32114288FA2E2C217B1103E9F86803796955 + FC7D10C7EEEA6E6520C37FBD1FF51DB887313E1ED67EF70D7DF0DE2762204208 + 31BF0B4B1084CC61D7C7114D1A3FA382D48C26A9166FDCC27C82100B72B5D84E + 30D740B211A981B41D5D0379E6C7F8DF687062FF42A306F2CE75C7E32E46076A + 207B0FDB8B7AED3E584D113B1B7E58415F2CFD526A204208D284D58ED10692CD + 8881B48D6418C8E26BC7E2D67BC34086EC3334610359FED93231102104311041 + C862B48124C2950F2DA12E05EC1FA71E34D26C209DFBECA2A6889DDA4F1653AF + 5EBD16FFF39253E48B844210311041C86260202A1837C7EFD363F169C387DCBD + 6BEFB2367F137DDC217B2D9E74E401770FDCA942BE892E04B13310411004217D + 74A81B97E42E2C2199C8158A206490D9B3677FA78269410C44482652FD17840C + E2F7FB2B55302D888108A9043512A99508429A70381CDB54302D888108A944D7 + 48C44404210D700D24FEF7E0B4819013BBAAAA6AEADCB97367AE5FBFDE78C5BA + 10001FD4EADDBB374D9C38715A7979F91D2A59880DF331264D5C42AE838BF694 + 3DEAFFE0830F3E7DEEB9E79EA4A22927C4406EBCE9263FDEBA7BDA69A751B76E + DD54AAB065CB167AE28927A8BEA181AEBEEA2AB99A8E0F9C30DA38C440924781 + 1A9AF3D49ACF18CA876AB28B941AC8ECD9B31F9F3C79F2E92A9A72420AC32BAE + B8C2CFA2B2B2326A6C8CFF69D88E0A3EE15B5D5D4DB7DC720B148B81601A292C + 03B858C80B6BE12608D946BB3F6FE7CC99F3F0A44993CE56D1941352184E9D3A + D57FEBADB7527D7DBD4A1134C5C5C574F9E597D31D77DC2106121F622051F8F7 + 7FFEE3EFDEC16BFCBF193992BA9697C772EE086D800D64361BC864154D39AD0C + 0457D96220AD8181A07626061237F89CA436102DC1C4B3CF3EEBFFD588112AD6 + 31E9515161BCA34B458514317BF6EC7F4F9E3CF9772A9A726C0DA4AEAE4EA508 + 9A9292123190C4C867A1CDD76C1E61F366FDFAF5C638341B9AC177F2F1A6720C + CD200EA1C9B5478F1E8EA7DFF9D2FFDAF22DF4E5DAD8EF66DCAD5B091DF3CB3E + 74C66F861A0B7F68C1FBFE27DFFF8EFEF7DD06637C2CECD1B72B9DFE9BA1F4FB + E347C4727C84200622240B3690BBD9402E52D19413B243B581D4D6D6AA144153 + 5A5A2A069206DA6A2017DCFF96FFCA13F6A75DBB77E2E9D5440A9FCDA75F91F4 + DDBAAD74C3531FD363D3461B0B1F77ED3CFF35938EA6FE7DBB113E8DE135CDB7 + A5C9D4FFC9C988D634FB68E59AF534FBB157E8DD3B7E1FCBF111821888902CE6 + CC99F3AF499326FD4145534EABE7407092FA7C3E9145C8973890132543A0E6B1 + 4BB74EB4B9C1476B6BBDF4D3364F50AFAE690AD1533F34D0235F6CA2627F23AD + A9DE71DB3A6A1E308F2A36868D8D3E5A53EF0D6AE9D696A03E62BDB9A1899E5D + B99D8A8B0BE8FB8D697D864B10EC48D91D5E76C883844287A4D9E7574238A0DA + 167F883C2DCDE4F5B490C7E35173ED00358F7A4EDEDEE2E31A46E0E2A1BAC94F + 3FD779835ACB86B2B6CE430DD55BA9B9B1C19846881DDC3C80DA57BCAAACAA8A + EB6A2E97E00BDDCC1B08AEB645A112720B345B35787D41B3595BE7A33A8FDF68 + C2D2DAB8BD811A6A02AF1EF2DA98901019DC7986A6BB78D5B95327B504C10631 + 906C94200882104A2B0341757EDBB66D228BEC9A39848E4FAB4B075C4C680942 + F691D66E09DB95D97522E7BA84DC044D59A1B551DC50119020641B0E8723F306 + 127AC288202137F1C22760164A7E1F1F0F4A82908564D6405058DA5D81E7BAC4 + 447213A98108ED093E46D3FA08415ADD4A10B28D48170618D56AAC911890CB5D + 40EEE252354210B202B71AA6055B03B1BB02CF7509ED8B162F5193D74F5EAF27 + A896E6A61019CF8170BA1D780E04B7ED46C2CBCBC0732482902D381C0EBC7BAE + 4DF04595FFD34F3F8D7CF02BA4092B4645BA5215B20CDE55F52D1EF23437B35A + 826AACAB0DAAA1763B35D6D719D3D8D1C0E653DD8865B049B4EC50737DED0ED5 + 6DA7161EFA5ADA662278536DF7AE5D3BB484B48177CFB5890D1B36D0CA952B55 + 2C325203895142FB60608F125A57B98DFA15F96857A87887465678821AD5CD4B + 87F774D0D13B17D0CAADF554E2A9514B20DA6BD76EB466C356EA57E8A57E055E + DAB580E7571ADEC9B3439DBD34A2DC4107F770D3D62DD554916F6F46D1C06BCE + F3F2F23AB4E43D58E9812F74DB5C03E9DDBBB7E3C4134F8C697F854C849729FE + F5AF7FA51F7FFC51A5089AFEFDFBD335D75C13EBCB1461CCE23A09D0D697293E + FAD6E7FE973F5F472BAB622FCC611E678D1C4A138E1A662CFCBEE7DEF13FB678 + 197DB37E87A94403E6F1A7B3470797214407AF25C193E5F1821A0D4C49450513 + 897ED296CF2DFF679F7D46FBEEBBAFC31C56A3C3123201BE4878F1C5171BDFBE + 58B3668D4A1576DE7967E31B2977DD7557AC5F2414031184288881241F369097 + D9408E51D198C185DB071F7C40A87998C36A74584226B8E9A69BFC050505347E + FC78EAD2A58B4A156A6A6A68FEFCF9D4D4D44457C5F64D743110212A8B172F9E + BA74E9D299D68B355CB00C1B366CDAC89123EF5049213CB5E49BA90BBF5C3F73 + F9BAD0B7FF0EE9D39946EFD57BDAC923F6B09DEFF1D73F9CFAEC926F667EB572 + A34A09B067BF9E74C2883DA69D7EC481C1F9C26D5B3CF0EF58C5BFE38E70BF43 + 0C24F9CC9E3DFBB5C993271FA9A2292764275455554DBDE79E7B66F2905ADAD8 + 31D891C8CFCFA7F2F272BAE0820BA6F1D0F664B020069220BA092B11D0769BC8 + 07A5D06F72E4D0EE74E6A1BF34CE87443E28857E93530E1A48E78F3B24E682ED + B6DB6EF39F70C209B4EBAEBBAA9400AB56ADA2279E7882FEFCE73F9773B43A90 + BA83DFDDF796FFA2D17BD3D09D307A07CB7EAEA2DB9FFB88E65D321A6F1B6CF5 + 519FD3AF9FE7BFFCF4C368EFDDFBA894005FFCB08EFE3677013DF3B7DF5570D4 + 783BA479DBD0746846C7F5EB7DCCE3751843980F9B44D8DF2106927CB806F23F + AE81FC4A4523C2FBC8B6D9CA1C56930A69C6F6E604213A30904485F9F141A99F + 366DF37B7DFED8E4F5FBD76CAEF19F7DC7826029880F4A2DFD71A3BFB2C9EBDF + D4E0F5AFAFF784D59A5A8FFFDB9A16FF1B2B36F847FDF1BE1D25690CA0CF910B + 61FFB66DDB4284348CE3490604A60CE5E0E9CFF99B78E337D67B4384348CE349 + 760A4C19CA9EE7DEE26FF4F8FC6B799BCD421AC6F124430253866E1BD7C0FDD5 + D5D57EBEB0F4575656FAB76CD9E2DFBC79B3FFBBEFBE33B462C50AFFF2E5CBFD + CB962DF37FF5D557FE2FBEF80205907FFBF6ED117F070C64FDA64D710BDBA516 + 215878E0810756A8605470CE3CF3CC33465EAE5EBDDAFFDFFFFED7089BD3A321 + 059D9055A0F33C5101D43CF035C22D8D3E5A57EF8DA855DBBDB4BCAA89CA8BF3 + 433ADD237D50CAACD5755EFA6EBB87BEAAE465742E8AABD35DC3177BB68A0A4F + 82B7A998D5FAA9C7D6603ADCA26C9631AFD02170B95CA1D5D20898EFB6DA6597 + 5D1CA79E7AAA118EE72E2C3110A1C381F2B7892F52A3A9C1E3232F9E17615931 + 7F500A1F9282AA5830A68DF56C4E6C1E30217CCE160F137ADBD0E41BB7793098 + CA6C1E10D2A281E9EA5BFC21429AD031983469520F154C0B62204287C4FA3542 + 3BF97CDEC0733E36EFB5D21F94C2D3E85AF5AC46568BD74B5E964FC9AF969328 + 891808C0369A150B98AE8E4DC3AC58E715042B21D51474A23FF7E9DA99B88F7E + 5DB57CA253D3A7AC888EF9651F1AB76F5FDB4EF4EAEAEAAE1B376EBC64DDBA75 + E39B9A9A865A9F55B0824222DA34C0ED762FEBD3A7CFFC810307DEE2743AEB54 + 728706EDEC2A1837BC6F1CE803583CFD78E31BE8308948E0352678421D0F191E + 7FC7627A77C63863A7F43AE366FFA70FFCD168A602F81AA1C628E08D9729EED8 + 4C3CA18E870CC75D3D87363C76654C557F80FE815B6EB985B66FDFAE520274EA + D409B7D4E399A3811CFD3E90BA03FCC6D7AE398ED6734DC84CEF62271DF9D717 + F03B76E6E8CF81D41DA09FE3ED597FA48F37853E23B37F0F37FDE6C2DBE9AB07 + AF18CAD1E5484B5627FA7DF7DD47FFFCE73F6D7F8774A2B77F4276C283AF7FE9 + BF7B5935B51CB80F15762A51A942E3F63ACAFFF033BA6868199D7BC45EAD0EDC + 152B565CC726327DC89021C63334898013CE6C2A88E3E1B865CB96515959D98C + C183075FA7467568D059AB8271C3F994740341D395F99D584601994403B9F9E6 + 9B8D0F9699E9DCB9335D79E595110DE4D5BF1C476B2D06D2970DE4A81B221BC8 + 5B77FF91DE5BDFA45202FCBA77011D7A51A881E036DEF7DE7B6FE6A64D9B104D + 083698B55CD0CFE1DF3187A362201D90909D70F2EDAFF8BFFFF5AFE9E01E8574 + 684994B32F8778ABCE49EF6E6AA401EFBD474FFDF1E856072E9F6CFEFDF7DF9F + F00C0D9A368036047341138E70D3E1F6E1868606FAE4934F68E4C8913971C224 + A306F2D6B5C7D1AB6B9A8C6F9947022F54C47BB1F06A93C9F3BE083190D7664D + A5A55B5BE8E73AAFF1FD7303DE47C6ABDC7D8121E200EFC5C2AB4DFE7CE77309 + 19089E33328367B0A219C82B6C206B6A43CFD19D4B9D7474140379E3AE69F4C6 + CF8D2A25C0E13B15D2E117CF0C31104519AB5B209830A8A6E0165EB98DB70312 + D207B2B1A6910A4A8BE950BE223B942B202225CE0FE40BF2C70ED41470175073 + 33DEEEAADAC77DBEE0309AC24D870717B15C2C3F57809926AAF6089A81B8D615 + 22DD34140978DADA064788B4CF45C2CB9ED7C0352AB390160614FA30B0B6086F + E56B651E42C7C0B6131DC713AE88454A816C89889ED66A02D6741D8F96A6D305 + 4110B215FBBBB0B8DC324C446428F02732B8023617FC3A6CAE9198E3D1D2747A + 7BBDB26E2F8435694ED6A38CEF7E18AF756F261FD70E70D71546E28352066D30 + 7AEB450314D385034FE2F571EDC1A4588ED3DA660F7DBA6E5B8890260889D0CA + 40F83A58FD0B1C8F2248E7487870D26B03301B01D2B5749A59E6F17A1A6B9A10 + 3FDB9B7DAD3E206555A40F4AA139087D1F5B1ABDA1DF0031497F50CA176619B1 + 623D2662014785874DC3AC588E141F4FD7D0D81422A4094222D83761F1F18483 + 4A1450AC65B8B5E087CC0543B4F17A1A733CD730F769C42B0D6761E08351A60F + 485915ED8352784070CDB646AADBBA916B1D6C12366ADC5695940F4A598F8958 + C0741E3E3ECC8A655E3CFB821B33CC429A2024827D13961037BAF007BA20B0CA + 6E9CC69A668EEBB45CC0CE186215D8AD5B097DB76E2B8DAA6809F9809455913E + 28B547DFAEB472CD7A1AD1A9850EE99E6F7C342A92DAF24129EC5BF30583F938 + 8A04A648A406E2F5FAA89E4DC32CA459C11B7FF1D246DCF195A8CEBDE72D3F96 + A31699716A6B6BFDA2D8A4B22C2A210DECD8E98DA78EA5CBBBF2C957A212055A + 5C47746B653E15FEF7C5E0AD9E66162E5CE83FF4D0437180AA940028D4746160 + 0E9BB1A6EBB81EE2A1B2B7DE7A8B8E3EBAF5EDC31D914D9B36C57CF05AC107A5 + 1E7B7B99FFF98F57D39AEAD0671D2261FDA0D4BDCF2FF13FFCE617F4FDC6D8DF + E89BC807A5701BEF0D37DCD0EA036EF878D95FFEF29788B7F13EFDA7B1B4785D + E86F1CD9A7804EFA87718C86BD8DF791BFFE8EAE78FE0B9512E096E3F7A6B3AE + F977C86DBCFA8DBF43F0C65FDE237AA76088C315C3E05D5F2A8EE375C7783F1B + 7935DDF3E247F4C8D431B66F074EF76DBCF1148CB94E6969694CF91B32916120 + E3C7D2658681485E6B16D739E83618C87C7B0379E59557FCA3468D0A31101800 + B09A864E077A5CB86901EF485AB46851CE18482E0103C117407FF8E107951260 + F7DD77D75FBF0C6B204FFDE9587AEBE750033974A7023AF91F2F45349087669C + 4B97CE5FAA5202FC73FC303A67FA8321068275BC79ED71C6FBBFB8726308AF3C + C13395B8ED179516DC3A0CD0811FA805A1290D1DFA3E236D54DF023AE5E6F0DB + 230692BDC46A20AD9AB07010D434B6D0C63A9116F203F9120D188196D90CCCA6 + 018C2B35D3781DB74E27746CF0C125BCEE03866116D2F014B79AAC15837A7536 + AEEE51409B85B4126FE86B51CCE0C351DFAEDE48334FDE3F4448EBEC8CBDC626 + 089A90120B571DDB4F3A867E5FD24007168A596B3E6C74D0BD7545D4E9E997C3 + D640F6DE7BEF561FE1B21A4924C24DCB575AF4E5975F4A0DA40312EE7521EA62 + E26F5C03F90F47F1205E08E85778FAC39F66AEB27CF71DE6B18B7FFD8C7FFFED + 0ACCD7EA8A1F5F247CE2ADCF677EB73EF4B93E9847BF82DA9B1EBDFBA6791C95 + 1A88907813160CE4BC623110333090FBEB231BC83EFBEC1334106B6D421B43B4 + 1A86DD74789D09BE0E2606D26189F4BA902DAC704F7197B230AF1D98A7559F83 + A22BAB6720D80A7CEBD6F822A118486E937013167218074AE0201019E2FC8876 + E4A1D0773A9D865C2E5730ACE3D634ABF434A87198D384EC60FCF8F1AD0E01BE + 6848468114E97521915E01028340A16CA770E6016010A865D8C9300F80EFABE3 + 13B965050EEACAAA2874508F22A7F1C65FBCB411EFDDDAB7C26168583727FDAA + 878B46F4CCA3437AE71B9DF9E88FF99E6B3A919AD484F64F88CBE0AA631BD740 + 7E5B544F0716446FF3CF153E6C72D27F1A8AA973981A08EEC23AE080036C5F6F + 0D748DC29AAE89341E3590A54B974A0D2483ECB6DB6EFE534F3DD5FB8F7FFC23 + 4F25190C1C38D0A879CE9F3FBFC3ED1B34933DB774E5CC1FB726DE3712AD494D + 6A20D94BC24D583527C2406A695881E4B5666993830DA494BA3C13BE096BF8F0 + E1C613E8C90486821AC9071F7C2006922176D96517FFA041839ACF38E30CF794 + 295342F6010C640417803D7AF4A05B6EB9A523EE9F48CD64F160DBA4260692BD + 24DC84C5A516F9B8F281364C5140C80FE44B2474B3136A135A3A6E1E679E46A7 + 874BD3CD5A427CECB5D75E510B8AF2E163A34E83E5F4ECD993B876E9E613AAD5 + A538F64D9F3E7D68D8B061F4E4934F76C4C2295233593C8AD4A426B4636CFB40 + 7CFCD7EE951E392BCE8F68A5030A1373E10FC11074BA36076B9A96791E6BBA10 + 3BA831E015F8A79E7A6AD84F6A960E1AE6771577A1FED3FE1D71B77EF9E5978E + DD76DBADB1A2A2021F790A7DDA8FE9D6AD1BEDB9E79EC6ADB7A79C728AD41085 + 9CC35C3AA9132050681A1DE92243C88F80B5860785BD1E9AA5B1A6D90DC34988 + 0DF455A0B9E988238EA0030F3CB0F0EF7FFF7BAB9DD669C841FEB20346539FF1 + 97D3D0037E4D87CDFD2AE28EFDEF7FFF5B84EFBC141414E04A3A84A14387D6A8 + 1A88EC242127311FF88E936F7FC5F7D581C369AFCEF974A0B35E250B1FFA8AE9 + CB6D2DB4E7871FD87E91F0ADB7DEFA7ADF7DF71DAABF4868D7196E36028C475C + 0FCDE879918E9A0A3E2AF5E9A79F2E3BF4D0437F618C106CC15D52FDFBF7F7B2 + 81B8D0DC841A030AFDC6C6C6DD8F39E698DD314DBF0BFFE9EF3474048DD8B59C + 7A77725397021795BA5DB4ADC94B978DE81BD1045E7EF9E51FF47234B7DE7AAB + FFF2CB2F8F389F101EE903C95E12E944773CF8FA97BE7F7D5D4575C37E497945 + 852A59F0343452C9D2CFE90FBF280FFB4DF4AAAAAAE97C456A7CD6D66C0C5693 + B0330D3B301DAE7CF14DF4F2F2F29CF926BA903B8881642FF11A8831E442F0D2 + 2797AE99F9F2E7EB68F37679B581A67BA7023AE6977DE894613B4FE3C2FC0E95 + 1CA4BABABAEBC68D1B2F59B76EDD782EF4F13EA1988C22DA346EB77B599F3E7D + E60F1C38F016A7D359A7920521E5E0A9F567977C33F3AB9578B63031F0EA9413 + 46EC31EDF4230E6C75CE003190EC25210361248305C106347FAD9C7569C849D5 + F5E093FC95EF3E1D7741D61E38FDFA79FECB4F3F8CF6ECDF27E44974E32974C4 + 8D7ED2C0B4F8A261E086137C5553BF96DE6BBC63EBF197DFA367FEF6BB0A9E2C + F890A2460C247B89D5406C3AD1054130838E77F49D58F16CDB6A188B8A762850 + F3D87BF73EB4B5D147EBEABDF4E3360F2DABF4D0C79B9AE9BDF54DF4C6CF8DB4 + 605583A13B3FDE4AB7BCBF9E6E58B48AAE79F55BE375F178E3EF809D7A907AEF + 56B857A708ED1CB94754E810E0B52278B00FDA638F3DFC071F7CB0FFBCF3CEAB + 4647B79AC4A83174DE7BA4A12EFB1DE9EF79ECF9FEC1D39FF18F7D74595813C0 + 2DBF5DF63BDCE878B723AFB49CF6BCF303B9B21572123110A143F0D9679F39F0 + 5A113C197EE28927D205175C40679C714617F35D52686E6213A11EA3A7D0AEBF + BB99CEBAE42ABAFCF883E8C53387DAD6BEF1B061E14E83D9784E36EEDAB2E2C8 + 7353F16E7BD171BFE845D7BEB54A4C44C839F48983A1E3830F3EB864DA3F9F98 + 5957D09D7CCEFCC018819CBE162A69DA4C332F3D6DDAF0E1C36D3BD13FFAE8A3 + 4B162F5E3CBEB2B2D2E84407E820377794230CCC1DE73ACD8EAE5DBB2E1B3972 + E4FCC30F3F5C3AD163E48A2BAEF0E3C9703CDC17EEF90CD41850E81FD8A7139D + 38A4C2761A0D1E36C4F32287EFD685A61D147AAB2F6A3030A14376E91C7539ED + 0D7C7CEA937F5F469B1B7CD4E0F5537D8B9FEA58B52D3EAAF320CEE978352FF3 + E9BA6DD4D0D8647C5FDDF84C6E7D3D35F210DF1A99386376C887AACC481F48F6 + 924827BA63FF53A7790BBAF6A6B107EC46E59D8AC89D9F1F52D8E51A28DC9B5B + 5AC8E7C8A347DEF8829A2AD7D3C7FF9DD92A43162C5870DDDB6FBF3D7DC89021 + C62768AD46613611601E6F1EA7D301D2B66FDF4E9F7CF2098D193366C6D1471F + DD6E6EE3FDF0C30FA7AE5EBD7AE6E6CD9B554AF2292F2FC753E7D3B8C6D1CAD0 + F15A91684F86A3C670FDA1BB469C4683870DCFD8B31BFD6EFF5E21D3A3F90B35 + 186B7A4720599DE8FF9CFD342DF9CF5FC440DA190919C89E13FFEE3DF3370369 + D8DE436940FFDDC8ED1603C1837C3FFCB48ABE5BB986EE79F113FA6AEE9F5B65 + C8B5D75E8B27A009AFBCE08C57A9ADD1861109B399E03526F8DCE9B7DF7EBBEC + 861B6E68370F12A200C7CB25B90615F5F7260296C9B53E7AF7DD77E9F4D34F4F + CB017ADB92B57EEBC386E83B09D7FCD5DE09F7F1A978B0FB5095193190EC2531 + 0339F716EFB5671E4CC3F6DD1B3B28F86EA65C050595C783AB2A0F7DFCD99774 + FDA3EFA23ADE2A432EBAE822FFE8D1A30D03E9D2A54B48A169350D1D370F8139 + AC41FEE36AEEEEBBEF5E366BD6AC766320F7DD779FFF9C73CE31C2F85DE6DF9F + 0CB04F90550F3FF2305D74E145B97B80A69E481F9F8A87E087AACC8881642F89 + DCC66BE02E2820675E3EF9D85350450D7C692C376554D1B91077E5BB8D7C0907 + 0A48B7DB4D454545C6104FA36B99E308EBB879886F7E98C75BC504FB55DA13C8 + 1718209A3592297C77054321E544FAF8543C6A651E42C7A09581E0B4D4ED9C76 + 856AAE49E745B4E20A35361881968E9BD36106886B99D375D83C1EEFC2429AB5 + 66D25ED851E8A316975CA18D5D1084CCD2CA403C5C52B6885A09F9120914F666 + 6903D04373BAD920ACB21BDF1E316A1F7EDDA19A6CA1594CAD4810848C11C640 + FC228B2219086A08E8AF301B0114CE24ACB24E678DB757FC9C6F28F077D44492 + 232C33D9FD2A8220C48F3C48980450986903311B893616ABF478BB740C319F79 + 7C7B2B2CB1FD8D8D8D545B5B473535DBA9BAA626A9AAACAC346E71160421B3D8 + D440F88ADB2BB20AF9120E6D14401B4038F380ACE3751843B38998C7B727029D + E7E803F11A1DDE9E96244B3AD105212BB03710512B453290586B08662308670A + 76CB6A8F3510BFDF475E345FF9948924536C4CD13F322C0842AA696D205C58D9 + 15A0B92EE44B34A2D514CC4680707BAB59C4037E9F17CFD0B0F0DC4652C5B510 + 3FAA3842BBE6372347528F8A8AB8D591CF9BF686DE13181A0F128E1D3D82FA0D + 6E978F1DA494952B96D18B0B97847D90F0B4D34EA35EBD7A514949894A0D603E + D8AD35093D2E5C0D438FBFE1861B68D6AC59ADD69BADDC7FFFFDFEB1638FA3CD + 5BB6524343A3D1999E4C5A3C2DD4ADA22BBDB5E80D799050881979903076127E + 9030D0E6EF13B552F8634F1B000A7C3B69CC69E8DBD058D3CD713DBEBD81CFF1 + 6EDBB69D9A1A9B8CD7C124532D783F99D4400421E3D818888F9A3C22AB902FE1 + 3017FCE6A1D90CECD275D81CD7D343DA98C2D550B295B2B232AAAEAEA1B22E9D + A94B974E4957D7F232AAABABE3E597A9350A829009F4A52D864613D66187FD8A + 76193424902A0459FDED727AF3CDFFD936615D78E185FEB3CE3ACB68C2B2BE4C + D16C04C01AD7201D986B33E83006EDAD096BE9D2A55357AD5A3573C3C60D2A25 + F9C03CBA77EF3EEDA8A38EB2FDDEB620589126ACD849F8658A878C1C463B0F14 + 03B1B2E6BBE5F4CEE2A561FB40B481E075EE666008DA1C80356E458FC710B7C1 + 0218C8DD77DF1D7E264110A22206123B89F781184D365E9145C8974844320533 + DA1CC2A19783A156A4E905411032452B03698681B470A1290A11F22512F114F2 + DA2400E6B39B1769984EF78B088220641BAD0C040F6935F315B72854C8977070 + 615F1FAE90B7A6DB9985DD34488310B69B47100421D3E8920B43C75E936FF2EE + B1EF5ED46BF7C12AD5BE50CC2954E1BDE18715F4CDA75FD297B3AF6A9529D75E + 7BEDC251A3461DBDDB6EBB85ED03310F3566E3D0E93ACD3CDDBFFEF5AF5766CC + 98315A45B39E47DFFA7CEA6BCB36CFFC6E53EA3EE33EB047091D39B4FBB4330F + FDA574A20B31217D20B1935027FA9197DCFAE3A67ADFAEC3468F21972B8F9C2E + 174AB4C014B9080A71BFCF78EE60E9C205D4A3D8B9EAB53B2FEFA7C60679E595 + 57262D59B2E4DE134E38A1A04F9F3EAD4CC0CE14CC66621EAFD331ACA9A9C1E7 + 619BF6DB6FBFDF1F7DF4D1738C89DA01E7CE7AC3FFD7D38653EFAEC5FC5B5462 + 32E165AEABDC46573FB2841E9E3A26870F50211EC44062272103A9AAAABAE4EC + BF3F3C734D5593F1CD052180D3E9A09DCB0BE8E13F9F3DADBCBCDCF68A77C182 + 0593DE7FFFFDD3B76EDD7A08478B03A9E14D0398CD420F819EA65BB76EAF1C74 + D0418F8F1933A6DD98073878FA73FEB7AF3B9EAA9B7CD4EC0B7C1E205E3007B2 + 21A840B2417D8B87FA15F9E8D03F3F421FFDF3776220424C8881C44E4206C292 + C77B85360303593CFD78DADC883BFA02EF128B17CC81D960A6C630906CE0696E + A65DD9408E9CFE84188810336220B193C86DBC92B94252D12FA2442D245E192F + B0F4F90CE1ADBEF884ED0E71DCCF13098290515ADD852508822008B1A00D446A + 1F822008425C98DBB9D0897EE99F1E5E32F3FB6A1F457B702E9770E739694099 + 93FE71F688B09DE8C20ED007F2D6B5C7D1479B5AA8AAC947B52DF15F9FA0EF03 + 1FA5C2ABE08D217AD2158D75B534B2C24367DEF9BA6D1FC892254BA6AE5EBD7A + E6D6CAAD2A253AE1DEAD855B925FFE7CDDCC153FFDAC52A2D3B5B480F6EAEA9D + 76EB65935B1D2BA32EBBCFFFCDBA1A158B4E457E331D32A0D37EF75E7BE9A72A + 494810E903899D783BD181E3F49B9FF1955774A32B8FDF87FA760DFDAE452EB3 + B6B28E6E7EFE33AADABA851EBFF2C498323697C9B4813CFEF8E3FE830F3ED878 + 26079FBE45BF0966C732F02D75A4F1528D8F52E16E43F4A9E0EDBEDF7FFF2D9D + 75D65921CB9B7CF7EBFEEB4F3D80CA8BF38D0F5999FB5EB65656A950282BB7D6 + D3ADCF7D4CAFFC6D42C8B28EBCEA41FFFF4D3996BA14E719EB34F3F9CF952A14 + CAD62DD53467FE6BF4F5BCBFC871D746C4406227A14EF475F52EBAEA847DA957 + 59095537F9454AC80FE40BF247C87EB8266DBC521EA681821A86812F19B6B001 + D4D7371866816F955455D5D096AD95B471D36672BBDD545D53AD96B0033C0CD9 + A76B675AD9E0A45550FD0E2DDE9A17D4A22D2E7A63A39F5E59D344FD2A8AA9B2 + B6492D61075FAEDA423BF7EA4A6B9A5C2C67883ED89E17D03617BD5FEDA02555 + 7E7A77533355742BA3AD2D6EB50441C82ECC06E2F0F119D7ABAC986AF88A11D7 + 47A280901FC817E48F103BA9CA2D736D241C78A6262FCF45F9F9F94A791CCF23 + 7741019B052BDF6D0CF3F3F2C9E58C7261C0D762C5989F4D26CF9D1F54614969 + 5045A59DA8B0B8C4982612854E27B9F20B28CF2277716940259D289F9797CF61 + 276FB7206433AD6FE3C5559BA89552561A7660D074B5BDD9472DCD4D09AA996B + 0D4DE469690E91D71BF84E8A200899A5D56DBC282771A52D0A95F8477C7096D1 + D6BA266AA8DD6EF459C4224CABD558A7C5E97575D458BF4378903085A0ED57AB + D5F92108C20E6C0D049FFF16858AFF0B31B247EFCEF4F5EACD7468450B8D62A1 + C33B168DEAE635C9478776F7D3613D880EEF0939823A7AE702A3A31A773BA500 + EC6A2DB4601A684731FB0B9AC9ACD25309422E1072B4E3EE99D7AE398ED6D707 + CF1B41D1BBD84947FEF5057A77C6382921A2F0CC07DF4E7DE6C39F662EFF61B5 + 4A493E916E95BDE79E7BFC13264C30FA4AD0818E2F3BEACEF4EA9A1AE36E2A7C + 2E181DEBCD5C9B696A6A32BEB5BEE4FD77E9A20B2F6A754EE0B52C6B6ABDD4E8 + 093C19AFF96273684D08CD6DA831C1F48C3BC4EEF82D3EE612BCF6E875C6CDFE + 8FFF73197D56D94C7E5FE8E70116AED9F1E662E3AE315E4F4B7D2D8D2877D09F + EF7C8E363C76A51C776D44EEC28A1DDC85C5E78FE3BAEBAE73CC9831C39A6FC1 + B818488C888164083E88CD85702CA4C2407EAE8381045EAFA2F9628BC5407859 + 687643CDC9EE166318C8273090AA66F259BE2FB3F0E77A153219089BD1887212 + 0349126220B193C86DBC0668BBB6EB44CE75215F840C10A779A40AB44E3959A1 + 4D56A86098A59BB12280E5E00FA6332964B9C6BFC0282179A05014C526956551 + 913E9018C5FF851CC628D04342A602DF243D55388C296C27D1F3B230410CCB12 + 844CD3CA40F026D4B5F50E9145C81741682BA8C514F01F07BE756F92332F6F87 + 5C2E723A5D46BA20643321973868EF7DFEEAE3E893AD525A5AD9AFC249C7DF28 + 7D20B182D776E0C9EB54B1D7AEDDE8B59BCEB5DD17A9E8035957EF35BE6D62BE + 90F8726B8B0A05C0B32BB80519779185EB03F9FCC1CB6879B587EA785BCCBCBA + 6EC793EB3EAF87FCBCCDCD75DB697867AFF48108594BAB93E5393690A59B433B + F804A261DD5D344E0C24268EBA7AB6FFF68BC651DFEE5D88CB5CA30F291E8C3E + 2704F4D042239BC19A0D9574DDBDCFD2A2DBCE6FB53F326920B80B0BB7244734 + 901A0FD57BF03EAE1DD81A487D2D0DEFE4110311B216DB3E100F9F78A250D915 + 64823D5FACDC4C3DBB75A1F50D3EFA69BBC7283063125F99435F54B5D017952D + C6DD4AB8E5D5AAAF37D7192F248CE7ADB68220241F69641552026A118D5E3FF1 + 85BB71B51D8BD0AC03B5F0D5B7075F1EE4219E97B04A7F95501084CCD2DA40F8 + 6ADBCB67BF2854721F6F8220EB0283A81204A17D61DB84655780E6BAA4801304 + 4108A5B5817049695780E6BAA402220882108A7D0D04CD58A210897FC4C7A646 + 2F7D5ED542EF6C6A32EE308A47AFFCDCC0AA375EEF81774459F5F28FD561BFE0 + 270842FA083110A7D3419BAAEB68FFEEF914F8D4A708427E205F903F82200842 + 809012F1CC5B9EF5179755D0D4B1FB50B7CE452A55D8B2AD81EE78F133AAAFDE + 4A8F5E7182B84814F0BCC36B774FA58FB6B6D0DA7A2F6D698AEF8E299F071F8C + 42B321D7FB200BD11EB093E74004213D841C94555555537FFFEF4533D7D7BB08 + 1F511202381D0EEA5DECA57B7F376A5A797979ABD7870BA1A0A05CF0AFA9C637 + BDD7D679A88E0BEC7830DE546B341BDA1B08DE527B50995F0C4410328C1C9442 + D24141F9E25D53E9CD0D4D8681785BE2FB82209EF308180863672051BE93A10D + 0468E3C010AAA9D96E988797D7E16503A9ABAFA7A6C68081BCB7E49DB006B2B9 + D16718488B6FC7F6ACA80E35467CBED7789549450B9D7AFB425B03F972F665C6 + C395783EC6EC20E82BD2D4B5F072BC7E6AE29AD6419D5AE84FB73F2506226425 + AD9F0311842450CD85E99A6D8D4621882BE998846959A861C02482438B7C2DA1 + 57FE76E8B7E33AF1A242C8E52497CB456E773E1514B85905868A8A0A83E3C281 + 17E3BAF94C29C87384A8BCC019541986852E2A282AA242563878362ACD7752E7 + 7C077576EFD04E252E437D8B59257986F20B8BC8CD12846C450C44483AFBF6EF + 493FFEF4338DE0AB675C41A319262675F61A42F3D44165647C4C09350DAB0EEE + E1A6AD5BAAA922DFBE66D3BD7B77AAAC0CDCA50513C9CB73517E5E9E611EC5C5 + 85545252429D4A4B8C5A47F76E15B4F34E7D8C66AE5E3D7B19F39819D8A384D6 + 57D61B06D1BDD0497DB880D73AA0477E5007B20EEBEBA6530676A20DB55E1AB2 + FB2E6A093BC00B20D76EAE319663188549C32AF20D1DC0C2EF3BAC57018DEBD7 + 89B66FABA7A13B714608421622D56221E9CC7D75E9D4B9AF7D3A73D9CF552A25 + F9C03C0E19D069BF7BAFBDF4539514E4C30F3F9CBA7AF5EA995BB76E55293B80 + A1A06F24F0ED8E1D94959551FFFEFDA70D1B362CA48FEBD1B73E9FFAFAF22D33 + BFDD58AB52A2836FC21FBB4FDF69270E1FD4AABF0C2F9AC4BBC26205667CFAC8 + 5F4C9B7854E87609822008822008822008822008822008822008822008822008 + 8220088220088220088220088220088220088220088220088220088220088220 + 08822008821027F2365E21ABD8B469D3D4EFBFFF7EE6962D5B548A902CBA75EB + 4603060C98D6A3478FE09B7D91DF5F7CF1C5CC6DDBB619AFB4D7323EBAC5C378 + 30CF0775EEDC998E3AEAA8697DFBF6CDD8FA84D42206226415AFBFFEBA7F975D + 7631BEE961FDC893F515EC42788CEFC99B4001BB79F3665ABD7A351D71C411C1 + 8C5CB264891FC6D2BB776FE3F3BE8D8D8DD4D2D2624C5F5B1BFB2BEC35FA75F9 + F888577575357DFBEDB73465CA9490F5ADDE6B0DAD2F5D4FD4E2A4FAC626637D + 3E1FD17F57BDA8A68A115EAA33CF6188F2BDB4E7E6DDE8C86F0E0F599F905A24 + A385ACE2E9A79FF61F79E491C6D702510809C9019FF3C5B7DF5F7BED353AE9A4 + 9382E7FDF3CF3FEF3FE490438C8F6CA156505757470D0D0DC6B45C5B5053C586 + FEFA234C04E6BFD34E3BD1534F3D45975F7E79C8FA6A8EDB66843D4D3EAAE6F5 + 353637199F18BE75F97F8CF458C1E1E1CA73922BDF49EE42171515E7D1EF5E38 + 3D647D426A918C16B28AF9F3E7FB0F3BECB0902B685DF3B00E85D6E87CB30E01 + F2EDCD37DFA4F1E3C707331005FAA851A3A8B8B8D8A831C040500B416D64E3C6 + 8D6AAAD880696813816020BC3F5B1988E3B8C085414BA397B6D66DA306369016 + 8F97AEF9F236233D561C4E362AAE7DE4BB5D945FE8641374D3050BCF10034923 + 728927009C7079AC625619AB070BDF77C51071A4637CB413B3CDCB41D3090A30 + 1464507D7D7D50D6B8C85E76F906215F91BF9180C9986B11F1C86C1E7A197674 + A2524325FE522AF4175181B79087856C22BEB8E461D3F11861F48170BCC5A7D6 + 20A40BDB3DFCEAABAFF6E12B97F338389E35D4484C9C7BF840BAE1A8A38E5AA7 + E2B664629D29249FD51208B60F366FDE3C8C076339DF467121B317D2B850F892 + F7C9220EBED8BD7BF7A5488BC6F2E5CB8771E13196E71BC5CB3296C3E12F39BC + C8E7F3BD3864C89088CB79E49147FCBFFEF5AF8DC28EE7310A229EDF086B0991 + 417E6921BFD07C8570616121BDF7DE7B74D659670533D15C03A9A9A9310C074D + 58E89788F74606AC4B1B0986E85779E289275AD5403A1FD7D90837357869535D + 15D5F3BEF6F8BC34F5B3BF1AE9B1C2AB319AB0F2DC4E2A28725171919B2E7EE3 + 2CA981A49156198D829C0F80B568132D2A2AA2BC3C5C3026CEF6EDDB8DAB1F3E + 88FB862BD0B1CE2647DEDACDEE0AAACCEF420DAE42352631FA366EA4EECD5BA9 + C0EF09BB4E61075BB76E3D9F0797B0C219F732D69D151515F705A2F6AC58B1E2 + 7C3E76222E878F833B070F1E1C763973E7CEF51F7CF0C146072E0A22B371403A + 4DB00746A10DC32CA4959696D2BBEFBE4B13274E8C6820BA23DDEE9BF291C07E + 31D74660208F3DF6582B03E9715C4F23DCD8D0421B6BABA8AE890DCBEBA10B3E + F98B911E2B68C2CACB67B95D5450E8A29262375DFAD6D9622069A45513161F6C + 7FE9D4A9139597971B572C3090B608CBC1F2B05CB58A5660DCE6820A5A57DC8B + 1ADDC5E4CCE3033041395C4E6339585EA4756688D05B6322F0CC33CFC43C2DB8 + F5D65BE39A5E03F3E013FF66D65014005A6FBFFD7630CCC2B89B95D1D8F2E38F + 3F9E9F9F9F7F33171E437521027DF5D557C1306B28A6C1B46AB656E8BB7FD081 + 8B3678DC39842B61146695959586AAAAAA4461A4F308F9857C43FE211F919FC8 + 57BB262CEC63EB108209C42BEC67F3D08E7CCA3314F8C7C78583C5FF7CBCFA78 + E4C79097670C110F2C5E48236A0F631704B900B7F5F1899E34617958AEB1747B + 2E5857DC9BABA37C58B90BDA2C2C07CBC3728DA56707FAF88E7A9C6BF388D544 + B479C46B22D5D5D5686EBA84D51927BBD6E2C58B8DF1189AD231CD2598C71869 + 62D5AA55C3B8C0B884D5190587D6E79F7F6E8CC7D0948E692EC13CC64821AB68 + 8B7940E679118E84313EF03F5012E1AEED38E4D761CCAB25A415DB2C371F10C9 + 52345CAE3CAE41E49313C33608E681E560795984B5600F5BD05B4D239A89584D + 231E13E113782CEF9B909AC75B6FBDA5C606405C8F53D38E55A38270FA583685 + 909AC7279F7CA2C60640DC347E28E651A3842C41EF671DC6791B8FB06FF510AD + 0F084705EB3326E3A12B4139B58C250A692490E5D3AFE3DCCF2C0E1C7C2C7D00 + B7056339AC2C215C81DE2A3D9C59844B379B85B9DD375613E1137C943EF921DC + E2A939E2882354888C74D374A35472102E2C4699CC813EFAE823358668F8F0E1 + 2A4446BA9E06F3A8642197C151ABA56B1489082559DB8B0E214EB2C6B393611C + 6692BDBC36A04F0F3B8570E289273AC2494D628B368F783B0FD90CF63219834A + 25BC0EC28863A8314D67DC59650669BACF0BD2A0331C710C357A1ABBE508390C + 8E5CBBDA4534E99A8711369624A49140962FFB05E7BED0DE806168D3D0B50E73 + 5A344CA66068F4E8D186107EF5D5575BA5695981596B638070570F8430EEFAB1 + A6415964F042A6C1216598401BA49721A4954096975749D6A70E14ECE114029A + AAC2494D628B368F78FA3F0017E25F9A8D416BE1C285C6780CADE3308F31D284 + DBEDFED2DC84A5B568111E212163681D87798C9142EE826B0843FC07B2D62EA2 + 09B50F3D340C8487425A09E4F879F7E5D3FDE71B0FBEBDF2CA2BFE41830619C9 + C9042F553BFAE8A36DF730D6F9599F838C4EF064E1F37A689F75EF875D679AB1 + 2BD86DB7CBCE2C223561D99946AC3590A6A6A6EBD810A6ABA8C14B2FBDA4423B + 38F6D86355887F88DF3FA3A0A0E03A1535A8ABAB433C6439A8C1583137893133 + 4A4A4A4296031E7CF041FFFEFBEF6FDC768A5A0ACCC66A6290600F9EF7B00AB7 + EEF27EA31E3D7AD0C71F7F4CE79E7B6EF0F8C07319871E7AA8F1CC179ED9D2CF + 81601EDC161C0F7ADFE85A265E88396FDEBC90E311EBEB7B5C5F23DCD8E4A10D + 0D9554D7D240CD3E2FFDF6BBFF33D26305C7471E5E6592E72477818B4ADDF934 + F58533231EFFCBBFFEDA2FCFABDB83B36AC82FE26B8D0A4C3CFEBF6E9A7F6A33 + 82622029C35CD047DC26B389C46A1E3869AC71150C4B7373F3303E09E7B28C07 + FF5E78E105231D1C77DC71ADE25C082D634DE4DA43C8D3E4584E4B4BCB5C2EEC + 8DE52C58B0C0480763C68C6915E7C269597E7E7EABE5003190B6D1EE0CA4D164 + 203F2460205C03C9C7CB14DD6C20F96C20CF473690AFD940860C19A2628299E5 + CB97D32FE234103913D387DE31517790368D689DE71A7DC2C4621A665080F349 + 78A7C7E3D986935173FCF1C71B2727861A35CD9D76853ED2D810EEE4C26A1B0A + 7CCDD8B1630D03C050836930ADDD72841C03879C5946335402322F2306706C8B + 5A2B1190FD42FA88792FC5621E300CAB69D8A54582AF14EFE3C2FC4A2ED8978D + 1B378E20F34185381BC0324C8369D56CADE0F1C67238B80CC603996B0C88EBE5 + 60DAC05C828043958581D197D116190B14D28864B98002FE3EAE294C64C398C1 + 5ACCB58D4A0861A4611CA65193870506A3A69DC15AECF57A2B2184918671914C + 48C841B8DC0F4AD72812915E86905690F5ADC09567B22564375CC0A3390B9DEA + A3B8865001218C348C539345A5ADCB41DB3BE06983FD1F3C6F889026B2975D5E + E97C043A7FB3126D02894A483BB606220899826B3EAD4C020520848E595D188A + EC65CE276B5E215F91BF59832EF4B501E8DA44BC32CF2FA415C97221ABC01532 + EE18B233113D440129B297399FCCF987FC44BE665D0D4417FE408713959076C4 + 40520F6EAD0DA710CC0F0E5AA526E9F0A080B31680E64211B22B384501E93C0A + 9787D9DB84C50EC02697B8B008FC11D24920C72DCF810C1E3CD8484E262B56AC + 90070943B1DD2E3BB388F576DE8EC0ECD9B3FD03060C30BEA78D020F57CEE6DA + 880E0BF6E0B90FD43430D4611DFFF9E79FE9FBEFBFA7C99327078FA78C3E07D2 + E2A10D4D5554E751CF81AC8DF383527C2C18CF81B89CE4CE7752A92B9FA6CE8F + FC4D743C0782F28DB3837C9C2FB90E72C0E5E4738AF372C58A6FE27E0E243071 + A8817CBDDB6EBB0D75BBDDC6A864800FF4FFF4D34FCBB830FF854A0A01EBFCA6 + C73E439B0B3AA994B6E36EDA4E7B6CFA2CEC3A3380F9688DB893CC26924BE601 + D6AE5D3B75E1C28533E32DBC84E8E0E36EA3478F9ED6B76FDF3B54524E1AC8A0 + 41301036553190A081B878BF25CB40AEEBD6ADDB74F511A8A4802FA3B1667061 + DEEAD51500EBDCD069E7E99BCAFAA994B6D3A37A25F5DABE26EC3A3304F6574C + 3B0826926BE621A49F8C1B48331B089E44F72768205CF819AF326195E6B181FC + 570C241EDA6A20ADDA0278A7DC8F03079FC1C427309B9A9ADA242C07CBC372D5 + 2A5A817115F51BA947CD2A2A6CA957A98983E5607991D6992162DE39E9368FCD + 9B370F635DC746BF88F7D9560861A4619C9A2C2ACB972F1FB662C58AEBBEF9E6 + 9B453CDC0AA9F07518A72613848C8142D38F7FAA792FA7C5466A644882040A29 + 530D04BCFAEAAB7D78E1E771703CCB78BF511BB8870BF21B8E3AEAA8752A6E4B + 26D6290450DF3ABF84152EDF97B1EEACA8A888F810209BC4F97C051A71393E9F + EFCEC18307CBC38459422ED640061A3510F411490D843D84F25CB8C922494D58 + 426E01F3E013F1660E760EA484651B1BFC95E14CE4C71F7F8409C5B41CD695FD + FBF7B75DCEA64D9BA67EFFFDF733D1EC29240E9AA0070C1830AD478F1EC1FE0E + 3B72D940BC6C207195961D10D442F2F25C86897CF38D18484EA1DFBE6B3E61EC + D2C2515D5D3D8C0FA0E0DB78F5F7D051A068CC693CED329E7662595959C813E5 + AB56AD42D3D45C96B11CFD3DF4FDF6DBCF18024B1A6A341377DD75D7564FA6BF + FEFAEBFE2DBFDA4A2DA52D54C6FF3A51A9915E4845944F59F59DFBACA1853CD4 + 480D46783BD55235FFCBAFCDA76EFFABC0A789231E073969200307B179888180 + A081B056246020723F6407409B86F975EEB1C027E0583EE187E2448434300DC4 + B57900C4D5B43B5EADABE0F4B12E976BA87E064103D3405C9B0750D30CC53C2A + 29846DDBB6D1FAD2F52A26240AF2107929B40627099A6E50788A90112A531220 + 506A986A207C55DA75E3C68D976CD8B0617A43434348C162073620DA34C0ED76 + 2FEBD3A7CFFC810307DEC285479D4A16DA889D69C452FB007CC5894F068E0CC4 + 02700D408576C057B12A64B0B853A74EA354D860FDFAF5AD96F3C1071FA8D00E + 860F1FAE42068B7BF7EE1DB21C307FFE7CFFCFE3D65399AF8CBAF8BB50893F50 + 0329E07F7C5D6B7FAC9993ACA363CA892CC2BA37CD719B931CE79F87FF35F13F + 50E7A8A51A470D553BAB69A7E77AD3F8F1E323E6402ED640761F30907F1FBE93 + E2E365A811390A8E9FFCFC3CCEC3BCE4F481E06E193691E9F8E84A7171B1313A + 5EACA682380ECA65CB96515959D98CC1830767D3ADB5ED1EB389C46A1EA0AEAE + 6E2B0FBA06623B307F4DD0F215415059525252A1C206B8638B0B8E56CBC1F7D0 + 35071F7CB00A05F0F97C953D7BF60C590E78FCF1C7FD3F1CB3868A5B4AA994CD + A3D05F64A4BBFD3010AEDDE0D7E1D832FF4A23CD24FC31860A731858E39922AA + 59F01F0CCDD21871FEC3FF3DE4A56647C0401A1D0D54CB26529F5F4BBBBFBC33 + 9D7EFAE9117FAD18881A91A3B4D5405A3561AD5BB76E3C2FC438A0F0E235A8A5 + A525388C26F33CE6342C6FE8D0A1C6F2D5AA8424A14F9878CC03E813DEAAD1A3 + 471BE331B41B6FC5389155A161D6A851810A0686D671B635090605178E99C6E6 + 266A60D5736106D53571C1D8DC600CEB9AEB77C803711A1742B6C238ABECA6CB + 84E2D93663BCE97743A63CD1F9843C43DE210F9197820DCA7CFDFE1D4FEAE7BA + 0299123FAD4A83E6E6E6A1858585C6D3E3380021E38E05358CA670D3E19910B5 + DCB6DEA22B2850F3D0B50F6D1EE6B4687021FEA5D918162E5C6808E1638E39A6 + 551A8479D4EC41DC6EF797BAFF035AB4689121840F3FFCF0566910E651B38780 + 8B0D3E5CC8EB6323F178C9C343A8C5CB17253CAED9C7E274437CAC05C5D304E5 + E769CCC23C21E3B344E66DC236B6DA6ED378F36FD5BF9FE7419E206F82F9C4E9 + C83BE421F252680D1799817F3605696E2A51FBD09579531316DE4B75D8618719 + 053E166E465F35EA74F35564A43480F48282027AF3CD37B3E93BE5ED1A6BD395 + 35AE8261E17D8CEF764C57517AE9A5975488E8D8638F6D1507BC4F67F07E0C69 + 82ACABAB433CB81C6B13589826B119252525AD9A32F14DF49BF7FE0F6DA8AEA2 + E62614885C1232686EF0E117A18FDEC501EBD0A9C2B8244218431E0487382E31 + 047A9869F4DEC2509FC5F8B97A88E71430444502612F8478E8D0C903DCC70F8C + E69C0217F52A2BA72BBFF86DC8F7CFEDC8C526AC7EBBF5377E9F97CDD6382E72 + 193EEEF2F2F3F9822E8FBEFFEEBBB6F781C04070D588030906809D643682B6C0 + 0506BDF1C61B622049C4AEB6118B7900AE0D0EE3FD1BBC8D17BCF0C20B2AB483 + E38E3BCE18F271B08C35916B0F21B7DF62392D2D2D73B966115CCE82050B5468 + 0763C68C31867CF22ECBCFCF6FB51C2006A2E262205149C440BEFAEA2B3FE613 + EC498A81A00682D798583167BC9DA958778C36200D0C446A20C927DE9A87198F + C7733EEB662ED0830F00F249AE42647CCB1CB0416CE34221EC77D1D9445A2DE7 + C5175F5421C2F7D08DA15E0E9B87ED72C440545C0C242A891888905C02479D0D + 28FCAD32F769441BAFA731C785D8E9DBB7EFAF54302AFA8449E4C4812170617E + 25EF1F3C24689C94E3C68D33C6618838C6619A70E6016008988683CB7441A2CD + 0743C4310ED3605A63842008ED1A5B0341618FC21F980DC22CBB711A6B9A39AE + D384C8AC5DBBF67F2A18136DB9EAE2C2FD3E97CB3591CD62066B31D7242A8F3D + F6D84A8491867198464D1E16188C9A76066B315FC51ACB4118691817C9840441 + 685F040CA4BC2A58AA9B0B78731857A21A84C31981751EC4ADF30AD90717F04B + 79DFA0537D14D7102A20849186716AB2A8246B398220643FAD6A207CA2ABD00E + AC69DA2490AE05B45998E37643411004A1FD133090AAF2900E8ACACA4ADC9A19 + 143AD4CD7173BA9639CD3C8D595BB7E2C167411004A12310A82A4C9FEEA41933 + 0C13C15D58FBECB38FF1242BD0B50A8DAE4598D3ECB09B2E3F3F9F3EFBEC33B9 + 0B4B088BDC85A5E218CA5D581141D992C85D5837BEF2C5E6B5AEF2E47D72B51D + B39BAF6ACB6547EDDD5D45E32690D11603D97FFFFD834FB15A9B9DACCD5356CC + E311361B89CB157833AB1888100E3110151703894AA206F287D7D7F82F1F11D8 + 865CE7D6256BE95F47EC9CF0191138EA665CC787E00E50D0EB83A02D322F4787 + 05411032097CD7850B5A9191176D2160201650D86B6903301B815DBA56B4F182 + 200842C7401988A3550D0455515411B574F554CB9C661D1F6E1E48102281A613 + 3431E1507138710C99C37C5CD9491D6F1D5E36BF5DE749683E7146721E1A7929 + 082904875A2BEC0E5E73BA0EEBA10E6BECD2805D9A209841DF9B338FABD7794E + 961E3A292F1F6107D7624D722959E3D1C4856C56C86EDBEC14EEF7B28C3C31F2 + 26904F3ACF9087BA1F531052455803D143B334D634BB613809422470D56C1848 + BE93F2DD2ECA73B3791872517E010BC37C2D9E06E202D39039ACE5B291759A4C + 29966DB3FE3E43EAF7AB3C41DEE87C421AF20E7928351021D5B43210BC721DAF + 72C72DB76872B2330173939435AE9BBFF4383D1ECBC372B17C41088751E8E57B + C95DC88563A1930A8A5C01711C694171C1E92ECCE321A4E25C7806C5056CA89C + 3BC4857156C8BC4DD6ED35FF16FDFBF05B8DDFCC61535E206F743E21CF90863C + 140311524D2B03E9DDBBF78C6FBEF9C6780E04853EE476BB0DE9B04E47A7B85D + BA969E0FD36179582E96AF562508ADE8DCB933EDB979372A2ACEA39212371517 + 055452ECA6521E06944FA5852C2E5003E2B09BC5C75C409C06F171171CE671BA + 4B09E16C50C8F658B6D910A743F86DF88DFAF7E2B7230F547E206F82F9C47986 + BC431E222F057B50F089DA4EAB36A5EAEAEAAE1B376EBC049F9E6D6E36DEF03E + 543FD3118928D3E02DACD4A74F9FF903070EBC856B24752A5D104258BB76EDD4 + 850B17CE8CF719042194F2F2727C92785ADFBE7DEF5049B6E4E2732017BCB6C6 + 7FC6FE3BA9586EF3D8C73FD33D4726FE1C48C2330A82D0FEC9550339793F3110 + F0D4276D339064D462044110DA152831456D470C441004414808311041100421 + 21C4400441C83970D38FA88D2FC262C4400441108484100311042173E88B600C + 1311B00E630017DF2295196D400C44100441480831104110B2035C11B745F160 + 774F6B2EAA8D888108829005B003D8B5B1C42C2C027F62C3EFF48B586D450C44 + 1084CC6114FC8160309CA8E2C0DBE413B1DA8A18882008994117FADA008CEFC0 + 2720F3FC31E0F279C8E3F38B58C88BB6908456304110DA2B197D1756B3873634 + E9776179E8B72B137817964BBD0B2BDF65BCC178EAD367467D17D6B54FBFB769 + 6B499FEE2A9AD374AE5BB5E9C69346F554D1B8110311841C26E306D26832909F + DA60206E6520CF443710217948139620081944B53F194D50FCA74D321628A411 + 31104110320397F92132F76BC423F33284B42206220842E63017FEF8026FBC82 + 81E8A11848DA110311042173E8421F43DB66A93814C77320427290CE2641C861 + 32DA89DEE8A10DF59554E7A9A7665EDF6FBFF9B3911E2B0EA7EA44CF77925B7D + 2F7EEACB6747ED44BFFC3FCF6CFDA1CEDF5545739A3D8A5CDE1BCF1B97A7A271 + 23062208394C561848B33290E56D30904265200BA31BC889FF7CDA7FC4907ED4 + A9B4848A8B8BC9E743FB57EEE07738783F37507D5D1DBDBE7C253D73E94909FB + 80188820E4305963201E3690AFAF36D263C530903C18888B6B202E2A2DCCA7A9 + AF46379071773CED3FF9D7FB519FDEBD554A6EB26EFD7A7AEABD4FE8B9A9891B + 88F48108829039D06DA165ED208F47D2899E11C4400441C81CE8F8365A9078E8 + 4D50C18E746389421A110311042123189F540DFC0F14FE76358B0872E830E6D5 + 12D28A1888902D5CC55AC53ADE8845E0E32FBEF1BFF4C6FB4121AE4609ED8016 + F2180AFCF3722582C5FFF076F178E4C09097670C110F2C5E482362204234C6B0 + 5E60151BB1D4B00FEB06D62EAC639110890D9BABE898C38607F5D42B4BD418A1 + 3DD0480D869AF85FB3A389CDA4993C8E1672B99C71097760B99C1C76F290C34E + 1EC60A0A3E51DB49741938E14729099901FB603AEB2D8B9096ACFD52C67A9435 + 96F50C2B1526E262DDA5866890B8871513A7FC6D920A0538E57757FBCD0A9726 + 08F01A91CA8C3610EF225068A120E967C40254B326B39E356242AA8139C46212 + 2B59D3586DDD2F47B1B479BCCA3A9155CF4A1617B066058286795C18088607CD + 56A87968FEEFD6D9F4F72BCE4DC2E9907B986FE3DDB66D9B711B6F535313793C + 1EAAACAC5453C506DE8EEB72B982EAD9B3273DFCF0C3AD6EE3751C17B86E6D69 + F4D2D6BA6DD4D0CCB5108F97AEF9F236233D56701BAF0BB7F1BA5D945FE8A492 + 12375DB0F08C986EE3DD65E8BED4B76F2F95929BAC5DBB81562FFB346DB7F1C2 + 3C3E65C13C50285DC7BA8385AB541430A197831D1BFCE6A981A02D188769920D + 968B5A86368F392C98F7A14A28DC910653C77EC27E99C96A0B66D3309B4932C0 + D3C068BA026B59313D08D0AB7BB9611A5AFB0CD94D8D11DA0A3AB6213C5C9788 + CCF31A9DE43654AB7F358E1AAA75D4521DABC1556B3CCB118F0A0A9C2C360F77 + E075EE79F9B19783F95CF261F29C5612DAB0E259C46C35C4552D0A94192A8C82 + 0BB4B5A06A2FC0185088E3F7EA3C3183348CC334C9341118B4CEE3452C949A30 + 0F1806E2108C1D6918A76B1E309D6C351198877EA5C495AC9A403032E803F9DB + E59383FA6CF94F6A8C9008BAA0370FCD46108FF000A27968A55BB76E945F9B4F + 5BF85FB5B39AEAF36BA9C95D4FCDEE26EA55561E977A7429A7EE5DCAA85BE72E + D4B9A488F6DD3288CACBCBD59A8474C03E14132808F1582A9A45EC2EF7F45531 + CC04055947E604160A508DAE05009887AE89A116B02F0B79D65674ED0F98D717 + 0DF3F62463DF24D29C3598856997B1C6B19A5900BF69290B7D1FEFB20E61C584 + 6EC25AD1CD4183B7F8834D58D63E8E27FF7DA36D9A0A0A0C9A94468D1A65BCD2 + A3A6A6C668C26A6868A0969616DAB2658B9A2A367413169E46C7B077EFDEF4C4 + 134F8434296DDAB469EA175F7C3113CD6530192D349961180FE6F9A0CE9D3BD3 + 51471D35AD6FDFBE6819090B9AB0FAFF621FEADB27C79BB0D66DA01FBFFEAC4D + 4D58B1CE08738049A000D2350E33B964200085B2B9F681421D98CD0379F19911 + 6B3B28B4615C581E4CC90C9AAA30AE0BEB3996759D7ADFD8CD1B2F300E2CEF40 + 168C03BFF14356244E633D1E08D2F52CF4DF80775807B3506A0C63C59C57D207 + 923CCC06525DCD3502D507026DDEBC594D151BFA55265A5C90D37FFFFBDFA87D + 12E90606B21B1BC84EBD73DB407E5EBF817E6AA381C4DA84A54D0105915DB38C + EE544FC6D5B6060515AE1E758103B01EB457A036846DD1A0E0461AAED253D1F7 + 60C55A0BC0FA53651EF83D3008806643335827F2034D54E893C2EF37E717D0F3 + E08A1F4A1498078C4C9B076A1FD1CC03609E2F0341E3598FFD59E7B1601EE07E + 565C79257D20A943375D61A8AFEC63956EC6D2D24D6259095AD7B079B9AC243C + 78194F1F883EC951B0EB421A435C89A36087C924CB40600EDA20CC4631918575 + 61BD2391A0403AD2DA5A48C643B8A6A4649A0730FF1EF31D55F8BD767D1B3012 + 6DE8C0BC5F12CD1B6D1E68C2D2E68166A9584093D5596AE866E178B9910562EE + 3837237D20C94517FE1AB389C4236D1C6633113A36B11A084E7A5DF86088AB7D + 1809CE5C5C05A3808AB55D3E1650E8A1B0C4D5FC5C24281046E18CF5A1B946F3 + 4F16D2305F320BEF68984D4C73A91A260BE4017E976E26D3603F6823B7623610 + 80BCC43212A12DE6A1410D44D78CF662C5DD716EC77E7F58AC4201CCCF7BE8BE + 0FBB346107E8D44653159AACD08781B7E816161652696929F5E8D1232E615915 + 1515464776595919FDFCF3CF59DBA9ED7789A0B6124BDB97B92316A02043AD00 + 85942EB47137160ABA5CC29C2FF8EDE6C23C5CED2499C04074C7BA9564F54525 + C33C34385CD1EF7190118BB3E3DC8CF481248F6CE8D44E37E803E9B787F481A0 + 0F64E537A9ED44B79A070A45EB95702E62350F14D828D091AE498789E80E7233 + A881B5B5B35C8326271808D6D116F3D00C606119DD592358BA6F242EF0EE2BF3 + EB4BD00772EAD843C5408498300C64C8DE6C20B9FD3D909FD7AFA795CBBF4899 + 8158AF70C53C02C038B45168F3D0CD66E6710005792A9BD4743F88EE64475355 + B26B8330111C0BB17498C7026A22A5AC849BAE04A12D180632580CC43090156D + 3390487D2028F874E127E6B103E40364350F60AE7560984AF300D806AC070DCD + 10C2C9340F80CEEF64990740BB8898879051FC5C648A5466B481242C421004A1 + FD70E2CC27FD3BEDB137F5ED95E30F126ED8403F7FF3053D33ED94847D20A119 + 274E9C18BC0368EEDCB9C9E8AC15E204FBC0E170E0C96E6B1FC822BFDFBF58F6 + 8B20D8F3DB5BEFDFB2D5D5B54245739A9E8D5BBCF75EFDFB3C158D9BB80C4415 + 5AE85435DF265ACD05D6642EB0CCCF28082982F7C128DE0731BD8D97F7CB34D9 + 2F8220A48A980D449987EE5447A184F67DD4428CB7D22A13C9897E12CE0BFCEE + 49FC7B6D6F4FE4F1C893393C3EA9FD11582EEF03F3C3837350DBE0A17E50B04C + D54AD0A9AE6F2BBE63CE9C39E858170441482A311BC8A44993601EFBA8ABDA60 + C1A9AE88713B69351754D9F9D450128179A8DF8B663CFEC97374A7B901E793BE + C5F733CEAB43936522BCDE49BC5E7D87179AA960D8DA384250DB8869F5DD5962 + 228220249D980C441548C6DB78B9206AF5E2212E348DE7115481D9A1DBDE392F + 4EE0BC40339E26682226F30068DADB375C211F0FBC4E73ED2FB8BE6898B72717 + F68D2008E925D65799E06A1BB4B9306CEF7021FC2CAEFE551470393D69B68D79 + A0C04E4A7EB179E8D7807C66350F36977EACA9BCFEE9301A956CA0A6354C8397 + D1D66F8208822084104F1396F11E212E18CBB9600C6996E1717827563F1EB75B + B20A4D5EA67ECAFA3A2E088D37CAA2B0E48210E965BCAE13F51535A7A3790705 + 243A8E93D66C1409B54EDDA464469B47529E01E1F5E8DA1FF21EBF39D8291E66 + 1B82F905781ADDC488F951234AF5B3298220E40871BF8D1785110A3584315457 + DEB82B6B11174E49310F147A3CD0771905EF36E27507DFC6CBE1E08B0C553AB6 + 0957E02157E1A9827F2B3AB05B352525D33C14C1DF63310FE481EDDB78795CF0 + 2E399E0726ABF74B5AF2461084DC2026035126A10B1FB4C757A186C0C3E0DB78 + ED0AD34451851E0A4B5CCD07DFC6ABC2289CB1BEE0DB78399C91B7F19A4D4CC3 + 691DED6DBC822008B6446DC252E6A1DBF6010A32D40A504819853617E0B8332B + E5CD46D984255FF0DBCD85F91C6B5F45B2E15A86B9633D04DE1FD2612E0842CA + 89682056F3E08229679EF58884D53C5060F310053AD235293711D40279106CE2 + 53A0A33D596FE3150441084BD8262C5CE1F240CCC302E70BF224C43C385F3E43 + DE208F543A98A4F23065F0FAF08A75EC13D480206C03CC4C100421E544AB81E8 + 8707C53C4CA81AC809DA3C02A9016030A889489E098220088220088220088220 + 0882200882200882200882200882200882200882200882200882200882200882 + 200882200882200882204425E62F120A6DE7C5175F2C57C12063C78E35BE3628 + 0882200882200882200882200882200882200882200882200882200882200882 + 2008822008822008822008822008423BC0A9868220D810F22A939A9A9A810F3E + F8E0BF376CD830B2A9A949A50AA9A0A0A0807AF7EE4D93274F1ED4A54B97EF90 + F6D1471FF5BEE4F6476FAC2BE83ED1E7CC37A613928FAFA5BEA68BA7FAD93BFF + 78E6D5071C70C07A954CD5D5D55D376EDC78C9BA75EBC6F3F13FD4E1B07FD38F + DFEF57A150C24D9F09DC6EF7B23E7DFACC1F3870E02D4EA7B30E69F87D7C8C5D + B278F1E2F1959595438D09196C377E93DE7EFDFBCCBFC7FC9B67CD9AE5B8F0C2 + 0B830976D3A56A59089BE7EFDAB5EBB2912347CEE7FD7867595959A54A16D2C4 + 8EBDC5DC78E38D8B8A8B8B479E76DA69D4AD5B37959A7A9A9B9BA9B0B0907C3E + 9F4A490F995A2FD8B2650B3DF1C413545F5FBFF8EAABAF1E85B4FD4F9D36A7A0 + 6BEF89C70EEB475D3B17933B3F3FE4844A25CBBFFA8A86ECB9A78AA59774AD1B + 054F734B0BF91C79F4C81B5F5053E5FAB91FFF77E624359A56AC58711D17B2D3 + 870C19427C1EA8D4D8E1829A6A6B6BA9B4B4B4CDC7141F17C636980B4B33918E + 0BCCD3D8D848CB962D232E54670C1E3CF83AA42F58B0E0BAB7DF7EDBF87D9D3A + 750A2EDB5A406BCCE3F5B837DE7883FEF5AF7F39FEF0873FF80F3FFCF060BA75 + 59C0BCBC542D6BFBF6EDB47CF972FACD6F7E3363CC9831C6EF14D2C78E3DC45C + 71C5157E160E3AE3004C17555555C6D5783AD70932B55E00E3E2C28A6EB9E516 + C8D80F7B4EFCBBFFCCDF0CA4FDF71A420377EFCF5791E93390EF37D4D3805EF1 + 179AC9205DEB46C1839AF50F3FADA2EF56AEA17B5EFC84BE9AFBE76006F395B9 + 7FFFFDF7376A875EAFD748B3166A91E0AB7EE2DA0BF195BF7171120FD6FDCC35 + 04EAD9B327B5B0E1C5B26E2BF97CF1D1D0D0409F7CF209F115BAB1F06BAFBDD6 + 3F68D020AAA8A8304C2E1C917EEFABAFBE4A7FFDEB5F1DD75C738DFFA8A38E52 + A9A198E74FE6B2EC80616FDDBA95BEFDF65BBAFEFAEBD373B2084142DA7871B0 + 72953023056AAE813C465E23CF83B8F269C0AE3BD180FEFD282FCFA5128564E2 + 72E5D1EEBBED4ADDCBBB18F96D06FB04C68EC21F0602A126A187D18482CEE3F1 + 1843BBF191A4D7A705A3C372625DB755981FBFC57C2EA3A0EDD2A58B211C7BE5 + E5E54199E3B880D471F350878135CD3CC4FC0843C95C964E37C7F5EFC16F13D2 + 4FAB4EC2486E2F2417BBBCCECBCB23A7CB457CDDCB22F2A1304A83BC3E2EA86C + D2D3A174ADDBC86DBEA275B289209FEDC03EB1330073BA0E5B0550E0039D665D + 4E249997655D4E2CB22ECB0AD2504B2A2A2A3286A8696999E308EBB879885A0D + 4C096088B8DD743A6C8D9B87892E4B87755CFF16BBDF9B28D3A74FCF1B3F7EBC + 5B458508D8DE65A20FC87409077C2EAD57CB0E270A36878BB0655EFEE349939A + 3DF6E9E950BAD68DFCF4B381389CAE403E87C1BC7FCCFB2B9A40B28EA9642CC7 + 0E18270A6B2D1D37A7A340465CCB9C8E821BE8025C8F334F6F4E4FE6B2F4FCE6 + E5E878B28071AC5AB5AAA5A4A4A4494C243A59612050AEAD17B2C3CBE91E9697 + 470786E991876B0176E9E950BAD66DCD573B749BBB5528D02173D82A8CB33661 + E9F963917959893485599785DF62C5C5B55BB350F89A87E6742D6B3A8875FA48 + E3108F67593A6E4D8792016A1E300E15A5F9F3E7C7D7911586499326F92115ED + 50644D0DC42E3DD5CAD47AB5ECE04D220F9772B85A4EA7B8BCB24D4F8732B16E + E47338221D17C02E1D029817D88DD70A87799A589663278D39AC81A1E04E316B + E16B5720DB09D3E18A1FE82B7FBBE96251A2CBB29B0EBFC9CE2CE381CDC3899A + 878AA26FB28B0A0A119026AC0CAC57CB0E0F27B7F0B874AB996B0176E9E95026 + D68D7CB6C3BC7FCC46A2318FB793799E78D556ACCBB22E13716D206623D1C662 + 95B98036A701BB746B9A5976E3118F7759D856F3783DB4FED67861F308743A31 + BCCC5E8F3CF2C836151522606B2042E6C079204A8FC2A10BE17805927551D216 + 23D2B2A28D02E8C2389C7940D6F108A3C006185AC799E35659C7239C8C65019D + 962896E6A55D1E78E0818D2A2C44A19581D81D88A2D449681F24739F9997154E + 891891757A213A66F360231B3867CE9C352A2AC480D440B20CAFCF6FF481A45B + 2DCD5EDBF4742813EB463EDBA1AFFC81B9308E55B1D41CE2C16EFE48B29B4763 + 0E47C27C351FEB957DB87992B9AC48C4FADBCC58CD836B1EDFABA81023B60662 + 3EF8D2A16455FBE355A6D6AB6587BE5B28FDE242DC363D1D4AFFBAEDEEC232EF + 13733891022D11CCC786D9C86205DB8679A26D6FBCBFC16E79D1D6118E642E0B + C43B3DC0EDB966F3E0BCDE53CC2331A4069265E0C21842D9914EC14BEDD2D3A1 + 4CACDBAE0262571859D374011D4EE6367AC80E6D125699E7B32EC72A3BB00CBB + A1B0832953A6F434DFAACB7979C8BC79F3BE56D184983C79F2AF6048E1A4260B + DECE6B27354958ECE689476A3149272B6A20B92A3B1ABD3EAAF7F8A82EDD6AF6 + D8A7A743195837F2391CE682DABC9F74C16DDD8F66599BB0E2C13C9F75395699 + B7512B5960F91A7318E878B874104B18E878B874601D97043AA9A1416D6DED87 + 2A9830B367CFFE9F0AE61C2147DDD4A953FD37DE78236DDC98DE9B10D6AF5F4F + 43870E355E6E984E32B55E0D5E9677F5D557D31D77DC61EC873DCFBDC57FC231 + BFA67E03F72087BAC3245D2C5FF6330D19BA938AA5974CACFBA715CBE8D997DF + A3AF1EBC22780EBCF2CA2BFEBDF7DE3BF4FD640C0AE7580A32BCA4F0830F3EA0 + E1C387B7F9DD4CDF7DF79DB11CBC54D18E58B607CF4C7CF9E59774F4D1471BBF + F1A28B2EF29F71C619D4AB572FE2AB70631A33DA84ACCB36A72F5AB48878198E + C71E7BCC3F6AD4A898E63193CC6581BABA3ADAB06103F132E8EEBBEF0E4C1885 + 090CD7F0E6AA28CD993327A6F91245D70052BD9E4CD0AA94C24EC209944EE1C5 + 6F78F78FDDB8542A53EBD5B23B211A5AB806D2E24DBB1A9B9B6DD3D3A14CAC1B + F96C079A8EB4507059873A6C278CB3DE929AA8F472E29575195650B3B1138E45 + BB74C8FC4247FD8E2E6B9A0E47535B9615691BE3611EC3838B02B1D0CE74213E + A40F24CBC04BFF70879028B5423EDB612E8451005B0B646B9A59985717FC76E3 + E3915E8E5E672C428DC33CBF157DC182E5DA49136E5CB4B0599A70E3A285CDD2 + D88D8380DDC55824B836308B0762226D246BFA40726DBD901D28DC3C1990D7EB + B34D4F8732B16EE4B315EC1373816C2ED075A16C97AE05301ED88D8F26BD7C08 + 6680C2D16EBA70324F8F3096614517B8E6A10E036BBA5E9659E6F15AE6E9F478 + 8DDD345AE6F15AB12C4B87CDC378818970ED65A28A8A8924806D1396287D12B2 + 0714442874F16E26086F82352B5CBA160A7E7C451043BBF1D1A4970FE135E528 + 48CD6966D9CD6F16A6B11A882E7CE391DD7CB1A65965374DAC69B12811D09C25 + 269238595303C945D9E1F5FBF8EA38FDF2F93CB6E9E95046D6CDF96C875D61A4 + E38914547A9E7805F38817BBE558C172215DCBD1351EA4E938867A1AABCCAF60 + B71B6F5D4E3297655E8E4E471AD41660227C3E4E5051319138C81A03C9B5F542 + 76783C3E6ACE803C1EAF6D7A3A948975239FEDB02B846315D08599DDF87884E5 + D8A5C7AA70052BC6753492F19BE6CE9DFB109F93622271D2EA0843C166BEBB21 + 1D8AE72E8E642A53EBD5B23311BC66A3C5EB4BBB3C9C1776E9E95026D68D7CB6 + 235CC16D4ED785B355D6E9DA222C07D88D8B47898279C35DE48403D3DBAD3399 + CB4A25561339F7DC7387A9609BC0EDBB1DF1165E605B03B12BEC522D1C3076E9 + A956A6D60BD9E1E1F416BCDEDC2854D3278FD7639B9E0E6562DDC8673B506859 + 654E3787AD02D682BFAD98971F4D56ECD2E229C8CDF3633EEBBCD634BBF56992 + B92C2BD665B50598882EF01F7CF0C1A52A590883AD81E89D294AADECF0E00AD9 + 937E793D5CB0DAA4A743995837F2D90E5D70616896C61CB6231603D1E3AC0A87 + DDB4B14A1052492B03B12BE8D2A14CAD3B53EBD5B282343CA3907E71ADC8363D + 1D4AFFBAEDF2BEA3C3BFB93E9CA958D3EDF2C73A8DDDB2C21DD356125996DD34 + 00E9F86D2A2AA411DB1A8890197C2DDE9A16E36A5CC9D4669F6AE1590CBBF474 + 28ADEB36E52FF25B65BD81DBED5E86B713E016D8707D19D1D27177908E8753B8 + F1FA0E2308B7E2623AF39D46D184E9F5B2F11BF05BF09BD4CFA36EDDBABDD3D0 + D0109CCE2C601EEA3040582FDF8C5D3AC23AAEC3D6F1892E4B0FADC26FC26F33 + 2610D24AC85EBCF1C61B171516168E1C3F7E3C75E992BE4F025757571BEFE769 + 6C6C5429E92153EB05353535F8683FD6BDF8EAABAF1E85B4A32EB9E5B68DF5FE + 3FEE7FF4D15C10B9C9C985079F21C6F4A9E6E7AFBEA19DF6DC43C5D24BDAD68D + 2B5AAEEDE035324B172EA09EC58EDB5FBDF38ACBD4585AB162C575555555D3F1 + 7E34DC5A8A2B601450C01C0E07CC63CB962D28CCC8830FBDB7011C9B892E07DB + DADCDC4CCB962DA3F2F2F21983070FBE0EE9AFBCF2CAA4254B96DC7BC2092714 + F4E9D327E4B7016B1C20CD3CFEEDB7DFA6534E39C5F1E4934FFA7FF39BDF848C + B3CE0752B12C737CDDBA75F4ECB3CF368D1831E2F7471F7DF41C63849036027B + 42C185DAC0BBEFBEFBDF7C128DC44926A40E5C21F2C98D17DC0D62B3FE0E69B5 + B5B5BDC75FF7E08D6BAB9A26DA3C282D2409A7D3417DCBDC73E75F77EED5A5A5 + A5EB55320AEDAE1B376EBC840BA5F15C000F451A0A295D602582B92034D39665 + C6026A1E6C12F3070E1C780B5FD9D7A9645AB060C1A4F7DF7FFFF4AD5BB71EC2 + D1E2406AF8821EE8B81ECE9A35CB71E18517FAADE91A733CDC383D8C67590071 + 13F5151515EF1C74D0418F8F193346CC43100441100441100441100441100441 + 1004411004411004411004411004411004411004411004411004411004411004 + 4110044110044110044110044110044110044110044110044110044110044110 + 044110044110044110044110044110044110044110044110044110847870A8A1 + 200842D63361C284E39D4EE7891CDC4BC9C5FA8CB596F5687171F14BB366CDAA + E5705A993871E2FE0E87E33C0E1EC8DA87D5C0FA92F59ACFE7BB67DEBC79D8BE + 0E474403993469925F05DBC49C3973DA6C547A5B92B12C4110DA17679F7DF66E + 2E976B3617D22355922D2D2D2D9BF3F2F2AE9C3B77EE1C954493274FBE60F6EC + D9F7A8685239E594538A4A4A4A6EE0EDBA94A330B35678BDDE1ADEF60BB9EC7A + 54257518DAA581B461BBAEE7F9A7ABB02008ED003EDFFFE8F7FB6770215DAA92 + A2C2D33F595F5F7F16D7488EE4F99EE3F33E4F8D4A1A6C4CDDD91CDEE11AD160 + 951411AE893CDAD0D03061FEFCF95E95D4EE71AA612E7093988720B42FD83C6E + E0C16DDA3CD818D03C753D17DC23EAEAEAF2D8203A71C1FC2B4EFF0B6A1F9806 + F0F4A71415152DE0718F70D4B666D016C68F1FEFE2753E67360F8E2FE6F58D63 + EDA4340E696A34F1B467726DE55A15ED10E44A0DE4169EEF4A154E1913274E5C + C407C95FB8BAFCAE4ACA18E63C8A94FFB88AE203FD2EAEF29FAE925202E7CDE3 + 9C371773DE044F722BB16E7332B15B6726B64383FD112E8F228DEB88F031339A + 8D60818A1A05341BC7E4871F7EF8279514C2942953BAF2F8D91C3C3E90B28364 + EF47DEB67378DBE6A928C005EAD52A1C021F4F37F2E0AA408C9A5D2ED72F1E78 + E081EF55BC5DD3E16B207CD0DDCE3B36E5E601F8801AC9EB7B0746C227FBC12A + 396B993061C289CDCDCD5FF3769FA6925206D68175619D2A49B070CE39E7ECC2 + C7CFFFB8C041211802A7FD87C72DC5342A29EDC058B55452CAE02B7C370FEE0A + C40C9EE18B9C51E1CC0370A15CC9B5929338F87C2025A5A0C3DC00C6C6EBFD8B + 8AB602E3781A7D51E966939BA2C2ED9EB80C042E6E76721DB74A8DCE38BCD3FE + C907DD652A9A36B2DD487025AB6A044FE7E7E77757C92907EBC23A79DDF3B10D + 2A5960901F7C65BA8883BBB1B88CDE61221CFE0F0F50E8ECC2D3BC930B79575A + 5A7A3C9F470310F6783C95C5C5C5138C1159C079E79DD785B7ED201545D3D45F + 22F56B601CA65151305A0DDB3D1DBA06C23B39ECD54A3AC846234967AD231CBC + EE53A436124A6D6D6D250F82EDE58C612226F3D0BCA9A6EDD0F0557AF0D860D3 + BC3DD65B73D968EEE041AB26AC64D2D4D404930FF6ABF085116ED78D084F835B + 8D0DF8B761FE0E415C06C2077348F555C7AD52A3B3813BB8F0BE428533463618 + 09AE5A3351EB0887D44642C1556A5D5DDD6F3918BCFD9499C4329BC71C4CD391 + EEE289C0FE6A085E52C3A8CC9D3BF7E254B78AF0711BF3DD609ABCBCBCE03E63 + 432C52C1764F87EF03E1C2FBE66C3011902923C9865A4738A436B2833026A249 + BB7944BA308C342E19F079D24B05A9BEBE7E990A66052D2D2D210F05721C0F34 + 46A4A1A1C16C881DE6A1C20EDD07A25126F27F2A9A0DA0FA9BF45B0BC3C1574C + E890CC6ADAC336A68348069123358F5694979767D515BBEAC80F368FFB7CBE1B + 705BAF8AB602E3308D8AC21C17AA60BBA7C3D740346C223764DA44F8C07997B7 + 631457B30F993D7BB6B9BD3BA5B0A93FE176BB7FC1C167022959C533D8366CA3 + 8AE7347C358FCE73345D59E151ADEFCEEAA8F079B24105759F4356C1E7F2032A + 68B42CE06974156D857A523DD8E2C066F2900AB67B22D6169255354D46AD446F + 4B36D67034E1F20BC6C157D8783E246DA661DE16739E4D9E3C194D46B3ACFD20 + A9CE576BDEE0A12FDE06B457078D23DC36A712BB7566623B00AFD76A1EBA292B + 248D99ACC269259DF93261C28447F89C3913613E7FFEC2175D7F33466409175E + 7861697D7DFDD71C0CDE56CDDBB998753B9BC5872A7E2087FF0883312608F03C + E7DD38156EF7E44C0D2413C038F8E0497B8D2312BC1D4F66416D446A1D16B876 + 8C36FFC3023103A3CFC3A64FE430356D8786CD23D871EEF1782E4581ADA25901 + EF17DC62FC5A20160046C1DBFD1C0FD7432A1C340F2E0FBEE7E33E6B6E474E06 + 39D107926EB2D138CCF0366DE6FD74126FE378F3EB1F528D5AD7E95837B62190 + 2A003E563678BDDE4338B89A15EC30B774ACAFE6C214C755B079A7A3C2BFF949 + 14B808A3B6CCF1989AEFD0DFC035A5E7D864BF53C3A4BF3A84977B269F3B4B39 + A8EF908BDA378532810787DC7FFFFD3581948E81D4409248B61B879534D746A4 + D61185871E7A68351F3FC3B479A8E4E0DD597C7CFD2AD293D81D09FECDCD3C98 + 1A881957F7A74C9830E155BC955725B5020FF81517173FCE41FD10229E0749AA + D9B2219DC303BCC224D869CEFB054F9AE33D7B307F2BEFF3B8C928133AA2F147 + AC2D98DB3CDB42326A257A5BA4862308B9039FF7E6F748A1B0C60385B7F070E1 + BC79F33EC42B4F8A8A8AF6713A9DC7720DF7024BDFDE33A8EDAA709B61F398C4 + C684073BCD775CC1E8F7E5F5180F134E99326500D712BB20CCACEDE8B5453110 + 4110B21A3EF7FFC803DCE514CFEDBCCFD4D6D69EF5E4934FE2C34E6D86B701CF + 50A17663C6AB6A171DE6AEAA7891262C4110B21ABE68BC9D6B18FB72611D4BB3 + 309A01F1F1A69392651E8ADBD45093F3E601C4400441C87A1E7CF0C1155C588F + F2F97C6892C20D051FB3D07C0493F898D3F1B5BFD3EBEAEAFACF4ECDD707D127 + A38179FC36D7CD0348139620084214B8FC399207E8FFC01B13A6723924378308 + 8220088220088220088220088220088220088220088220088220088220088220 + 088220088220088220088220088220088220088220088220088220B437E4CDB6 + 8220B462C284097D9D4EE75D5EAFF73097CBA5BFB01784D36B38FD4D9FCF77F1 + BC79F3D6AA6421C7100311042184F1E3C7BB4A4A4ADEE1E041819488BC5F5757 + 7788F91BEEA966F2E4C923FD7EFFCD1C3C3090421F3A1C8E2B67CF9E1DCB07A7 + 8424221F9412042184E2E2E2BD78108B798083D4F46983CD039F96D5E6010E54 + 69429A911A8890354C9C38F1B6B973E75EA6A2692353EBCD56F80AFF602E9051 + 038909BEFA3F84AFFEDF55D19C25173F7A97941FCA555E375F85DCC127E1852A + 29ED702130ABBEBE7E2A57A5CD9F9E14DA01387E4A4A4AF0B5B7733271F2A913 + FFA1BABABADF66E3F193EEF32B5B0C64C284096F389DCEC35434217C3EDF9BF3 + E6CD3B5C45534A2E1A489B9BB0B8E0EEC507F71B7C105DA0923202D68FEDC0F6 + A824A11D70E1851796161515BDC8C173022919E31C6C07B647C5B3824C9C5F6C + 1E7BAB604CC43B7DACB079B4D9CC93B10C213C6D3210BE4238900FECA5AC8355 + 5246C176B03E3DE79C73626DBF4D297C45F2474845050B281CB9D688AB4C7C6F + 3AE3603BB03DD97211926DE757BAE12BF9312A9830C95886109E840D844FB229 + 7CC2A19ADB37909235F472B95C8B78FBCE53F18CC0C671260F6E8354583071F6 + D967EFC6031C3FE6CED06C00DBF38EDABE8C91C5E797200489BBAD4EB7C7F255 + 91B54A7D3DBBFD74154E3B5C48CFE0C1B5815890FBEBEAEA2E4E77BB366F0BDA + 6D17B0DC460211D63F86F3E7CD40343570A1731BEF9736D578FC7EFFEDA9EE50 + E6EDDC9FB713CD56ADAEF433D17ECCFBCB68BBB6B081F3622CE7C5C72A9E16B2 + E1FCCAA64EF430FB2666D2793CE96DCDC4319C29E2AA81F0891FAE3D36A3E601 + D4FAAF0FC4829C57525282DA48DA9A24785DFB78BDDEA739A8CD03B891868253 + C553020A7E9FCFF7A88AC60DE64DB57928735DC4CAF6BE2A6CDF22B5BD69219B + CFAF2C039DE2E68E716B3CA5C060795FA15CB15EB0B602D3605ACCA3923A1431 + 3B25DA63B94A8D8231E62A752A9D38CE2B930D5C809FF4D0430FBDAFE22961CA + 9429031A1B1B97E4E7E777574921B4B4B46C2E2C2C1CF1C0030F7CAF92920EAE + 608B8A8A16F0BE8AABE0C3DD2A0D0D0D6352595BE37D86A6BCD92CB3B9869089 + ABB728C712F263326F57C2C61C0BD9747E657B0D44FF6E3DCE1A37938A3CE2F5 + 045B3B389FA6F3459771E16ADD1E9807E70DA6051DF22220A61A0867447B6F8F + 4D79BF089F74DD3D1ECF8270E601300ED3605A95947460006C522771309EA697 + CF304F8ACDE3521E3CC20A6B1E590AB6F711B5FD29A1039C5F39853202C33460 + 10300A84CDE4827980980C840FEEF676D2DBC2BFC3A58249E594534E29E22B91 + 17F98019A092C28269302DE6514949E7FEFBEFAFE1F58CE1F544ADE9601A9EF6 + 28CCA39252454AF23E8DA46CFB3BCAF9954B4432915C310F10938170F5F41ECE + 10B4316E08A4B43B3660FBF13B543C69A84E4F7408C77337D1819807F3AA78D2 + E1DFBA392F2F6F0C9ACD54522B300ED3605A959432F824BA9DCD6A0207D37A43 + 431268C67663FB553CE97480F32B27B19A08862057CC03C4DC89CE07F9BB7C22 + EDCBC156FD089C3E9D33CA61951A9D12ECD687ED50A3CD7CE8F3F98661FB553C + A9141515CDE62BC8B83B5A310FE655D19480BE1697CB3596830D8194101A302E + 95FD3156E6CE9DFB100FC6F27EAA0DA464376A3B712716B63BA564DBF925C406 + EF87A08958C8891B1FE2BA0B8B4FA40D757575A338787F2025001CD7AE1D309D + 58AA8D9A07787B0F49D5EBA6274D9A74231B41C2CF78605E2C43455302FFF60F + 790013315FF9233C568D4B2B7C52BDC605627BB8DAC66DBC87637B553CE564F3 + F92584C7C64472C23C40C257317C409FC707F65D1C0C36C370A665ECAA48DF01 + A168E66D9B8AA60115CF79387F6074E8C40667F1BE4AE95D45D1C01D6B5EAFF7 + 550E863CB0978963C872EC809FB87676543A6B675632797E65FB5D58BC6DC6D3 + E5BC5E3C6BD52A6E269DC7136FAB7101CBEBCC09F30071D540CCF0D5D2FD5C00 + E06A29DBAE2453D6DFD19E8161F089763584B04ACE18289C795B467030AD0FEA + C5C0C7D8AE4C9A07C8E2F32BE3C028CC66618DA712189A9DA901184738F38834 + 5F7B2661030178AE824F36DB76DB0C91D2FE8EF60E174A37412A9A71D064535C + 5C3C0ACFA0A8A48C82EDC0F660BB545246C9A2F3EB632EA07FC185230F1CBF40 + 3C909CBB4C983021E65BAEE399B6BDD126030138D9ECDA6D33404AFB3B84D430 + 6BD6AC5A3CC0C88577466B45583FB603DBA392B2822C38BF9A5D2ED7E97C51B6 + 0C110C11473AE2B98AD3E9FCCFC418DE70816930AD8A763832D667210856F864 + C3372FA6AA68DAC8D47AB3154B1FC8FD5CF3385F85834C9A34E93E1E180FE672 + AD24957D203FF320D12BF8B5BCED3BA97052C8B6EDC9346DAE810842B2C85421 + 2EE6119127D5D04AB8F4A4C246F65B1E24D2A488BBE8306F52C9B6EDC9345203 + 110421045D0361D5D6D7D797CD9F3FDFAB4605193F7EBCABB8B8B89A6B1FA5A9 + AC8108D98DD4400441B0858D61999D7900A463BC8A0A82200882200882200882 + 2008822008822008822008822008822008822008822008822008822008822008 + 82200882200882200882200882200882200842F623AF734F2253A64CE9EAF3F9 + 4EF3FBFDA3398A8FCEEC638C20FA8CB5D6E1702C743A9D4F3CF0C00395816441 + 1084F64BBB3290647D941EDF7656C1A470CA29A7149594945CCAE67195CBE5EA + A2926DF17ABD356C2237D5D5D5FDF3C9279F6C50C949215BF34710848E897C0F + A48DE09BC7A5A5A58BB876716334F3009806D3629E58BEA92C088290AD8881B4 + 81091326F46533F81F070F0CA4C4C5819817CB507141108476856D53C5E4C993 + 47FAFDFE9B399848C1F83EEB2F73E6CC7933104D1ED9D444337EFC78774949C9 + 3B1C4C248FCC7C58575777C8FCF9F39B553C61A4094B108474625B0361F3789C + 0789168C07B1FE1308EE800BB71B55B043505C5CFC471E44CB237C0EF474AFD7 + BB2B0F3F34525A73A05A96200842BBC2F64AB3AD57B2E8287EE8A187CA10C6C7 + F7F94A7D1607CF6BEB95AD75BB625D5EA2F385E3BCF3CEEB525F5FFF635E5E5E + 5795648BC7E3A97CF8E1872B10E66DB88107FF87B0154CC726D2FFFEFBEFAF51 + 490911C77EBB8C0543771B310B52031104211652DA0782661E2E181FE1E07981 + 948E417373F3B1D1CC03601A2ED4674F9C38F10A8E4E09A4B606D3B5B4B49CA9 + A229C7ED763FC0263F8A831B0229822008F193B21A484343436F368FE79C4EE7 + 912AB9CD57B66DDD2E4D12B6E3391E1C1F8845E563BFDF8F3BAF06A878389EE7 + ED1AA7C209116BFEB08194A1B6830E7CDE3F4F735248539CD4400441888594D4 + 405C2E97BBB4B4F40DB37974247C3EDF60150CC75A368DF3D9403B71613CACAE + AE6E6F4E8BF6CCC7FE6A985460E6BC2DB773F0281EF6863954555519DB326FDE + BCB5B5B5B5A889CC415C1004211E525203094712AEFC43B62BD6E5253A5F38CE + 39E79CEA48CF7CB0C1AC60F35CCCEB391FF1C993271FCC8537EED88A44334F5F + A0C20961B3DF567B3C9E510F3FFCF04F2ADE0AF451B1D1DDC635A44B5592D440 + 04418809790E2405B079A086521488198672B00A86850DA6CDB7F15AE1F55E9C + 979737808D651E6BA9921F3701603C1B5B77368F37CCE6210882102BEDBA0692 + 286DDD8E0913267CA34C222C68C29A3B77EEFD084F9C38F11D2EA4239A086A2D + F3E6CDDB434513C2267F5E621D1B08EE007D204D4D4D03789BD0FFB14B207507 + 520311042116525503411B3B1E28EC90B079AC50C1B0B0212CC41057FB5C50E3 + D99888C4B2CC0468651EA0B9B9F91CDE2634A9B5320F4110845849898178BDDE + E6E2E2E2A3B8104DFAD3E86670A51C8BD4E449836B174FAAA02DA84D3CF4D043 + AB11E62B7DD43C5CAC88B7CC72816E184E9AB88B156C62130441488494F581CC + 9A35ABB6A1A1610C079F09A4741C0A0A0A9EC7DD4D2ADA0AAE4D7CAF82300618 + C959ACE78D041BB0ACFCFCFC4755541004A15D90923E1014889627D1EFE3E094 + B6D606B2A50F044C9C38F12A3607DBD7B3B4B4B46CCECBCB9B505F5FFF1AFFF6 + A15C23B98A4D25EC83825CA3B97AEEDCB937A968C26453FE0882D0F10967203F + F320E1B7C47281F83D17880355D4800BDCDB380DAFD04898440BC8541488EA65 + 8A4B38D8D6E7373EAEADAD3D2419DF06C9A6FC1104A1E363DB84C506F05B1E24 + FA9A0B34D95C1C08EEA0ADE6D15650B82ACD50496D026FCFE59A059E1C5F1B48 + 4988B55846B23F2C9508C9CE1F41103A3EEDEACA13059C0AC605AEB0D5BCD773 + 787A2035399C73CE39BBB85CAEF91C8CF7EDC51F7ABDDEF1BAB33D196463FE08 + 82D071C9A50709535238C200F03A10AEB5FD2552C7BA06D3605ACC934CF34802 + 621E8220C485B47D27912953A67465834067F96816FA90F6413AF3190B4D5D0B + B9B6F2E8030F3C5069A40A822008822008822008822008822008822008822008 + 8220088220088220088220088220088220088220088220088220088220088220 + 0882200882200882200882200882200882200882200882200882200882200882 + 2008822008822008822008822008822008822008822008822008822008822008 + 8220088220088220088220088220088220088220088220088220088220088220 + 0882200882200882200882200882200882200882204484E8FF01B1221AA5ED01 + 97650000000049454E44AE42608200000756697369626C65080000545046300A + 5452656374616E676C6500095374796C654E616D65060C50616E656C31537479 + 6C65310A46696C6C2E436F6C6F720708636C6157686974650748697454657374 + 080A506F736974696F6E2E580500000000000000DB06400A506F736974696F6E + 2E590500000000000000A107400A53697A652E57696474680500000000000040 + E508400B53697A652E4865696768740500000000000000B004401453697A652E + 506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F72070978 + 46463937393739370756697369626C650800005450463007544C61796F757400 + 095374796C654E616D65060B4D656D6F315374796C65310A506F736974696F6E + 2E580500000000000000DB06400A506F736974696F6E2E590500000000000000 + 8A05400A53697A652E57696474680500000000000040E508400B53697A652E48 + 656967687405000000000000C08908401453697A652E506C6174666F726D4465 + 6661756C7408085461624F7264657202020012544163746976655374796C654F + 626A65637400095374796C654E616D65060A6261636B67726F756E6405416C69 + 676E0708436F6E74656E74730C50616464696E672E4C65667405000000000000 + 008000400B50616464696E672E546F7005000000000000008000400D50616464 + 696E672E526967687405000000000000008000400E50616464696E672E426F74 + 746F6D05000000000000008000400C536F757263654C6F6F6B75700626537479 + 6C65426F6F6B315374796C65426F6F6B3157696E646F777320377374796C652E + 706E670A53697A652E57696474680500000000000040E508400B53697A652E48 + 656967687405000000000000C08908401453697A652E506C6174666F726D4465 + 6661756C74080D416374697665547269676765720707466F63757365640A4163 + 746976654C696E6B0E010E436170496E736574732E4C65667405000000000000 + 00E001400D436170496E736574732E546F700500000000000000E001400F4361 + 70496E736574732E52696768740500000000000000E0014010436170496E7365 + 74732E426F74746F6D0500000000000000E001400F536F75726365526563742E + 4C6566740500000000000000E106400E536F75726365526563742E546F700500 + 000000000000E0054010536F75726365526563742E5269676874050000000000 + 00009E074011536F75726365526563742E426F74746F6D05000000000000008D + 064000000A536F757263654C696E6B0E010E436170496E736574732E4C656674 + 0500000000000000E001400D436170496E736574732E546F7005000000000000 + 00E001400F436170496E736574732E52696768740500000000000000E0014010 + 436170496E736574732E426F74746F6D0500000000000000E001400F536F7572 + 6365526563742E4C6566740500000000000000E106400E536F75726365526563 + 742E546F700500000000000000A2054010536F75726365526563742E52696768 + 7405000000000000009E074011536F75726365526563742E426F74746F6D0500 + 000000000000DC0540000013546F756368416E696D6174696F6E2E4C696E6B0E + 000007544C61796F757400095374796C654E616D650607636F6E74656E740541 + 6C69676E0706436C69656E740A53697A652E57696474680500000000000040E0 + 08400B53697A652E48656967687405000000000000C08408401453697A652E50 + 6C6174666F726D44656661756C740800000A545363726F6C6C42617200095374 + 796C654E616D65060A767363726F6C6C62617205416C69676E07055269676874 + 06437572736F72070763724172726F770B536D616C6C4368616E676505000000 + 000000000000000B4F7269656E746174696F6E0708566572746963616C0A506F + 736974696F6E2E5805000000000000C0E008400A506F736974696F6E2E590500 + 0000000000008000400A53697A652E576964746805000000000000008003400B + 53697A652E48656967687405000000000000C08408401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B7570061A4D656D6F314D + 656D6F315363726F6C6C4261725374796C65313100000A545363726F6C6C4261 + 7200095374796C654E616D65060A687363726F6C6C62617205416C69676E0706 + 426F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E + 676505000000000000000000000B4F7269656E746174696F6E070A486F72697A + 6F6E74616C0A506F736974696F6E2E5805000000000000008000400A506F7369 + 74696F6E2E5905000000000000408508400A53697A652E576964746805000000 + 00000040E408400B53697A652E48656967687405000000000000008003401453 + 697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570 + 06144D656D6F315363726F6C6C4261725374796C6531000007544C61796F7574 + 0005416C69676E0706436C69656E740A53697A652E5769647468050000000000 + 0040E008400B53697A652E48656967687405000000000000C08408401453697A + 652E506C6174666F726D44656661756C7408000F54536D616C6C5363726F6C6C + 42617200095374796C654E616D65060F76736D616C6C7363726F6C6C62617205 + 416C69676E0705526967687406437572736F72070763724172726F770B536D61 + 6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07 + 08566572746963616C0C4D617267696E732E4C65667405000000000000008000 + 400A53697A652E576964746805000000000000008002400B53697A652E486569 + 67687405000000000000008002401453697A652E506C6174666F726D44656661 + 756C74080B5374796C654C6F6F6B7570061F4D656D6F314D656D6F31536D616C + 6C5363726F6C6C4261725374796C6531310756697369626C650800000F54536D + 616C6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C73 + 63726F6C6C62617205416C69676E0706426F74746F6D06437572736F72070763 + 724172726F770B536D616C6C4368616E676505000000000000000000000B4F72 + 69656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E546F + 7005000000000000008000400A53697A652E5769647468050000000000000096 + 06400B53697A652E48656967687405000000000000008002401453697A652E50 + 6C6174666F726D44656661756C74080B5374796C654C6F6F6B757006194D656D + 6F31536D616C6C5363726F6C6C4261725374796C65310756697369626C650800 + 0000000C5442727573684F626A65637400095374796C654E616D65060A666F72 + 6567726F756E640B42727573682E436F6C6F720708636C61426C61636B00000C + 5442727573684F626A65637400095374796C654E616D65060973656C65637469 + 6F6E0B42727573682E436F6C6F72070978374633333939464600000B54466F6E + 744F626A65637400095374796C654E616D650604666F6E740B466F6E742E4661 + 6D696C790608436F6E736F6C61730000005450463007544C61796F7574000953 + 74796C654E616D65061A4D656D6F314D656D6F315363726F6C6C426172537479 + 6C6531310756697369626C6508085461624F726465720203000754427574746F + 6E00095374796C654E616D65060A6C656674627574746F6E05416C69676E0704 + 4C656674064C6F636B6564090A506F736974696F6E2E59050000000000000080 + 03400A53697A652E576964746805000000000000008003400B53697A652E4865 + 6967687405000000000000009003401453697A652E506C6174666F726D446566 + 61756C74080B5374796C654C6F6F6B757006137363726F6C6C6261726C656674 + 627574746F6E00000754427574746F6E00095374796C654E616D65060B726967 + 6874627574746F6E05416C69676E07055269676874064C6F636B6564090A506F + 736974696F6E2E5805000000000000008804400A506F736974696F6E2E590500 + 0000000000008003400A53697A652E576964746805000000000000008003400B + 53697A652E48656967687405000000000000009003401453697A652E506C6174 + 666F726D44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C + 6261727269676874627574746F6E00000754427574746F6E00095374796C654E + 616D650609746F70627574746F6E05416C69676E0703546F70064C6F636B6564 + 090A53697A652E57696474680500000000000000C804400B53697A652E486569 + 67687405000000000000008003401453697A652E506C6174666F726D44656661 + 756C74080B5374796C654C6F6F6B757006127363726F6C6C626172746F706275 + 74746F6E00000754427574746F6E00095374796C654E616D65060C626F74746F + 6D627574746F6E05416C69676E0706426F74746F6D064C6F636B6564090A506F + 736974696F6E2E5905000000000000008804400A53697A652E57696474680500 + 000000000000C804400B53697A652E4865696768740500000000000000800340 + 1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B + 757006157363726F6C6C626172626F74746F6D627574746F6E00000654547261 + 636B00095374796C654E616D65060668747261636B05416C69676E0706436C69 + 656E74064C6F636B6564090B4F7269656E746174696F6E070A486F72697A6F6E + 74616C0A53697A652E576964746805000000000000009003400B53697A652E48 + 656967687405000000000000009003401453697A652E506C6174666F726D4465 + 6661756C74080B5374796C654C6F6F6B757006147363726F6C6C626172687472 + 61636B7374796C6500000654547261636B00095374796C654E616D6506067674 + 7261636B05416C69676E0706436C69656E74064C6F636B6564090B4F7269656E + 746174696F6E070A486F72697A6F6E74616C0A53697A652E5769647468050000 + 00000000009003400B53697A652E486569676874050000000000000090034014 + 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 + 7006147363726F6C6C62617276747261636B7374796C65000000545046300754 + 4C61796F757400095374796C654E616D6506144D656D6F315363726F6C6C4261 + 725374796C65310756697369626C6508085461624F7264657202040007544275 + 74746F6E00095374796C654E616D65060A6C656674627574746F6E05416C6967 + 6E07044C656674064C6F636B6564090A506F736974696F6E2E59050000000000 + 00008003400A53697A652E576964746805000000000000008003400B53697A65 + 2E48656967687405000000000000009003401453697A652E506C6174666F726D + 44656661756C74080B5374796C654C6F6F6B757006137363726F6C6C6261726C + 656674627574746F6E00000754427574746F6E00095374796C654E616D65060B + 7269676874627574746F6E05416C69676E07055269676874064C6F636B656409 + 0A506F736974696F6E2E5805000000000000008804400A506F736974696F6E2E + 5905000000000000008003400A53697A652E5769647468050000000000000080 + 03400B53697A652E48656967687405000000000000009003401453697A652E50 + 6C6174666F726D44656661756C74080B5374796C654C6F6F6B75700614736372 + 6F6C6C6261727269676874627574746F6E00000754427574746F6E0009537479 + 6C654E616D650609746F70627574746F6E05416C69676E0703546F70064C6F63 + 6B6564090A53697A652E57696474680500000000000000C804400B53697A652E + 48656967687405000000000000008003401453697A652E506C6174666F726D44 + 656661756C74080B5374796C654C6F6F6B757006127363726F6C6C626172746F + 70627574746F6E00000754427574746F6E00095374796C654E616D65060C626F + 74746F6D627574746F6E05416C69676E0706426F74746F6D064C6F636B656409 + 0A506F736974696F6E2E5905000000000000008804400A53697A652E57696474 + 680500000000000000C804400B53697A652E4865696768740500000000000000 + 8003401453697A652E506C6174666F726D44656661756C74080B5374796C654C + 6F6F6B757006157363726F6C6C626172626F74746F6D627574746F6E00000654 + 547261636B00095374796C654E616D65060668747261636B05416C69676E0706 + 436C69656E74064C6F636B6564090B4F7269656E746174696F6E070A486F7269 + 7A6F6E74616C0A53697A652E576964746805000000000000009003400B53697A + 652E48656967687405000000000000009003401453697A652E506C6174666F72 + 6D44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C626172 + 68747261636B7374796C6500000654547261636B00095374796C654E616D6506 + 0676747261636B05416C69676E0706436C69656E74064C6F636B6564090B4F72 + 69656E746174696F6E070A486F72697A6F6E74616C0A53697A652E5769647468 + 05000000000000009003400B53697A652E486569676874050000000000000090 + 03401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F + 6F6B757006147363726F6C6C62617276747261636B7374796C65000000545046 + 3007544C61796F757400095374796C654E616D65061F4D656D6F314D656D6F31 + 536D616C6C5363726F6C6C4261725374796C6531310756697369626C65080854 + 61624F726465720205000654547261636B00095374796C654E616D6506066874 + 7261636B05416C69676E0706436C69656E74064C6F636B6564090B4F7269656E + 746174696F6E070A486F72697A6F6E74616C0A53697A652E5769647468050000 + 0000000000C804400B53697A652E4865696768740500000000000000C8044014 + 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 + 7006147363726F6C6C62617268747261636B7374796C6500000654547261636B + 00095374796C654E616D65060676747261636B05416C69676E0706436C69656E + 74064C6F636B6564090B4F7269656E746174696F6E070A486F72697A6F6E7461 + 6C0A53697A652E57696474680500000000000000C804400B53697A652E486569 + 6768740500000000000000C804401453697A652E506C6174666F726D44656661 + 756C74080B5374796C654C6F6F6B757006147363726F6C6C6261727674726163 + 6B7374796C650000005450463007544C61796F757400095374796C654E616D65 + 06194D656D6F31536D616C6C5363726F6C6C4261725374796C65310756697369 + 626C6508085461624F726465720206000654547261636B00095374796C654E61 + 6D65060668747261636B05416C69676E0706436C69656E74064C6F636B656409 + 0B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A652E5769 + 6474680500000000000000C804400B53697A652E486569676874050000000000 + 0000C804401453697A652E506C6174666F726D44656661756C74080B5374796C + 654C6F6F6B757006147363726F6C6C62617268747261636B7374796C65000006 + 54547261636B00095374796C654E616D65060676747261636B05416C69676E07 + 06436C69656E74064C6F636B6564090B4F7269656E746174696F6E070A486F72 + 697A6F6E74616C0A53697A652E57696474680500000000000000C804400B5369 + 7A652E4865696768740500000000000000C804401453697A652E506C6174666F + 726D44656661756C74080B5374796C654C6F6F6B757006147363726F6C6C6261 + 7276747261636B7374796C65000000} + end> Left = 16 Top = 40 - ResourcesBin = { - 464D585F5354594C4520322E3501060C50616E656C315374796C653103D80006 - 0B4D656D6F315374796C653103280906265374796C65426F6F6B315374796C65 - 426F6F6B3157696E646F777320377374796C652E706E670444910000061A4D65 - 6D6F314D656D6F315363726F6C6C4261725374796C65313103690406144D656D - 6F315363726F6C6C4261725374796C6531036304061F4D656D6F314D656D6F31 - 536D616C6C5363726F6C6C4261725374796C65313103AC0106194D656D6F3153 - 6D616C6C5363726F6C6C4261725374796C653103A60100545046300A54526563 - 74616E676C6500095374796C654E616D65060C50616E656C315374796C65310A - 46696C6C2E436F6C6F720708636C6157686974650748697454657374080A506F - 736974696F6E2E580500000000000000DB06400A506F736974696F6E2E590500 - 000000000000A107400A53697A652E57696474680500000000000040E508400B - 53697A652E4865696768740500000000000000B004401453697A652E506C6174 - 666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846463937 - 393739370756697369626C650800005450463007544C61796F75740009537479 - 6C654E616D65060B4D656D6F315374796C65310A506F736974696F6E2E580500 - 000000000000DB06400A506F736974696F6E2E5905000000000000008A05400A - 53697A652E57696474680500000000000040E508400B53697A652E4865696768 - 7405000000000000C08908401453697A652E506C6174666F726D44656661756C - 7408085461624F7264657202010012544163746976655374796C654F626A6563 - 7400095374796C654E616D65060A6261636B67726F756E6405416C69676E0708 - 436F6E74656E74730C50616464696E672E4C6566740500000000000000800040 - 0B50616464696E672E546F7005000000000000008000400D50616464696E672E - 526967687405000000000000008000400E50616464696E672E426F74746F6D05 - 000000000000008000400C536F757263654C6F6F6B757006265374796C65426F - 6F6B315374796C65426F6F6B3157696E646F777320377374796C652E706E670A - 53697A652E57696474680500000000000040E508400B53697A652E4865696768 - 7405000000000000C08908401453697A652E506C6174666F726D44656661756C - 74080D416374697665547269676765720707466F63757365640A416374697665 - 4C696E6B0E010E436170496E736574732E4C6566740500000000000000E00140 - 0D436170496E736574732E546F700500000000000000E001400F436170496E73 - 6574732E52696768740500000000000000E0014010436170496E736574732E42 - 6F74746F6D0500000000000000E001400F536F75726365526563742E4C656674 - 0500000000000000E106400E536F75726365526563742E546F70050000000000 - 0000E0054010536F75726365526563742E526967687405000000000000009E07 - 4011536F75726365526563742E426F74746F6D05000000000000008D06400000 - 0A536F757263654C696E6B0E010E436170496E736574732E4C65667405000000 - 00000000E001400D436170496E736574732E546F700500000000000000E00140 - 0F436170496E736574732E52696768740500000000000000E001401043617049 - 6E736574732E426F74746F6D0500000000000000E001400F536F757263655265 - 63742E4C6566740500000000000000E106400E536F75726365526563742E546F - 700500000000000000A2054010536F75726365526563742E5269676874050000 - 00000000009E074011536F75726365526563742E426F74746F6D050000000000 - 0000DC054000000007544C61796F757400095374796C654E616D650607636F6E - 74656E7405416C69676E0706436C69656E740A53697A652E5769647468050000 - 0000000040E008400B53697A652E48656967687405000000000000C084084014 - 53697A652E506C6174666F726D44656661756C740800000A545363726F6C6C42 - 617200095374796C654E616D65060A767363726F6C6C62617205416C69676E07 - 05526967687406437572736F72070763724172726F770B536D616C6C4368616E - 676505000000000000000000000B4F7269656E746174696F6E07085665727469 - 63616C0A506F736974696F6E2E5805000000000000C0E008400A506F73697469 - 6F6E2E5905000000000000008000400A53697A652E5769647468050000000000 - 00008003400B53697A652E48656967687405000000000000C08408401453697A - 652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570061A - 4D656D6F314D656D6F315363726F6C6C4261725374796C65313100000A545363 - 726F6C6C42617200095374796C654E616D65060A687363726F6C6C6261720541 - 6C69676E0706426F74746F6D06437572736F72070763724172726F770B536D61 - 6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07 - 0A486F72697A6F6E74616C0A506F736974696F6E2E5805000000000000008000 - 400A506F736974696F6E2E5905000000000000408508400A53697A652E576964 - 74680500000000000040E408400B53697A652E48656967687405000000000000 - 008003401453697A652E506C6174666F726D44656661756C74080B5374796C65 - 4C6F6F6B757006144D656D6F315363726F6C6C4261725374796C653100000754 - 4C61796F75740005416C69676E0706436C69656E740A53697A652E5769647468 - 0500000000000040E008400B53697A652E48656967687405000000000000C084 - 08401453697A652E506C6174666F726D44656661756C7408000F54536D616C6C - 5363726F6C6C42617200095374796C654E616D65060F76736D616C6C7363726F - 6C6C62617205416C69676E0705526967687406437572736F7207076372417272 - 6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74 - 6174696F6E0708566572746963616C0C4D617267696E732E4C65667405000000 - 000000008000400A53697A652E576964746805000000000000008002400B5369 - 7A652E48656967687405000000000000008002401453697A652E506C6174666F - 726D44656661756C74080B5374796C654C6F6F6B7570061F4D656D6F314D656D - 6F31536D616C6C5363726F6C6C4261725374796C6531310756697369626C6508 - 00000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68 - 736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D06437572 - 736F72070763724172726F770B536D616C6C4368616E67650500000000000000 - 0000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267 - 696E732E546F7005000000000000008000400A53697A652E5769647468050000 - 00000000009606400B53697A652E486569676874050000000000000080024014 - 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 - 7006194D656D6F31536D616C6C5363726F6C6C4261725374796C653107566973 - 69626C6508000000000C5442727573684F626A65637400095374796C654E616D - 65060A666F726567726F756E640B42727573682E436F6C6F720708636C61426C - 61636B00000C5442727573684F626A65637400095374796C654E616D65060973 - 656C656374696F6E0B42727573682E436F6C6F72070978374633333939464600 - 000B54466F6E744F626A65637400095374796C654E616D650604666F6E740B46 - 6F6E742E46616D696C790608436F6E736F6C6173000000545046300654496D61 - 676500095374796C654E616D6506265374796C65426F6F6B315374796C65426F - 6F6B3157696E646F777320377374796C652E706E670E4D756C74695265734269 - 746D61700E010557696474680390010648656967687403580203504E470ACC90 - 000089504E470D0A1A0A0000000D49484452000001900000025808060000004C - ECB088000000017352474200AECE1CE90000000467414D410000B18F0BFC6105 - 0000907649444154785EED9D078014D5FDC77FBB7BB757813B8E8E059122448D - 050D120DD841516CD8A548A251A3422CD1FCA38831D1D8301AB1244AB1077B03 - 3B58D0287605B152A4C315B87E5BFEBFEFEC7BCBECDC6CBD6D77FBFBC0F7E6BD - 3775DFCCBCEFBCF7A69020088220088220088220088220088220084207C4A186 - 82207410EEB9E71EBF0A0A162EB8E082B065DEF537DE21F916866BAF9E6A9B6F - B689B5B5B5929149A6B4B434A259FFE3D6BB732ECFFF74F9457201931C908FC1 - E3070672C61967A898A079ECB1C7A21AC835575DAA6282E6AF37FD530C24D3C4 - 6220575E76A18A757C6EBE6D961848F2D0F9689CB76220F688812446240371AA - A12008ED17316221238881088220080921062208ED1F398F858C20079E20741C - A4294B482B622082200842428881088220080921062208822024841888909578 - 3C5E3FF0F9446601E48DCA2641C82862204256C265254B0F453B14C81341C806 - C44084ACC4E3F15153B38F9A5B4466214F903761106711D28A18889095B478FD - D4E2F1B27CA210719EB46EC10AEB2882904AC44084AC0457D9B8E26E11850879 - 12A106220869450C44C84ABC3ED440B8D0F48A42C47982BC11846C400C44C84A - FC7EBF28826C105711D28E18889095A08C1485970569D3123282188890956CAB - 6DA2CAEA46AAAA1199853C41DE08423620062264250E8743144182900D888108 - 5989D3E12487536427E48D20640372240A590B9795C6012A32097F04214B90C3 - 51C84AD04A631498188A7648E58D20640362204256E23435D9884285BC11846C - 408E44212BC1D5B68BFF885A8BFF0B42562006226425B8D3C8A9EE3812ED90CE - 1341C806C44084ACC45A708A422508D9801888909538BC9E16878345A210214F - 386F5436094246B1BD94A9ADAD6DFDB204A14D94969646BC6CFCC7AD77FBAFBC - EC4215EBF8DC7CDB2CFAD3E51785CD9377DEFFCA5F55534779792E9522008FC7 - 4BE55D4AE89083F60C9B77F7DC738FFF8C33CE503141F3D8638FD105175C1036 - DFAEBFF10EFF35575DAA6282E6AF37FD93AEBD7AAA6DBED9268A81241F319050 - A219881C839189743C8981D823069218910C449AB084AC0405A428BC54360942 - 4611031104411012420C44C826E4788C0DC927212B900351C826E4788C0DB71A - 0A4246B16D4B950ECCE413ADDD5A3AD10DF2581E04AAAAAAA6FE549D3F73FD76 - 17357991929B14B8887A77F2D26E652DD3CACBCBFFA5920B59B581606BA413DD - 1EE9444F0CB90B2B0B100309259A817CFC53ADDFE9CCA7DD2A028568AE02F3FC - 692B91CFD742FBEF565AA0925103110389133190C490BBB084F642F0785CC735 - 0F9887CBE1A316AF376785DF8F7C407E30A546E6048C5610328E18889095B4F0 - 95773E97993E9FDFF69BE0B922FC7EE403F2836964E19C95F356C80AE44014B2 - 1A2E43735E8290AD888108D98D5D899A6BDA819CAF42562107A490B5D895A5B9 - 2A41C846C44084EC854B4E6B419A8B0AFC31F0A9A1206405622042361152401A - 0528FFC97905B2C38C71ABB320641A3110217B518567AE2BF027084C566A2242 - 56200622642DC1C233C78581428C43C82AC440846C420AC8C8E8DA8734610959 - 81188890D5582EC6735226B4C18AD10A5981188890B5180528FFC97905B24323 - E621640D62204236115238EAC233E7853F0174FE4813969015888108594DC895 - 788ECA06A985085981188820B42FC43C84AC410C44C85A8C2B700C735DF81340 - CC43C82AC44084ACC6DC9493AB12846C450C44C84AF00D8C662F1FA0CE881F72 - ECF0E0F7231F901F82906D8881085949EF522FADAE2672389C54E876E5ACF0FB - 910FC80F41C8366C2FEFC27D13DD91DB17836DA2A444BE896E26CC37D1835455 - 554DFDBE327FE6C63A9771059EABB08750CF122F0DE8DA32ADBCBCFC0E951C11 - F926BA3DF24DF4C488F44D74DB443190E42306124A34031112470CC41E3190C4 - 886420D284250882202484188820088290106220822008424288810882200809 - 21062208822024846DCFBADC85957CE42EAC5022DD85B568D1A23FF2E0B6404C - B0C3EFF7D3A1871E6A9B7F7217963D72175662C86DBC5980184828910CC4E7F3 - FDD1E17088814481F3C836FFC440EC1103490CB98D576857389DCEDB51385A70 - 8A42A5B24B1032861C8442B6822B1EB30441C832C440846CC36A186613C955E5 - B3F03A45B3902E0819450C44C83674E1A8A531A769E1F8CD15E52999D30421A3 - C475105ABF53208A5D424CE078D41F4DD285A42E3871150E1598E4EEE0D2BF1D - 7902E15BE87A28DF4517320EAEE25A11EE2E2C21714A4BE52E2C3361EEC2321B - 889020B80B4B05050BD1EEC25241C142526EE31512470C241431104110842401 - 03C925F07BD54F3703031104A19D2027AC904D48ED4310DA1162208220084242 - 8881088220080911B16357481FD2892E0899A5A9B9C5FFE6E71B68D9EA1AAAAE - 6B56A9B94959899B86EED2850EFB652F2A70E7873D4FE504CE12C4400421B33C - FDDE4ABFC3E9A27D76EF4EA5C578E42877A9AD6FA1CF7ED84C7E9F974EFA753F - 31906C27CC5D491D1A319000CB96AFF07FBDEC5B151352C52F860EA2A1430687 - 3DE6FEFAD8E7FE29A37F41CD3E224F8EDFCE91E72472B31E58F8355D73C62FC5 - 40B2946CEC83923BA1D2CCEA359BFC3BEFD45DC58464E353AF8258BB760BEDB2 - 738FB065DE35F33EF15F7CE22FA9A6411E83035D8A1C74D7339FD35F27EC2706 - 22B42FAAAAAA465556569EE1F1788ECECBCBDB55256725BC8DAB781B5FE9DAB5 - EB63E5E5E58B5472CC8881A4162FE4F5D2C6F59531194855BD1808282F160311 - DA21CA3C6EEDDFBFFFFE2AA95DF0E38F3F7ECC267279BC262206925AC4401243 - 0CA41DF1FAEBAFE7D4517BC41147843DF67EF8E187FBD83CCEABAEAEFEC0EFF7 - DFCB85F25C352A2B61B39BE870387E5F5656369C4DE4FEDD77DFFD7C352A26C4 - 40524B5C0672821888C6309067C5408476C68A152B560E1A346857AE894CCA76 - F3D0C044B8E631E7DB6FBF5D3578F0E07E2A3926C440528BD9401EF84F77D78C - 190EDB7E3E319050623110799050C83A749F477B310FA0B735DBFB6B729D65BF - F81AAFC78F08EC43141B62208220E40CDBD7BB23B6BAC45A70E602B1E4851888 - 20088209F355782E2B166CDDF8E0E9CFC53A7F467977C6B8885713EDE5E1BC68 - 0FD47594DF112B3FFCF083BF7FFFFEE4605452BB00AFA9FFF1C71F69F7DD778F - 6BBBA50F24B598FB40CE7BBABA70E1A5839A026342411FC81FC6FD92B6CA7320 - 0615450EFAD7730974A2C340DEBCF63815CB4E0EBBFE85980C24DB5F0F12CB2B - 3DF03B2E9B1AD78D3D69E7B63BEE13031103C94AE231908BD8402AC5400CBAB2 - 81DC1DC5402236615537F9B352B94A535353564A103A0AB83D0B0FAE8B627B25 - 455803E1F9B35AB988C7E3C94A094287810B17BBC23417154B411BB1060207CA - 46E52A68D1C946094247C2AE30CD45C5427803B15960B62817AB207EFEE1D92C - 41E828E82226D7150B119BB0F016CB6C54AC3FAEA3615770678304A1A3A00B4F - 5140D1886220D929FE2F0882206498887D205E2EA9B351B98ACFE7CB4A094247 - C1285EF047640CA2219DE8ED04BBA6A36C9220B4130AD4302C389C452A33A210 - BE09CB6681D9A45CC4AEE0CE060942470287B44865461422D64084ECC2AEF0CE - 060942470187338E68110B7FA210D6405A78E69F6A1D59296C5BAE81BE866DDB - B665A5A41F44682FB84BA2F7A21A85A72826C21A88D72813EC169B7905B62DB7 - 30775A67A304A13DE0AE2989F8EA04A306220A2A1A119BB0EC9A2BB241822008 - 89509BD728573B49247C273ACBEE21BE6C50AE5A889D99668304A12381235A14 - 1B110DC4FAFC45B688FFE71C7605773649103A02389271388B58812C8948C426 - AC162EADB351B9080A697CD3201B250622741470248B76281AE16B2028B07CD9 - A95C2DB0EC0AEF6C90206433C671EA89ADEBC35A80E6BAA261FB2E6E7C91F0E9 - 3F8DA5B7D735AB94ECE2377DDC74D23F5ECCA92F125EF4FB8984AFDD6523F87A - E0DDF7CE952F1232897C9170CDC62ABFBFB945C58454E170E7D3EF1EDF1CF18B - 84E71EFB4BDAB82D96A2B3E3D3B3B3831E7C29C14FDA3EC506B2786D767E6D6E - 64DF023A39C70CE4C2F32764B581CCBA6F9E18488206226407DA40D68B8118F4 - 8EC140C2F781F8EDEF80CA0661DB721134DD65A304A1C380C359B44351B07516 - A30672E5B1F4E6CFD95903396C27AE81DCFC52CED540BEFFFE7B95925D0C1830 - 406A200C9B6942359065CB57F8CF7FF82B151352C57D67EF4943870C0EBB6F8C - 1AC831BFA475520331E8831AC8CB093461094226C9350379E9D3F5FE63F6E9A5 - 6242B2315A2D98859F6FA463F7ED2D061223B11848C4DB78054110DA3B7EBE0E - F1C4F8BA1DA3E586FF8858812C89881888906CA4562BB45B5070FA44869017D1 - 10031104411012420C4410849C61FA747FD832AFB8C0458DCD5ECAE329429A72 - 7250C803E405F22412D2DCD0469A7DBEE10B5F7EF9F76FBCF6FAC48D1B37AAD4 - D4D2B3674F3AFCC823E68E3EE6987BDD4EE7072A99CE3DF7DC631D0EC7012A9A - 36FC7EFF470F3EF8E04B2A8A638A0FC1C4914E742199E05D09781AFDF52F37D3 - 9CEFB616CC3F754FDB27A49F7F7F95BFC9EFA23DFBF7E20234B78B468FCF4F5F - FDB881F239F74E18B16BD8CCC8ED5C4A024F3DF5CC9C850B174EDC73AFBDA873 - E7CE2A35B5E0234E1F7EF83F3AE9C493E69E7CF2899390A6CDE3CF7FB996FAF4 - EA634C970ED66D58477FBFE17AB389E00AAF4DAFCC1603119289D940EE7A7B7B - D827D1EB1B9BFD0B96AEA3656B6AA8B925B75FD1E3CE77D1D09DBBD098617DA8 - B8D02D06922A7E7FE11FFC43860CA11E3D7A52972E5D546A6A71B95CB4ECEBAF - 69C5B72BE8DE59FF32F6E1942953AEBB8ACDA3578F1E545BDF684C970E4A8B0B - 69C3A64D74139BC8030F3C701D27898188816415B11A88103F61DB0385D8D8BC - 6933959575A5B2F20AEADAB57B7A54D1830E1A7188B16E33DDBAF5A02D95B5D4 - D8E8499BB03EAC571084DC430CA48DF87C7EAE11E493DB5D444E973B2D7238F2 - C8955760ACDB848BAFFB5D3E9F2FEDC27A8DF50B829053C040A03C2326C40D8A - 7087D369C8E974A5450E47607D66FBF0FBFD25CD1E56B327FDE2F562FD6A5304 - 41C811601E6E56BE116B5FC0F432BEDDCDCDDE4081AE0AF574885766AC0FEB16 - 0441C814E8EC2B667958D9F9F18FF0C0F832BECDC78C3DD97FDA9913A957EF9D - A9B4537AEEC2D2FCEDBA2BE9E5179F0A76A29F72FAB954595D6F8C4B275DCB8A - E9C9C71FD49DE86D463AD18564229DE8A903077A290B5FB30966EAAD77DFBD73 - BEC773B2CFE1389A337F7FA4B9883E76FAFDAFB4E4E53D75F94517AD3126B470 - DAAD8FEDECE0F9F8FAF86872F88DF9C8EFF8D84FFE57FC3CDF13979F613B5F82 - EB2BE0F5F548647DC9E4D8E34EF69F71F664EADD67173690F4DC85A5B9FE9A3F - D24B2F040DE496534F9F425B6AEA8C71E9A45B9712FAEFE30FC040AE50496D62 - C58A152B070D1AB46B5555D5A4AE5DBBCE55C9594D6565E5C4F2F2F239DF7EFB - EDAAC18307F753C9312106925A72C8405016B4E919AC78411316561ABC629A79 - D75D07B9BCDEBBBA5654CCFCD5B061A3279C7E7A770861A4611CA651930739E3 - E6470E72787D77F5EE5E3EF3E8437E39FA4FBF3DBE3B8430D2300ED3A8C98324 - BABE13AEB97B38963960975E33CF3CEED7A367FCE194EE10C2480BB7BEE4E3C0 - 9527F97C3EF2F1419A0EF9795D9069B7611BEA9D4E47BDCBE14CBBB05EAC5F6D - CA8E8D4A10AE7DBC822B79AE80FC1E05B34ACE5AB08DD8566C33B65D250BD949 - 811A0A4900277B190B8EDC809A000AECFEBBEE3AEEE0830FA115DFFF445535DB - 301D559477A181BBF7A377DF79877E5CB5EA39AFCB75B1AE1918350F2EB0F71C - D077DCB8A347D0076BFCB4B1D6988D7A75221ABE93839E7D65097DF5FDDAE7FC - 2EE7C5BA66605DDF17CBBEA5A55F7F67CC77E05E8368CF2103C3AFAFA565D6F0 - 7D078D3DFCE0FDE8AD6FB6D3E75F7E6BCCB7CFDE83E8D0C19DE8F5773FA10F3E - FF21647DA960ECF1A7F84F3F7322D74076A64EE9AE814CBF825E7CFE49A3C03E - F7DC736F3F7BC2F95459D3608C4B275DBB14D1C3F3EEA3071F7CF08F1CC5F6B4 - E92A886B1EA33A75EA74EBAA55AB02B5CA76C2AEBBEEFAF1F6EDDB2FE79AC822 - 9514135203492D961A4817AE81040AB58E479BCFBD7809A981A019A95BD7AEE3 - 861F3482967CF4293534355345450575EBD68D77808F0BE9E534E2D7BF264C83 - 69310F403352EF6E5DC61D7BC4087A6A999F5A3C4E1AD4358F06B37C5E273DFF - AD9F8E3D7204611A4CAB660B59DFC3CFBD42BFBFE15E7AE3A3AF69FE2BEFD0C4 - FF9B49F35F7C23ECFA06ECDA7BECC883F6A3BB9EF982FEF5972BE8E7F75EA02F - 5E984BB75C7631DDF9CCA73472C47E3460E71E21EB4B1578B00F72A649E81AB0 - 760F707C9BC395B7CDE174A55F582FAF5F6D4A9B41018C82B85FBF7EF7EFBCF3 - CEABD01F92CDC236625B13310F4168CF38F94ACFD9BD7B771809A10F62C0EEBB - D3F73FAEA2929252EADCA933B9F3F3A9B4B8887AF6E846DD2BBA12DEF7846930 - ADB104067D10FB0CE9471FADF353AF1227F52D7552A18BA8D44DD4BFCC49FD3A - 3BE98B4D7EC234467F8542AFEFEB6FBEA7BB1E7D992EBCE83C9A7ED3DF68FF69 - 97502DE5D1DF1F789256FFFCB3EDFA86EF3390DEFE6E3BBD3EF74EFAD36517D1 - BCBB6EA063FEF5776A7017D382FFCCA40F57D511A631AF2F15A020773A03B7F0 - E6E5E5A545DA4020336EB79B559C01E17E86E48282984DF97C5E763FFE9D590D - B611DB2AE621E41A4EBFDF1F2C85D081BD3B17D6553535D4A573272A2CC8A74E - 2585D4A5B4888745D4BD5B57F278BCB8CBC49856CDC6A5A87FFF5F0EDE99D66D - 27EA59E4A47C368FA27CA2621686BB757152A3C7419826D8D9CDE8F52DF9EC6B - 2A2D70927FF75D69D69A95F4D64A2FB98EB9889A6B6BE8C32FBEB35DDFA05D7B - D2474BBFA04E3C5FB75FEF45B7143AE8859FCBA9F0B73379BE6AFAF293CF09D3 - 98D7972A5C6C20792E16866990D309D30A350F50E82E64B933A042B5050669AD - 420B4207A0F5C9DC4ED04D58211470ADA3B8A8C0308DCEA5C55C1B29A6828202 - 4308A33DD18E3C368E82BC8069A0F6D18D0BF5EEAC72B7837A15398C8E663BF2 - F3F269C3860D74E7ABABE89D4F6B0977A2363407CAA1C2C282B0EB43198AF9AE - 7EB5915E7C8F684B2D516D5360BE2EBC0DDE18BF42D6165009E08BD0B42A50E3 - 7172586D84228F0BF24C491084DCC3515A5ADABDA8A8A861F3E6CDB533EFBC73 - C141071E38BAA0A8C468BAEA56516E344FE473180557535313353737D3CA952B - E9FD0F3F5C38ED924BC6602167DCF4F0823123F719EDED36900AB960DBADB393 - 3AB36994B299B8B890DBCE66B0CDEBA36FBE5D410B167FB6F0B1ABCE36E6D3EB - F339F3E9F42B6EA61A3CDA71C485E4610F70BC368B2A9C2DB468DECDB471FDBA - 56EB3B7BDC21A37F6A28A67F4CBB986ADD5DC879CEADD40CBF78E8722AF7D4D0 - 9CB9F75043C3367AF8B97782EB4B0593A75CE83FF4F0A368D0E0A1D4B933EE47 - 483DB8EB0BDCFA8F1934FB8159868D4C9E3C79EAD9675F58D6A3CF4EB46D5BFA - 1E8FE9DCD94DF5B5DBE8FE7B6F4EDA7320B98674A2A7165C7EC6DA89FECF7FFE - 536AD061B8F4D24B2D97AC81DA47050BAF6FADE3CC9B8A5B67C78C1E43AB56AF - A66EDD2AA84BE7CE46BB3B7600CC03B590E79E7F9E2AB76E9DC60BBC030B39FD - A687A6F6E9D175E639A71C49EFACF1D31E652EEAD7C949C55C2369E1427D7B8B - 9F8A8ABC74CF63AFD1BA4D95D31EBFEA1C633EF3FA162C7A8FFE7CE723D4D2B0 - 9D1CBC0BF38B3BD17F6E9846C3F7196ABBBE81BBF69E79D2B1BFA1392F7F4A4F - CD9A491E9E0FE41775A2E97FB99C461EB237CD7BF66DFA6ED5FAE0FA52C103B3 - 9F9AF3FE078B269E74F219B46BBFDD556A6AA9AEAAA4271E9B4BBFFCE50173A7 - 4C3ED9789D3B1BC8C15C2B39E2F77FB88ACA3A7735A64B07D5DB2AE9DE7FDD04 - 53337F134488033190D4623690FB3EAEEEFCFC6F87040A0B1BF8381603090357 - 22221B88F9B6DA912347D1B6EDDBC8E97052BE3BDF6866CACFCFA337DF7C33E2 - 6DBC278F1941EBB63988EB2CD439DF4105F97EAEC5F8E8B19722DFC68BF56DD8 - BC99967DB79A5CBC9EFD860EE482B034FCFAD46DBC47FF663FFAE6E7EDF4D38A - EFA938CF41BFDC7300F5E85E4A2F2C4ACF6DBC2FBFBA74F8920F16FDFE8B4F3E - 9AB86D5BB54A4D2DA8E9ECBDDF0173470C1F75EF31470DCBB60F4A0971220692 - 5ACC0632FBCD96E2272FDB25ECBDEE355BB78A8184A14B4585AD81E0E105B479 - 18996A3CB4E7F7FF09B7CEEEDEBF3F0D1A3408C9F4DD77DFD1F73FFC405B2A2B - 9F632BFAC7B48B2F7EDF18A1C0437BECDD7FEAD3BD6CDCDE8377A1FD7F117818 - F79365ABE8F36F56D1BACDD5CFB17FFDE3B12BCF0A992FD1F58DFBBFBB461575 - EE3A75E02E3DC71DB8F7EE3474F7C0479496FFB89EFEF7F9F7F4DDEA8DB6EB13 - 846C430C24B5589AB0223E892E06129E7006821738C140825F214AF0D522E97E - 954921AFAF7B22EB13846C420C24B5980DE4D87D7BB72A04CD888184279C81E0 - D1FEF6F86E98F6BADD82108218486A1103490E760682DB78F359EDF1FD30621E - 82204405E6E1F5A4FE96FE5C048E829BF8F16D0DF5F62A211BF9C7AD77B78B2B - A33F5D7E51C42B3CA135A881A8A09062A4069238E19AB0F01E0AD44450D3335E - 69C2205D4F8CA139537518968E71A8C16088B88B8557C303EB7CFA12400F310E - D2CBD1E9820D30902B2FBB50C5B2939B6F9B250622B46BC440C213CE40B40158 - 0D44A3C3BAC03783B8FE1C2EA683F0712A609DCF3C2FC2E6A7E011D606126E7D - 588F8EEB21A6C5769B31CFA3411AA6D5432C0BDBA9B735EBD106F2DCCAECFCEE - D7B87E6E3110A1DD2306129E700682C214436B0DC03CB13553314EA7A1D6A141 - BAB940B7DB193A4D9B15302F0FD8AD4F1B8E1E8721E2E6EDB69BCF3A3D8069B6 - 5B0341619D4DE86D120311DA3B6220E10967205AEDB109C95C730987FED1EDFA - C01003E9B878BD5EBFCBE5721C3CFDB9848FD14165AEC5E3470DBD7BCCBEFDE7 - 23BEE7B9B724BCACEE79B58B4F1A39FCEE8BCF1A632C2B971003094F2403914C - CB72C4403A3E309037AF3D4EC5E263EA9CF7A857312DBEF68C4346210E03F9E3 - F1BF34C6C5CBDCF92FD1803DF658FCC0351718CBCA25C440C213D5406E9F3933 - EECCFBE3B4698EF17F7F28EEF9E6FFF91C47475F9F0A260531908E8F36906AF5 - 46E978282B70D061D7BF40EFCE1867E43F0CE482317BD198C37E638C8F8745EF - BC4BB73FFF397DF5E01539B72FC540C213CE4082A0803DEF77BF53B1E8DCFFEF - 7F070BD87F5C769A4A8DCE9F6E7B2258A0475A9FFE7812EEE3C6ABE0635D5F67 - 97930A78BEED5E1F35E2FD2A31AECF4A5B7F9F8A260531908E8F3690CA040CA4 - AB8D815C7BE6C1346CDFBD8DF1F1B0F4D32FE8FA47DF15031142B03310734776 - 9057DF7ACF56AF2D5A428BDEFB1FBDFFE1C76ACA50FEFDB1DF5E9FF8E9C1CFFC - 34EF0BFB7D63B72E7CA5F091673EA06B6F7B9ED66DAC348CC48ADDBABEDDE0A4 - 271E799F2EBCEC51CADBDE18D2C3AF39E092FBE8C04BEE57BA8F0EB8F85E1AF6 - 875934ECC2BB68FFF3EFA0FD7E77AB9A3294632FB88BC65EF02FA5BBE8D8DFDF - 49C7F0F4C7FCEE361A73EECD347AD2DFD5948290383E3E4DE2951DEE820272E6 - E5C72DCC2708B1606B2060E79D760A51FF7EBBD2A001FD6930CB9DAFEFDC6DCD - F0DE7921FA75DF3CFACD4E793492E5B22BCD15E675EDB2F3CE34A0FF6EF4EA3B - 3FD0C75FADA71F566EB13510605ED7883E7974686FA2DBFEFD163DF6FC27F4D1 - E7ABA9C0E6CB7D60FC79A7D289934FA663CF3E818E3CF5381A356E0C0D1F7324 - ED77D828F279C3DF9C75DA8C2974D25F26D1D83F9D43474F3B930EBBF0341A31 - E554DAFFEC9322CE2708B1E2E35A73BCB2037797787954BC6A8F77D3089921AC - 8168F0E9D402773E1516BA8D4FDC229C8F4F0F4601C53626C3E76DDD6A18A62C - 0F01EBEBD6B58CDEFEF047AAACAEA3DD76AEA0BDF7E815F66B861A2C7AF72E0E - AEB52CA5D5EBAA68CFC1BD69D84143A8DEEEF2CCEF234FB3875E5C5B4BAF6EA8 - A7455B1BE8BDEA46FA685B1335D43590DF13E6590B9EAFA5D94B0B9AFCF4BAC7 - 498B298F96B80A68A9BB881AEB9AC3CF2708716057A847931D787B07BEC713AF - E4AD1F42AC8435107C3215DFFF80611415B2D83C6020A87DB8392D1CA828B878 - A9DA38B479E4715A49F8D9A8B8B890BA5594F13ADCD4B5BC333DF3CA17C6369C - 36765FAAAD0BFF96958A42A281650E2AE44AD1A04E7EFAC7BD6F18E9575F7424 - 7D5D657DC630809FCDA8A90905BE877C9E16F2353591AFB181554F0DB5F5E46D - 0EBE983804CCD7DCC4D3F319E66FF1F27C5EF236F2321A5AA8617B53D8F90421 - 1EEC0C229AEC0818883F6E898108B1626B20795C7580591473ADA3940B767C1B - BDA4B888D30A8CCFDB161616A92943E1F2DE300B7C179D6737BE8DDED9CDC290 - 5551605F05E9D9A31B71B94DEF2E5D43BD7A74A50F3E59459BB7D6D1CE7DCAE9 - E003FA73A16D7F65BF6F775EE1CFABE8E5F98B68685707FDF7A5CFE887555B68 - 50FF1E74F2E8BD695D9DFD99E5F779A8A9B1997C5CE0FB1AEAC9575F475E96A7 - 763B1B411DA7DB7F6FC698AF810DA3C9435E1E7AEB59752D3C5F0BD56FE76585 - 994F68FF5C70C105FE701A3E7CF8483599191C7CE1D49F15162EC3E3961D1E1E - D1C2EE12AF309F20C482AD81B8B58114B95905C6676CF5B7D1030682F72FB606 - 350F5DEB28661329773BA88C852F1396E439A83C8C81F4EED98D1E79F6637AF8 - 69343FD5D2530B50FB70D0C963F6319AAE0AC2ACEF57BD5CF47FB7BC4857DDF4 - 02AD5CB6926EBCFB3523FDF2DF1D4AD51E5E7798F5F9BD6C04F55CE3A8E7DA06 - D76E3CB5DBC8B3AD9ABCDB6AA87E5B2DD724C21888311FD756601C6C1A9E6D4D - E4A9696635F17CA88188817454EEB9E71EDB83E9D34F3F1DF5C1071F2C565133 - F6071F11BE7BFC6320680F97E171CB0EC34012901888102B616B2068AACACF43 - C7B7CB109A93F4104D5B76A00682A6AA023690229EA41066025351C22767EDA8 - AAAAA6A9E78E343ACAFFCC86F0F3866AEA51D1890E1D31D0309070EB5BBAD94B - 0FDC7C86111E75DA5DB4FCFB8DB40BD75ACE3A7118357AC3AFCFD7D24C0DB50D - 01F3D8CEE651534D2DD555868934D6710DA4C5FE4DF181F9D830A06D01E3F054 - 371AC3C65A369630F3091D03AB8944300F8DF5008C6A1E606DBD236ED9E1F1DB - 1B4434613E4188052ED65B63F473B0F01C86360D0805BC61209C6E87AE8118E6 - C135887C8EA30C87A940A895D8D1D4D444A5250574F8C183F88CE37FBC9E7147 - EDC5217FC4F5ADACF551E74E8534E1E41D9F019F3A6524353BD8EC22AC0F9DDD - 8D75F534D0DB42FD9A9AA937D72A2AEABDD4B91EDB62DF6F0202F335D1C08D5B - 6997751BA9E7EAF5D475F53AEAB4666DC4F9848EC3C71F7F6C343F7DFEF9E7E7 - 44310F4D57351CC68A6A1EC0EE2EAB68B2E3C7EA66FA6A4B53DCC27C82100B5C - CCB6061DD99B376FA1CACA2AAAAEA9A16DDBB7532D5F99D7D5D7531D17BC2E97 - 7DC90CE3F8B6DA4B2BB7F9E8672EDCD7D7F96873839FB6B0B6B2C2DD529BC7A5 - 7D75E5663A65CCDE74D888DDE9888307F270206DAFAD8DB83E9C361FD517D2F4 - A9A3E9B7A71F44E79F35C218AEA98DBC3EDC6EFBE182E7E9F3375FA065EFBE44 - 3F7EFC3AAD5FF6366DFD6E09D5AEFA9F9AAA3598EF8307EEA34F1FB987BE9E3F - 8B7E7CE93E5AFBE683B4E59D79B4FD7F8FA8A9848ECC871F7EF8136A224B962C - 79582545A38A8503D1FEE1291BBC5C0B88577604FA347C09486A20426CD81AC8 - D0217B50BF7EBB52EFDEBDA85B45055FE577A2E2A2222A2A2CA4A2A2422A2929 - 56538672D260071DB20BD15EBDFCB45B371F75EFE2A3D2522F159704D4A593FD - 553AD6D7A74F6FEA51514A174F1A49BF3FEBD75C83F01B9DF6D1D637A4879F5C - DD3BD1CD7F3D99FE7EDD4954E972506171E4F57DF9E85FD9006EA6E5CFDE45DF - BEFC6FFAEE95D901BDAAC4613BDE98FF0F7AEBD93B68311BC7BBAFCDA5F7DE7C - 24A0B794382C086D054D48F1CA0E984193277E613E418885904BF48EFE6EAA74 - AF4F059382BCCAA4E3A35F65B2708DFE265BEC8CDE39BFD5AB4C0E19398C761E - 38C4181F0F6BBE5B4EEF2C5E2AAF32114288FA2E2C217B1103E9F86803796955 - FC7D10C7EEEA6E6520C37FBD1FF51DB887313E1ED67EF70D7DF0DE2762204208 - 31BF0B4B1084CC61D7C7114D1A3FA382D48C26A9166FDCC27C82100B72B5D84E - 30D740B211A981B41D5D0379E6C7F8DF687062FF42A306F2CE75C7E32E46076A - 207B0FDB8B7AED3E584D113B1B7E58415F2CFD526A204208D284D58ED10692CD - 8881B48D6418C8E26BC7E2D67BC34086EC3334610359FED93231102104311041 - C862B48124C2950F2DA12E05EC1FA71E34D26C209DFBECA2A6889DDA4F1653AF - 5EBD16FFF39253E48B844210311041C86260202A1837C7EFD363F169C387DCBD - 6BEFB2367F137DDC217B2D9E74E401770FDCA942BE892E04B13310411004217D - 74A81B97E42E2C2199C8158A206490D9B3677FA78269410C44482652FD17840C - E2F7FB2B55302D888108A9043512A99508429A70381CDB54302D888108A944D7 - 48C44404210D700D24FEF7E0B4819013BBAAAA6AEADCB97367AE5FBFDE78C5BA - 10001FD4EADDBB374D9C38715A7979F91D2A59880DF331264D5C42AE838BF694 - 3DEAFFE0830F3E7DEEB9E79EA4A22927C4406EBCE9263FDEBA7BDA69A751B76E - DD54AAB065CB167AE28927A8BEA181AEBEEA2AB99A8E0F9C30DA38C440924781 - 1A9AF3D49ACF18CA876AB28B941AC8ECD9B31F9F3C79F2E92A9A72420AC32BAE - B8C2CFA2B2B2326A6C8CFF69D88E0A3EE15B5D5D4DB7DC720B148B81601A292C - 03B858C80B6BE12608D946BB3F6FE7CC99F3F0A44993CE56D1941352184E9D3A - D57FEBADB7527D7DBD4A1134C5C5C574F9E597D31D77DC2106121F622051F8F7 - 7FFEE3EFDEC16BFCBF193992BA9697C772EE086D800D64361BC864154D39AD0C - 0457D96220AD8181A07626061237F89CA436102DC1C4B3CF3EEBFFD588112AD6 - 31E9515161BCA34B458514317BF6EC7F4F9E3CF9772A9A726C0DA4AEAE4EA508 - 9A9292123190C4C867A1CDD76C1E61F366FDFAF5C638341B9AC177F2F1A6720C - CD200EA1C9B5478F1E8EA7DFF9D2FFDAF22DF4E5DAD8EF66DCAD5B091DF3CB3E - 74C66F861A0B7F68C1FBFE27DFFF8EFEF7DD06637C2CECD1B72B9DFE9BA1F4FB - E347C4727C84200622240B3690BBD9402E52D19413B243B581D4D6D6AA144153 - 5A5A2A069206DA6A2017DCFF96FFCA13F6A75DBB77E2E9D5440A9FCDA75F91F4 - DDBAAD74C3531FD363D3461B0B1F77ED3CFF35938EA6FE7DBB113E8DE135CDB7 - A5C9D4FFC9C988D634FB68E59AF534FBB157E8DD3B7E1FCBF111821888902CE6 - CC99F3AF499326FD4145534EABE7407092FA7C3E9145C8973890132543A0E6B1 - 4BB74EB4B9C1476B6BBDF4D3364F50AFAE690AD1533F34D0235F6CA2627F23AD - A9DE71DB3A6A1E308F2A36868D8D3E5A53EF0D6AE9D696A03E62BDB9A1899E5D - B99D8A8B0BE8FB8D697D864B10EC48D91D5E76C883844287A4D9E7574238A0DA - 167F883C2DCDE4F5B490C7E35173ED00358F7A4EDEDEE2E31A46E0E2A1BAC94F - 3FD779835ACB86B2B6CE430DD55BA9B9B1C19846881DDC3C80DA57BCAAACAA8A - EB6A2E97E00BDDCC1B08AEB645A112720B345B35787D41B3595BE7A33A8FDF68 - C2D2DAB8BD811A6A02AF1EF2DA98901019DC7986A6BB78D5B95327B504C10631 - 906C94200882104A2B0341757EDBB66D228BEC9A39848E4FAB4B075C4C680942 - F691D66E09DB95D97522E7BA84DC044D59A1B551DC50119020641B0E8723F306 - 127AC288202137F1C22760164A7E1F1F0F4A82908564D6405058DA5D81E7BAC4 - 447213A98108ED093E46D3FA08415ADD4A10B28D48170618D56AAC911890CB5D - 40EEE252354210B202B71AA6055B03B1BB02CF7509ED8B162F5193D74F5EAF27 - A896E6A61019CF8170BA1D780E04B7ED46C2CBCBC0732482902D381C0EBC7BAE - 4DF04595FFD34F3F8D7CF02BA4092B4645BA5215B20CDE55F52D1EF23437B35A - 826AACAB0DAAA1763B35D6D719D3D8D1C0E653DD8865B049B4EC50737DED0ED5 - 6DA7161EFA5ADA662278536DF7AE5D3BB484B48177CFB5890D1B36D0CA952B55 - 2C325203895142FB60608F125A57B98DFA15F96857A87887465678821AD5CD4B - 87F774D0D13B17D0CAADF554E2A9514B20DA6BD76EB466C356EA57E8A57E055E - DAB580E7571ADEC9B3439DBD34A2DC4107F770D3D62DD554916F6F46D1C06BCE - F3F2F23AB4E43D58E9812F74DB5C03E9DDBBB7E3C4134F8C697F854C849729FE - F5AF7FA51F7FFC51A5089AFEFDFBD335D75C13EBCB1461CCE23A09D0D697293E - FAD6E7FE973F5F472BAB622FCC611E678D1C4A138E1A662CFCBEE7DEF13FB678 - 197DB37E87A94403E6F1A7B3470797214407AF25C193E5F1821A0D4C49450513 - 897ED296CF2DFF679F7D46FBEEBBAFC31C56A3C3123201BE4878F1C5171BDFBE - 58B3668D4A1576DE7967E31B2977DD7557AC5F2414031184288881241F369097 - D9408E51D198C185DB071F7C40A87998C36A74584226B8E9A69BFC050505347E - FC78EAD2A58B4A156A6A6A68FEFCF9D4D4D44457C5F64D743110212A8B172F9E - BA74E9D299D68B355CB00C1B366CDAC89123EF5049213CB5E49BA90BBF5C3F73 - F9BAD0B7FF0EE9D39946EFD57BDAC923F6B09DEFF1D73F9CFAEC926F667EB572 - A34A09B067BF9E74C2883DA69D7EC481C1F9C26D5B3CF0EF58C5BFE38E70BF43 - 0C24F9CC9E3DFBB5C993271FA9A2292764275455554DBDE79E7B66F2905ADAD8 - 31D891C8CFCFA7F2F272BAE0820BA6F1D0F664B020069220BA092B11D0769BC8 - 07A5D06F72E4D0EE74E6A1BF34CE87443E28857E93530E1A48E78F3B24E682ED - B6DB6EF39F70C209B4EBAEBBAA9400AB56ADA2279E7882FEFCE73F9773B43A90 - BA83DFDDF796FFA2D17BD3D09D307A07CB7EAEA2DB9FFB88E65D321A6F1B6CF5 - 519FD3AF9FE7BFFCF4C368EFDDFBA894005FFCB08EFE3677013DF3B7DF5570D4 - 783BA479DBD0746846C7F5EB7DCCE3751843980F9B44D8DF2106927CB806F23F - AE81FC4A4523C2FBC8B6D9CA1C56930A69C6F6E604213A30904485F9F141A99F - 366DF37B7DFED8E4F5FBD76CAEF19F7DC7826029880F4A2DFD71A3BFB2C9EBDF - D4E0F5AFAFF784D59A5A8FFFDB9A16FF1B2B36F847FDF1BE1D25690CA0CF910B - 61FFB66DDB4284348CE3490604A60CE5E0E9CFF99B78E337D67B4384348CE349 - 760A4C19CA9EE7DEE26FF4F8FC6B799BCD421AC6F124430253866E1BD7C0FDD5 - D5D57EBEB0F4575656FAB76CD9E2DFBC79B3FFBBEFBE33B462C50AFFF2E5CBFD - CB962DF37FF5D557FE2FBEF80205907FFBF6ED117F070C64FDA64D710BDBA516 - 215878E0810756A8605470CE3CF3CC33465EAE5EBDDAFFDFFFFED7089BD3A321 - 059D9055A0F33C5101D43CF035C22D8D3E5A57EF8DA855DBBDB4BCAA89CA8BF3 - 433ADD237D50CAACD5755EFA6EBB87BEAAE465742E8AABD35DC3177BB68A0A4F - 82B7A998D5FAA9C7D6603ADCA26C9631AFD02170B95CA1D5D20898EFB6DA6597 - 5D1CA79E7AAA118EE72E2C3110A1C381F2B7892F52A3A9C1E3232F9E17615931 - 7F500A1F9282AA5830A68DF56C4E6C1E30217CCE160F137ADBD0E41BB7793098 - CA6C1E10D2A281E9EA5BFC21429AD031983469520F154C0B62204287C4FA3542 - 3BF97CDEC0733E36EFB5D21F94C2D3E85AF5AC46568BD74B5E964FC9AF969328 - 891808C0369A150B98AE8E4DC3AC58E715042B21D51474A23FF7E9DA99B88F7E - 5DB57CA253D3A7AC888EF9651F1AB76F5FDB4EF4EAEAEAAE1B376EBC64DDBA75 - E39B9A9A865A9F55B0824222DA34C0ED762FEBD3A7CFFC810307DEE2743AEB54 - 728706EDEC2A1837BC6F1CE803583CFD78E31BE8308948E0352678421D0F191E - 7FC7627A77C63863A7F43AE366FFA70FFCD168A602F81AA1C628E08D9729EED8 - 4C3CA18E870CC75D3D87363C76654C557F80FE815B6EB985B66FDFAE520274EA - D409B7D4E399A3811CFD3E90BA03FCC6D7AE398ED6734DC84CEF62271DF9D717 - F03B76E6E8CF81D41DA09FE3ED597FA48F37853E23B37F0F37FDE6C2DBE9AB07 - AF18CAD1E5484B5627FA7DF7DD47FFFCE73F6D7F8774A2B77F4276C283AF7FE9 - BF7B5935B51CB80F15762A51A942E3F63ACAFFF033BA6868199D7BC45EAD0EDC - 152B565CC726327DC89021C63334898013CE6C2A88E3E1B865CB96515959D98C - C183075FA7467568D059AB8271C3F994740341D395F99D584601994403B9F9E6 - 9B8D0F9699E9DCB9335D79E595110DE4D5BF1C476B2D06D2970DE4A81B221BC8 - 5B77FF91DE5BDFA45202FCBA77011D7A51A881E036DEF7DE7B6FE6A64D9B104D - 083698B55CD0CFE1DF3187A362201D90909D70F2EDAFF8BFFFF5AFE9E01E8574 - 684994B32F8778ABCE49EF6E6AA401EFBD474FFDF1E856072E9F6CFEFDF7DF9F - F00C0D9A368036047341138E70D3E1F6E1868606FAE4934F68E4C8913971C224 - A306F2D6B5C7D1AB6B9A8C6F9947022F54C47BB1F06A93C9F3BE083190D7664D - A5A55B5BE8E73AAFF1FD7303DE47C6ABDC7D8121E200EFC5C2AB4DFE7CE77309 - 19089E33328367B0A219C82B6C206B6A43CFD19D4B9D7474140379E3AE69F4C6 - CF8D2A25C0E13B15D2E117CF0C31104519AB5B209830A8A6E0165EB98DB70312 - D207B2B1A6910A4A8BE950BE223B942B202225CE0FE40BF2C70ED41470175073 - 33DEEEAADAC77DBEE0309AC24D870717B15C2C3F57809926AAF6089A81B8D615 - 22DD34140978DADA064788B4CF45C2CB9ED7C0352AB390160614FA30B0B6086F - E56B651E42C7C0B6131DC713AE88454A816C89889ED66A02D6741D8F96A6D305 - 4110B215FBBBB0B8DC324C446428F02732B8023617FC3A6CAE9198E3D1D2747A - 7BBDB26E2F8435694ED6A38CEF7E18AF756F261FD70E70D71546E28352066D30 - 7AEB450314D385034FE2F571EDC1A4588ED3DA660F7DBA6E5B8890260889D0CA - 40F83A58FD0B1C8F2248E7487870D26B03301B01D2B5749A59E6F17A1A6B9A10 - 3FDB9B7DAD3E206555A40F4AA139087D1F5B1ABDA1DF0031497F50CA176619B1 - 623D2662014785874DC3AC588E141F4FD7D0D81422A4094222D83761F1F18483 - 4A1450AC65B8B5E087CC0543B4F17A1A733CD730F769C42B0D6761E08351A60F - 485915ED8352784070CDB646AADBBA916B1D6C12366ADC5695940F4A598F8958 - C0741E3E3ECC8A655E3CFB821B33CC429A2024827D13961037BAF007BA20B0CA - 6E9CC69A668EEBB45CC0CE186215D8AD5B097DB76E2B8DAA6809F9809455913E - 28B547DFAEB472CD7A1AD1A9850EE99E6F7C342A92DAF24129EC5BF30583F938 - 8A04A648A406E2F5FAA89E4DC32CA459C11B7FF1D246DCF195A8CEBDE72D3F96 - A31699716A6B6BFDA2D8A4B22C2A210DECD8E98DA78EA5CBBBF2C957A212055A - 5C47746B653E15FEF7C5E0AD9E66162E5CE83FF4D0437180AA940028D4746160 - 0E9BB1A6EBB81EE2A1B2B7DE7A8B8E3EBAF5EDC31D914D9B36C57CF05AC107A5 - 1E7B7B99FFF98F57D39AEAD0671D2261FDA0D4BDCF2FF13FFCE617F4FDC6D8DF - E89BC807A5701BEF0D37DCD0EA036EF878D95FFEF29788B7F13EFDA7B1B4785D - E86F1CD9A7804EFA87718C86BD8DF791BFFE8EAE78FE0B9512E096E3F7A6B3AE - F977C86DBCFA8DBF43F0C65FDE237AA76088C315C3E05D5F2A8EE375C7783F1B - 7935DDF3E247F4C8D431B66F074EF76DBCF1148CB94E6969694CF91B32916120 - E3C7D2658681485E6B16D739E83618C87C7B0379E59557FCA3468D0A31101800 - B09A864E077A5CB86901EF485AB46851CE18482E0103C117407FF8E107951260 - F7DD77D75FBF0C6B204FFDE9587AEBE750033974A7023AF91F2F45349087669C - 4B97CE5FAA5202FC73FC303A67FA8321068275BC79ED71C6FBBFB8726308AF3C - C13395B8ED179516DC3A0CD0811FA805A1290D1DFA3E236D54DF023AE5E6F0DB - 230692BDC46A20AD9AB07010D434B6D0C63A9116F203F9120D188196D90CCCA6 - 018C2B35D3781DB74E27746CF0C125BCEE03866116D2F014B79AAC15837A7536 - AEEE51409B85B4126FE86B51CCE0C351DFAEDE48334FDE3F4448EBEC8CBDC626 - 089A90120B571DDB4F3A867E5FD24007168A596B3E6C74D0BD7545D4E9E997C3 - D640F6DE7BEF561FE1B21A4924C24DCB575AF4E5975F4A0DA40312EE7521EA62 - E26F5C03F90F47F1205E08E85778FAC39F66AEB27CF71DE6B18B7FFD8C7FFFED - 0ACCD7EA8A1F5F247CE2ADCF677EB73EF4B93E9847BF82DA9B1EBDFBA6791C95 - 1A88907813160CE4BC623110333090FBEB231BC83EFBEC1334106B6D421B43B4 - 1A86DD74789D09BE0E2606D26189F4BA902DAC704F7197B230AF1D98A7559F83 - A22BAB6720D80A7CEBD6F822A118486E937013167218074AE0201019E2FC8876 - E4A1D0773A9D865C2E5730ACE3D634ABF434A87198D384EC60FCF8F1AD0E01BE - 6848468114E97521915E01028340A16CA770E6016010A865D8C9300F80EFABE3 - 13B965050EEACAAA2874508F22A7F1C65FBCB411EFDDDAB7C26168583727FDAA - 878B46F4CCA3437AE71B9DF9E88FF99E6B3A919AD484F64F88CBE0AA631BD740 - 7E5B544F0716446FF3CF153E6C72D27F1A8AA973981A08EEC23AE080036C5F6F - 0D748DC29AAE89341E3590A54B974A0D2483ECB6DB6EFE534F3DD5FB8F7FFC23 - 4F25190C1C38D0A879CE9F3FBFC3ED1B34933DB774E5CC1FB726DE3712AD494D - 6A20D94BC24D583527C2406A695881E4B5666993830DA494BA3C13BE096BF8F0 - E1C613E8C90486821AC9071F7C2006922176D96517FFA041839ACF38E30CF794 - 295342F6010C640417803D7AF4A05B6EB9A523EE9F48CD64F160DBA4260692BD - 24DC84C5A516F9B8F281364C5140C80FE44B2474B3136A135A3A6E1E679E46A7 - 874BD3CD5A427CECB5D75E510B8AF2E163A34E83E5F4ECD993B876E9E613AAD5 - A538F64D9F3E7D68D8B061F4E4934F76C4C2295233593C8AD4A426B4636CFB40 - 7CFCD7EE951E392BCE8F68A5030A1373E10FC11074BA36076B9A96791E6BBA10 - 3BA831E015F8A79E7A6AD84F6A960E1AE6771577A1FED3FE1D71B77EF9E5978E - DD76DBADB1A2A2021F790A7DDA8FE9D6AD1BEDB9E79EC6ADB7A79C728AD41085 - 9CC35C3AA9132050681A1DE92243C88F80B5860785BD1E9AA5B1A6D90DC34988 - 0DF455A0B9E988238EA0030F3CB0F0EF7FFF7BAB9DD669C841FEB20346539FF1 - 97D3D0037E4D87CDFD2AE28EFDEF7FFF5B84EFBC141414E04A3A84A14387D6A8 - 1A88EC242127311FF88E936F7FC5F7D581C369AFCEF974A0B35E250B1FFA8AE9 - CB6D2DB4E7871FD87E91F0ADB7DEFA7ADF7DF71DAABF4868D7196E36028C475C - 0FCDE879918E9A0A3E2AF5E9A79F2E3BF4D0437F618C106CC15D52FDFBF7F7B2 - 81B8D0DC841A030AFDC6C6C6DD8F39E698DD314DBF0BFFE9EF3474048DD8B59C - 7A77725397021795BA5DB4ADC94B978DE81BD1045E7EF9E51FF47234B7DE7AAB - FFF2CB2F8F389F101EE903C95E12E944773CF8FA97BE7F7D5D4575C37E497945 - 852A59F0343452C9D2CFE90FBF280FFB4DF4AAAAAAE97C456A7CD6D66C0C5693 - B0330D3B301DAE7CF14DF4F2F2F29CF926BA903B8881642FF11A8831E442F0D2 - 2797AE99F9F2E7EB68F37679B581A67BA7023AE6977DE894613B4FE3C2FC0E95 - 1CA4BABABAEBC68D1B2F59B76EDD782EF4F13EA1988C22DA346EB77B599F3E7D - E60F1C38F016A7D359A7920521E5E0A9F567977C33F3AB9578B63031F0EA9413 - 46EC31EDF4230E6C75CE003190EC25210361248305C106347FAD9C7569C849D5 - F5E093FC95EF3E1D7741D61E38FDFA79FECB4F3F8CF6ECDF27E44974E32974C4 - 8D7ED2C0B4F8A261E086137C5553BF96DE6BBC63EBF197DFA367FEF6BB0A9E2C - F890A2460C247B89D5406C3AD1054130838E77F49D58F16CDB6A188B8A762850 - F3D87BF73EB4B5D147EBEABDF4E3360F2DABF4D0C79B9AE9BDF54DF4C6CF8DB4 - 605583A13B3FDE4AB7BCBF9E6E58B48AAE79F55BE375F178E3EF809D7A907AEF - 56B857A708ED1CB94754E810E0B52278B00FDA638F3DFC071F7CB0FFBCF3CEAB - 4647B79AC4A83174DE7BA4A12EFB1DE9EF79ECF9FEC1D39FF18F7D74595813C0 - 2DBF5DF63BDCE878B723AFB49CF6BCF303B9B21572123110A143F0D9679F39F0 - 5A113C197EE28927D205175C40679C714617F35D52686E6213A11EA3A7D0AEBF - BB99CEBAE42ABAFCF883E8C53387DAD6BEF1B061E14E83D9784E36EEDAB2E2C8 - 7353F16E7BD171BFE845D7BEB54A4C44C839F48983A1E3830F3EB864DA3F9F98 - 5957D09D7CCEFCC018819CBE162A69DA4C332F3D6DDAF0E1C36D3BD13FFAE8A3 - 4B162F5E3CBEB2B2D2E84407E820377794230CCC1DE73ACD8EAE5DBB2E1B3972 - E4FCC30F3F5C3AD163E48A2BAEF0E3C9703CDC17EEF90CD41850E81FD8A7139D - 38A4C2761A0D1E36C4F32287EFD685A61D147AAB2F6A3030A14376E91C7539ED - 0D7C7CEA937F5F469B1B7CD4E0F5537D8B9FEA58B52D3EAAF320CEE978352FF3 - E9BA6DD4D0D8647C5FDDF84C6E7D3D35F210DF1A99386376C887AACC481F48F6 - 924827BA63FF53A7790BBAF6A6B107EC46E59D8AC89D9F1F52D8E51A28DC9B5B - 5AC8E7C8A347DEF8829A2AD7D3C7FF9DD92A43162C5870DDDB6FBF3D7DC89021 - C62768AD46613611601E6F1EA7D301D2B66FDF4E9F7CF2098D193366C6D1471F - DD6E6EE3FDF0C30FA7AE5EBD7AE6E6CD9B554AF2292F2FC753E7D3B8C6D1CAD0 - F15A91684F86A3C670FDA1BB469C4683870DCFD8B31BFD6EFF5E21D3A3F90B35 - 186B7A4720599DE8FF9CFD342DF9CF5FC440DA190919C89E13FFEE3DF3370369 - D8DE436940FFDDC8ED1603C1837C3FFCB48ABE5BB986EE79F113FA6AEE9F5B65 - C8B5D75E8B27A009AFBCE08C57A9ADD1861109B399E03526F8DCE9B7DF7EBBEC - 861B6E68370F12A200C7CB25B90615F5F7260296C9B53E7AF7DD77E9F4D34F4F - CB017ADB92B57EEBC386E83B09D7FCD5DE09F7F1A978B0FB5095193190EC2531 - 0339F716EFB5671E4CC3F6DD1B3B28F86EA65C050595C783AB2A0F7DFCD99774 - FDA3EFA23ADE2A432EBAE822FFE8D1A30D03E9D2A54B48A169350D1D370F8139 - AC41FEE36AEEEEBBEF5E366BD6AC766320F7DD779FFF9C73CE31C2F85DE6DF9F - 0CB04F90550F3FF2305D74E145B97B80A69E481F9F8A87E087AACC8881642F89 - DCC66BE02E2820675E3EF9D85350450D7C692C376554D1B91077E5BB8D7C0907 - 0A48B7DB4D454545C6104FA36B99E308EBB879886F7E98C75BC504FB55DA13C8 - 1718209A3592297C77054321E544FAF8543C6A651E42C7A09581E0B4D4ED9C76 - 856AAE49E745B4E20A35361881968E9BD36106886B99D375D83C1EEFC2429AB5 - 66D25ED851E8A316975CA18D5D1084CCD2CA403C5C52B6885A09F9120914F666 - 6903D04373BAD920ACB21BDF1E316A1F7EDDA19A6CA1594CAD4810848C11C640 - FC228B2219086A08E8AF301B0114CE24ACB24E678DB757FC9C6F28F077D44492 - 232C33D9FD2A8220C48F3C48980450986903311B893616ABF478BB740C319F79 - 7C7B2B2CB1FD8D8D8D545B5B473535DBA9BAA626A9AAACAC346E71160421B3D8 - D440F88ADB2BB20AF9120E6D14401B4038F380ACE3751843B38998C7B727029D - E7E803F11A1DDE9E96244B3AD105212BB03710512B453290586B08662308670A - 76CB6A8F3510BFDF475E345FF9948924536C4CD13F322C0842AA696D205C58D9 - 15A0B92EE44B34A2D514CC4680707BAB59C4037E9F17CFD0B0F0DC4652C5B510 - 3FAA3842BBE6372347528F8A8AB8D591CF9BF686DE13181A0F128E1D3D82FA0D - 6E978F1DA494952B96D18B0B97847D90F0B4D34EA35EBD7A514949894A0D603E - D8AD35093D2E5C0D438FBFE1861B68D6AC59ADD69BADDC7FFFFDFEB1638FA3CD - 5BB6524343A3D1999E4C5A3C2DD4ADA22BBDB5E80D799050881979903076127E - 9030D0E6EF13B552F8634F1B000A7C3B69CC69E8DBD058D3CD713DBEBD81CFF1 - 6EDBB69D9A1A9B8CD7C124532D783F99D4400421E3D818888F9A3C22AB902FE1 - 3017FCE6A1D90CECD275D81CD7D343DA98C2D550B295B2B232AAAEAEA1B22E9D - A94B974E4957D7F232AAABABE3E597A9350A829009F4A52D864613D66187FD8A - 76193424902A0459FDED727AF3CDFFD936615D78E185FEB3CE3ACB68C2B2BE4C - D16C04C01AD7201D986B33E83006EDAD096BE9D2A55357AD5A3573C3C60D2A25 - F9C03CBA77EF3EEDA8A38EB2FDDEB620589126ACD849F8658A878C1C463B0F14 - 03B1B2E6BBE5F4CEE2A561FB40B481E075EE666008DA1C80356E458FC710B7C1 - 0218C8DD77DF1D7E264110A22206123B89F781184D365E9145C8974844320533 - DA1CC2A19783A156A4E905411032452B03698681B470A1290A11F22512F114F2 - DA2400E6B39B1769984EF78B088220641BAD0C040F6935F315B72854C8977070 - 615F1FAE90B7A6DB9985DD34488310B69B47100421D3E8920B43C75E936FF2EE - B1EF5ED46BF7C12AD5BE50CC2954E1BDE18715F4CDA75FD297B3AF6A9529D75E - 7BEDC251A3461DBDDB6EBB85ED03310F3566E3D0E93ACD3CDDBFFEF5AF5766CC - 98315A45B39E47DFFA7CEA6BCB36CFFC6E53EA3EE33EB047091D39B4FBB4330F - FDA574A20B31217D20B1935027FA9197DCFAE3A67ADFAEC3468F21972B8F9C2E - 174AB4C014B9080A71BFCF78EE60E9C205D4A3D8B9EAB53B2FEFA7C60679E595 - 57262D59B2E4DE134E38A1A04F9F3EAD4CC0CE14CC66621EAFD331ACA9A9C1E7 - 619BF6DB6FBFDF1F7DF4D1738C89DA01E7CE7AC3FFD7D38653EFAEC5FC5B5462 - 32E165AEABDC46573FB2841E9E3A26870F50211EC44062272103A9AAAABAE4EC - BF3F3C734D5593F1CD052180D3E9A09DCB0BE8E13F9F3DADBCBCDCF68A77C182 - 0593DE7FFFFDD3B76EDD7A08478B03A9E14D0398CD420F819EA65BB76EAF1C74 - D0418F8F1933A6DD98073878FA73FEB7AF3B9EAA9B7CD4EC0B7C1E205E3007B2 - 21A840B2417D8B87FA15F9E8D03F3F421FFDF3776220424C8881C44E4206C292 - C77B85360303593CFD78DADC883BFA02EF128B17CC81D960A6C630906CE0696E - A65DD9408E9CFE84188810336220B193C86DBC92B94252D12FA2442D245E192F - B0F4F90CE1ADBEF884ED0E71DCCF13098290515ADD852508822008B1A00D446A - 1F822008425C98DBB9D0897EE99F1E5E32F3FB6A1F457B702E9770E739694099 - 93FE71F688B09DE8C20ED007F2D6B5C7D1479B5AA8AAC947B52DF15F9FA0EF03 - 1FA5C2ABE08D217AD2158D75B534B2C24367DEF9BA6D1FC892254BA6AE5EBD7A - E6D6CAAD2A253AE1DEAD855B925FFE7CDDCC153FFDAC52A2D3B5B480F6EAEA9D - 76EB65935B1D2BA32EBBCFFFCDBA1A158B4E457E331D32A0D37EF75E7BE9A72A - 494810E903899D783BD181E3F49B9FF1955774A32B8FDF87FA760DFDAE452EB3 - B6B28E6E7EFE33AADABA851EBFF2C498323697C9B4813CFEF8E3FE830F3ED878 - 26079FBE45BF0966C732F02D75A4F1528D8F52E16E43F4A9E0EDBEDF7FFF2D9D - 75D65921CB9B7CF7EBFEEB4F3D80CA8BF38D0F5999FB5EB65656A950282BB7D6 - D3ADCF7D4CAFFC6D42C8B28EBCEA41FFFF4D3996BA14E719EB34F3F9CF952A14 - CAD62DD53467FE6BF4F5BCBFC871D746C4406227A14EF475F52EBAEA847DA957 - 59095537F9454AC80FE40BF247C87EB8266DBC521EA681821A86812F19B6B001 - D4D7371866816F955455D5D096AD95B471D36672BBDD545D53AD96B0033C0CD9 - A76B675AD9E0A45550FD0E2DDE9A17D4A22D2E7A63A39F5E59D344FD2A8AA9B2 - B6492D61075FAEDA423BF7EA4A6B9A5C2C67883ED89E17D03617BD5FEDA02555 - 7E7A77533355742BA3AD2D6EB50441C82ECC06E2F0F119D7ABAC986AF88A11D7 - 47A280901FC817E48F103BA9CA2D736D241C78A6262FCF45F9F9F94A791CCF23 - 7741019B052BDF6D0CF3F3F2C9E58C7261C0D762C5989F4D26CF9D1F54614969 - 5045A59DA8B0B8C4982612854E27B9F20B28CF2277716940259D289F9797CF61 - 276FB7206433AD6FE3C5559BA89552561A7660D074B5BDD9472DCD4D09AA996B - 0D4DE469690E91D71BF84E8A200899A5D56DBC282771A52D0A95F8477C7096D1 - D6BA266AA8DD6EF459C4224CABD558A7C5E97575D458BF4378903085A0ED57AB - D5F92108C20E6C0D049FFF16858AFF0B31B247EFCEF4F5EACD7468450B8D62A1 - C33B168DEAE635C9478776F7D3613D880EEF0939823A7AE702A3A31A773BA500 - EC6A2DB4601A684731FB0B9AC9ACD25309422E1072B4E3EE99D7AE398ED6D707 - CF1B41D1BBD84947FEF5057A77C6382921A2F0CC07DF4E7DE6C39F662EFF61B5 - 4A493E916E95BDE79E7BFC13264C30FA4AD0818E2F3BEACEF4EA9A1AE36E2A7C - 2E181DEBCD5C9B696A6A32BEB5BEE4FD77E9A20B2F6A754EE0B52C6B6ABDD4E8 - 093C19AFF96273684D08CD6DA831C1F48C3BC4EEF82D3EE612BCF6E875C6CDFE - 8FFF73197D56D94C7E5FE8E70116AED9F1E662E3AE315E4F4B7D2D8D2877D09F - EF7C8E363C76A51C776D44EEC28A1DDC85C5E78FE3BAEBAE73CC9831C39A6FC1 - B818488C888164083E88CD85702CA4C2407EAE8381045EAFA2F9628BC5407859 - 687643CDC9EE166318C8273090AA66F259BE2FB3F0E77A153219089BD1887212 - 0349126220B193C86DBC0668BBB6EB44CE75215F840C10A779A40AB44E3959A1 - 4D56A86098A59BB12280E5E00FA6332964B9C6BFC0282179A05014C526956551 - 913E9018C5FF851CC628D04342A602DF243D55388C296C27D1F3B230410CCB12 - 844CD3CA40F026D4B5F50E9145C81741682BA8C514F01F07BE756F92332F6F87 - 5C2E723A5D46BA20643321973868EF7DFEEAE3E893AD525A5AD9AFC249C7DF28 - 7D20B182D776E0C9EB54B1D7AEDDE8B59BCEB5DD17A9E8035957EF35BE6D62BE - 90F8726B8B0A05C0B32BB80519779185EB03F9FCC1CB6879B587EA785BCCBCBA - 6EC793EB3EAF87FCBCCDCD75DB697867AFF48108594BAB93E5393690A59B433B - F804A261DD5D344E0C24268EBA7AB6FFF68BC651DFEE5D88CB5CA30F291E8C3E - 2704F4D042239BC19A0D9574DDBDCFD2A2DBCE6FB53F326920B80B0BB7244734 - 901A0FD57BF03EAE1DD81A487D2D0DEFE4110311B216DB3E100F9F78A250D915 - 64823D5FACDC4C3DBB75A1F50D3EFA69BBC7283063125F99435F54B5D017952D - C6DD4AB8E5D5AAAF37D7192F248CE7ADB68220241F69641552026A118D5E3FF1 - 85BB71B51D8BD0AC03B5F0D5B7075F1EE4219E97B04A7F95501084CCD2DA40F8 - 6ADBCB67BF2854721F6F8220EB0283A81204A17D61DB84655780E6BAA4801304 - 4108A5B5817049695780E6BAA402220882108A7D0D04CD58A210897FC4C7A646 - 2F7D5ED542EF6C6A32EE308A47AFFCDCC0AA375EEF81774459F5F28FD561BFE0 - 270842FA083110A7D3419BAAEB68FFEEF914F8D4A708427E205F903F82200842 - 809012F1CC5B9EF5179755D0D4B1FB50B7CE452A55D8B2AD81EE78F133AAAFDE - 4A8F5E7182B84814F0BCC36B774FA58FB6B6D0DA7A2F6D698AEF8E299F071F8C - 42B321D7FB200BD11EB093E74004213D841C94555555537FFFEF4533D7D7BB08 - 1F511202381D0EEA5DECA57B7F376A5A797979ABD7870BA1A0A05CF0AFA9C637 - BDD7D679A88E0BEC7830DE546B341BDA1B08DE527B50995F0C4410328C1C9442 - D24141F9E25D53E9CD0D4D8681785BE2FB82209EF308180863672051BE93A10D - 0468E3C010AAA9D96E988797D7E16503A9ABAFA7A6C68081BCB7E49DB006B2B9 - D16718488B6FC7F6ACA80E35467CBED7789549450B9D7AFB425B03F972F665C6 - C395783EC6EC20E82BD2D4B5F072BC7E6AE29AD6419D5AE84FB73F2506226425 - AD9F0311842450CD85E99A6D8D4621882BE998846959A861C02482438B7C2DA1 - 57FE76E8B7E33AF1A242C8E52497CB456E773E1514B85905868A8A0A83E3C281 - 17E3BAF94C29C87384A8BCC019541986852E2A282AA242563878362ACD7752E7 - 7C077576EFD04E252E437D8B59257986F20B8BC8CD12846C450C44483AFBF6EF - 493FFEF4338DE0AB675C41A319262675F61A42F3D44165647C4C09350DAB0EEE - E1A6AD5BAAA922DFBE66D3BD7B77AAAC0CDCA50513C9CB73517E5E9E611EC5C5 - 85545252429D4A4B8C5A47F76E15B4F34E7D8C66AE5E3D7B19F39819D8A384D6 - 57D61B06D1BDD0497DB880D73AA0477E5007B20EEBEBA6530676A20DB55E1AB2 - FB2E6A093BC00B20D76EAE319663188549C32AF20D1DC0C2EF3BAC57018DEBD7 - 89B66FABA7A13B714608421622D56221E9CC7D75E9D4B9AF7D3A73D9CF552A25 - F9C03C0E19D069BF7BAFBDF4539514E4C30F3F9CBA7AF5EA995BB76E55293B80 - A1A06F24F0ED8E1D94959551FFFEFDA70D1B362CA48FEBD1B73E9FFAFAF22D33 - BFDD58AB52A2836FC21FBB4FDF69270E1FD4AABF0C2F9AC4BBC26205667CFAC8 - 5F4C9B7854E87609822008822008822008822008822008822008822008822008 - 8220088220088220088220088220088220088220088220088220088220088220 - 08822008821027F2365E21ABD8B469D3D4EFBFFF7EE6962D5B548A902CBA75EB - 4603060C98D6A3478FE09B7D91DF5F7CF1C5CC6DDBB619AFB4D7323EBAC5C378 - 30CF0775EEDC998E3AEAA8697DFBF6CDD8FA84D42206226415AFBFFEBA7F975D - 7631BEE961FDC893F515EC42788CEFC99B4001BB79F3665ABD7A351D71C411C1 - 8C5CB264891FC6D2BB776FE3F3BE8D8D8DD4D2D2624C5F5B1BFB2BEC35FA75F9 - F888577575357DFBEDB73465CA9490F5ADDE6B0DAD2F5D4FD4E2A4FAC626637D - 3E1FD17F57BDA8A68A115EAA33CF6188F2BDB4E7E6DDE8C86F0E0F599F905A24 - A385ACE2E9A79FF61F79E491C6D702510809C9019FF3C5B7DF5F7BED353AE9A4 - 9382E7FDF3CF3FEF3FE490438C8F6CA156505757470D0D0DC6B45C5B5053C586 - FEFA234C04E6BFD34E3BD1534F3D45975F7E79C8FA6A8EDB66843D4D3EAAE6F5 - 353637199F18BE75F97F8CF458C1E1E1CA73922BDF49EE42171515E7D1EF5E38 - 3D647D426A918C16B28AF9F3E7FB0F3BECB0902B685DF3B00E85D6E87CB30E01 - F2EDCD37DFA4F1E3C707331005FAA851A3A8B8B8D8A831C040500B416D64E3C6 - 8D6AAAD880696813816020BC3F5B1988E3B8C085414BA397B6D66DA306369016 - 8F97AEF9F236233D561C4E362AAE7DE4BB5D945FE8641374D3050BCF10034923 - 728927009C7079AC625619AB070BDF77C51071A4637CB413B3CDCB41D3090A30 - 1464507D7D7D50D6B8C85E76F906215F91BF9180C9986B11F1C86C1E7A197674 - A2524325FE522AF4175181B79087856C22BEB8E461D3F11861F48170BCC5A7D6 - 20A40BDB3DFCEAABAFF6E12B97F338389E35D4484C9C7BF840BAE1A8A38E5AA7 - E2B664629D29249FD51208B60F366FDE3C8C076339DF467121B317D2B850F892 - F7C9220EBED8BD7BF7A5488BC6F2E5CB8771E13196E71BC5CB3296C3E12F39BC - C8E7F3BD3864C89088CB79E49147FCBFFEF5AF8DC28EE7310A229EDF086B0991 - 417E6921BFD07C8570616121BDF7DE7B74D659670533D15C03A9A9A9310C074D - 58E89788F74606AC4B1B0986E85779E289275AD5403A1FD7D90837357869535D - 15D5F3BEF6F8BC34F5B3BF1AE9B1C2AB319AB0F2DC4E2A28725171919B2E7EE3 - 2CA981A49156198D829C0F80B568132D2A2AA2BC3C5C3026CEF6EDDB8DAB1F3E - 88FB862BD0B1CE2647DEDACDEE0AAACCEF420DAE42352631FA366EA4EECD5BA9 - C0EF09BB4E61075BB76E3D9F0797B0C219F732D69D151515F705A2F6AC58B1E2 - 7C3E76222E878F833B070F1E1C763973E7CEF51F7CF0C146072E0A22B371403A - 4DB00746A10DC32CA4959696D2BBEFBE4B13274E8C6820BA23DDEE9BF291C07E - 31D74660208F3DF6582B03E9715C4F23DCD8D0421B6BABA8AE890DCBEBA10B3E - F98B911E2B68C2CACB67B95D5450E8A29262375DFAD6D9622069A45513161F6C - 7FE9D4A9139597971B572C3090B608CBC1F2B05CB58A5660DCE6820A5A57DC8B - 1ADDC5E4CCE3033041395C4E6339585EA4756688D05B6322F0CC33CFC43C2DB8 - F5D65BE39A5E03F3E013FF66D65014005A6FBFFD7630CCC2B89B95D1D8F2E38F - 3F9E9F9F9F7F33171E437521027DF5D557C1306B28A6C1B46AB656E8BB7FD081 - 8B3678DC39842B61146695959586AAAAAA4461A4F308F9857C43FE211F919FC8 - 57BB262CEC63EB108209C42BEC67F3D08E7CCA3314F8C7C78583C5FF7CBCFA78 - E4C79097670C110F2C5E48236A0F631704B900B7F5F1899E34617958AEB1747B - 2E5857DC9BABA37C58B90BDA2C2C07CBC3728DA56707FAF88E7A9C6BF388D544 - B479C46B22D5D5D5686EBA84D51927BBD6E2C58B8DF1189AD231CD2598C71869 - 62D5AA55C3B8C0B884D5190587D6E79F7F6E8CC7D0948E692EC13CC64821AB68 - 8B7940E679118E84313EF03F5012E1AEED38E4D761CCAB25A415DB2C371F10C9 - 52345CAE3CAE41E49313C33608E681E560795984B5600F5BD05B4D239A89584D - 231E13E113782CEF9B909AC75B6FBDA5C606405C8F53D38E55A38270FA583685 - 909AC7279F7CA2C60640DC347E28E651A3842C41EF671DC6791B8FB06FF510AD - 0F084705EB3326E3A12B4139B58C250A692490E5D3AFE3DCCF2C0E1C7C2C7D00 - B7056339AC2C215C81DE2A3D9C59844B379B85B9DD375613E1137C943EF921DC - E2A939E2882354888C74D374A35472102E2C4699CC813EFAE823358668F8F0E1 - 2A4446BA9E06F3A8642197C151ABA56B1489082559DB8B0E214EB2C6B393611C - 6692BDBC36A04F0F3B8570E289273AC2494D628B368F783B0FD90CF63219834A - 25BC0EC28863A8314D67DC59650669BACF0BD2A0331C710C357A1ABBE508390C - 8E5CBBDA4534E99A8711369624A49140962FFB05E7BED0DE806168D3D0B50E73 - 5A344CA66068F4E8D186107EF5D5575BA5695981596B638070570F8430EEFAB1 - A6415964F042A6C1216598401BA49721A4954096975749D6A70E14ECE114029A - AAC2494D628B368F78FA3F0017E25F9A8D416BE1C285C6780CADE3308F31D284 - DBEDFED2DC84A5B568111E212163681D87798C9142EE826B0843FC07B2D62EA2 - 09B50F3D340C8487425A09E4F879F7E5D3FDE71B0FBEBDF2CA2BFE41830619C9 - C9042F553BFAE8A36DF730D6F9599F838C4EF064E1F37A689F75EF875D679AB1 - 2BD86DB7CBCE2C223561D99946AC3590A6A6A6EBD810A6ABA8C14B2FBDA4423B - 38F6D86355887F88DF3FA3A0A0E03A1535A8ABAB433C6439A8C1583137893133 - 4A4A4A4296031E7CF041FFFEFBEF6FDC768A5A0ACCC66A6290600F9EF7B00AB7 - EEF27EA31E3D7AD0C71F7F4CE79E7B6EF0F8C07319871E7AA8F1CC179ED9D2CF - 81601EDC161C0F7ADFE85A265E88396FDEBC90E311EBEB7B5C5F23DCD8E4A10D - 0D9554D7D240CD3E2FFDF6BBFF33D26305C7471E5E6592E72477818B4ADDF934 - F58533231EFFCBBFFEDA2FCFABDB83B36AC82FE26B8D0A4C3CFEBF6E9A7F6A33 - 82622029C35CD047DC26B389C46A1E3869AC71150C4B7373F3303E09E7B28C07 - FF5E78E105231D1C77DC71ADE25C082D634DE4DA43C8D3E4584E4B4BCB5C2EEC - 8DE52C58B0C0480763C68C6915E7C269597E7E7EABE5003190B6D1EE0CA4D164 - 203F2460205C03C9C7CB14DD6C20F96C20CF473690AFD940860C19A2628299E5 - CB97D32FE234103913D387DE31517790368D689DE71A7DC2C4621A665080F349 - 78A7C7E3D986935173FCF1C71B2727861A35CD9D76853ED2D810EEE4C26A1B0A - 7CCDD8B1630D03C050836930ADDD72841C03879C5946335402322F2306706C8B - 5A2B1190FD42FA88792FC5621E300CAB69D8A54582AF14EFE3C2FC4A2ED8978D - 1B378E20F34185381BC0324C8369D56CADE0F1C67238B80CC603996B0C88EBE5 - 60DAC05C828043958581D197D116190B14D28864B98002FE3EAE294C64C398C1 - 5ACCB58D4A0861A4611CA65193870506A3A69DC15AECF57A2B2184918671914C - 48C841B8DC0F4AD72812915E86905690F5ADC09567B22564375CC0A3390B9DEA - A3B8865001218C348C539345A5ADCB41DB3BE06983FD1F3C6F889026B2975D5E - E97C043A7FB3126D02894A483BB606220899826B3EAD4C020520848E595D188A - EC65CE276B5E215F91BF59832EF4B501E8DA44BC32CF2FA415C97221ABC01532 - EE18B233113D440129B297399FCCF987FC44BE665D0D4417FE408713959076C4 - 40520F6EAD0DA710CC0F0E5AA526E9F0A080B31680E64211B22B384501E93C0A - 9787D9DB84C50EC02697B8B008FC11D24920C72DCF810C1E3CD8484E262B56AC - 90070943B1DD2E3BB388F576DE8EC0ECD9B3FD03060C30BEA78D020F57CEE6DA - 880E0BF6E0B90FD43430D4611DFFF9E79FE9FBEFBFA7C99327078FA78C3E07D2 - E2A10D4D5554E751CF81AC8DF383527C2C18CF81B89CE4CE7752A92B9FA6CE8F - FC4D743C0782F28DB3837C9C2FB90E72C0E5E4738AF372C58A6FE27E0E243071 - A8817CBDDB6EBB0D75BBDDC6A864800FF4FFF4D34FCBB830FF854A0A01EBFCA6 - C73E439B0B3AA994B6E36EDA4E7B6CFA2CEC3A3380F9688DB893CC26924BE601 - D6AE5D3B75E1C28533E32DBC84E8E0E36EA3478F9ED6B76FDF3B54524E1AC8A0 - 41301036553190A081B878BF25CB40AEEBD6ADDB74F511A8A4802FA3B1667061 - DEEAD51500EBDCD069E7E99BCAFAA994B6D3A37A25F5DABE26EC3A3304F6574C - 3B0826926BE621A49F8C1B48331B089E44F72768205CF819AF326195E6B181FC - 570C241EDA6A20ADDA0278A7DC8F03079FC1C427309B9A9ADA242C07CBC372D5 - 2A5A817115F51BA947CD2A2A6CA957A98983E5607991D6992162DE39E9368FCD - 9B370F635DC746BF88F7D9560861A4619C9A2C2ACB972F1FB662C58AEBBEF9E6 - 9B453CDC0AA9F07518A72613848C8142D38F7FAA792FA7C5466A644882040A29 - 530D04BCFAEAAB7D78E1E771703CCB78BF511BB8870BF21B8E3AEAA8752A6E4B - 26D6290450DF3ABF84152EDF97B1EEACA8A888F810209BC4F97C051A71393E9F - EFCEC18307CBC38459422ED640061A3510F411490D843D84F25CB8C922494D58 - 426E01F3E013F1660E760EA484651B1BFC95E14CE4C71F7F8409C5B41CD695FD - FBF7B75DCEA64D9BA67EFFFDF733D1EC29240E9AA0070C1830AD478F1EC1FE0E - 3B72D940BC6C207195961D10D442F2F25C86897CF38D18484EA1DFBE6B3E61EC - D2C2515D5D3D8C0FA0E0DB78F5F7D051A068CC693CED329E7662595959C813E5 - AB56AD42D3D45C96B11CFD3DF4FDF6DBCF18024B1A6A341377DD75D7564FA6BF - FEFAEBFE2DBFDA4A2DA52D54C6FF3A51A9915E4845944F59F59DFBACA1853CD4 - 480D46783BD55235FFCBAFCDA76EFFABC0A789231E073969200307B179888180 - A081B056246020723F6407409B86F975EEB1C027E0583EE187E2448434300DC4 - B57900C4D5B43B5EADABE0F4B12E976BA87E064103D3405C9B0750D30CC53C2A - 29846DDBB6D1FAD2F52A26240AF2107929B40627099A6E50788A90112A531220 - 506A986A207C55DA75E3C68D976CD8B0617A43434348C162073620DA34C0ED76 - 2FEBD3A7CFFC810307DEC285479D4A16DA889D69C452FB007CC5894F068E0CC4 - 02700D408576C057B12A64B0B853A74EA354D860FDFAF5AD96F3C1071FA8D00E - 860F1FAE42068B7BF7EE1DB21C307FFE7CFFCFE3D65399AF8CBAF8BB50893F50 - 0329E07F7C5D6B7FAC9993ACA363CA892CC2BA37CD719B931CE79F87FF35F13F - 50E7A8A51A470D553BAB69A7E77AD3F8F1E323E6402ED640761F30907F1FBE93 - E2E365A811390A8E9FFCFC3CCEC3BCE4F481E06E193691E9F8E84A7171B1313A - 5EACA682380ECA65CB96515959D98CC1830767D3ADB5ED1EB389C46A1EA0AEAE - 6E2B0FBA06623B307F4DD0F215415059525252A1C206B8638B0B8E56CBC1F7D0 - 35071F7CB00A05F0F97C953D7BF60C590E78FCF1C7FD3F1CB3868A5B4AA994CD - A3D05F64A4BBFD3010AEDDE0D7E1D832FF4A23CD24FC31860A731858E39922AA - 59F01F0CCDD21871FEC3FF3DE4A56647C0401A1D0D54CB26529F5F4BBBBFBC33 - 9D7EFAE9117FAD18881A91A3B4D5405A3561AD5BB76E3C2FC438A0F0E235A8A5 - A525388C26F33CE6342C6FE8D0A1C6F2D5AA8424A14F9878CC03E813DEAAD1A3 - 471BE331B41B6FC5389155A161D6A851810A0686D671B635090605178E99C6E6 - 266A60D5736106D53571C1D8DC600CEB9AEB77C803711A1742B6C238ABECA6CB - 84E2D93663BCE97743A63CD1F9843C43DE210F9197820DCA7CFDFE1D4FEAE7BA - 0299123FAD4A83E6E6E6A1858585C6D3E3380021E38E05358CA670D3E19910B5 - DCB6DEA22B2850F3D0B50F6D1EE6B4687021FEA5D918162E5C6808E1638E39A6 - 551A8479D4EC41DC6EF797BAFF035AB4689121840F3FFCF0566910E651B38780 - 8B0D3E5CC8EB6323F178C9C343A8C5CB17253CAED9C7E274437CAC05C5D304E5 - E769CCC23C21E3B344E66DC236B6DA6ED378F36FD5BF9FE7419E206F82F9C4E9 - C83BE421F252680D1799817F3605696E2A51FBD09579531316DE4B75D8618719 - 053E166E465F35EA74F35564A43480F48282027AF3CD37B3E93BE5ED1A6BD395 - 35AE8261E17D8CEF764C57517AE9A5975488E8D8638F6D1507BC4F67F07E0C69 - 82ACABAB433CB81C6B13589826B119252525AD9A32F14DF49BF7FE0F6DA8AEA2 - E62614885C1232686EF0E117A18FDEC501EBD0A9C2B8244218431E0487382E31 - 047A9869F4DEC2509FC5F8B97A88E71430444502612F8478E8D0C903DCC70F8C - E69C0217F52A2BA72BBFF86DC8F7CFEDC8C526AC7EBBF5377E9F97CDD6382E72 - 193EEEF2F2F3F9822E8FBEFFEEBBB6F781C04070D588030906809D643682B6C0 - 0506BDF1C61B622049C4AEB6118B7900AE0D0EE3FD1BBC8D17BCF0C20B2AB483 - E38E3BCE18F271B08C35916B0F21B7DF62392D2D2D73B966115CCE82050B5468 - 0763C68C31867CF22ECBCFCF6FB51C2006A2E262205149C440BEFAEA2B3FE613 - EC498A81A00682D798583167BC9DA958778C36200D0C446A20C927DE9A87198F - C7733EEB662ED0830F00F249AE42647CCB1CB0416CE34221EC77D1D9445A2DE7 - C5175F5421C2F7D08DA15E0E9B87ED72C440545C0C242A891888905C02479D0D - 28FCAD32F769441BAFA731C785D8E9DBB7EFAF54302AFA8449E4C4812170617E - 25EF1F3C24689C94E3C68D33C6618838C6619A70E6016008988683CB7441A2CD - 0743C4310ED3605A63842008ED1A5B0341618FC21F980DC22CBB711A6B9A39AE - D384C8AC5DBBF67F2A18136DB9EAE2C2FD3E97CB3591CD62066B31D7242A8F3D - F6D84A8491867198464D1E16188C9A76066B315FC51ACB4118691817C9840441 - 685F040CA4BC2A58AA9B0B78731857A21A84C31981751EC4ADF30AD90717F04B - 79DFA0537D14D7102A20849186716AB2A8246B398220643FAD6A207CA2ABD00E - AC69DA2490AE05B45998E37643411004A1FD133090AAF2900E8ACACA4ADC9A19 - 143AD4CD7173BA9639CD3C8D595BB7E2C167411004A12310A82A4C9FEEA41933 - 0C13C15D58FBECB38FF1242BD0B50A8DAE4598D3ECB09B2E3F3F9F3EFBEC33B9 - 0B4B088BDC85A5E218CA5D581141D992C85D5837BEF2C5E6B5AEF2E47D72B51D - B39BAF6ACB6547EDDD5D45E32690D11603D97FFFFD834FB15A9B9DACCD5356CC - E311361B89CB157833AB1888100E3110151703894AA206F287D7D7F82F1F11D8 - 865CE7D6256BE95F47EC9CF0191138EA665CC787E00E50D0EB83A02D322F4787 - 05411032097CD7850B5A9191176D2160201650D86B6903301B815DBA56B4F182 - 200842C7401988A3550D0455515411B574F554CB9C661D1F6E1E48102281A613 - 3431E1507138710C99C37C5CD9491D6F1D5E36BF5DE749683E7146721E1A7929 - 082904875A2BEC0E5E73BA0EEBA10E6BECD2805D9A209841DF9B338FABD7794E - 961E3A292F1F6107D7624D722959E3D1C4856C56C86EDBEC14EEF7B28C3C31F2 - 26904F3ACF9087BA1F531052455803D143B334D634BB613809422470D56C1848 - BE93F2DD2ECA73B3791872517E010BC37C2D9E06E202D39039ACE5B291759A4C - 29966DB3FE3E43EAF7AB3C41DEE87C421AF20E7928351021D5B43210BC721DAF - 72C72DB76872B2330173939435AE9BBFF4383D1ECBC372B17C41088751E8E57B - C95DC88563A1930A8A5C01711C694171C1E92ECCE321A4E25C7806C5056CA89C - 3BC4857156C8BC4DD6ED35FF16FDFBF05B8DDFCC61535E206F743E21CF90863C - 140311524D2B03E9DDBBF78C6FBEF9C6780E04853EE476BB0DE9B04E47A7B85D - BA969E0FD36179582E96AF562508ADE8DCB933EDB979372A2ACEA39212371517 - 055452ECA6521E06944FA5852C2E5003E2B09BC5C75C409C06F171171CE671BA - 4B09E16C50C8F658B6D910A743F86DF88DFAF7E2B7230F547E206F82F9C47986 - BC431E222F057B50F089DA4EAB36A5EAEAEAAE1B376EBC049F9E6D6E36DEF03E - 543FD3118928D3E02DACD4A74F9FF903070EBC856B24752A5D104258BB76EDD4 - 850B17CE8CF719042194F2F2727C92785ADFBE7DEF5049B6E4E2732017BCB6C6 - 7FC6FE3BA9586EF3D8C73FD33D4726FE1C48C2330A82D0FEC9550339793F3110 - F0D4276D339064D462044110DA152831456D470C441004414808311041100421 - 21C4400441C83970D38FA88D2FC262C4400441108484100311042173E88B600C - 1311B00E630017DF2295196D400C44100441480831104110B2035C11B745F160 - 774F6B2EAA8D888108829005B003D8B5B1C42C2C027F62C3EFF48B586D450C44 - 1084CC6114FC8160309CA8E2C0DBE413B1DA8A18882008994117FADA008CEFC0 - 2720F3FC31E0F279C8E3F38B58C88BB6908456304110DA2B197D1756B3873634 - E9776179E8B72B137817964BBD0B2BDF65BCC178EAD367467D17D6B54FBFB769 - 6B499FEE2A9AD374AE5BB5E9C69346F554D1B8110311841C26E306D26832909F - DA60206E6520CF443710217948139620081944B53F194D50FCA74D321628A411 - 31104110320397F92132F76BC423F33284B42206220842E63017FEF8026FBC82 - 81E8A11848DA110311042173E8421F43DB66A93814C77320427290CE2641C861 - 32DA89DEE8A10DF59554E7A9A7665EDF6FBFF9B3911E2B0EA7EA44CF77925B7D - 2F7EEACB6747ED44BFFC3FCF6CFDA1CEDF5545739A3D8A5CDE1BCF1B97A7A271 - 23062208394C561848B33290E56D30904265200BA31BC889FF7CDA7FC4907ED4 - A9B4848A8B8BC9E743FB57EEE07738783F37507D5D1DBDBE7C253D73E94909FB - 80188820E4305963201E3690AFAF36D263C530903C18888B6B202E2A2DCCA7A9 - AF46379071773CED3FF9D7FB519FDEBD554A6EB26EFD7A7AEABD4FE8B9A9891B - 88F48108829039D06DA165ED208F47D2899E11C4400441C81CE8F8365A9078E8 - 4D50C18E746389421A110311042123189F540DFC0F14FE76358B0872E830E6D5 - 12D28A1888902D5CC55AC53ADE8845E0E32FBEF1BFF4C6FB4121AE4609ED8016 - F2180AFCF3722582C5FFF076F178E4C09097670C110F2C5E482362204234C6B0 - 5E60151BB1D4B00FEB06D62EAC639110890D9BABE898C38607F5D42B4BD418A1 - 3DD0480D869AF85FB3A389CDA4993C8E1672B99C71097760B99C1C76F290C34E - 1EC60A0A3E51DB49741938E14729099901FB603AEB2D8B9096ACFD52C67A9435 - 96F50C2B1526E262DDA5866890B8871513A7FC6D920A0538E57757FBCD0A9726 - 08F01A91CA8C3610EF225068A120E967C40254B326B39E356242AA8139C46212 - 2B59D3586DDD2F47B1B479BCCA3A9155CF4A1617B066058286795C18088607CD - 56A87968FEEFD6D9F4F72BCE4DC2E9907B986FE3DDB66D9B711B6F535313793C - 1EAAACAC5453C506DE8EEB72B982EAD9B3273DFCF0C3AD6EE3751C17B86E6D69 - F4D2D6BA6DD4D0CCB5108F97AEF9F236233D56701BAF0BB7F1BA5D945FE8A492 - 12375DB0F08C986EE3DD65E8BED4B76F2F95929BAC5DBB81562FFB346DB7F1C2 - 3C3E65C13C50285DC7BA8385AB541430A197831D1BFCE6A981A02D188769920D - 968B5A86368F392C98F7A14A28DC910653C77EC27E99C96A0B66D3309B4932C0 - D3C068BA026B59313D08D0AB7BB9611A5AFB0CD94D8D11DA0A3AB6213C5C9788 - CCF31A9DE43654AB7F358E1AAA75D4521DABC1556B3CCB118F0A0A9C2C360F77 - E075EE79F9B19783F95CF261F29C5612DAB0E259C46C35C4552D0A94192A8C82 - 0BB4B5A06A2FC0185088E3F7EA3C3183348CC334C9341118B4CEE3452C949A30 - 0F1806E2108C1D6918A76B1E309D6C351198877EA5C495AC9A403032E803F9DB - E59383FA6CF94F6A8C9008BAA0370FCD46108FF000A27968A55BB76E945F9B4F - 5BF85FB5B39AEAF36BA9C95D4FCDEE26EA55561E977A7429A7EE5DCAA85BE72E - D4B9A488F6DD3288CACBCBD59A8474C03E14132808F1582A9A45EC2EF7F45531 - CC04055947E604160A508DAE05009887AE89A116B02F0B79D65674ED0F98D717 - 0DF3F62463DF24D29C3598856997B1C6B19A5900BF69290B7D1FEFB20E61C584 - 6EC25AD1CD4183B7F8834D58D63E8E27FF7DA36D9A0A0A0C9A94468D1A65BCD2 - A3A6A6C668C26A6868A0969616DAB2658B9A2A367413169E46C7B077EFDEF4C4 - 134F8434296DDAB469EA175F7C3113CD6530192D349961180FE6F9A0CE9D3BD3 - 51471D35AD6FDFBE6819090B9AB0FAFF621FEADB27C79BB0D66DA01FBFFEAC4D - 4D58B1CE08738049A000D2350E33B964200085B2B9F681421D98CD0379F19911 - 6B3B28B4615C581E4CC90C9AAA30AE0BEB3996759D7ADFD8CD1B2F300E2CEF40 - 168C03BFF14356244E633D1E08D2F52CF4DF80775807B3506A0C63C59C57D207 - 923CCC06525DCD3502D507026DDEBC594D151BFA55265A5C90D37FFFFBDFA87D - 12E90606B21B1BC84EBD73DB407E5EBF817E6AA381C4DA84A54D0105915DB38C - EE544FC6D5B6060515AE1E758103B01EB457A036846DD1A0E0461AAED253D1F7 - 60C55A0BC0FA53651EF83D3008806643335827F2034D54E893C2EF37E717D0F3 - E08A1F4A1498078C4C9B076A1FD1CC03609E2F0341E3598FFD59E7B1601EE07E - 565C79257D20A943375D61A8AFEC63956EC6D2D24D6259095AD7B079B9AC243C - 78194F1F883EC951B0EB421A435C89A36087C924CB40600EDA20CC4631918575 - 61BD2391A0403AD2DA5A48C643B8A6A4649A0730FF1EF31D55F8BD767D1B3012 - 6DE8C0BC5F12CD1B6D1E68C2D2E68166A9584093D5596AE866E178B9910562EE - 3837237D20C94517FE1AB389C4236D1C6633113A36B11A084E7A5DF86088AB7D - 1809CE5C5C05A3808AB55D3E1650E8A1B0C4D5FC5C24281046E18CF5A1B946F3 - 4F16D2305F320BEF68984D4C73A91A260BE4017E976E26D3603F6823B7623610 - 80BCC43212A12DE6A1410D44D78CF662C5DD716EC77E7F58AC4201CCCF7BE8BE - 0FBB346107E8D44653159AACD08781B7E816161652696929F5E8D1232E615915 - 1515464776595919FDFCF3CF59DBA9ED7789A0B6124BDB97B92316A02043AD00 - 85942EB47137160ABA5CC29C2FF8EDE6C23C5CED2499C04074C7BA9564F54525 - C33C34385CD1EF7190118BB3E3DC8CF481248F6CE8D44E37E803E9B787F481A0 - 0F64E537A9ED44B79A070A45EB95702E62350F14D828D091AE498789E80E7233 - A881B5B5B35C8326271808D6D116F3D00C606119DD592358BA6F242EF0EE2BF3 - EB4BD00772EAD843C5408498300C64C8DE6C20B9FD3D909FD7AFA795CBBF4899 - 8158AF70C53C02C038B45168F3D0CD66E6710005792A9BD4743F88EE64475355 - B26B8330111C0BB17498C7026A22A5AC849BAE04A12D180632580CC43090156D - 3390487D2028F874E127E6B103E40364350F60AE7560984AF300D806AC070DCD - 10C2C9340F80CEEF64990740BB8898879051FC5C648A5466B481242C421004A1 - FD70E2CC27FD3BEDB137F5ED95E30F126ED8403F7FF3053D33ED94847D20A119 - 274E9C18BC0368EEDCB9C9E8AC15E204FBC0E170E0C96E6B1FC822BFDFBF58F6 - 8B20D8F3DB5BEFDFB2D5D5B54245739A9E8D5BBCF75EFDFB3C158D9BB80C4415 - 5AE85435DF265ACD05D6642EB0CCCF28082982F7C128DE0731BD8D97F7CB34D9 - 2F8220A48A980D449987EE5447A184F67DD4428CB7D22A13C9897E12CE0BFCEE - 49FC7B6D6F4FE4F1C893393C3EA9FD11582EEF03F3C3837350DBE0A17E50B04C - D54AD0A9AE6F2BBE63CE9C39E858170441482A311BC8A44993601EFBA8ABDA60 - C1A9AE88713B69351754D9F9D450128179A8DF8B663CFEC97374A7B901E793BE - C5F733CEAB43936522BCDE49BC5E7D87179AA960D8DA384250DB8869F5DD5962 - 228220249D980C441548C6DB78B9206AF5E2212E348DE7115481D9A1DBDE392F - 4EE0BC40339E26682226F30068DADB375C211F0FBC4E73ED2FB8BE6898B72717 - F68D2008E925D65799E06A1BB4B9306CEF7021FC2CAEFE551470393D69B68D79 - A0C04E4A7EB179E8D7807C66350F36977EACA9BCFEE9301A956CA0A6354C8397 - D1D66F8208822084104F1396F11E212E18CBB9600C6996E1717827563F1EB75B - B20A4D5EA67ECAFA3A2E088D37CAA2B0E48210E965BCAE13F51535A7A3790705 - 243A8E93D66C1409B54EDDA464469B47529E01E1F5E8DA1FF21EBF39D8291E66 - 1B82F905781ADDC488F951234AF5B3298220E40871BF8D1785110A3584315457 - DEB82B6B11174E49310F147A3CD0771905EF36E27507DFC6CBE1E08B0C553AB6 - 0957E02157E1A9827F2B3AB05B352525D33C14C1DF63310FE481EDDB78795CF0 - 2E399E0726ABF74B5AF2461084DC2026035126A10B1FB4C757A186C0C3E0DB78 - ED0AD34451851E0A4B5CCD07DFC6ABC2289CB1BEE0DB78399C91B7F19A4D4CC3 - 691DED6DBC822008B6446DC252E6A1DBF6010A32D40A504819853617E0B8332B - E5CD46D984255FF0DBCD85F91C6B5F45B2E15A86B9633D04DE1FD2612E0842CA - 89682056F3E08229679EF58884D53C5060F310053AD235293711D40279106CE2 - 53A0A33D596FE3150441084BD8262C5CE1F240CCC302E70BF224C43C385F3E43 - DE208F543A98A4F23065F0FAF08A75EC13D480206C03CC4C100421E544AB81E8 - 8707C53C4CA81AC809DA3C02A9016030A889489E098220088220088220088220 - 0882200882200882200882200882200882200882200882200882200882200882 - 200882200882200882204425E62F120A6DE7C5175F2C57C12063C78E35BE3628 - 0882200882200882200882200882200882200882200882200882200882200882 - 2008822008822008822008822008423BC0A9868220D810F22A939A9A9A810F3E - F8E0BF376CD830B2A9A949A50AA9A0A0A0807AF7EE4D93274F1ED4A54B97EF90 - F6D1471FF5BEE4F6476FAC2BE83ED1E7CC37A613928FAFA5BEA68BA7FAD93BFF - 78E6D5071C70C07A954CD5D5D55D376EDC78C9BA75EBC6F3F13FD4E1B07FD38F - DFEF57A150C24D9F09DC6EF7B23E7DFACC1F3870E02D4EA7B30E69F87D7C8C5D - B278F1E2F1959595438D09196C377E93DE7EFDFBCCBFC7FC9B67CD9AE5B8F0C2 - 0B830976D3A56A59089BE7EFDAB5EBB2912347CEE7FD7867595959A54A16D2C4 - 8EBDC5DC78E38D8B8A8B8B479E76DA69D4AD5B37959A7A9A9B9BA9B0B0907C3E - 9F4A490F995A2FD8B2650B3DF1C413545F5FBFF8EAABAF1E85B4FD4F9D36A7A0 - 6BEF89C70EEB475D3B17933B3F3FE4844A25CBBFFA8A86ECB9A78AA59774AD1B - 054F734B0BF91C79F4C81B5F5053E5FAB91FFF77E624359A56AC58711D17B2D3 - 870C19427C1EA8D4D8E1829A6A6B6BA9B4B4B4CDC7141F17C636980B4B33918E - 0BCCD3D8D848CB962D232E54670C1E3CF83AA42F58B0E0BAB7DF7EDBF87D9D3A - 750A2EDB5A406BCCE3F5B837DE7883FEF5AF7F39FEF0873FF80F3FFCF060BA75 - 59C0BCBC542D6BFBF6EDB47CF972FACD6F7E3363CC9831C6EF14D2C78E3DC45C - 71C5157E160E3AE3004C17555555C6D5783AD70932B55E00E3E2C28A6EB9E516 - C8D80F7B4EFCBBFFCCDF0CA4FDF71A420377EFCF5791E93390EF37D4D3805EF1 - 179AC9205DEB46C1839AF50F3FADA2EF56AEA17B5EFC84BE9AFBE76006F395B9 - 7FFFFDF7376A875EAFD748B3166A91E0AB7EE2DA0BF195BF7171120FD6FDCC35 - 04EAD9B327B5B0E1C5B26E2BF97CF1D1D0D0409F7CF209F115BAB1F06BAFBDD6 - 3F68D020AAA8A8304C2E1C917EEFABAFBE4A7FFDEB5F1DD75C738DFFA8A38E52 - A9A198E74FE6B2EC80616FDDBA95BEFDF65BBAFEFAEBD373B2084142DA7871B0 - 72953023056AAE813C465E23CF83B8F269C0AE3BD180FEFD282FCFA5128564E2 - 72E5D1EEBBED4ADDCBBB18F96D06FB04C68EC21F0602A126A187D18482CEE3F1 - 1843BBF191A4D7A705A3C372625DB755981FBFC57C2EA3A0EDD2A58B211C7BE5 - E5E54199E3B880D471F350878135CD3CC4FC0843C95C964E37C7F5EFC16F13D2 - 4FAB4EC2486E2F2417BBBCCECBCB23A7CB457CDDCB22F2A1304A83BC3E2EA86C - D2D3A174ADDBC86DBEA275B289209FEDC03EB1330073BA0E5B0550E0039D665D - 4E249997655D4E2CB22ECB0AD2504B2A2A2A3286A8696999E308EBB879885A0D - 4C096088B8DD743A6C8D9B87892E4B87755CFF16BBDF9B28D3A74FCF1B3F7EBC - 5B458508D8DE65A20FC87409077C2EAD57CB0E270A36878BB0655EFEE349939A - 3DF6E9E950BAD68DFCF4B381389CAE403E87C1BC7FCCFB2B9A40B28EA9642CC7 - 0E18270A6B2D1D37A7A340465CCB9C8E821BE8025C8F334F6F4E4FE6B2F4FCE6 - E5E878B28071AC5AB5AAA5A4A4A4494C243A59612050AEAD17B2C3CBE91E9697 - 470786E991876B0176E9E950BAD66DCD573B749BBB5528D02173D82A8CB33661 - E9F963917959893485599785DF62C5C5B55BB350F89A87E6742D6B3A8875FA48 - E3108F67593A6E4D8792016A1E300E15A5F9F3E7C7D7911586499326F92115ED - 50644D0DC42E3DD5CAD47AB5ECE04D220F9772B85A4EA7B8BCB24D4F8732B16E - E47338221D17C02E1D029817D88DD70A87799A589663278D39AC81A1E04E316B - E16B5720DB09D3E18A1FE82B7FBBE96251A2CBB29B0EBFC9CE2CE381CDC3899A - 878AA26FB28B0A0A119026AC0CAC57CB0E0F27B7F0B874AB996B0176E9E95026 - D68D7CB6C3BC7FCC46A2318FB793799E78D556ACCBB22E13716D206623D1C662 - 95B98036A701BB746B9A5976E3118F7759D856F3783DB4FED67861F308743A31 - BCCC5E8F3CF2C836151522606B2042E6C079204A8FC2A10BE17805927551D216 - 23D2B2A28D02E8C2389C7940D6F108A3C006185AC799E35659C7239C8C65019D - 962896E6A55D1E78E0818D2A2C44A19581D81D88A2D449681F24739F9997154E - 891891757A213A66F360231B3867CE9C352A2AC480D440B20CAFCF6FF481A45B - 2DCD5EDBF4742813EB463EDBA1AFFC81B9308E55B1D41CE2C16EFE48B29B4763 - 0E47C27C351FEB957DB87992B9AC48C4FADBCC58CD836B1EDFABA81023B60662 - 3EF8D2A16455FBE355A6D6AB6587BE5B28FDE242DC363D1D4AFFBAEDEEC232EF - 13733891022D11CCC786D9C86205DB8679A26D6FBCBFC16E79D1D6118E642E0B - C43B3DC0EDB966F3E0BCDE53CC2331A4069265E0C21842D9914EC14BEDD2D3A1 - 4CACDBAE0262571859D374011D4EE6367AC80E6D125699E7B32EC72A3BB00CBB - A1B0832953A6F434DFAACB7979C8BC79F3BE56D184983C79F2AF6048E1A4260B - DECE6B27354958ECE689476A3149272B6A20B92A3B1ABD3EAAF7F8A82EDD6AF6 - D8A7A743195837F2391CE682DABC9F74C16DDD8F66599BB0E2C13C9F75395699 - B7512B5960F91A7318E878B874104B18E878B874601D97043AA9A1416D6DED87 - 2A9830B367CFFE9F0AE61C2147DDD4A953FD37DE78236DDC98DE9B10D6AF5F4F - 43870E355E6E984E32B55E0D5E9677F5D557D31D77DC61EC873DCFBDC57FC231 - BFA67E03F72087BAC3245D2C5FF6330D19BA938AA5974CACFBA715CBE8D997DF - A3AF1EBC22780EBCF2CA2BFEBDF7DE3BF4FD640C0AE7580A32BCA4F0830F3EA0 - E1C387B7F9DD4CDF7DF79DB11CBC54D18E58B607CF4C7CF9E59774F4D1471BBF - F1A28B2EF29F71C619D4AB572FE2AB70631A33DA84ACCB36A72F5AB48878198E - C71E7BCC3F6AD4A898E63193CC6581BABA3ADAB06103F132E8EEBBEF0E4C1885 - 090CD7F0E6AA28CD993327A6F91245D70052BD9E4CD0AA94C24EC209944EE1C5 - 6F78F78FDDB8542A53EBD5B23B211A5AB806D2E24DBB1A9B9B6DD3D3A14CAC1B - F96C079A8EB4507059873A6C278CB3DE929AA8F472E29575195650B3B1138E45 - BB74C8FC4247FD8E2E6B9A0E47535B9615691BE3611EC3838B02B1D0CE74213E - A40F24CBC04BFF70879028B5423EDB612E8451005B0B646B9A59985717FC76E3 - E3915E8E5E672C428DC33CBF157DC182E5DA49136E5CB4B0599A70E3A285CDD2 - D88D8380DDC55824B836308B0762226D246BFA40726DBD901D28DC3C1990D7EB - B34D4F8732B16EE4B315EC1373816C2ED075A16C97AE05301ED88D8F26BD7C08 - 6680C2D16EBA70324F8F3096614517B8E6A10E036BBA5E9659E6F15AE6E9F478 - 8DDD345AE6F15AB12C4B87CDC378818970ED65A28A8A8924806D1396287D12B2 - 0714442874F16E26086F82352B5CBA160A7E7C451043BBF1D1A4970FE135E528 - 48CD6966D9CD6F16A6B11A882E7CE391DD7CB1A65965374DAC69B12811D09C25 - 269238595303C945D9E1F5FBF8EA38FDF2F93CB6E9E95046D6CDF96C875D61A4 - E38914547A9E7805F38817BBE558C172215DCBD1351EA4E938867A1AABCCAF60 - B71B6F5D4E3297655E8E4E471AD41660227C3E4E5051319138C81A03C9B5F542 - 76783C3E6ACE803C1EAF6D7A3A948975239FEDB02B846315D08599DDF87884E5 - D8A5C7AA70052BC6753492F19BE6CE9DFB109F93622271D2EA0843C166BEBB21 - 1D8AE72E8E642A53EBD5B23311BC66A3C5EB4BBB3C9C1776E9E95026D68D7CB6 - 235CC16D4ED785B355D6E9DA222C07D88D8B47898279C35DE48403D3DBAD3399 - CB4A25561339F7DC7387A9609BC0EDBB1DF1165E605B03B12BEC522D1C3076E9 - A956A6D60BD9E1E1F416BCDEDC2854D3278FD7639B9E0E6562DDC8673B506859 - 654E3787AD02D682BFAD98971F4D56ECD2E229C8CDF3633EEBBCD634BBF56992 - B92C2BD665B50598882EF01F7CF0C1A52A590883AD81E89D294AADECF0E00AD9 - 937E793D5CB0DAA4A743995837F2D90E5D70616896C61CB6231603D1E3AC0A87 - DDB4B14A1052492B03B12BE8D2A14CAD3B53EBD5B282343CA3907E71ADC8363D - 1D4AFFBAEDF2BEA3C3BFB93E9CA958D3EDF2C73A8DDDB2C21DD356125996DD34 - 00E9F86D2A2AA411DB1A8890197C2DDE9A16E36A5CC9D4669F6AE1590CBBF474 - 28ADEB36E52FF25B65BD81DBED5E86B713E016D8707D19D1D27177908E8753B8 - F1FA0E2308B7E2623AF39D46D184E9F5B2F11BF05BF09BD4CFA36EDDBABDD3D0 - D0109CCE2C601EEA3040582FDF8C5D3AC23AAEC3D6F1892E4B0FADC26FC26F33 - 2610D24AC85EBCF1C61B171516168E1C3F7E3C75E992BE4F025757571BEFE769 - 6C6C5429E92153EB05353535F8683FD6BDF8EAABAF1E85B4A32EB9E5B68DF5FE - 3FEE7FF4D15C10B9C9C985079F21C6F4A9E6E7AFBEA19DF6DC43C5D24BDAD68D - 2B5AAEEDE035324B172EA09EC58EDB5FBDF38ACBD4585AB162C575555555D3F1 - 7E34DC5A8A2B601450C01C0E07CC63CB962D28CCC8830FBDB7011C9B892E07DB - DADCDC4CCB962DA3F2F2F21983070FBE0EE9AFBCF2CAA4254B96DC7BC2092714 - F4E9D327E4B7016B1C20CD3CFEEDB7DFA6534E39C5F1E4934FFA7FF39BDF848C - B3CE0752B12C737CDDBA75F4ECB3CF368D1831E2F7471F7DF41C63849036027B - 42C185DAC0BBEFBEFBDF7C128DC44926A40E5C21F2C98D17DC0D62B3FE0E69B5 - B5B5BDC75FF7E08D6BAB9A26DA3C282D2409A7D3417DCBDC73E75F77EED5A5A5 - A5EB55320AEDAE1B376EBC840BA5F15C000F451A0A295D602582B92034D39665 - C6026A1E6C12F3070E1C780B5FD9D7A9645AB060C1A4F7DF7FFFF4AD5BB71EC2 - D1E2406AF8821EE8B81ECE9A35CB71E18517FAADE91A733CDC383D8C67590071 - 13F5151515EF1C74D0418F8F193346CC43100441100441100441100441100441 - 1004411004411004411004411004411004411004411004411004411004411004 - 4110044110044110044110044110044110044110044110044110044110044110 - 044110044110044110044110044110044110044110044110044110847870A8A1 - 200842D63361C284E39D4EE7891CDC4BC9C5FA8CB596F5687171F14BB366CDAA - E5705A993871E2FE0E87E33C0E1EC8DA87D5C0FA92F59ACFE7BB67DEBC79D8BE - 0E474403993469925F05DBC49C3973DA6C547A5B92B12C4110DA17679F7DF66E - 2E976B3617D22355922D2D2D2D9BF3F2F2AE9C3B77EE1C954493274FBE60F6EC - D9F7A8685239E594538A4A4A4A6EE0EDBA94A330B35678BDDE1ADEF60BB9EC7A - 54257518DAA581B461BBAEE7F9A7ABB02008ED003EDFFFE8F7FB6770215DAA92 - A2C2D33F595F5F7F16D7488EE4F99EE3F33E4F8D4A1A6C4CDDD91CDEE11AD160 - 951411AE893CDAD0D03061FEFCF95E95D4EE71AA612E7093988720B42FD83C6E - E0C16DDA3CD818D03C753D17DC23EAEAEAF2D8203A71C1FC2B4EFF0B6A1F9806 - F0F4A71415152DE0718F70D4B666D016C68F1FEFE2753E67360F8E2FE6F58D63 - EDA4340E696A34F1B467726DE55A15ED10E44A0DE4169EEF4A154E1913274E5C - C407C95FB8BAFCAE4ACA18E63C8A94FFB88AE203FD2EAEF29FAE925202E7CDE3 - 9C371773DE044F722BB16E7332B15B6726B64383FD112E8F228DEB88F031339A - 8D60818A1A05341BC7E4871F7EF8279514C2942953BAF2F8D91C3C3E90B28364 - EF47DEB67378DBE6A928C005EAD52A1C021F4F37F2E0AA408C9A5D2ED72F1E78 - E081EF55BC5DD3E16B207CD0DDCE3B36E5E601F8801AC9EB7B0746C227FBC12A - 396B993061C289CDCDCD5FF3769FA6925206D68175619D2A49B070CE39E7ECC2 - C7CFFFB8C041211802A7FD87C72DC5342A29EDC058B55452CAE02B7C370FEE0A - C40C9EE18B9C51E1CC0370A15CC9B5929338F87C2025A5A0C3DC00C6C6EBFD8B - 8AB602E3781A7D51E966939BA2C2ED9EB80C042E6E76721DB74A8DCE38BCD3FE - C907DD652A9A36B2DD487025AB6A044FE7E7E77757C92907EBC23A79DDF3B10D - 2A5960901F7C65BA8883BBB1B88CDE61221CFE0F0F50E8ECC2D3BC930B79575A - 5A7A3C9F470310F6783C95C5C5C5138C1159C079E79DD785B7ED201545D3D45F - 22F56B601CA65151305A0DDB3D1DBA06C23B39ECD54A3AC846234967AD231CBC - EE53A436124A6D6D6D250F82EDE58C612226F3D0BCA9A6EDD0F0557AF0D860D3 - BC3DD65B73D968EEE041AB26AC64D2D4D404930FF6ABF085116ED78D084F835B - 8D0DF8B761FE0E415C06C2077348F555C7AD52A3B3813BB8F0BE428533463618 - 09AE5A3351EB0887D44642C1556A5D5DDD6F3918BCFD9499C4329BC71C4CD391 - EEE289C0FE6A085E52C3A8CC9D3BF7E254B78AF0711BF3DD609ABCBCBCE03E63 - 432C52C1764F87EF03E1C2FBE66C3011902923C9865A4738A436B2833026A249 - BB7944BA308C342E19F079D24B05A9BEBE7E990A66052D2D2D210F05721C0F34 - 46A4A1A1C16C881DE6A1C20EDD07A25126F27F2A9A0DA0FA9BF45B0BC3C1574C - E890CC6ADAC336A68348069123358F5694979767D515BBEAC80F368FFB7CBE1B - 705BAF8AB602E3308D8AC21C17AA60BBA7C3D740346C223764DA44F8C07997B7 - 631457B30F993D7BB6B9BD3BA5B0A93FE176BB7FC1C167022959C533D8366CA3 - 8AE7347C358FCE73345D59E151ADEFCEEAA8F079B24105759F4356C1E7F2032A - 68B42CE06974156D857A523DD8E2C066F2900AB67B22D6169255354D46AD446F - 4B36D67034E1F20BC6C157D8783E246DA661DE16739E4D9E3C194D46B3ACFD20 - A9CE576BDEE0A12FDE06B457078D23DC36A712BB7566623B00AFD76A1EBA292B - 248D99ACC269259DF93261C28447F89C3913613E7FFEC2175D7F33466409175E - 7861697D7DFDD71C0CDE56CDDBB998753B9BC5872A7E2087FF0883312608F03C - E7DD38156EF7E44C0D2413C038F8E0497B8D2312BC1D4F66416D446A1D16B876 - 8C36FFC3023103A3CFC3A64FE430356D8786CD23D871EEF1782E4581ADA25901 - EF17DC62FC5A20160046C1DBFD1C0FD7432A1C340F2E0FBEE7E33E6B6E474E06 - 39D107926EB2D138CCF0366DE6FD74126FE378F3EB1F528D5AD7E95837B62190 - 2A003E563678BDDE4338B89A15EC30B774ACAFE6C214C755B079A7A3C2BFF949 - 14B808A3B6CCF1989AEFD0DFC035A5E7D864BF53C3A4BF3A84977B269F3B4B39 - A8EF908BDA378532810787DC7FFFFD3581948E81D4409248B61B879534D746A4 - D61185871E7A68351F3FC3B479A8E4E0DD597C7CFD2AD293D81D09FECDCD3C98 - 1A881957F7A74C9830E155BC955725B5020FF81517173FCE41FD10229E0749AA - D9B2219DC303BCC224D869CEFB054F9AE33D7B307F2BEFF3B8C928133AA2F147 - AC2D98DB3CDB42326A257A5BA4862308B9039FF7E6F748A1B0C60385B7F070E1 - BC79F33EC42B4F8A8A8AF6713A9DC7720DF7024BDFDE33A8EDAA709B61F398C4 - C684073BCD775CC1E8F7E5F5180F134E99326500D712BB20CCACEDE8B5453110 - 4110B21A3EF7FFC803DCE514CFEDBCCFD4D6D69EF5E4934FE2C34E6D86B701CF - 50A17663C6AB6A171DE6AEAA7891262C4110B21ABE68BC9D6B18FB72611D4BB3 - 309A01F1F1A69392651E8ADBD45093F3E601C4400441C87A1E7CF0C1155C588F - F2F97C6892C20D051FB3D07C0493F898D3F1B5BFD3EBEAEAFACF4ECDD707D127 - A38179FC36D7CD0348139620084214B8FC399207E8FFC01B13A6723924378308 - 8220088220088220088220088220088220088220088220088220088220088220 - 088220088220088220088220088220088220088220088220088220B437E4CDB6 - 8220B462C284097D9D4EE75D5EAFF73097CBA5BFB01784D36B38FD4D9FCF77F1 - BC79F3D6AA6421C7100311042184F1E3C7BB4A4A4ADEE1E041819488BC5F5757 - 7788F91BEEA966F2E4C923FD7EFFCD1C3C3090421F3A1C8E2B67CF9E1DCB07A7 - 8424221F9412042184E2E2E2BD78108B798083D4F46983CD039F96D5E6010E54 - 69429A911A8890354C9C38F1B6B973E75EA6A2692353EBCD56F80AFF602E9051 - 038909BEFA3F84AFFEDF55D19C25173F7A97941FCA555E375F85DCC127E1852A - 29ED702130ABBEBE7E2A57A5CD9F9E14DA01387E4A4A4AF0B5B7733271F2A913 - FFA1BABABADF66E3F193EEF32B5B0C64C284096F389DCEC35434217C3EDF9BF3 - E6CD3B5C45534A2E1A489B9BB0B8E0EEC507F71B7C105DA0923202D68FEDC0F6 - A824A11D70E1851796161515BDC8C173022919E31C6C07B647C5B3824C9C5F6C - 1E7BAB604CC43B7DACB079B4D9CC93B10C213C6D3210BE4238900FECA5AC8355 - 5246C176B03E3DE79C73626DBF4D297C45F2474845050B281CB9D688AB4C7C6F - 3AE3603BB03DD97211926DE757BAE12BF9312A9830C95886109E840D844FB229 - 7CC2A19ADB37909235F472B95C8B78FBCE53F18CC0C671260F6E8354583071F6 - D967EFC6031C3FE6CED06C00DBF38EDABE8C91C5E797200489BBAD4EB7C7F255 - 91B54A7D3DBBFD74154E3B5C48CFE0C1B5815890FBEBEAEA2E4E77BB366F0BDA - 6D17B0DC460211D63F86F3E7CD40343570A1731BEF9736D578FC7EFFEDA9EE50 - E6EDDC9FB713CD56ADAEF433D17ECCFBCB68BBB6B081F3622CE7C5C72A9E16B2 - E1FCCAA64EF430FB2666D2793CE96DCDC4319C29E2AA81F0891FAE3D36A3E601 - D4FAAF0FC4829C57525282DA48DA9A24785DFB78BDDEA739A8CD03B891868253 - C553020A7E9FCFF7A88AC60DE64DB57928735DC4CAF6BE2A6CDF22B5BD69219B - CFAF2C039DE2E68E716B3CA5C060795FA15CB15EB0B602D3605ACCA3923A1431 - 3B25DA63B94A8D8231E62A752A9D38CE2B930D5C809FF4D0430FBDAFE22961CA - 9429031A1B1B97E4E7E777574921B4B4B46C2E2C2C1CF1C0030F7CAF92920EAE - 608B8A8A16F0BE8AABE0C3DD2A0D0D0D6352595BE37D86A6BCD92CB3B9869089 - ABB728C712F263326F57C2C61C0BD9747E657B0D44FF6E3DCE1A37938A3CE2F5 - 045B3B389FA6F3459771E16ADD1E9807E70DA6051DF22220A61A0867447B6F8F - 4D79BF089F74DD3D1ECF8270E601300ED3605A95947460006C522771309EA697 - CF304F8ACDE3521E3CC20A6B1E590AB6F711B5FD29A1039C5F39853202C33460 - 10300A84CDE4827980980C840FEEF676D2DBC2BFC3A58249E594534E29E22B91 - 17F98019A092C28269302DE6514949E7FEFBEFAFE1F58CE1F544ADE9601A9EF6 - 28CCA39252454AF23E8DA46CFB3BCAF9954B4432915C310F10938170F5F41ECE - 10B4316E08A4B43B3660FBF13B543C69A84E4F7408C77337D1819807F3AA78D2 - E1DFBA392F2F6F0C9ACD54522B300ED3605A959432F824BA9DCD6A0207D37A43 - 431268C67663FB553CE97480F32B27B19A08862057CC03C4DC89CE07F9BB7C22 - EDCBC156FD089C3E9D33CA61951A9D12ECD687ED50A3CD7CE8F3F98661FB553C - A9141515CDE62BC8B83B5A310FE655D19480BE1697CB3596830D8194101A302E - 95FD3156E6CE9DFB100FC6F27EAA0DA464376A3B712716B63BA564DBF925C406 - EF87A08958C8891B1FE2BA0B8B4FA40D757575A338787F2025001CD7AE1D309D - 58AA8D9A07787B0F49D5EBA6274D9A74231B41C2CF78605E2C43455302FFF60F - 790013315FF9233C568D4B2B7C52BDC605627BB8DAC66DBC87637B553CE564F3 - F92584C7C64472C23C40C257317C409FC707F65D1C0C36C370A665ECAA48DF01 - A168E66D9B8AA60115CF79387F6074E8C40667F1BE4AE95D45D1C01D6B5EAFF7 - 550E863CB0978963C872EC809FB87676543A6B675632797E65FB5D58BC6DC6D3 - E5BC5E3C6BD52A6E269DC7136FAB7101CBEBCC09F30071D540CCF0D5D2FD5C00 - E06A29DBAE2453D6DFD19E8161F089763584B04ACE18289C795B467030AD0FEA - C5C0C7D8AE4C9A07C8E2F32BE3C028CC66618DA712189A9DA901184738F38834 - 5F7B2661030178AE824F36DB76DB0C91D2FE8EF60E174A37412A9A71D064535C - 5C3C0ACFA0A8A48C82EDC0F660BB545246C9A2F3EB632EA07FC185230F1CBF40 - 3C909CBB4C983021E65BAEE399B6BDD126030138D9ECDA6D33404AFB3B84D430 - 6BD6AC5A3CC0C88577466B45583FB603DBA392B2822C38BF9A5D2ED7E97C51B6 - 0C110C11473AE2B98AD3E9FCCFC418DE70816930AD8A763832D667210856F864 - C3372FA6AA68DAC8D47AB3154B1FC8FD5CF3385F85834C9A34E93E1E180FE672 - AD24957D203FF320D12BF8B5BCED3BA97052C8B6EDC9346DAE810842B2C85421 - 2EE6119127D5D04AB8F4A4C246F65B1E24D2A488BBE8306F52C9B6EDC9345203 - 110421045D0361D5D6D7D797CD9F3FDFAB4605193F7EBCABB8B8B89A6B1FA5A9 - AC8108D98DD4400441B0858D61999D7900A463BC8A0A82200882200882200882 - 2008822008822008822008822008822008822008822008822008822008822008 - 82200882200882200882200882200882200842F623AF734F2253A64CE9EAF3F9 - 4EF3FBFDA3398A8FCEEC638C20FA8CB5D6E1702C743A9D4F3CF0C00395816441 - 1084F64BBB3290647D941EDF7656C1A470CA29A7149594945CCAE67195CBE5EA - A2926DF17ABD356C2237D5D5D5FDF3C9279F6C50C949215BF34710848E897C0F - A48DE09BC7A5A5A58BB876716334F3009806D3629E58BEA92C088290AD8881B4 - 81091326F46533F81F070F0CA4C4C5819817CB507141108476856D53C5E4C993 - 47FAFDFE9B399848C1F83EEB2F73E6CC7933104D1ED9D444337EFC78774949C9 - 3B1C4C248FCC7C58575777C8FCF9F39B553C61A4094B108474625B0361F3789C - 0789168C07B1FE1308EE800BB71B55B043505C5CFC471E44CB237C0EF474AFD7 - BB2B0F3F34525A73A05A96200842BBC2F64AB3AD57B2E8287EE8A187CA10C6C7 - F7F94A7D1607CF6BEB95AD75BB625D5EA2F385E3BCF3CEEB525F5FFF635E5E5E - 5795648BC7E3A97CF8E1872B10E66DB88107FF87B0154CC726D2FFFEFBEFAF51 - 490911C77EBB8C0543771B310B52031104211652DA0782661E2E181FE1E07981 - 948E417373F3B1D1CC03601A2ED4674F9C38F10A8E4E09A4B606D3B5B4B49CA9 - A229C7ED763FC0263F8A831B0229822008F193B21A484343436F368FE79C4EE7 - 912AB9CD57B66DDD2E4D12B6E3391E1C1F8845E563BFDF8F3BAF06A878389EE7 - ED1AA7C209116BFEB08194A1B6830E7CDE3F4F735248539CD4400441888594D4 - 405C2E97BBB4B4F40DB37974247C3EDF60150CC75A368DF3D9403B71613CACAE - AE6E6F4E8BF6CCC7FE6A985460E6BC2DB773F0281EF6863954555519DB326FDE - BCB5B5B5B5A889CC415C1004211E525203094712AEFC43B62BD6E5253A5F38CE - 39E79CEA48CF7CB0C1AC60F35CCCEB391FF1C993271FCC8537EED88A44334F5F - A0C20961B3DF567B3C9E510F3FFCF04F2ADE0AF451B1D1DDC635A44B5592D440 - 04418809790E2405B079A086521488198672B00A86850DA6CDB7F15AE1F55E9C - 979737808D651E6BA9921F3701603C1B5B77368F37CCE6210882102BEDBA0692 - 286DDD8E0913267CA34C222C68C29A3B77EEFD084F9C38F11D2EA4239A086A2D - F3E6CDDB434513C2267F5E621D1B08EE007D204D4D4D03789BD0FFB14B207507 - 520311042116525503411B3B1E28EC90B079AC50C1B0B0212CC41057FB5C50E3 - D99888C4B2CC0468651EA0B9B9F91CDE2634A9B5320F4110845849898178BDDE - E6E2E2E2A3B8104DFAD3E86670A51C8BD4E449836B174FAAA02DA84D3CF4D043 - AB11E62B7DD43C5CAC88B7CC72816E184E9AB88B156C62130441488494F581CC - 9A35ABB6A1A1610C079F09A4741C0A0A0A9EC7DD4D2ADA0AAE4D7CAF82300618 - C959ACE78D041BB0ACFCFCFC4755541004A15D90923E1014889627D1EFE3E094 - B6D606B2A50F044C9C38F12A3607DBD7B3B4B4B46CCECBCB9B505F5FFF1AFFF6 - A15C23B98A4D25EC83825CA3B97AEEDCB937A968C26453FE0882D0F10967203F - F320E1B7C47281F83D17880355D4800BDCDB380DAFD04898440BC8541488EA65 - 8A4B38D8D6E7373EAEADAD3D2419DF06C9A6FC1104A1E363DB84C506F05B1E24 - FA9A0B34D95C1C08EEA0ADE6D15650B82ACD50496D026FCFE59A059E1C5F1B48 - 4988B55846B23F2C9508C9CE1F41103A3EEDEACA13059C0AC605AEB0D5BCD773 - 787A2035399C73CE39BBB85CAEF91C8CF7EDC51F7ABDDEF1BAB33D196463FE08 - 82D071C9A50709535238C200F03A10AEB5FD2552C7BA06D3605ACC934CF34802 - 621E8220C485B47D27912953A67465834067F96816FA90F6413AF3190B4D5D0B - B9B6F2E8030F3C5069A40A822008822008822008822008822008822008822008 - 8220088220088220088220088220088220088220088220088220088220088220 - 0882200882200882200882200882200882200882200882200882200882200882 - 2008822008822008822008822008822008822008822008822008822008822008 - 8220088220088220088220088220088220088220088220088220088220088220 - 0882200882200882200882200882200882200882204484E8FF01B1221AA5ED01 - 97650000000049454E44AE42608200000756697369626C650800005450463007 - 544C61796F757400095374796C654E616D65061A4D656D6F314D656D6F315363 - 726F6C6C4261725374796C6531310756697369626C6508085461624F72646572 - 0203000754427574746F6E00095374796C654E616D65060A6C65667462757474 - 6F6E05416C69676E07044C656674064C6F636B6564090A506F736974696F6E2E - 5905000000000000008003400A53697A652E5769647468050000000000000080 - 03400B53697A652E48656967687405000000000000009003401453697A652E50 - 6C6174666F726D44656661756C74080B5374796C654C6F6F6B75700613736372 - 6F6C6C6261726C656674627574746F6E00000754427574746F6E00095374796C - 654E616D65060B7269676874627574746F6E05416C69676E0705526967687406 - 4C6F636B6564090A506F736974696F6E2E5805000000000000008804400A506F - 736974696F6E2E5905000000000000008003400A53697A652E57696474680500 - 0000000000008003400B53697A652E4865696768740500000000000000900340 - 1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B - 757006147363726F6C6C6261727269676874627574746F6E0000075442757474 - 6F6E00095374796C654E616D650609746F70627574746F6E05416C69676E0703 - 546F70064C6F636B6564090A53697A652E57696474680500000000000000C804 - 400B53697A652E48656967687405000000000000008003401453697A652E506C - 6174666F726D44656661756C74080B5374796C654C6F6F6B757006127363726F - 6C6C626172746F70627574746F6E00000754427574746F6E00095374796C654E - 616D65060C626F74746F6D627574746F6E05416C69676E0706426F74746F6D06 - 4C6F636B6564090A506F736974696F6E2E5905000000000000008804400A5369 - 7A652E57696474680500000000000000C804400B53697A652E48656967687405 - 000000000000008003401453697A652E506C6174666F726D44656661756C7408 - 0B5374796C654C6F6F6B757006157363726F6C6C626172626F74746F6D627574 - 746F6E00000654547261636B00095374796C654E616D65060668747261636B05 - 416C69676E0706436C69656E74064C6F636B6564090B4F7269656E746174696F - 6E070A486F72697A6F6E74616C0A53697A652E57696474680500000000000000 - 9003400B53697A652E48656967687405000000000000009003401453697A652E - 506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006147363 - 726F6C6C62617268747261636B7374796C6500000654547261636B0009537479 - 6C654E616D65060676747261636B05416C69676E0706436C69656E74064C6F63 - 6B6564090B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A - 652E576964746805000000000000009003400B53697A652E4865696768740500 - 0000000000009003401453697A652E506C6174666F726D44656661756C74080B - 5374796C654C6F6F6B757006147363726F6C6C62617276747261636B7374796C - 650000005450463007544C61796F757400095374796C654E616D6506144D656D - 6F315363726F6C6C4261725374796C65310756697369626C6508085461624F72 - 6465720204000754427574746F6E00095374796C654E616D65060A6C65667462 - 7574746F6E05416C69676E07044C656674064C6F636B6564090A506F73697469 - 6F6E2E5905000000000000008003400A53697A652E5769647468050000000000 - 00008003400B53697A652E48656967687405000000000000009003401453697A - 652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75700613 - 7363726F6C6C6261726C656674627574746F6E00000754427574746F6E000953 - 74796C654E616D65060B7269676874627574746F6E05416C69676E0705526967 - 6874064C6F636B6564090A506F736974696F6E2E580500000000000000880440 - 0A506F736974696F6E2E5905000000000000008003400A53697A652E57696474 - 6805000000000000008003400B53697A652E4865696768740500000000000000 - 9003401453697A652E506C6174666F726D44656661756C74080B5374796C654C - 6F6F6B757006147363726F6C6C6261727269676874627574746F6E0000075442 - 7574746F6E00095374796C654E616D650609746F70627574746F6E05416C6967 - 6E0703546F70064C6F636B6564090A53697A652E576964746805000000000000 - 00C804400B53697A652E48656967687405000000000000008003401453697A65 - 2E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570061273 - 63726F6C6C626172746F70627574746F6E00000754427574746F6E0009537479 - 6C654E616D65060C626F74746F6D627574746F6E05416C69676E0706426F7474 - 6F6D064C6F636B6564090A506F736974696F6E2E590500000000000000880440 - 0A53697A652E57696474680500000000000000C804400B53697A652E48656967 - 687405000000000000008003401453697A652E506C6174666F726D4465666175 - 6C74080B5374796C654C6F6F6B757006157363726F6C6C626172626F74746F6D - 627574746F6E00000654547261636B00095374796C654E616D65060668747261 - 636B05416C69676E0706436C69656E74064C6F636B6564090B4F7269656E7461 - 74696F6E070A486F72697A6F6E74616C0A53697A652E57696474680500000000 - 0000009003400B53697A652E4865696768740500000000000000900340145369 - 7A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B757006 - 147363726F6C6C62617268747261636B7374796C6500000654547261636B0009 - 5374796C654E616D65060676747261636B05416C69676E0706436C69656E7406 - 4C6F636B6564090B4F7269656E746174696F6E070A486F72697A6F6E74616C0A - 53697A652E576964746805000000000000009003400B53697A652E4865696768 - 7405000000000000009003401453697A652E506C6174666F726D44656661756C - 74080B5374796C654C6F6F6B757006147363726F6C6C62617276747261636B73 - 74796C650000005450463007544C61796F757400095374796C654E616D65061F - 4D656D6F314D656D6F31536D616C6C5363726F6C6C4261725374796C65313107 - 56697369626C6508085461624F726465720205000654547261636B0009537479 - 6C654E616D65060668747261636B05416C69676E0706436C69656E74064C6F63 - 6B6564090B4F7269656E746174696F6E070A486F72697A6F6E74616C0A53697A - 652E57696474680500000000000000C804400B53697A652E4865696768740500 - 000000000000C804401453697A652E506C6174666F726D44656661756C74080B - 5374796C654C6F6F6B757006147363726F6C6C62617268747261636B7374796C - 6500000654547261636B00095374796C654E616D65060676747261636B05416C - 69676E0706436C69656E74064C6F636B6564090B4F7269656E746174696F6E07 - 0A486F72697A6F6E74616C0A53697A652E57696474680500000000000000C804 - 400B53697A652E4865696768740500000000000000C804401453697A652E506C - 6174666F726D44656661756C74080B5374796C654C6F6F6B757006147363726F - 6C6C62617276747261636B7374796C650000005450463007544C61796F757400 - 095374796C654E616D6506194D656D6F31536D616C6C5363726F6C6C42617253 - 74796C65310756697369626C6508085461624F72646572020600065454726163 - 6B00095374796C654E616D65060668747261636B05416C69676E0706436C6965 - 6E74064C6F636B6564090B4F7269656E746174696F6E070A486F72697A6F6E74 - 616C0A53697A652E57696474680500000000000000C804400B53697A652E4865 - 696768740500000000000000C804401453697A652E506C6174666F726D446566 - 61756C74080B5374796C654C6F6F6B757006147363726F6C6C62617268747261 - 636B7374796C6500000654547261636B00095374796C654E616D650606767472 - 61636B05416C69676E0706436C69656E74064C6F636B6564090B4F7269656E74 - 6174696F6E070A486F72697A6F6E74616C0A53697A652E576964746805000000 - 00000000C804400B53697A652E4865696768740500000000000000C804401453 - 697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B7570 - 06147363726F6C6C62617276747261636B7374796C65000000} end end diff --git a/uSaveUnitForm.pas b/uSaveUnitForm.pas index 0e81fc7..3b5ec7b 100644 --- a/uSaveUnitForm.pas +++ b/uSaveUnitForm.pas @@ -5,7 +5,7 @@ interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, - FMX.Layouts, FMX.Memo; + FMX.Layouts, FMX.Memo, FMX.Controls.Presentation, FMX.ScrollBox; type TSaveUnitForm = class(TForm) @@ -18,10 +18,8 @@ TSaveUnitForm = class(TForm) StyleBook1: TStyleBook; procedure btnCloseClick(Sender: TObject); procedure btnSaveClick(Sender: TObject); - procedure Memo1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; - Shift: TShiftState); - procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; - Shift: TShiftState); + procedure Memo1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); + procedure FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure FormShow(Sender: TObject); private { Private declarations } @@ -45,14 +43,12 @@ procedure TSaveUnitForm.btnCloseClick(Sender: TObject); procedure TSaveUnitForm.btnSaveClick(Sender: TObject); begin - if sd.Execute then - begin - - end; + if not sd.Execute then + exit; + Memo1.Lines.SaveToFile(sd.FileName); end; -procedure TSaveUnitForm.FormKeyDown(Sender: TObject; var Key: Word; - var KeyChar: Char; Shift: TShiftState); +procedure TSaveUnitForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = 27 then ModalResult := mrCancel; @@ -60,14 +56,13 @@ procedure TSaveUnitForm.FormKeyDown(Sender: TObject; var Key: Word; procedure TSaveUnitForm.FormShow(Sender: TObject); begin - SaveUnitForm.width := MainForm.Width - 50; - SaveUnitForm.height := MainForm.Height - 50; - SaveUnitForm.left := MainForm.Left + 25; - SaveUnitForm.top := MainForm.Top + 25; + SaveUnitForm.width := MainForm.width - 50; + SaveUnitForm.height := MainForm.height - 50; + SaveUnitForm.left := MainForm.left + 25; + SaveUnitForm.top := MainForm.top + 25; end; -procedure TSaveUnitForm.Memo1KeyUp(Sender: TObject; var Key: Word; - var KeyChar: Char; Shift: TShiftState); +procedure TSaveUnitForm.Memo1KeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = 27 then ModalResult := mrCancel; diff --git a/uUpdate.pas b/uUpdate.pas index 6f37047..fb9bcee 100644 --- a/uUpdate.pas +++ b/uUpdate.pas @@ -1,27 +1,32 @@ unit uUpdate; interface + uses REST.Client, uGitHub, REST.JSON, JSON, - IPPeerClient, SysUtils, System.Threading, Classes, Pkg.Json.Mapper; + IPPeerClient, SysUtils, System.Threading, Classes, Pkg.JSON.Mapper; const - ProgramVersion : double = 0.65; + ProgramVersion: double = 0.65; UpdateUrl = 'https://api.github.com/repos/PKGeorgiev/Delphi-JsonToDelphiClass/releases'; ProgramUrl = 'https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass'; function InternalCheckForUpdate: TObject; procedure NewCheckForUpdateTask(AOnFinish: TProc); +var + PointDsFormatSettings: TFormatSettings; + implementation -uses Math; + +uses + Math; function InternalCheckForUpdate: TObject; var LRestClient: TRESTClient; LRestRequest: TRESTRequest; LRestResponse: TRESTResponse; - LRelease, - LResult: TObject; + LRelease, LResult: TObject; LJsonArray: TJsonArray; LJsonValue: TJsonValue; LTag: double; @@ -43,7 +48,7 @@ function InternalCheckForUpdate: TObject; if LRestResponse.StatusCode = 200 then begin - LJsonArray := TJSONObject.ParseJSONValue(LRestResponse.Content) as TJSONArray; + LJsonArray := TJSONObject.ParseJSONValue(LRestResponse.Content) as TJsonArray; try for LJsonValue in LJsonArray do begin @@ -80,7 +85,7 @@ function InternalCheckForUpdate: TObject; on e: Exception do begin LResult := TErrorClass.Create; - (LResult as TErrorClass).message := e.Message; + (LResult as TErrorClass).message := e.message; end; end; @@ -94,7 +99,7 @@ procedure NewCheckForUpdateTask(AOnFinish: TProc); var LResult: TObject; begin - // Asynchronously check for update + // Asynchronously check for update LResult := InternalCheckForUpdate(); try // Execute AOnFinish in the context of the Main Thread @@ -102,12 +107,15 @@ procedure NewCheckForUpdateTask(AOnFinish: TProc); procedure begin AOnFinish(LResult); - end - ); + end); except end; - end - ); + end); end; +initialization + +PointDsFormatSettings := TFormatSettings.Create(); +PointDsFormatSettings.DecimalSeparator := '.'; + end. From d9b93313bb5ae8b0abd220619ef14577f62949ae Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Fri, 20 Dec 2019 20:27:05 +0100 Subject: [PATCH 002/129] Update README.md --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a04580f..d936431 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,17 @@ Delphi-JsonToDelphiClass ======================== +## This is a fork of Petar Georgiev original work ## + +Lots of changes in this version: +* Only floating poiunt numbers are mapped to Double +* Numbers are mapped to Integer or Int64 depending on their size +* Generated code restructored, and simplified +* Generated classes inheriteds from TJsonDTO +* Socurce Code restructored +* Parser logic are seperated from GUI logic +* Fixed bug in the RegEx for recognizing an ISO8601 Date + Generates Delphi Classes based on JSON string. Just like XML Data Binding, but for JSON. Main features: @@ -16,7 +27,8 @@ Main features: - Adds helper serialization/deserialization functions; - Serialization and deserialization results in the same JSON structure! - Automatically detects date/datetime parts and maps them to TDate/TDateTime (as long as dates are ISO8601 compliant); -- Maps all numbers to Double; +- Maps floating point numbers to Double +- Maps Number to Integer or Int64 depending on the number - Maps true/false values to Boolean; - Allows you to change property names (keys); - Allows you to change the names of the stub classes; From c7519214abdf00dffac73b439220df54effabd4c Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Fri, 20 Dec 2019 20:28:55 +0100 Subject: [PATCH 003/129] Added missing Pkg.Json.DTO; --- Pkg.Json.DTO.pas | 71 ++++++++++++++++++++++++++++++++++++ Win32/Debug/Pkg.Json.DTO.pas | 20 +++++----- 2 files changed, 81 insertions(+), 10 deletions(-) create mode 100644 Pkg.Json.DTO.pas diff --git a/Pkg.Json.DTO.pas b/Pkg.Json.DTO.pas new file mode 100644 index 0000000..059555b --- /dev/null +++ b/Pkg.Json.DTO.pas @@ -0,0 +1,71 @@ +unit Pkg.Json.DTO; + +interface + +uses + Rest.Json; + +type + TJsonDTO = class + private + FOptions: TJsonOptions; + function GetAsJson: string; + procedure SetAsJson(const Value: string); + public + constructor Create; overload; + constructor Create(const aJson: string; AOptions: TJsonOptions = [joDateIsUTC, joDateFormatISO8601]); overload; + property AsJson: string read GetAsJson write SetAsJson; + end; + +implementation + +uses + System.Json, System.Sysutils, Rest.JsonReflect, System.JSONConsts; + +{ TJsonDTO } + +constructor TJsonDTO.Create(const aJson: string; AOptions: TJsonOptions); +begin + inherited Create; + FOptions := AOptions; + AsJson := aJson; +end; + +constructor TJsonDTO.Create; +begin + inherited; + FOptions := [joDateIsUTC, joDateFormatISO8601]; +end; + +function TJsonDTO.GetAsJson: string; +begin + Result := TJson.ObjectToJsonString(Self, FOptions); +end; + +procedure TJsonDTO.SetAsJson(const Value: string); +var + Json: string; + JSONValue: TJSONValue; + JSONObject: TJSONObject; +begin + JSONValue := TJSONObject.ParseJSONValue(Value); + try + if Assigned(JSONValue) and (JSONValue is TJSONObject) then + JSONObject := JSONValue as TJSONObject + else + begin + Json := Value.Trim; + if (Json = '') and not Assigned(JSONValue) or (Json <> '') and Assigned(JSONValue) and JSONValue.Null then + Exit + else + raise EConversionError.Create(SCannotCreateObject); + end; + + TJson.JsonToObject(Self, JSONObject, FOptions); + + finally + JSONValue.Free; + end; +end; + +end. diff --git a/Win32/Debug/Pkg.Json.DTO.pas b/Win32/Debug/Pkg.Json.DTO.pas index 4193f90..059555b 100644 --- a/Win32/Debug/Pkg.Json.DTO.pas +++ b/Win32/Debug/Pkg.Json.DTO.pas @@ -44,27 +44,27 @@ function TJsonDTO.GetAsJson: string; procedure TJsonDTO.SetAsJson(const Value: string); var - LJson: string; - LJSONValue: TJSONValue; - LJSONObject: TJSONObject; + Json: string; + JSONValue: TJSONValue; + JSONObject: TJSONObject; begin - LJSONValue := TJSONObject.ParseJSONValue(Value); + JSONValue := TJSONObject.ParseJSONValue(Value); try - if Assigned(LJSONValue) and (LJSONValue is TJSONObject) then - LJSONObject := LJSONValue as TJSONObject + if Assigned(JSONValue) and (JSONValue is TJSONObject) then + JSONObject := JSONValue as TJSONObject else begin - LJson := Value.Trim; - if (LJson = '') and not Assigned(LJSONValue) or (LJson <> '') and Assigned(LJSONValue) and LJSONValue.Null then + Json := Value.Trim; + if (Json = '') and not Assigned(JSONValue) or (Json <> '') and Assigned(JSONValue) and JSONValue.Null then Exit else raise EConversionError.Create(SCannotCreateObject); end; - TJson.JsonToObject(Self, LJSONObject, FOptions); + TJson.JsonToObject(Self, JSONObject, FOptions); finally - LJSONValue.Free; + JSONValue.Free; end; end; From dda52da10463b855b270ae9d5ae4107ea8e0bb96 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sat, 28 Dec 2019 07:34:29 +0100 Subject: [PATCH 004/129] Added support for annotations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed bug one “Hyphens are not allowed!” with this simple example: { "web-app": {} }. --- JSON_PAS.rc | 1 + JSON_PAS.res | Bin 0 -> 4532 bytes JsonToDelphiClass.dpr | 4 +- JsonToDelphiClass.dproj | 3 + JsonToDelphiClass.skincfg | 100 ++++++++--------- Pkg.Json.DTO.pas | 109 ++++++++++++++++--- Pkg.Json.Mapper.pas | 159 +++++++++++++++++++++------ ProjectGroup1.groupproj | 48 +++++++++ uMainForm.fmx | 219 +++++++++++++++++--------------------- uMainForm.pas | 4 +- uSaveUnitForm.pas | 21 +++- 11 files changed, 448 insertions(+), 220 deletions(-) create mode 100644 JSON_PAS.rc create mode 100644 JSON_PAS.res create mode 100644 ProjectGroup1.groupproj diff --git a/JSON_PAS.rc b/JSON_PAS.rc new file mode 100644 index 0000000..b7067d4 --- /dev/null +++ b/JSON_PAS.rc @@ -0,0 +1 @@ +JsonDTO PAS Pkg.Json.DTO.pas diff --git a/JSON_PAS.res b/JSON_PAS.res new file mode 100644 index 0000000000000000000000000000000000000000..17db66ae345eff057c81408e3fa4df32c527f5c0 GIT binary patch literal 4532 zcmcIn-*4MC5Y}^mJnTQXm%=vY327gOA!!GAj#D_uY@^opupk%|n@-p%l0i{vjiP^h zcX#|DN>&qh#SA18De~^SyYG(2D2gJ$zb{|RAHFtzw?9PD3C=8{QMAP8CH|jBv*qEa53NV zu2Zwrj!*{RZ&T$g6W$6vDoNBSlv>IB&Mw%hVkOp<60meD`hTWbCEU7!UC7E&vs=DU zLhIcEMd?K8JD_V(+%P&E(32 zZiP(Hs#@tn!B`25_dd$KC4JrnX(Q4Ygf5Dp<=5|va}+!+|47C|FoTOiJ*0ZNod5Fk z$;+FsxyBPK;DHTDK(c{j(H?Xp(pD(FgC;8h4PDn{g%3*VfSMc~kyDf~{T{ZNctFym z#Q%;Q#8j-b%rFUk-n|nW$}*pR1bIweG)ecVPPfk_FpPmq#MlJmTRcr_>j}QH+zqCxg9)-kZ{f%| z3-rBU!g%4(s;2R1z3v-t&Nt)xRP}q%8ya*2RNed3b7gdcMZ{rNsLD0` z1TSG-5Ip(?Zsj^3AZ+ZVkL9(z8MZ(UQ7^H;+tt|RH9FYVG2d+JXKN~Qh>(k{6d*gj z%Z1uIw_%_u?Tocu|u8D$=^&BrtdY!lswj?Z{QElAIn&;xe-?~HK1KQ#SX2Tt0rw-)*yi-ybe+{$PkyE zlp{?uubabq&kdLHMnm+(TFl>Jk4uKDi)}?;<4uP@F{xj%PjA?#PNFHM`?Wntdh5H+ zL*3U$L&_^j9i8p)G8`~^60l!}gPK`y=JUb~X}djXS&CLWlR91;FQ$N1rSM-d z+z8nP((lIOcLRPAy#5t(nFYn5Rq<$L-!I3mf!kQJ(@EaQJk2tT4QkQxg%X01V==M~ z3kk0e##&aKh>yls4QaswFU*K?0uMP0|F7np+Ybs!GWmURHA?7&?!72aUz9{zTNSQk z?k^JTjG6e*#S)*k_WL13*ypGtS{y{o3dG}uv%-aqfRPf@?Dm}vL%0r#OWmyax;unK z$%np`%7GhTkIXeHWP)4J3LLF-s!ezs2X{x}Qqs~6R)O5j3(YsDfU`~@KkKT|szTH& z&8e^Ezri)JJ((~&4r6Bqc0{I?eSs;sL;pPZ+<3wS*Y==&t0^BRF?8C z7wbAF2ax7#sK>1)Y7qD-1W4*@ENP?hB2!EUVctA=nr2|Mn_psL1BZsbAwY9?rc~$| zWE8J1)Yy;NwOE7P;;w~co<|zbs;phECLg6XKts@kN2L7N_qUc}J+k3G9 literal 0 HcmV?d00001 diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr index c7d70ce..411eeff 100644 --- a/JsonToDelphiClass.dpr +++ b/JsonToDelphiClass.dpr @@ -1,5 +1,7 @@ program JsonToDelphiClass; +{$R 'JSON_PAS.res' 'JSON_PAS.rc'} + uses System.StartUpCopy, FMX.Forms, @@ -7,7 +9,7 @@ uses Pkg.Json.Mapper in 'Pkg.Json.Mapper.pas', uSaveUnitForm in 'uSaveUnitForm.pas' {SaveUnitForm}, uGitHub in 'uGitHub.pas', - FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {/ IdSSLOpenSSLHeaders,}, + FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas', uUpdate in 'uUpdate.pas', uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, Pkg.Json.Visualizer in 'Pkg.Json.Visualizer.pas'; diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index 068aef2..80062e2 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -123,6 +123,9 @@ MainSource + +
JSON_PAS.res
+
MainForm
fmx diff --git a/JsonToDelphiClass.skincfg b/JsonToDelphiClass.skincfg index 94b8805..e074481 100644 --- a/JsonToDelphiClass.skincfg +++ b/JsonToDelphiClass.skincfg @@ -1,57 +1,57 @@ [ExpressSkins] Default=1 -ShowNotifications=0 +ShowNotifications=1 Enabled=0 -dxSkinBlack=0 -dxSkinBlue=0 -dxSkinBlueprint=0 -dxSkinCaramel=0 -dxSkinCoffee=0 -dxSkinDarkroom=0 -dxSkinDarkSide=0 -dxSkinDevExpressDarkStyle=0 -dxSkinDevExpressStyle=0 -dxSkinFoggy=0 -dxSkinGlassOceans=0 -dxSkinHighContrast=0 -dxSkiniMaginary=0 +dxSkinBlack=1 +dxSkinBlue=1 +dxSkinBlueprint=1 +dxSkinCaramel=1 +dxSkinCoffee=1 +dxSkinDarkroom=1 +dxSkinDarkSide=1 +dxSkinDevExpressDarkStyle=1 +dxSkinDevExpressStyle=1 +dxSkinFoggy=1 +dxSkinGlassOceans=1 +dxSkinHighContrast=1 +dxSkiniMaginary=1 dxSkinLilian=1 dxSkinLiquidSky=1 dxSkinLondonLiquidSky=1 dxSkinMcSkin=1 -dxSkinMetropolis=0 -dxSkinMetropolisDark=0 -dxSkinMoneyTwins=0 -dxSkinOffice2007Black=0 -dxSkinOffice2007Blue=0 -dxSkinOffice2007Green=0 -dxSkinOffice2007Pink=0 -dxSkinOffice2007Silver=0 -dxSkinOffice2010Black=0 -dxSkinOffice2010Blue=0 -dxSkinOffice2010Silver=0 -dxSkinOffice2013DarkGray=0 -dxSkinOffice2013LightGray=0 -dxSkinOffice2013White=0 -dxSkinOffice2016Colorful=0 -dxSkinOffice2016Dark=0 -dxSkinOffice2019Colorful=0 -dxSkinPumpkin=0 -dxSkinSeven=0 -dxSkinSevenClassic=0 -dxSkinSharp=0 -dxSkinSharpPlus=0 -dxSkinSilver=0 -dxSkinSpringtime=0 -dxSkinStardust=0 -dxSkinSummer2008=0 -dxSkinTheAsphaltWorld=0 -dxSkinTheBezier=0 -dxSkinsDefaultPainters=0 -dxSkinValentine=0 -dxSkinVisualStudio2013Blue=0 -dxSkinVisualStudio2013Dark=0 -dxSkinVisualStudio2013Light=0 -dxSkinVS2010=0 -dxSkinWhiteprint=0 -dxSkinXmas2008Blue=0 +dxSkinMetropolis=1 +dxSkinMetropolisDark=1 +dxSkinMoneyTwins=1 +dxSkinOffice2007Black=1 +dxSkinOffice2007Blue=1 +dxSkinOffice2007Green=1 +dxSkinOffice2007Pink=1 +dxSkinOffice2007Silver=1 +dxSkinOffice2010Black=1 +dxSkinOffice2010Blue=1 +dxSkinOffice2010Silver=1 +dxSkinOffice2013DarkGray=1 +dxSkinOffice2013LightGray=1 +dxSkinOffice2013White=1 +dxSkinOffice2016Colorful=1 +dxSkinOffice2016Dark=1 +dxSkinOffice2019Colorful=1 +dxSkinPumpkin=1 +dxSkinSeven=1 +dxSkinSevenClassic=1 +dxSkinSharp=1 +dxSkinSharpPlus=1 +dxSkinSilver=1 +dxSkinSpringtime=1 +dxSkinStardust=1 +dxSkinSummer2008=1 +dxSkinTheAsphaltWorld=1 +dxSkinTheBezier=1 +dxSkinsDefaultPainters=1 +dxSkinValentine=1 +dxSkinVisualStudio2013Blue=1 +dxSkinVisualStudio2013Dark=1 +dxSkinVisualStudio2013Light=1 +dxSkinVS2010=1 +dxSkinWhiteprint=1 +dxSkinXmas2008Blue=1 diff --git a/Pkg.Json.DTO.pas b/Pkg.Json.DTO.pas index 059555b..be08940 100644 --- a/Pkg.Json.DTO.pas +++ b/Pkg.Json.DTO.pas @@ -3,31 +3,35 @@ interface uses - Rest.Json; + System.Classes, System.Json, Rest.Json, System.Generics.Collections; type TJsonDTO = class private FOptions: TJsonOptions; function GetAsJson: string; - procedure SetAsJson(const Value: string); + procedure SetAsJson(Value: string); + class procedure PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; + class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); public constructor Create; overload; - constructor Create(const aJson: string; AOptions: TJsonOptions = [joDateIsUTC, joDateFormatISO8601]); overload; + constructor Create(const aJson: string; aOptions: TJsonOptions = [joDateIsUTC, joDateFormatISO8601]); overload; + class function PrettyPrintJSON(aJson: string): string; overload; property AsJson: string read GetAsJson write SetAsJson; end; implementation uses - System.Json, System.Sysutils, Rest.JsonReflect, System.JSONConsts; + System.Sysutils, Rest.JsonReflect, System.JSONConsts; { TJsonDTO } -constructor TJsonDTO.Create(const aJson: string; AOptions: TJsonOptions); +constructor TJsonDTO.Create(const aJson: string; aOptions: TJsonOptions); begin inherited Create; - FOptions := AOptions; + FOptions := aOptions; AsJson := aJson; end; @@ -42,10 +46,92 @@ function TJsonDTO.GetAsJson: string; Result := TJson.ObjectToJsonString(Self, FOptions); end; -procedure TJsonDTO.SetAsJson(const Value: string); +const + INDENT_SIZE = 2; + +class procedure TJsonDTO.PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer); +var + i: Integer; + Ident: Integer; +begin + Ident := Indent + INDENT_SIZE; + i := 0; + + if aJSONValue is TJSONObject then + begin + aOutputStrings.Add(StringOfChar(' ', Ident) + '{'); + for i := 0 to TJSONObject(aJSONValue).Count - 1 do + PrettyPrintPair(TJSONObject(aJSONValue).Pairs[i], aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident); + + aOutputStrings.Add(StringOfChar(' ', Ident) + '}'); + end + else if aJSONValue is TJSONArray then + PrettyPrintArray(TJSONArray(aJSONValue), aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident) + else + aOutputStrings.Add(StringOfChar(' ', Ident) + aJSONValue.ToString); +end; + +class procedure TJsonDTO.PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +var + i: Integer; +begin + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); + + for i := 0 to aJSONValue.Count - 1 do + begin + PrettyPrintJSON(aJSONValue.Items[i], aOutputStrings, Indent); + if i < aJSONValue.Count - 1 then + aOutputStrings[aOutputStrings.Count - 1] := aOutputStrings[aOutputStrings.Count - 1] + ','; + end; + + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); +end; + +class function TJsonDTO.PrettyPrintJSON(aJson: string): string; +var + StringList: TStringlist; + JSONValue: TJsonValue; +begin + StringList := TStringlist.Create; + try + JSONValue := TJSONObject.ParseJSONValue(aJson); + try + if JSONValue <> nil then + PrettyPrintJSON(JSONValue, StringList); + finally + JSONValue.Free; + end; + + Result := StringList.Text; + finally + StringList.Free; + end; +end; + +class procedure TJsonDTO.PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +const + TEMPLATE = '%s:%s'; +var + Line: string; + NewList: TStringlist; +begin + NewList := TStringlist.Create; + try + PrettyPrintJSON(aJSONValue.JSONValue, NewList, Indent); + Line := Format(TEMPLATE, [aJSONValue.JsonString.ToString, Trim(NewList.Text)]); + finally + NewList.Free; + end; + + Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; + if not Last then + Line := Line + ','; + aOutputStrings.Add(Line); +end; + +procedure TJsonDTO.SetAsJson(Value: string); var - Json: string; - JSONValue: TJSONValue; + JSONValue: TJsonValue; JSONObject: TJSONObject; begin JSONValue := TJSONObject.ParseJSONValue(Value); @@ -54,15 +140,14 @@ procedure TJsonDTO.SetAsJson(const Value: string); JSONObject := JSONValue as TJSONObject else begin - Json := Value.Trim; - if (Json = '') and not Assigned(JSONValue) or (Json <> '') and Assigned(JSONValue) and JSONValue.Null then + Value := Value.Trim; + if (Value = '') and not Assigned(JSONValue) or (Value <> '') and Assigned(JSONValue) and JSONValue.Null then Exit else raise EConversionError.Create(SCannotCreateObject); end; TJson.JsonToObject(Self, JSONObject, FOptions); - finally JSONValue.Free; end; diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index edd2c49..782906f 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -7,6 +7,7 @@ interface System.Classes, Generics.Collections, Generics.Defaults; type +{$M+} EJsonMapper = class(Exception); TJsonType = (jtUnknown, jtObject, jtArray, jtString, jtTrue, jtFalse, jtNumber, jtDate, jtDateTime, jtBytes, jtInteger, jtInteger64); @@ -14,18 +15,36 @@ EJsonMapper = class(Exception); TStubClass = class; TPkgJsonMapper = class; - TStubField = class + TSOJName = class + private + FJsonName: string; + FDelphiName: string; + FNeedsAttribute: Boolean; + protected + function CapitaiazeFirst(const Value: string): string; + published + property JsonName: string read FJsonName; + property DelphiName: string read FDelphiName; + property NeedsAttribute: Boolean read FNeedsAttribute; + public + constructor Create(aItemName: string); reintroduce; + function NameAttribute: string; + end; + + TStubField = class(TSOJName) private FName: string; FPropertyName: string; FFieldName: string; FFieldType: TJsonType; FParentClass: TStubClass; + FJsonFieldName: string; procedure SetName(const Value: string); public constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); - property name: string read FName write SetName; property FieldName: string read FFieldName write FFieldName; + property name: string read FName; + property JsonFieldName: string read FJsonFieldName write FJsonFieldName; property PropertyName: string read FPropertyName write FPropertyName; property FieldType: TJsonType read FFieldType write FFieldType; function GetTypeAsString: string; overload; virtual; @@ -53,7 +72,7 @@ TStubArrayField = class(TStubContainerField) function GetTypeAsString: string; override; end; - TStubClass = class + TStubClass = class(TSOJName) private FItems: TObjectList; FComplexItems, FArrayItems: TList; @@ -71,6 +90,7 @@ TStubClass = class constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); destructor Destroy; override; property name: string read FName write SetName; + property Items: TObjectList read FItems write FItems; function GetDeclarationPart(const BaseClass: string): string; function GetImplementationPart: string; @@ -108,7 +128,7 @@ procedure PrettyPrintJSON(JSONValue: TJsonValue; OutputStrings: TStrings; Indent implementation uses - System.RegularExpressions, System.StrUtils, + System.RegularExpressions, System.StrUtils, System.Character, uUpdate; var @@ -276,9 +296,30 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: function TPkgJsonMapper.GenerateUnit: string; var StubClass: TStubClass; + StubField: TStubField; k: Integer; StringList: TStringList; + NeedsAttribute: Boolean; begin + NeedsAttribute := false; + for StubClass in FStubClasses do + begin + if StubClass.NeedsAttribute then + begin + NeedsAttribute := True; + Break; + end; + + for StubField in StubClass.Items do + if StubField.NeedsAttribute then + begin + NeedsAttribute := True; + Break; + end; + + if NeedsAttribute then + Break; + end; StringList := TStringList.Create; try @@ -287,7 +328,7 @@ function TPkgJsonMapper.GenerateUnit: string; StringList.Add('interface'); StringList.Add(''); StringList.Add('uses'); - StringList.Add(' Pkg.Json.DTO;'); + StringList.Add(' Pkg.Json.DTO' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); StringList.Add(''); StringList.Add('{$M+}'); StringList.Add(''); @@ -489,9 +530,9 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string); begin - inherited Create; + inherited Create(aClassName); FMapper := aMapper; - name := aClassName; + SetName(DelphiName); FItems := TObjectList.Create; FComplexItems := TList.Create; @@ -559,7 +600,7 @@ function TStubClass.GetImplementationPart: string; begin Lines.Add('var'); for StubField in FArrayItems do - Lines.AddFormat(' %sItem: %s;', [StubField.FName, (StubField as TStubContainerField).FFieldClass.Name]); + Lines.AddFormat(' %sItem: %s;', [StubField.FName, (StubField as TStubContainerField).FieldClass.Name]); end; Lines.Add('begin'); @@ -568,8 +609,8 @@ function TStubClass.GetImplementationPart: string; begin for StubField in FArrayItems do begin - Lines.AddFormat(' for %sItem in %s do', [StubField.FName, StubField.FieldName]); - Lines.AddFormat(' %sItem.Free;', [StubField.FName]); + Lines.AddFormat(' for %sItem in %s do', [StubField.Name, StubField.FieldName]); + Lines.AddFormat(' %sItem.Free;', [StubField.Name]); end; Lines.Add(''); end; @@ -581,7 +622,7 @@ function TStubClass.GetImplementationPart: string; Lines.Add('end;') end; - Lines.TrailingLineBreak := False; + Lines.TrailingLineBreak := false; Result := Lines.Text; finally Lines.Free; @@ -589,12 +630,9 @@ function TStubClass.GetImplementationPart: string; end; procedure TStubClass.SetName(const Value: string); -var - LName: string; begin - FPureClassName := string(Copy(Value, 1, 1)).ToUpper + Copy(Value, 2); - LName := 'T' + FPureClassName + 'DTO'; - FName := FMapper.SuggestClassName(LName); + FPureClassName := Value; + FName := FMapper.SuggestClassName('T' + FPureClassName + 'DTO'); end; procedure TStubClass.SetPureClassName(const Value: string); @@ -616,11 +654,16 @@ function TStubClass.GetDeclarationPart(const BaseClass: string): string; begin Lines := TStringList.Create; try + if NeedsAttribute then + Lines.Add(NameAttribute); Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); - Lines.Add('strict private'); + Lines.Add('private'); for StubField in FItems do begin + if StubField.NeedsAttribute then + Lines.Add(' ' + StubField.NameAttribute); + s := Format(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); Lines.Add(s); end; @@ -648,9 +691,12 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + Lines.Add('end;'); Lines.Add(''); + i := 0; + for i := 0 to Lines.Count - 1 do Lines[i] := ' ' + Lines[i]; + Lines.TrailingLineBreak := false; Result := Lines.Text; finally Lines.Free; @@ -661,16 +707,11 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + constructor TStubField.Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); begin - inherited Create; - - if aItemName.Contains('-') then - raise EJsonMapper.CreateFmt('%s: Hyphens are not allowed!', [aItemName]); + inherited Create(aItemName); FParentClass := aParentClass; FFieldType := aFieldType; - - aItemName[1] := aItemName.ToUpper[1]; - name := aItemName; + SetName(DelphiName); if FParentClass <> nil then FParentClass.FItems.Add(Self); @@ -682,7 +723,7 @@ class function TStubField.GetTypeAsString(AType: TJsonType): string; jtUnknown: Result := 'Unknown'; jtString: - Result := 'String'; + Result := 'string'; jtTrue, jtFalse: Result := 'Boolean'; jtNumber: @@ -706,16 +747,12 @@ procedure TStubField.SetName(const Value: string); FParentClass.FArrayProperty := Value; FName := Value; - - FFieldName := 'F' + string(Copy(Value, 1, 1)).ToUpper + Copy(Value, 2); + FFieldName := 'F' + DelphiName; if ReservedWords.Contains(Value.ToLower) then FPropertyName := '&' + Value else FPropertyName := Value; - - FFieldName := CapitaiazeFirst(FFieldName); - FPropertyName := CapitaiazeFirst(FPropertyName); end; function TStubField.GetTypeAsString: string; @@ -764,6 +801,68 @@ function TStubObjectField.GetTypeAsString: string; Result := FFieldClass.Name; end; +{ TSOJName } + +function TSOJName.CapitaiazeFirst(const Value: string): string; +var + List: TStringList; + s: string; + i: Integer; +begin + List := TStringList.Create; + try + ExtractStrings(['_'], [], PChar(Value), List); + for i := 0 to List.Count - 1 do + begin + s := List[i]; + if s.StartsWith('&') then + s[2] := s.ToUpper[2] + else + s[1] := s.ToUpper[1]; + List[i] := s; + end; + + List.Delimiter := '_'; + Result := List.DelimitedText; + finally + List.Free; + end; +end; + +constructor TSOJName.Create(aItemName: string); +var + s: string; + ch: Char; +begin + inherited Create; + + if aItemName.IsEmpty then + raise Exception.Create('aItemName can not be empty'); + + FNeedsAttribute := false; + FJsonName := aItemName; + + for ch in FJsonName do + if ch.IsLetterOrDigit then + s := s + ch + else + s := s + '_'; + + FNeedsAttribute := s <> FJsonName; + + if s.StartsWith('_') then + s := s.Substring(1); + + FDelphiName := CapitaiazeFirst(s); + if not FDelphiName[1].IsLetter then + FDelphiName := '_' + FDelphiName; +end; + +function TSOJName.NameAttribute: string; +begin + exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); +end; + initialization ReservedWords := TList.Create; diff --git a/ProjectGroup1.groupproj b/ProjectGroup1.groupproj new file mode 100644 index 0000000..79be8fa --- /dev/null +++ b/ProjectGroup1.groupproj @@ -0,0 +1,48 @@ + + + {353C9ED7-1E10-4228-A4AE-D6F9671EEA80} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/uMainForm.fmx b/uMainForm.fmx index da4e398..eeca38c 100644 --- a/uMainForm.fmx +++ b/uMainForm.fmx @@ -1537,135 +1537,108 @@ object MainForm: TMainForm Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] DataDetectorTypes = [] Lines.Strings = ( - '[' - ' {' + '{"web-app": {' + ' "servlet": [ ' + ' {' + ' "servlet-name": "cofaxCDS",' + ' "servlet-class": "org.cofax.cds.CDSServlet",' + ' "init-param": {' + ' "configGlossary:installationAt": "Philadelphia, PA",' + ' "configGlossary:adminEmail": "ksm@pobox.com",' + ' "configGlossary:poweredBy": "Cofax",' + ' "configGlossary:poweredByIcon": "/images/cofax.gif",' + ' "configGlossary:staticPath": "/content/static",' + ' "templateProcessorClass": "org.cofax.WysiwygTemplate",' + ' "templateLoaderClass": "org.cofax.FilesTemplateLoader",' + ' "templatePath": "templates",' + ' "templateOverridePath": "",' + ' "defaultListTemplate": "listTemplate.htm",' + ' "defaultFileTemplate": "articleTemplate.htm",' + ' "useJSP": false,' + ' "jspListTemplate": "listTemplate.jsp",' + ' "jspFileTemplate": "articleTemplate.jsp",' + ' "cachePackageTagsTrack": 200,' + ' "cachePackageTagsStore": 200,' + ' "cachePackageTagsRefresh": 60,' + ' "cacheTemplatesTrack": 100,' + ' "cacheTemplatesStore": 50,' + ' "cacheTemplatesRefresh": 15,' + ' "cachePagesTrack": 200,' + ' "cachePagesStore": 100,' + ' "cachePagesRefresh": 10,' + ' "cachePagesDirtyRead": 10,' + ' "searchEngineListTemplate": "forSearchEnginesList.htm",' + ' "searchEngineFileTemplate": "forSearchEngines.htm",' + ' "searchEngineRobotsDb": "WEB-INF/robots.db",' + ' "useDataStore": true,' + ' "dataStoreClass": "org.cofax.SqlDataStore",' + ' "redirectionClass": "org.cofax.SqlRedirection",' + ' "dataStoreName": "cofax",' - ' "url": "https://api.github.com/repos/PKGeorgiev/Delphi-JsonT' + - 'oDelphiClass/releases/821827",' + ' "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServ' + + 'erDriver",' - ' "assets_url": "https://api.github.com/repos/PKGeorgiev/Delph' + - 'i-JsonToDelphiClass/releases/821827/assets",' + ' "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:14' + + '33;DatabaseName=goon",' + ' "dataStoreUser": "sa",' + ' "dataStorePassword": "dataStoreTestQuery",' - ' "upload_url": "https://uploads.github.com/repos/PKGeorgiev/D' + - 'elphi-JsonToDelphiClass/releases/821827/assets{?name}",' + ' "dataStoreTestQuery": "SET NOCOUNT ON;select test='#39'test'#39 + + ';",' - ' "html_url": "https://github.com/PKGeorgiev/Delphi-JsonToDelp' + - 'hiClass/releases/tag/0.64",' - ' "id": 821827,' - ' "tag_name": "0.64",' - ' "target_commitish": "master",' - ' "name": "Initial Public Release.",' - ' "draft": false,' - ' "author": {' - ' "login": "PKGeorgiev",' - ' "id": 9254467,' + ' "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.lo' + + 'g",' + ' "dataStoreInitConns": 10,' + ' "dataStoreMaxConns": 100,' + ' "dataStoreConnUsageLimit": 100,' + ' "dataStoreLogLevel": "debug",' + ' "maxUrlLength": 500}},' + ' {' + ' "servlet-name": "cofaxEmail",' + ' "servlet-class": "org.cofax.cds.EmailServlet",' + ' "init-param": {' + ' "mailHost": "mail1",' + ' "mailHostOverride": "mail2"}},' + ' {' + ' "servlet-name": "cofaxAdmin",' + ' "servlet-class": "org.cofax.cds.AdminServlet"},' + ' ' + ' {' + ' "servlet-name": "fileServlet",' + ' "servlet-class": "org.cofax.cds.FileServlet"},' + ' {' + ' "servlet-name": "cofaxTools",' + ' "servlet-class": "org.cofax.cms.CofaxToolsServlet",' + ' "init-param": {' + ' "templatePath": "toolstemplates/",' + ' "log": 1,' + ' "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",' + ' "logMaxSize": "",' + ' "dataLog": 1,' + ' "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",' + ' "dataLogMaxSize": "",' - ' "avatar_url": "https://avatars.githubusercontent.com/u/925' + - '4467?v=3",' - ' "gravatar_id": "",' - ' "url": "https://api.github.com/users/PKGeorgiev",' - ' "html_url": "https://github.com/PKGeorgiev",' + ' "removePageCache": "/content/admin/remove?cache=pages&id' + + '=",' - ' "followers_url": "https://api.github.com/users/PKGeorgiev/' + - 'followers",' + ' "removeTemplateCache": "/content/admin/remove?cache=temp' + + 'lates&id=",' - ' "following_url": "https://api.github.com/users/PKGeorgiev/' + - 'following{/other_user}",' - - ' "gists_url": "https://api.github.com/users/PKGeorgiev/gist' + - 's{/gist_id}",' - - ' "starred_url": "https://api.github.com/users/PKGeorgiev/st' + - 'arred{/owner}{/repo}",' - - ' "subscriptions_url": "https://api.github.com/users/PKGeorg' + - 'iev/subscriptions",' - - ' "organizations_url": "https://api.github.com/users/PKGeorg' + - 'iev/orgs",' - - ' "repos_url": "https://api.github.com/users/PKGeorgiev/repo' + - 's",' - - ' "events_url": "https://api.github.com/users/PKGeorgiev/eve' + - 'nts{/privacy}",' - - ' "received_events_url": "https://api.github.com/users/PKGeo' + - 'rgiev/received_events",' - ' "type": "User",' - ' "site_admin": false' - ' },' - ' "prerelease": true,' - ' "created_at": "2015-01-03T18:51:51Z",' - ' "published_at": "2015-01-03T18:54:25Z",' - ' "assets": [' - ' {' - - ' "url": "https://api.github.com/repos/PKGeorgiev/Delphi-J' + - 'sonToDelphiClass/releases/assets/364101",' - ' "id": 364101,' - ' "name": "JsonToDelphiClass-0.64.zip",' - ' "label": null,' - ' "uploader": {' - ' "login": "PKGeorgiev",' - ' "id": 9254467,' - - ' "avatar_url": "https://avatars.githubusercontent.com/u' + - '/9254467?v=3",' - ' "gravatar_id": "",' - ' "url": "https://api.github.com/users/PKGeorgiev",' - ' "html_url": "https://github.com/PKGeorgiev",' - - ' "followers_url": "https://api.github.com/users/PKGeorg' + - 'iev/followers",' - - ' "following_url": "https://api.github.com/users/PKGeorg' + - 'iev/following{/other_user}",' - - ' "gists_url": "https://api.github.com/users/PKGeorgiev/' + - 'gists{/gist_id}",' - - ' "starred_url": "https://api.github.com/users/PKGeorgie' + - 'v/starred{/owner}{/repo}",' - - ' "subscriptions_url": "https://api.github.com/users/PKG' + - 'eorgiev/subscriptions",' - - ' "organizations_url": "https://api.github.com/users/PKG' + - 'eorgiev/orgs",' - - ' "repos_url": "https://api.github.com/users/PKGeorgiev/' + - 'repos",' - - ' "events_url": "https://api.github.com/users/PKGeorgiev' + - '/events{/privacy}",' - - ' "received_events_url": "https://api.github.com/users/P' + - 'KGeorgiev/received_events",' - ' "type": "User",' - ' "site_admin": false' - ' },' - ' "content_type": "application/x-zip-compressed",' - ' "state": "uploaded",' - ' "size": 4697167,' - ' "download_count": 6,' - ' "created_at": "2015-01-03T18:53:08Z",' - ' "updated_at": "2015-01-03T18:54:23Z",' - - ' "browser_download_url": "https://github.com/PKGeorgiev/D' + - 'elphi-JsonToDelphiClass/releases/download/0.64/JsonToDelphiClass' + - '-0.64.zip"' - ' }' - ' ],' - - ' "tarball_url": "https://api.github.com/repos/PKGeorgiev/Delp' + - 'hi-JsonToDelphiClass/tarball/0.64",' - - ' "zipball_url": "https://api.github.com/repos/PKGeorgiev/Delp' + - 'hi-JsonToDelphiClass/zipball/0.64",' - ' "body": "Initial Public Release."' - ' }' - ']') + ' "fileTransferFolder": "/usr/local/tomcat/webapps/content' + + '/fileTransferFolder",' + ' "lookInContext": 1,' + ' "adminGroupID": 4,' + ' "betaServer": true}}],' + ' "servlet-mapping": {' + ' "cofaxCDS": "/",' + ' "cofaxEmail": "/cofaxutil/aemail/*",' + ' "cofaxAdmin": "/admin/*",' + ' "fileServlet": "/static/*",' + ' "cofaxTools": "/tools/*"},' + ' ' + ' "taglib": {' + ' "taglib-uri": "cofax.tld",' + ' "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}') StyledSettings = [Size, Style, FontColor] TextSettings.Font.Family = 'Consolas' OnChange = Memo1Change @@ -1678,7 +1651,7 @@ object MainForm: TMainForm StyleLookup = 'Memo1Style1' TabOrder = 0 Viewport.Width = 637.000000000000000000 - Viewport.Height = 428.000000000000000000 + Viewport.Height = 444.000000000000000000 end object Label4: TLabel Align = Top diff --git a/uMainForm.pas b/uMainForm.pas index 9f22169..88d7f02 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -221,7 +221,7 @@ procedure TMainForm.actRenamePropertyExecute(Sender: TObject); if (s <> '') and (s.ToLower <> StubField.Name.ToLower) then begin FChanged := True; - StubField.Name := s; +// StubField.Name := s; JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); end; end; @@ -292,7 +292,7 @@ procedure TMainForm.FormCreate(Sender: TObject); self.Constraints.MinWidth := 1024; self.Constraints.MinHeight := 560; - Caption := 'JsonToDelphiClass - ' + FloatToStr(ProgramVersion, PointDsFormatSettings) + ' | By Petar Georgiev'; + Caption := 'JsonToDelphiClass - ' + FloatToStr(ProgramVersion, PointDsFormatSettings) + ' | By Jens Borrisholt'; FJsonMapper := TPkgJsonMapper.Create; diff --git a/uSaveUnitForm.pas b/uSaveUnitForm.pas index 3b5ec7b..8c261a5 100644 --- a/uSaveUnitForm.pas +++ b/uSaveUnitForm.pas @@ -34,7 +34,8 @@ implementation {$R *.fmx} -uses uMainForm; +uses + uMainForm, System.IoUtils; procedure TSaveUnitForm.btnCloseClick(Sender: TObject); begin @@ -42,10 +43,26 @@ procedure TSaveUnitForm.btnCloseClick(Sender: TObject); end; procedure TSaveUnitForm.btnSaveClick(Sender: TObject); +var + Buffer: TStringList; + ResourceStream: TResourceStream; begin if not sd.Execute then exit; - Memo1.Lines.SaveToFile(sd.FileName); + + Memo1.Lines.SaveToFile(sd.FileName); + + Buffer := TStringList.Create; + try + ResourceStream := TResourceStream.Create(HInstance, 'JsonDTO', 'PAS'); + ResourceStream.Position := 0; + Buffer.LoadFromStream(ResourceStream); + Buffer.SaveToFile( TPath.GetDirectoryName(sd.FileName) + TPath.DirectorySeparatorChar + 'Pkg.Json.DTO.pas' ); + finally + ResourceStream.Free; + Buffer.Free; + end; + end; procedure TSaveUnitForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); From b62a8dc2ef1bea355dc345cf50e55a48c7c1a7d0 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sun, 29 Dec 2019 17:15:12 +0100 Subject: [PATCH 005/129] Added support for Arrany Json strings Starting with an Array wasn't supported. Example : [ { "EventType": 49 }, { "EventType": 48 } ] --- .gitignore | 1 + JSON_PAS.res | Bin 4532 -> 5820 bytes Pkg.Json.DTO.pas | 79 ++++++++++++++++----- Pkg.Json.Mapper.pas | 164 ++++++++------------------------------------ uGitHub.pas | 1 - uMainForm.fmx | 1 + uMainForm.pas | 43 +++--------- uSaveUnitForm.pas | 5 +- 8 files changed, 104 insertions(+), 190 deletions(-) diff --git a/.gitignore b/.gitignore index 48e9fa6..bd3450f 100644 --- a/.gitignore +++ b/.gitignore @@ -51,4 +51,5 @@ # Delphi history and backups __history/ +__recover/ *.~* \ No newline at end of file diff --git a/JSON_PAS.res b/JSON_PAS.res index 17db66ae345eff057c81408e3fa4df32c527f5c0..4fb0b798c90c701d5eeaccb85bbaa04e9be0b636 100644 GIT binary patch delta 1638 zcmbVM!EO^V5M`kfQmc}l0KsL{99#%58yzx zU%-VQC`W|EXK>*c_yq8bz1|H~FXWK5XXcIHJkR*+#<$0x;HJ2Hv7TRi{}8ZZCwSPI z%;Z>$RKg3chqI&6`6=&fKJ6w&2SVxa;OH$MYg}%@$ZlF@MM0N?;A3$6Ok{e- zlH&EPU#o2xo-30hI@DTRd|oe}ENx!?SqhhnaOHmfzvnz%T|Q&k>M}rA&oQ$hfS+zE zHJ@wa20->T7jDV^lIxQ+CQoir)d|~M)6{3A(ZbS18OJ=;;0)4_s0S8))r5!Sl`l>IL zW^&9I5CFS#QJ&CpLPr&><6)8E%*NPyCSUQO@yImk^Tr@|7mtc!@&;$Y(t2DEF9l#bZa1GS9Iz?b;Cm&@4HJ;X5c47hg( zM!k&N_lSaI?3>CCr_Q3bn-MwyuU>oPA$$cp!C?SNf=S-TSiH~s>- CYyV9E delta 307 zcmdm^yG40|0#lOUM5X%4f0&gfF01AXOUx-vwNfZ9Day=C*W6sk*u%(~UzS>wlb@Jk zJ^2HZgt$g>eqM2jLZVl3ejZGrwL;>=3!;n)lXF>ACMPmUOqOH5I9Za#0FUB8O>17R zq}24xJYFsZh0MH+)S}Fi)D#8hqSVBaRG^%Kf}4LqNhZ)T1uI*HL?|09;aCi^94riC z0L4=CQmi*?vAA; + ElementType: TClass; + Element: TObject; begin - JSONValue := TJSONObject.ParseJSONValue(Value); + RttiContext := TRttiContext.Create; + JSONValue := TJSONObject.ParseJSONValue(aValue); try - if Assigned(JSONValue) and (JSONValue is TJSONObject) then + if not Assigned(JSONValue) then + Exit; + + if (JSONValue is TJSONArray) then + begin + RttiField := TRttiContext.Create.GetType(ClassInfo).GetField('FItems'); + Value := RttiField.GetValue(Self); + List := TObjectList(Value.AsObject); + ElementType := GetSubTypeItemClassFromList(Value.AsObject); + + for JSONValue in (JSONValue as TJSONArray) do + begin + Element := ElementType.Create; + if (JSONValue is TJSONObject) then + begin + TJson.JsonToObject(Element, TJSONObject(JSONValue), FOptions); + List.Add(Element); + end + else + Element.Free; + end; + + Exit; + end; + + if (JSONValue is TJSONObject) then JSONObject := JSONValue as TJSONObject else begin - Value := Value.Trim; - if (Value = '') and not Assigned(JSONValue) or (Value <> '') and Assigned(JSONValue) and JSONValue.Null then + aValue := aValue.Trim; + if (aValue = '') and not Assigned(JSONValue) or (aValue <> '') and Assigned(JSONValue) and JSONValue.Null then Exit else raise EConversionError.Create(SCannotCreateObject); diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 782906f..442b5c6 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -12,6 +12,7 @@ EJsonMapper = class(Exception); TJsonType = (jtUnknown, jtObject, jtArray, jtString, jtTrue, jtFalse, jtNumber, jtDate, jtDateTime, jtBytes, jtInteger, jtInteger64); +type TStubClass = class; TPkgJsonMapper = class; @@ -40,13 +41,14 @@ TStubField = class(TSOJName) FParentClass: TStubClass; FJsonFieldName: string; procedure SetName(const Value: string); - public - constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); + published property FieldName: string read FFieldName write FFieldName; property name: string read FName; property JsonFieldName: string read FJsonFieldName write FJsonFieldName; property PropertyName: string read FPropertyName write FPropertyName; property FieldType: TJsonType read FFieldType write FFieldType; + public + constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); function GetTypeAsString: string; overload; virtual; class function GetTypeAsString(AType: TJsonType): string; overload; end; @@ -55,7 +57,7 @@ TStubContainerField = class(TStubField) private FFieldClass: TStubClass; FContainedType: TJsonType; - public + published property ContainedType: TJsonType read FContainedType write FContainedType; property FieldClass: TStubClass read FFieldClass write FFieldClass; end; @@ -85,16 +87,15 @@ TStubClass = class(TSOJName) FArrayProperty: string; procedure SortFields; procedure SetName(const Value: string); - procedure SetPureClassName(const Value: string); public constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); destructor Destroy; override; - property name: string read FName write SetName; - - property Items: TObjectList read FItems write FItems; function GetDeclarationPart(const BaseClass: string): string; function GetImplementationPart: string; - property PureClassName: string read FPureClassName write SetPureClassName; + published + property name: string read FName write SetName; + property Items: TObjectList read FItems write FItems; + property PureClassName: string read FPureClassName write FPureClassName; property ArrayProperty: string read FArrayProperty write FArrayProperty; end; @@ -118,13 +119,12 @@ TPkgJsonMapper = class // Generates result unit function GenerateUnit: string; procedure Debug(aLines: TStrings); + published property DestinationClassName: string read FClassName write FClassName; property DestinationUnitName: string read FUnitName write SetUnitName; property RootClass: TStubClass read FRootClass; end; -procedure PrettyPrintJSON(JSONValue: TJsonValue; OutputStrings: TStrings; Indent: Integer = 0); - implementation uses @@ -150,92 +150,6 @@ procedure TStringsHelper.AddFormat(const aFormat: string; const Args: array of c Add(Format(aFormat, Args)); end; -function CapitaiazeFirst(const Value: string): string; -var - List: TStringList; - s: string; - i: Integer; -begin - List := TStringList.Create; - try - ExtractStrings(['_'], [], PChar(Value), List); - for i := 0 to List.Count - 1 do - begin - s := List[i]; - if s.StartsWith('&') then - s[2] := s.ToUpper[2] - else - s[1] := s.ToUpper[1]; - List[i] := s; - end; - - List.Delimiter := '_'; - Result := List.DelimitedText; - finally - List.Free; - end; -end; - -// http://stackoverflow.com/a/12198174 -procedure PrettyPrintPair(JSONValue: TJSONPair; OutputStrings: TStrings; Last: Boolean; Indent: Integer); -const - TEMPLATE = '%s:%s'; -var - Line: string; - NewList: TStringList; -begin - NewList := TStringList.Create; - try - PrettyPrintJSON(JSONValue.JSONValue, NewList, Indent); - Line := Format(TEMPLATE, [JSONValue.JsonString.ToString, Trim(NewList.Text)]); - finally - NewList.Free; - end; - - Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; - if not Last then - Line := Line + ','; - OutputStrings.Add(Line); -end; - -procedure PrettyPrintArray(JSONValue: TJSONArray; OutputStrings: TStrings; Last: Boolean; Indent: Integer); -var - i: Integer; -begin - OutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); - - for i := 0 to JSONValue.Count - 1 do - begin - PrettyPrintJSON(JSONValue.Items[i], OutputStrings, Indent); - if i < JSONValue.Count - 1 then - OutputStrings[OutputStrings.Count - 1] := OutputStrings[OutputStrings.Count - 1] + ','; - end; - - OutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); -end; - -procedure PrettyPrintJSON(JSONValue: TJsonValue; OutputStrings: TStrings; Indent: Integer = 0); -var - i: Integer; - Ident: Integer; -begin - Ident := Indent + INDENT_SIZE; - i := 0; - - if JSONValue is TJSONObject then - begin - OutputStrings.Add(StringOfChar(' ', Ident) + '{'); - for i := 0 to TJSONObject(JSONValue).Count - 1 do - PrettyPrintPair(TJSONObject(JSONValue).Pairs[i], OutputStrings, i = TJSONObject(JSONValue).Count - 1, Ident); - - OutputStrings.Add(StringOfChar(' ', Ident) + '}'); - end - else if JSONValue is TJSONArray then - PrettyPrintArray(TJSONArray(JSONValue), OutputStrings, i = TJSONObject(JSONValue).Count - 1, Ident) - else - OutputStrings.Add(StringOfChar(' ', Ident) + JSONValue.ToString); -end; - { TPkgJsonMapper } procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); @@ -328,7 +242,7 @@ function TPkgJsonMapper.GenerateUnit: string; StringList.Add('interface'); StringList.Add(''); StringList.Add('uses'); - StringList.Add(' Pkg.Json.DTO' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); + StringList.Add(' Pkg.Json.DTO, System.Generics.Collections' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); StringList.Add(''); StringList.Add('{$M+}'); StringList.Add(''); @@ -579,14 +493,17 @@ function TStubClass.GetImplementationPart: string; Lines.Add(''); end; - if FComplexItems.Count > 0 then + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin Lines.Add(Format('constructor %s.Create;', [ClassName])); Lines.Add('begin'); Lines.Add(' inherited;'); + if FArrayItems.Count > 0 then + Lines.AddFormat(' FItems := %s.Create;', [FArrayItems[0].GetTypeAsString]); + for StubField in FComplexItems do - Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, (StubField).GetTypeAsString]); + Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.GetTypeAsString]); Lines.Add('end;'); Lines.Add(''); @@ -595,31 +512,20 @@ function TStubClass.GetImplementationPart: string; if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin Lines.Add(Format('destructor %s.Destroy;', [ClassName])); - - if FArrayItems.Count > 0 then - begin - Lines.Add('var'); - for StubField in FArrayItems do - Lines.AddFormat(' %sItem: %s;', [StubField.FName, (StubField as TStubContainerField).FieldClass.Name]); - end; - Lines.Add('begin'); + end; - if FArrayItems.Count > 0 then - begin - for StubField in FArrayItems do - begin - Lines.AddFormat(' for %sItem in %s do', [StubField.Name, StubField.FieldName]); - Lines.AddFormat(' %sItem.Free;', [StubField.Name]); - end; - Lines.Add(''); - end; + for StubField in FComplexItems do + Lines.AddFormat(' %s.Free;', [StubField.FieldName]); - for StubField in FComplexItems do - Lines.AddFormat(' %s.Free;', [StubField.FieldName]); + if FArrayItems.Count > 0 then + begin + if FComplexItems.Count > 0 then + Lines.Add(''); + Lines.Add(' FItems.Free;'); Lines.Add(' inherited;'); - Lines.Add('end;') + Lines.Add('end;'); end; Lines.TrailingLineBreak := false; @@ -635,11 +541,6 @@ procedure TStubClass.SetName(const Value: string); FName := FMapper.SuggestClassName('T' + FPureClassName + 'DTO'); end; -procedure TStubClass.SetPureClassName(const Value: string); -begin - FPureClassName := Value; -end; - procedure TStubClass.SortFields; begin FItems.Sort(FComparer); @@ -654,8 +555,6 @@ function TStubClass.GetDeclarationPart(const BaseClass: string): string; begin Lines := TStringList.Create; try - if NeedsAttribute then - Lines.Add(NameAttribute); Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); Lines.Add('private'); @@ -680,19 +579,14 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + end; if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + begin Lines.Add('public'); - - if FComplexItems.Count > 0 then - Lines.Add(' constructor Create;'); - - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + Lines.Add(' constructor Create; override;'); Lines.Add(' destructor Destroy; override;'); - + end; Lines.Add('end;'); Lines.Add(''); - i := 0; - for i := 0 to Lines.Count - 1 do Lines[i] := ' ' + Lines[i]; @@ -783,7 +677,7 @@ function TStubArrayField.GetTypeAsString: string; else LSubType := GetTypeAsString(FContainedType); end; - Result := Format('TArray<%s>', [LSubType]); + Result := Format('TObjectList<%s>', [LSubType]); end; { TStubObjectField } diff --git a/uGitHub.pas b/uGitHub.pas index 301ea87..aa7020f 100644 --- a/uGitHub.pas +++ b/uGitHub.pas @@ -340,7 +340,6 @@ class function TGitReleasesClass.FromUrl(AUrl: string; ATimeout: integer): TGitR LJsonValue: TJsonValue; LJsonObject: TJsonObject; begin - result := nil; LUri := TIdUri.Create(AUrl); try LHttp := TIdHttp.Create; diff --git a/uMainForm.fmx b/uMainForm.fmx index eeca38c..e05935f 100644 --- a/uMainForm.fmx +++ b/uMainForm.fmx @@ -1727,6 +1727,7 @@ object MainForm: TMainForm end object btnExit: TButton Align = Right + ModalResult = 1 Position.X = 932.000000000000000000 Position.Y = 6.000000000000000000 Size.Width = 80.000000000000000000 diff --git a/uMainForm.pas b/uMainForm.pas index 88d7f02..6524cbd 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -58,7 +58,6 @@ TMainForm = class(TConstrainedForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure PreviewUnitClick(Sender: TObject); - procedure btnExitClick(Sender: TObject); procedure MainPopupMenuPopup(Sender: TObject); procedure TreeViewDblClick(Sender: TObject); procedure MenuItem5Click(Sender: TObject); @@ -73,6 +72,7 @@ TMainForm = class(TConstrainedForm) procedure actValidateJSONExecute(Sender: TObject); procedure actRenamePropertyExecute(Sender: TObject); procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean); + procedure btnExitClick(Sender: TObject); private { Private declarations } FJsonMapper: TPkgJsonMapper; @@ -83,7 +83,6 @@ TMainForm = class(TConstrainedForm) // >=2: Terminated FApplicationStatus: Integer; FUpdateCheckEvent: TEvent; - procedure DisableMenuItems; procedure VisualizeClass; procedure PrepareMenu; procedure DisableGuiElements; @@ -99,7 +98,7 @@ implementation {$R *.fmx} uses - uSaveUnitForm, Pkg.Json.Visualizer, + uSaveUnitForm, Pkg.Json.Visualizer, Pkg.Json.DTO, {$IFDEF MSWINDOWS} Winapi.ShellAPI, Winapi.Windows; {$ENDIF MSWINDOWS} @@ -107,6 +106,11 @@ implementation Posix.Stdlib; {$ENDIF POSIX} +procedure TMainForm.btnExitClick(Sender: TObject); +begin + CLose; +end; + procedure TMainForm.btnVisualizeClick(Sender: TObject); begin if FChanged then @@ -131,14 +135,6 @@ procedure TMainForm.DisableGuiElements; btnGenerateUnit.Enabled := false; end; -procedure TMainForm.DisableMenuItems; -var - k: Integer; -begin - for k := 0 to MainPopupMenu.ItemsCount - 1 do - MainPopupMenu.Items[k].Enabled := false; -end; - procedure TMainForm.Edit1Change(Sender: TObject); begin Edit2.Text := Edit1.Text + 'U'; @@ -191,24 +187,8 @@ procedure TMainForm.ActionList1Update(Action: TBasicAction; var Handled: Boolean end; procedure TMainForm.actPrettyPrintJSONExecute(Sender: TObject); -var - StringList: TStringList; - JsonValue: TJSONValue; begin - StringList := TStringList.Create; - try - JsonValue := TJSONObject.ParseJSONValue(Memo1.Text); - try - if JsonValue <> nil then - PrettyPrintJSON(JsonValue, StringList); - finally - JsonValue.Free; - end; - - Memo1.Text := StringList.Text; - finally - StringList.Free; - end; + Memo1.Text := TJsonDTO.PrettyPrintJSON(Memo1.Text); end; procedure TMainForm.actRenamePropertyExecute(Sender: TObject); @@ -221,7 +201,7 @@ procedure TMainForm.actRenamePropertyExecute(Sender: TObject); if (s <> '') and (s.ToLower <> StubField.Name.ToLower) then begin FChanged := True; -// StubField.Name := s; + // StubField.Name := s; JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); end; end; @@ -236,11 +216,6 @@ procedure TMainForm.actValidateJSONExecute(Sender: TObject); {$ENDIF POSIX} end; -procedure TMainForm.btnExitClick(Sender: TObject); -begin - Close; -end; - procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if FUpdateCheckEvent.WaitFor(0) = wrSignaled then diff --git a/uSaveUnitForm.pas b/uSaveUnitForm.pas index 8c261a5..9757a2f 100644 --- a/uSaveUnitForm.pas +++ b/uSaveUnitForm.pas @@ -53,16 +53,15 @@ procedure TSaveUnitForm.btnSaveClick(Sender: TObject); Memo1.Lines.SaveToFile(sd.FileName); Buffer := TStringList.Create; + ResourceStream := TResourceStream.Create(HInstance, 'JsonDTO', 'PAS'); try - ResourceStream := TResourceStream.Create(HInstance, 'JsonDTO', 'PAS'); ResourceStream.Position := 0; Buffer.LoadFromStream(ResourceStream); - Buffer.SaveToFile( TPath.GetDirectoryName(sd.FileName) + TPath.DirectorySeparatorChar + 'Pkg.Json.DTO.pas' ); + Buffer.SaveToFile(TPath.GetDirectoryName(sd.FileName) + TPath.DirectorySeparatorChar + 'Pkg.Json.DTO.pas'); finally ResourceStream.Free; Buffer.Free; end; - end; procedure TSaveUnitForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); From afd84a13439e1ed2918a3863563a6f64c4366d72 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sun, 29 Dec 2019 17:15:37 +0100 Subject: [PATCH 006/129] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index bd3450f..11c555e 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,7 @@ # Delphi history and backups __history/ __recover/ -*.~* \ No newline at end of file +*.~* +__recovery/__recovery.ini +__recovery/uMainForm.fmx +__recovery/uMainForm.pas From c40a38e0e313770c69d690c3ec63aaab97b1d6d0 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jan 2020 10:22:56 +0100 Subject: [PATCH 007/129] Removed Warnings Removed Warnings Removed access to firends private fields. Simplified Array parsning --- JSON_PAS.res | Bin 5820 -> 4548 bytes JsonToDelphiClass.dpr | 5 +- JsonToDelphiClass.dproj | 1 + Pkg.Json.DTO.pas | 52 ++------------ Pkg.Json.Mapper.pas | 154 +++++++++++++++++++++------------------- uMainForm.pas | 67 ++++++++++------- 6 files changed, 134 insertions(+), 145 deletions(-) diff --git a/JSON_PAS.res b/JSON_PAS.res index 4fb0b798c90c701d5eeaccb85bbaa04e9be0b636..41e2e838635f6f6eab7be0c6510472d5d548cdad 100644 GIT binary patch delta 178 zcmdm^dqjDH0#mWzMkQ&+&E1SMm?s}GTOf-yDK$MaZ}L0Al|kj1B^e4K zUcvr;p?SWEMa3D3IeN}Tsfi`23Mu)#TnbQ7QdEiHC@2J{mbhi6=A<|l6(v?`1gGYt v=_sgsmZatutLsdjB`l?(X^l{xmYJ8BlY^q)ttd4WtYY&~kuQwQyj%-5>e4O@q{yS*1=w*Q27IB zPVzTUP@=Syw0r|UK|{yRc(ZXXN<)*_GxKKN8^7J34}UzqhFkve_tOXE_B4?b<%bep zq8cXS(dRk#6wW$<8^_%!oW1g6p`W;D`Lz6XFZ+G>(em%Ub0<5k z+)w|v)w6@jCpS8%0Cd#ijZ(gzL4Tc4DqJX?1|Wik6uol%HL9!7QqcJr(pz^A+ZKu!dfHYY&r%nBn*H*g`pNY(#vven$Y4xhnrA;>jnwd8=$UG z<`4#5ro{ybh7xtri+eIwuAJZo1mJw(-yE?5J128CFzQ}5C#jM)$LWsNv$W&2V! zOLc}AOmmx2CFz7#svW#Ow^p~q2+@wsF=n}hD(r%$=-xZ8gY6b8FOhBg!@-5FxSgQ( zZ1$yga%TMrV7Evk?NAz6m|r|?09mU``iayj~bFp`{6Z0$2EAR(nfmx
+ Cfg_2 Base diff --git a/Pkg.Json.DTO.pas b/Pkg.Json.DTO.pas index 9abde46..b824857 100644 --- a/Pkg.Json.DTO.pas +++ b/Pkg.Json.DTO.pas @@ -11,7 +11,6 @@ TJsonDTO = class FOptions: TJsonOptions; function GetAsJson: string; procedure SetAsJson(aValue: string); - class function GetSubTypeItemClassFromList(ObjectList: TObject): TClass; class procedure PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); @@ -41,7 +40,6 @@ function TJsonDTO.GetAsJson: string; const INDENT_SIZE = 2; - class procedure TJsonDTO.PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer); var i: Integer; @@ -122,38 +120,11 @@ class procedure TJsonDTO.PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: aOutputStrings.Add(Line); end; -class function TJsonDTO.GetSubTypeItemClassFromList(ObjectList: TObject): TClass; -var - CtxRtti: TRttiContext; - TypeRtti: TRttiType; - MethodRtti: TRttiMethod; - ParameterRtti: TRttiParameter; -begin - Result := nil; - CtxRtti := TRttiContext.Create; - TypeRtti := CtxRtti.GetType(ObjectList.ClassType); - MethodRtti := TypeRtti.GetMethod('Add'); - - for ParameterRtti in MethodRtti.GetParameters do - if SameText(ParameterRtti.Name, 'Value') then - if ParameterRtti.ParamType.IsInstance then - Exit(ParameterRtti.ParamType.AsInstance.MetaclassType); -end; - procedure TJsonDTO.SetAsJson(aValue: string); var JSONValue: TJsonValue; JSONObject: TJSONObject; -var - RttiField: TRttiField; - RttiContext: TRttiContext; - - Value: TValue; - List: TObjectList; - ElementType: TClass; - Element: TObject; begin - RttiContext := TRttiContext.Create; JSONValue := TJSONObject.ParseJSONValue(aValue); try if not Assigned(JSONValue) then @@ -161,22 +132,12 @@ procedure TJsonDTO.SetAsJson(aValue: string); if (JSONValue is TJSONArray) then begin - RttiField := TRttiContext.Create.GetType(ClassInfo).GetField('FItems'); - Value := RttiField.GetValue(Self); - List := TObjectList(Value.AsObject); - ElementType := GetSubTypeItemClassFromList(Value.AsObject); - - for JSONValue in (JSONValue as TJSONArray) do - begin - Element := ElementType.Create; - if (JSONValue is TJSONObject) then - begin - TJson.JsonToObject(Element, TJSONObject(JSONValue), FOptions); - List.Add(Element); - end - else - Element.Free; - end; + with TJSONUnMarshal.Create do + try + SetFieldArray(Self, 'Items', (JSONValue as TJSONArray)); + finally + Free; + end; Exit; end; @@ -199,3 +160,4 @@ procedure TJsonDTO.SetAsJson(aValue: string); end; end. + diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 442b5c6..f0b1197 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -40,21 +40,21 @@ TStubField = class(TSOJName) FFieldType: TJsonType; FParentClass: TStubClass; FJsonFieldName: string; + class function GetTypeAsString(AType: TJsonType): string; overload; procedure SetName(const Value: string); published - property FieldName: string read FFieldName write FFieldName; - property name: string read FName; - property JsonFieldName: string read FJsonFieldName write FJsonFieldName; - property PropertyName: string read FPropertyName write FPropertyName; - property FieldType: TJsonType read FFieldType write FFieldType; + property name: string read FName write SetName; + property FieldName: string read FFieldName; + property JsonFieldName: string read FJsonFieldName; + property PropertyName: string read FPropertyName; + property FieldType: TJsonType read FFieldType; public constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); function GetTypeAsString: string; overload; virtual; - class function GetTypeAsString(AType: TJsonType): string; overload; end; TStubContainerField = class(TStubField) - private + strict private FFieldClass: TStubClass; FContainedType: TJsonType; published @@ -75,9 +75,10 @@ TStubArrayField = class(TStubContainerField) end; TStubClass = class(TSOJName) - private + strict private + FArrayItems: TList; + FComplexItems: TList; FItems: TObjectList; - FComplexItems, FArrayItems: TList; FName: string; FComparison: TComparison; FComparer: IComparer; @@ -85,32 +86,33 @@ TStubClass = class(TSOJName) FMapper: TPkgJsonMapper; FPureClassName: string; FArrayProperty: string; - procedure SortFields; procedure SetName(const Value: string); public constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); destructor Destroy; override; - function GetDeclarationPart(const BaseClass: string): string; + function GetDeclarationPart(const BaseClass: string = ''): string; function GetImplementationPart: string; + procedure SortFields; published property name: string read FName write SetName; property Items: TObjectList read FItems write FItems; property PureClassName: string read FPureClassName write FPureClassName; property ArrayProperty: string read FArrayProperty write FArrayProperty; + property ComplexItems: TList read FComplexItems; + property ArrayItems: TList read FArrayItems; end; TPkgJsonMapper = class - private + strict private FStubClasses: TObjectList; FRootClass: TStubClass; FUnitName: string; FClassName: string; procedure SetUnitName(const Value: string); - protected + strict protected function GetJsonType(aJsonValue: TJsonValue): TJsonType; function GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; procedure ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); - function SuggestClassName(aSuggestedClassName: string): string; public constructor Create; destructor Destroy; override; @@ -118,11 +120,13 @@ TPkgJsonMapper = class function Parse(aJsonString: string): TPkgJsonMapper; // Generates result unit function GenerateUnit: string; + function SuggestClassName(aSuggestedClassName: string): string; procedure Debug(aLines: TStrings); published property DestinationClassName: string read FClassName write FClassName; property DestinationUnitName: string read FUnitName write SetUnitName; property RootClass: TStubClass read FRootClass; + property StubClasses: TObjectList read FStubClasses; end; implementation @@ -141,10 +145,17 @@ implementation TStringsHelper = class helper for TStrings public procedure AddFormat(const aFormat: string; const Args: array of const); + procedure AddIfNotEmpty(const s: string); end; { TStringsHelper } +procedure TStringsHelper.AddIfNotEmpty(const s: string); +begin + if s <> '' then + inherited Add(s); +end; + procedure TStringsHelper.AddFormat(const aFormat: string; const Args: array of const); begin Add(Format(aFormat, Args)); @@ -211,11 +222,11 @@ function TPkgJsonMapper.GenerateUnit: string; var StubClass: TStubClass; StubField: TStubField; - k: Integer; StringList: TStringList; NeedsAttribute: Boolean; + i: Integer; begin - NeedsAttribute := false; + NeedsAttribute := False; for StubClass in FStubClasses do begin if StubClass.NeedsAttribute then @@ -237,34 +248,27 @@ function TPkgJsonMapper.GenerateUnit: string; StringList := TStringList.Create; try + StringList.TrailingLineBreak := False; + StringList.Add('unit ' + FUnitName + ';'); StringList.Add(''); StringList.Add('interface'); StringList.Add(''); StringList.Add('uses'); - StringList.Add(' Pkg.Json.DTO, System.Generics.Collections' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); + StringList.Add(' Pkg.Json.DTO' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); StringList.Add(''); StringList.Add('{$M+}'); StringList.Add(''); StringList.Add('type'); - for k := FStubClasses.Count - 1 downto 1 do - begin - StubClass := FStubClasses[k]; - StringList.Add(StubClass.GetDeclarationPart('').TrimRight); - StringList.Add(''); - end; + for i := FStubClasses.Count - 1 downto 1 do + StringList.AddIfNotEmpty(FStubClasses[i].GetDeclarationPart); - StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO').TrimRight + sLineBreak); + StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO')); StringList.Add('implementation'); - for k := FStubClasses.Count - 1 downto 0 do - begin - StubClass := FStubClasses[k]; - if k = 0 then - StringList.Add(''); - StringList.Add(StubClass.GetImplementationPart.TrimRight); - end; + for i := FStubClasses.Count - 1 downto 0 do + StringList.AddIfNotEmpty(FStubClasses[i].GetImplementationPart); StringList.Add(''); StringList.Add('end.'); @@ -304,7 +308,7 @@ procedure TPkgJsonMapper.Debug(aLines: TStrings); begin aLines.Add('-------'); aLines.Add(StubClass.Name); - for StubField in StubClass.FItems do + for StubField in StubClass.Items do aLines.AddFormat('%-15s | %s', [StubField.FieldName, StubField.GetTypeAsString]); end; end; @@ -451,7 +455,7 @@ constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMap FItems := TObjectList.Create; FComplexItems := TList.Create; FArrayItems := TList.Create; - FMapper.FStubClasses.Add(Self); + FMapper.StubClasses.Add(Self); FArrayProperty := aArrayProperty; FParentClass := aParentClass; @@ -480,28 +484,23 @@ destructor TStubClass.Destroy; function TStubClass.GetImplementationPart: string; var Lines: TStringList; - ClassName: string; StubField: TStubField; begin Lines := TStringList.Create; try - ClassName := Format('%s', [FName]); - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin - Lines.AddFormat('{ %s }', [ClassName]); + Lines.Add(''); + Lines.AddFormat('{ %s }', [FName]); Lines.Add(''); end; - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + if (FComplexItems.Count > 0) then begin - Lines.Add(Format('constructor %s.Create;', [ClassName])); + Lines.AddFormat('constructor %s.Create;', [FName]); Lines.Add('begin'); Lines.Add(' inherited;'); - if FArrayItems.Count > 0 then - Lines.AddFormat(' FItems := %s.Create;', [FArrayItems[0].GetTypeAsString]); - for StubField in FComplexItems do Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.GetTypeAsString]); @@ -511,24 +510,29 @@ function TStubClass.GetImplementationPart: string; if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin - Lines.Add(Format('destructor %s.Destroy;', [ClassName])); + Lines.Add(Format('destructor %s.Destroy;', [FName])); + if FArrayItems.Count > 0 then + begin + Lines.Add('var'); + Lines.Add(' Element: TObject;'); + end; + Lines.Add('begin'); - end; - for StubField in FComplexItems do - Lines.AddFormat(' %s.Free;', [StubField.FieldName]); + for StubField in FComplexItems do + Lines.AddFormat(' %s.Free;', [StubField.FieldName]); - if FArrayItems.Count > 0 then - begin - if FComplexItems.Count > 0 then - Lines.Add(''); + for StubField in FArrayItems do + begin + Lines.AddFormat(' for Element in %s do', [StubField.FieldName]); + Lines.Add(' Element.Free;'); + end; - Lines.Add(' FItems.Free;'); Lines.Add(' inherited;'); Lines.Add('end;'); end; - Lines.TrailingLineBreak := false; + Lines.TrailingLineBreak := False; Result := Lines.Text; finally Lines.Free; @@ -578,19 +582,22 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + Lines.Add(s); end; - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + if FComplexItems.Count > 0 then begin Lines.Add('public'); - Lines.Add(' constructor Create; override;'); - Lines.Add(' destructor Destroy; override;'); + Lines.Add(' constructor Create;' + IfThen(BaseClass = '', '', ' override;')); end; + + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + Lines.Add(' destructor Destroy; override;'); + Lines.Add('end;'); Lines.Add(''); for i := 0 to Lines.Count - 1 do Lines[i] := ' ' + Lines[i]; - Lines.TrailingLineBreak := false; + Lines.TrailingLineBreak := False; Result := Lines.Text; finally Lines.Free; @@ -608,7 +615,7 @@ constructor TStubField.Create(aParentClass: TStubClass; aItemName: string; aFiel SetName(DelphiName); if FParentClass <> nil then - FParentClass.FItems.Add(Self); + FParentClass.Items.Add(Self); end; class function TStubField.GetTypeAsString(AType: TJsonType): string; @@ -637,8 +644,8 @@ class function TStubField.GetTypeAsString(AType: TJsonType): string; procedure TStubField.SetName(const Value: string); begin - if (FParentClass.FArrayProperty <> '') and (FParentClass.FArrayProperty = FName) then - FParentClass.FArrayProperty := Value; + if (FParentClass.ArrayProperty <> '') and (FParentClass.ArrayProperty = FName) then + FParentClass.ArrayProperty := Value; FName := Value; FFieldName := 'F' + DelphiName; @@ -659,25 +666,26 @@ function TStubField.GetTypeAsString: string; constructor TStubArrayField.Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); begin inherited Create(aClass, aItemName, jtArray); - FContainedType := aItemSubType; - FFieldClass := aItemClass; - if FContainedType = TJsonType.jtObject then - aClass.FArrayItems.Add(Self); + ContainedType := aItemSubType; + FieldClass := aItemClass; + if ContainedType = TJsonType.jtObject then + aClass.ArrayItems.Add(Self); end; function TStubArrayField.GetTypeAsString: string; var - LSubType: string; + SubType: string; begin - case FContainedType of + case ContainedType of jtObject: - LSubType := FFieldClass.Name; + SubType := FieldClass.Name; jtArray: raise EJsonMapper.Create('Nested arrays are not supported!'); else - LSubType := GetTypeAsString(FContainedType); + SubType := GetTypeAsString(ContainedType); end; - Result := Format('TObjectList<%s>', [LSubType]); + + Result := Format('TArray<%s>', [SubType]); end; { TStubObjectField } @@ -685,14 +693,14 @@ function TStubArrayField.GetTypeAsString: string; constructor TStubObjectField.Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); begin inherited Create(aParentClass, aItemName, jtObject); - FFieldClass := aItemClass; - aParentClass.FComplexItems.Add(Self); - FContainedType := jtObject; + FieldClass := aItemClass; + aParentClass.ComplexItems.Add(Self); + ContainedType := jtObject; end; function TStubObjectField.GetTypeAsString: string; begin - Result := FFieldClass.Name; + Result := FieldClass.Name; end; { TSOJName } @@ -733,7 +741,7 @@ constructor TSOJName.Create(aItemName: string); if aItemName.IsEmpty then raise Exception.Create('aItemName can not be empty'); - FNeedsAttribute := false; + FNeedsAttribute := False; FJsonName := aItemName; for ch in FJsonName do diff --git a/uMainForm.pas b/uMainForm.pas index 6524cbd..383ead6 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -183,7 +183,7 @@ procedure TMainForm.ActionList1Update(Action: TBasicAction; var Handled: Boolean else StubContainerField := nil; - actRenameProperty.Enabled := (StubContainerField <> nil) and (StubContainerField.FieldType = jtObject); + actRenameProperty.Enabled := (StubContainerField = nil); // and (StubContainerField.FieldType = jtObject); end; procedure TMainForm.actPrettyPrintJSONExecute(Sender: TObject); @@ -193,17 +193,27 @@ procedure TMainForm.actPrettyPrintJSONExecute(Sender: TObject); procedure TMainForm.actRenamePropertyExecute(Sender: TObject); var - s: string; StubField: TStubField; begin - StubField := (Sender as TFmxObject).TagObject as TStubField; - s := InputBox('Rename Property ' + StubField.Name, 'Enter new Property name', StubField.Name); - if (s <> '') and (s.ToLower <> StubField.Name.ToLower) then - begin - FChanged := True; - // StubField.Name := s; - JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); - end; + if TreeView.Selected.TagObject is TStubContainerField then + exit; + + StubField := TStubField(TreeView.Selected.TagObject); + + TDialogService.InputQuery('Rename Property ' + StubField.Name, ['Enter new Property name'], [StubField.Name], + procedure(const AResult: TModalResult; const AValues: array of string) + var + s: string; + begin + s := AValues[0]; + + if (s <> '') and (s.ToLower <> StubField.Name.ToLower) then + begin + FChanged := True; + StubField.Name := s; + JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); + end; + end); end; procedure TMainForm.actValidateJSONExecute(Sender: TObject); @@ -246,7 +256,7 @@ procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); TThread.Queue(nil, procedure begin - Close; + CLose; end); end); @@ -310,7 +320,7 @@ procedure TMainForm.FormDestroy(Sender: TObject); procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = 27 then - Close; + CLose; end; procedure TMainForm.Label1Click(Sender: TObject); @@ -338,17 +348,27 @@ procedure TMainForm.Memo1Change(Sender: TObject); procedure TMainForm.MenuItem5Click(Sender: TObject); var - s: string; - StubClass: TStubClass; + StubField: TStubField; begin - StubClass := (Sender as TFmxObject).TagObject as TStubClass; - s := InputBox('Rename Class ' + StubClass.Name, 'Enter new Class name', StubClass.PureClassName); - if (s <> '') and (s.ToLower <> StubClass.PureClassName.ToLower) then - begin - FChanged := True; - StubClass.Name := s; - JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); - end; + if TreeView.Selected.TagObject is TStubContainerField then + exit; + + StubField := TStubField(TreeView.Selected.TagObject); + + TDialogService.InputQuery('Rename Class ' + StubField.Name, ['Enter new Property name'], [StubField.Name], + procedure(const AResult: TModalResult; const AValues: array of string) + var + s: string; + begin + s := AValues[0]; + + if (s <> '') and (s.ToLower <> StubField.Name.ToLower) then + begin + FChanged := True; + StubField.Name := s; + JsonVisualizer.Visualize(TreeView, 'TreeViewItem1Style1', FJsonMapper); + end; + end); end; procedure TMainForm.Panel1Resize(Sender: TObject); @@ -364,13 +384,11 @@ procedure TMainForm.MainPopupMenuPopup(Sender: TObject); Item: TTreeViewItem; Point: TPointF; begin - // DisableMenuItems; MainPopupMenu.Items[0].Text := '---'; Point := TreeView.AbsoluteToLocal(ScreenToClient(MainPopupMenu.PopupPoint)); Item := TreeView.ItemByPoint(Point.X, Point.Y); if Item <> nil then Item.Select; - // PrepareMenu; end; @@ -419,7 +437,6 @@ procedure TMainForm.TreeViewKeyDown(Sender: TObject; var Key: Word; var KeyChar: MenuItem5Click(MenuItem5) else actRenameProperty.Execute; - // MenuItem3Click(MenuItem3); end; end; From 799b796a13629d6168ba8d24e6180b838813ca7b Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jan 2020 19:21:52 +0100 Subject: [PATCH 008/129] Update uUpdate.pas --- uUpdate.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/uUpdate.pas b/uUpdate.pas index fb9bcee..c189989 100644 --- a/uUpdate.pas +++ b/uUpdate.pas @@ -6,8 +6,8 @@ interface IPPeerClient, SysUtils, System.Threading, Classes, Pkg.JSON.Mapper; const - ProgramVersion: double = 0.65; - UpdateUrl = 'https://api.github.com/repos/PKGeorgiev/Delphi-JsonToDelphiClass/releases'; + ProgramVersion: double = 1; + UpdateUrl = 'https://api.github.com/repos/JensBorrisholt/Delphi-JsonToDelphiClass/releases'; ProgramUrl = 'https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass'; function InternalCheckForUpdate: TObject; From 0219876f7e10d0532b7cbb94bfa184ae2132b78b Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sat, 25 Jan 2020 06:17:01 +0100 Subject: [PATCH 009/129] Fixed bug in Github Communication --- .gitignore | 4 +- Pkg.Json.Mapper.pas | 29 ++--- uGitHub.pas | 300 ++++++++++++++++++++++---------------------- uMainForm.pas | 1 - uUpdate.pas | 2 +- 5 files changed, 165 insertions(+), 171 deletions(-) diff --git a/.gitignore b/.gitignore index 11c555e..c0821f2 100644 --- a/.gitignore +++ b/.gitignore @@ -53,6 +53,6 @@ __history/ __recover/ *.~* -__recovery/__recovery.ini -__recovery/uMainForm.fmx __recovery/uMainForm.pas +__recovery/uMainForm.fmx +__recovery/__recovery.ini diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index f0b1197..94fd17f 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -108,7 +108,6 @@ TPkgJsonMapper = class FRootClass: TStubClass; FUnitName: string; FClassName: string; - procedure SetUnitName(const Value: string); strict protected function GetJsonType(aJsonValue: TJsonValue): TJsonType; function GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; @@ -124,7 +123,7 @@ TPkgJsonMapper = class procedure Debug(aLines: TStrings); published property DestinationClassName: string read FClassName write FClassName; - property DestinationUnitName: string read FUnitName write SetUnitName; + property DestinationUnitName: string read FUnitName write FUnitName; property RootClass: TStubClass read FRootClass; property StubClasses: TObjectList read FStubClasses; end; @@ -191,8 +190,6 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: jtArray: begin StubClass := nil; - JsonType2 := jtUnknown; - JsonValue2 := GetFirstArrayItem(JSONValue); if JsonValue2 <> nil then begin @@ -206,6 +203,12 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: jtArray: raise EJsonMapper.Create('Nested Arrays are not supported!'); end; + end + else + begin + // if we meet an empty array then + JsonType2 := jtObject; + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); end; TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType2, StubClass); @@ -319,11 +322,6 @@ destructor TPkgJsonMapper.Destroy; inherited; end; -procedure TPkgJsonMapper.SetUnitName(const Value: string); -begin - FUnitName := Value; -end; - function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; var StubClass: TStubClass; @@ -553,33 +551,32 @@ procedure TStubClass.SortFields; function TStubClass.GetDeclarationPart(const BaseClass: string): string; var Lines: TStringList; - s: string; StubField: TStubField; i: Integer; begin Lines := TStringList.Create; try Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); - Lines.Add('private'); + if FItems.Count > 0 then + Lines.Add('private'); for StubField in FItems do begin if StubField.NeedsAttribute then Lines.Add(' ' + StubField.NameAttribute); - s := Format(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); - Lines.Add(s); + Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); end; - Lines.Add('published'); + if FItems.Count > 0 then + Lines.Add('published'); for StubField in FItems do begin if (StubField.FieldType = jtUnknown) or ((StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = jtUnknown)) then raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [StubField.PropertyName]); - s := Format(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.GetTypeAsString, StubField.FieldName, StubField.FieldName]); - Lines.Add(s); + Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.GetTypeAsString, StubField.FieldName, StubField.FieldName]); end; if FComplexItems.Count > 0 then diff --git a/uGitHub.pas b/uGitHub.pas index aa7020f..3440a31 100644 --- a/uGitHub.pas +++ b/uGitHub.pas @@ -40,158 +40,158 @@ TUGitHubSerializableObject = class abstract TUploaderClass = class private - FAvatar_url: String; - FEvents_url: String; - FFollowers_url: String; - FFollowing_url: String; - FGists_url: String; - FGravatar_id: String; - FHtml_url: String; + FAvatar_url: string; + FEvents_url: string; + FFollowers_url: string; + FFollowing_url: string; + FGists_url: string; + FGravatar_id: string; + FHtml_url: string; FId: Extended; - FLogin: String; - FOrganizations_url: String; - FReceived_events_url: String; - FRepos_url: String; + FLogin: string; + FOrganizations_url: string; + FReceived_events_url: string; + FRepos_url: string; FSite_admin: Boolean; - FStarred_url: String; - FSubscriptions_url: String; - FType: String; - FUrl: String; + FStarred_url: string; + FSubscriptions_url: string; + FType: string; + FUrl: string; public - property avatar_url: String read FAvatar_url write FAvatar_url; - property events_url: String read FEvents_url write FEvents_url; - property followers_url: String read FFollowers_url write FFollowers_url; - property following_url: String read FFollowing_url write FFollowing_url; - property gists_url: String read FGists_url write FGists_url; - property gravatar_id: String read FGravatar_id write FGravatar_id; - property html_url: String read FHtml_url write FHtml_url; + property avatar_url: string read FAvatar_url write FAvatar_url; + property events_url: string read FEvents_url write FEvents_url; + property followers_url: string read FFollowers_url write FFollowers_url; + property following_url: string read FFollowing_url write FFollowing_url; + property gists_url: string read FGists_url write FGists_url; + property gravatar_id: string read FGravatar_id write FGravatar_id; + property html_url: string read FHtml_url write FHtml_url; property id: Extended read FId write FId; - property login: String read FLogin write FLogin; - property organizations_url: String read FOrganizations_url write FOrganizations_url; - property received_events_url: String read FReceived_events_url write FReceived_events_url; - property repos_url: String read FRepos_url write FRepos_url; + property login: string read FLogin write FLogin; + property organizations_url: string read FOrganizations_url write FOrganizations_url; + property received_events_url: string read FReceived_events_url write FReceived_events_url; + property repos_url: string read FRepos_url write FRepos_url; property site_admin: Boolean read FSite_admin write FSite_admin; - property starred_url: String read FStarred_url write FStarred_url; - property subscriptions_url: String read FSubscriptions_url write FSubscriptions_url; - property &type: String read FType write FType; - property url: String read FUrl write FUrl; + property starred_url: string read FStarred_url write FStarred_url; + property subscriptions_url: string read FSubscriptions_url write FSubscriptions_url; + property &type: string read FType write FType; + property url: string read FUrl write FUrl; function ToJsonString: string; - class function FromJsonString(AJsonString: string): TUploaderClass; + class function FromJsonString(aJsonString: string): TUploaderClass; end; TAssetsClass = class private - FBrowser_download_url: String; - FContent_type: String; - FCreated_at: String; + FBrowser_download_url: string; + FContent_type: string; + FCreated_at: string; FDownload_count: Extended; FId: Extended; - FName: String; + FName: string; FSize: Extended; - FState: String; - FUpdated_at: String; + FState: string; + FUpdated_at: string; FUploader: TUploaderClass; - FUrl: String; + FUrl: string; public - property browser_download_url: String read FBrowser_download_url write FBrowser_download_url; - property content_type: String read FContent_type write FContent_type; - property created_at: String read FCreated_at write FCreated_at; + property browser_download_url: string read FBrowser_download_url write FBrowser_download_url; + property content_type: string read FContent_type write FContent_type; + property created_at: string read FCreated_at write FCreated_at; property download_count: Extended read FDownload_count write FDownload_count; property id: Extended read FId write FId; - property name: String read FName write FName; + property name: string read FName write FName; property size: Extended read FSize write FSize; - property state: String read FState write FState; - property updated_at: String read FUpdated_at write FUpdated_at; + property state: string read FState write FState; + property updated_at: string read FUpdated_at write FUpdated_at; property uploader: TUploaderClass read FUploader write FUploader; - property url: String read FUrl write FUrl; + property url: string read FUrl write FUrl; constructor Create; destructor Destroy; override; function ToJsonString: string; - class function FromJsonString(AJsonString: string): TAssetsClass; + class function FromJsonString(aJsonString: string): TAssetsClass; end; TAuthorClass = class private - FAvatar_url: String; - FEvents_url: String; - FFollowers_url: String; - FFollowing_url: String; - FGists_url: String; - FGravatar_id: String; - FHtml_url: String; + FAvatar_url: string; + FEvents_url: string; + FFollowers_url: string; + FFollowing_url: string; + FGists_url: string; + FGravatar_id: string; + FHtml_url: string; FId: Extended; - FLogin: String; - FOrganizations_url: String; - FReceived_events_url: String; - FRepos_url: String; + FLogin: string; + FOrganizations_url: string; + FReceived_events_url: string; + FRepos_url: string; FSite_admin: Boolean; - FStarred_url: String; - FSubscriptions_url: String; - FType: String; - FUrl: String; + FStarred_url: string; + FSubscriptions_url: string; + FType: string; + FUrl: string; public - property avatar_url: String read FAvatar_url write FAvatar_url; - property events_url: String read FEvents_url write FEvents_url; - property followers_url: String read FFollowers_url write FFollowers_url; - property following_url: String read FFollowing_url write FFollowing_url; - property gists_url: String read FGists_url write FGists_url; - property gravatar_id: String read FGravatar_id write FGravatar_id; - property html_url: String read FHtml_url write FHtml_url; + property avatar_url: string read FAvatar_url write FAvatar_url; + property events_url: string read FEvents_url write FEvents_url; + property followers_url: string read FFollowers_url write FFollowers_url; + property following_url: string read FFollowing_url write FFollowing_url; + property gists_url: string read FGists_url write FGists_url; + property gravatar_id: string read FGravatar_id write FGravatar_id; + property html_url: string read FHtml_url write FHtml_url; property id: Extended read FId write FId; - property login: String read FLogin write FLogin; - property organizations_url: String read FOrganizations_url write FOrganizations_url; - property received_events_url: String read FReceived_events_url write FReceived_events_url; - property repos_url: String read FRepos_url write FRepos_url; + property login: string read FLogin write FLogin; + property organizations_url: string read FOrganizations_url write FOrganizations_url; + property received_events_url: string read FReceived_events_url write FReceived_events_url; + property repos_url: string read FRepos_url write FRepos_url; property site_admin: Boolean read FSite_admin write FSite_admin; - property starred_url: String read FStarred_url write FStarred_url; - property subscriptions_url: String read FSubscriptions_url write FSubscriptions_url; - property &type: String read FType write FType; - property url: String read FUrl write FUrl; + property starred_url: string read FStarred_url write FStarred_url; + property subscriptions_url: string read FSubscriptions_url write FSubscriptions_url; + property &type: string read FType write FType; + property url: string read FUrl write FUrl; function ToJsonString: string; - class function FromJsonString(AJsonString: string): TAuthorClass; + class function FromJsonString(aJsonString: string): TAuthorClass; end; TReleaseClass = class(TUGitHubSerializableObject) private FAssets: TArray; - FAssets_url: String; + FAssets_url: string; FAuthor: TAuthorClass; - FBody: String; - FCreated_at: String; + FBody: string; + FCreated_at: string; FDraft: Boolean; - FHtml_url: String; + FHtml_url: string; FId: Extended; - FName: String; + FName: string; FPrerelease: Boolean; - FPublished_at: String; - FTag_name: String; - FTarball_url: String; - FTarget_commitish: String; - FUpload_url: String; - FUrl: String; - FZipball_url: String; + FPublished_at: string; + FTag_name: string; + FTarball_url: string; + FTarget_commitish: string; + FUpload_url: string; + FUrl: string; + FZipball_url: string; public property assets: TArray read FAssets write FAssets; - property assets_url: String read FAssets_url write FAssets_url; + property assets_url: string read FAssets_url write FAssets_url; property author: TAuthorClass read FAuthor write FAuthor; - property body: String read FBody write FBody; - property created_at: String read FCreated_at write FCreated_at; + property body: string read FBody write FBody; + property created_at: string read FCreated_at write FCreated_at; property draft: Boolean read FDraft write FDraft; - property html_url: String read FHtml_url write FHtml_url; + property html_url: string read FHtml_url write FHtml_url; property id: Extended read FId write FId; - property name: String read FName write FName; + property name: string read FName write FName; property prerelease: Boolean read FPrerelease write FPrerelease; - property published_at: String read FPublished_at write FPublished_at; - property tag_name: String read FTag_name write FTag_name; - property tarball_url: String read FTarball_url write FTarball_url; - property target_commitish: String read FTarget_commitish write FTarget_commitish; - property upload_url: String read FUpload_url write FUpload_url; - property url: String read FUrl write FUrl; - property zipball_url: String read FZipball_url write FZipball_url; + property published_at: string read FPublished_at write FPublished_at; + property tag_name: string read FTag_name write FTag_name; + property tarball_url: string read FTarball_url write FTarball_url; + property target_commitish: string read FTarget_commitish write FTarget_commitish; + property upload_url: string read FUpload_url write FUpload_url; + property url: string read FUrl write FUrl; + property zipball_url: string read FZipball_url write FZipball_url; constructor Create; destructor Destroy; override; function ToJsonString: string; - class function FromJsonString(AJsonString: string): TReleaseClass; + class function FromJsonString(aJsonString: string): TReleaseClass; class function HttpGet(AUrl: string; AOnBeforeRequest: TProc = nil): TReleaseClass; end; @@ -203,19 +203,19 @@ TGitReleasesClass = class constructor Create; destructor Destroy; override; function ToJsonString: string; - class function FromJsonString(AJsonString: string): TGitReleasesClass; + class function FromJsonString(aJsonString: string): TGitReleasesClass; class function FromUrl(AUrl: string; ATimeout: integer): TGitReleasesClass; end; TErrorClass = class private - FDocumentation_url: String; - FMessage: String; + FDocumentation_url: string; + FMessage: string; public - property documentation_url: String read FDocumentation_url write FDocumentation_url; - property message: String read FMessage write FMessage; + property documentation_url: string read FDocumentation_url write FDocumentation_url; + property message: string read FMessage write FMessage; function ToJsonString: string; - class function FromJsonString(AJsonString: string): TErrorClass; + class function FromJsonString(aJsonString: string): TErrorClass; end; implementation @@ -224,12 +224,12 @@ implementation function TUploaderClass.ToJsonString: string; begin - result := TJson.ObjectToJsonString(self); + Result := TJson.ObjectToJsonString(Self); end; -class function TUploaderClass.FromJsonString(AJsonString: string): TUploaderClass; +class function TUploaderClass.FromJsonString(aJsonString: string): TUploaderClass; begin - result := TJson.JsonToObject(AJsonString) + Result := TJson.JsonToObject(aJsonString) end; { TAssetsClass } @@ -242,30 +242,30 @@ constructor TAssetsClass.Create; destructor TAssetsClass.Destroy; begin - FUploader.free; + FUploader.Free; inherited; end; function TAssetsClass.ToJsonString: string; begin - result := TJson.ObjectToJsonString(self); + Result := TJson.ObjectToJsonString(Self); end; -class function TAssetsClass.FromJsonString(AJsonString: string): TAssetsClass; +class function TAssetsClass.FromJsonString(aJsonString: string): TAssetsClass; begin - result := TJson.JsonToObject(AJsonString) + Result := TJson.JsonToObject(aJsonString) end; { TAuthorClass } function TAuthorClass.ToJsonString: string; begin - result := TJson.ObjectToJsonString(self); + Result := TJson.ObjectToJsonString(Self); end; -class function TAuthorClass.FromJsonString(AJsonString: string): TAuthorClass; +class function TAuthorClass.FromJsonString(aJsonString: string): TAuthorClass; begin - result := TJson.JsonToObject(AJsonString) + Result := TJson.JsonToObject(aJsonString) end; { TReleaseClass } @@ -280,27 +280,26 @@ destructor TReleaseClass.Destroy; var LassetsItem: TAssetsClass; begin - for LassetsItem in FAssets do - LassetsItem.free; + LassetsItem.Free; - FAuthor.free; + FAuthor.Free; inherited; end; function TReleaseClass.ToJsonString: string; begin - result := TJson.ObjectToJsonString(self); + Result := TJson.ObjectToJsonString(Self); end; -class function TReleaseClass.FromJsonString(AJsonString: string): TReleaseClass; +class function TReleaseClass.FromJsonString(aJsonString: string): TReleaseClass; begin - result := TJson.JsonToObject(AJsonString) + Result := TJson.JsonToObject(aJsonString) end; class function TReleaseClass.HttpGet(AUrl: string; AOnBeforeRequest: TProc): TReleaseClass; begin - result := inherited HttpGet(AUrl, AOnBeforeRequest); + Result := inherited HttpGet(AUrl, AOnBeforeRequest); end; { TGitReleasesClass } @@ -316,19 +315,19 @@ destructor TGitReleasesClass.Destroy; begin for LReleasesItem in FReleases do - LReleasesItem.free; + LReleasesItem.Free; inherited; end; function TGitReleasesClass.ToJsonString: string; begin - result := TJson.ObjectToJsonString(self); + Result := TJson.ObjectToJsonString(Self); end; -class function TGitReleasesClass.FromJsonString(AJsonString: string): TGitReleasesClass; +class function TGitReleasesClass.FromJsonString(aJsonString: string): TGitReleasesClass; begin - result := TJson.JsonToObject(AJsonString) + Result := TJson.JsonToObject(aJsonString) end; class function TGitReleasesClass.FromUrl(AUrl: string; ATimeout: integer): TGitReleasesClass; @@ -373,20 +372,20 @@ class function TGitReleasesClass.FromUrl(AUrl: string; ATimeout: integer): TGitR LJsonObject.AddPair('Releases', LJsonValue); LString := LJsonObject.ToJSON; finally - LJsonObject.free; + LJsonObject.Free; end; end; - result := TGitReleasesClass.FromJsonString(LString); + Result := TGitReleasesClass.FromJsonString(LString); finally - LJsonValue.free; + LJsonValue.Free; end; finally - LHttp.free; + LHttp.Free; end; finally - LUri.free; + LUri.Free; end; end; @@ -394,12 +393,12 @@ class function TGitReleasesClass.FromUrl(AUrl: string; ATimeout: integer): TGitR function TErrorClass.ToJsonString: string; begin - result := TJson.ObjectToJsonString(self); + Result := TJson.ObjectToJsonString(Self); end; -class function TErrorClass.FromJsonString(AJsonString: string): TErrorClass; +class function TErrorClass.FromJsonString(aJsonString: string): TErrorClass; begin - result := TJson.JsonToObject(AJsonString) + Result := TJson.JsonToObject(aJsonString) end; { TUGitHubSerializableObject } @@ -439,14 +438,13 @@ function TUGitHubSerializableObject.HttpDelete(AUrl: string; AOnBeforeRequest: T end); - result := LResult; + Result := LResult; end; class function TUGitHubSerializableObject.HttpGet(AUrl: string; AOnBeforeRequest: TProc; AArrayProperty: string): T; var LResult: T; begin - WebRequest(AUrl, procedure(LHttp: TIdHttp) var @@ -478,20 +476,20 @@ class function TUGitHubSerializableObject.HttpGet(AUrl: string; AOnBeforeRequ LJsonObject.AddPair(AArrayProperty, LJsonValue); LString := LJsonObject.ToJSON; finally - LJsonObject.free; + LJsonObject.Free; end; end else raise Exception.CreateFmt('The class %s does not accept array values!', [LResult.className]); finally - LJsonValue.free; + LJsonValue.Free; end; LResult := TJson.JsonToObject(LString); end); - result := LResult; + Result := LResult; end; function TUGitHubSerializableObject.HttpPost(AUrl: string; AOnBeforeRequest: TProc): string; @@ -509,7 +507,7 @@ function TUGitHubSerializableObject.HttpPost(AUrl: string; AOnBeforeRequest: TPr if assigned(AOnBeforeRequest) then AOnBeforeRequest(LHttp); - LResult := TJson.ObjectToJsonString(self); + LResult := TJson.ObjectToJsonString(Self); LStringStream := TStringStream.Create(LResult, TEncoding.GetEncoding(LHttp.Request.ContentEncoding)); try @@ -517,12 +515,12 @@ function TUGitHubSerializableObject.HttpPost(AUrl: string; AOnBeforeRequest: TPr EnsureHttpResponseCode(LHttp.ResponseCode, AUrl, [200, 201, 202, 204]); EnsureHttpContentType(LHttp); finally - LStringStream.free; + LStringStream.Free; end; end); - result := LResult; + Result := LResult; end; function TUGitHubSerializableObject.HttpPut(AUrl: string; AOnBeforeRequest: TProc): string; @@ -540,7 +538,7 @@ function TUGitHubSerializableObject.HttpPut(AUrl: string; AOnBeforeRequest: TPro if assigned(AOnBeforeRequest) then AOnBeforeRequest(LHttp); - LResult := TJson.ObjectToJsonString(self); + LResult := TJson.ObjectToJsonString(Self); LStringStream := TStringStream.Create(LResult, TEncoding.GetEncoding(LHttp.Request.ContentEncoding)); try @@ -548,12 +546,12 @@ function TUGitHubSerializableObject.HttpPut(AUrl: string; AOnBeforeRequest: TPro EnsureHttpResponseCode(LHttp.ResponseCode, AUrl, [200, 204]); EnsureHttpContentType(LHttp); finally - LStringStream.free; + LStringStream.Free; end; end); - result := LResult; + Result := LResult; end; class function TUGitHubSerializableObject.WebRequest(AUrl: string; AOnRequest: TProc): integer; @@ -582,14 +580,14 @@ class function TUGitHubSerializableObject.WebRequest(AUrl: string; AOnRequest: T try AOnRequest(LHttp); finally - result := LHttp.ResponseCode; + Result := LHttp.ResponseCode; end; finally - LHttp.free; + LHttp.Free; end; finally - LUri.free; + LUri.Free; end; end; diff --git a/uMainForm.pas b/uMainForm.pas index 383ead6..1cb6a41 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -443,7 +443,6 @@ procedure TMainForm.TreeViewKeyDown(Sender: TObject; var Key: Word; var KeyChar: procedure TMainForm.VisualizeClass; begin FChanged := false; - FJsonMapper.DestinationUnitName := Edit1.Text; FJsonMapper.Parse(Memo1.Text); diff --git a/uUpdate.pas b/uUpdate.pas index c189989..a7ae067 100644 --- a/uUpdate.pas +++ b/uUpdate.pas @@ -8,7 +8,7 @@ interface const ProgramVersion: double = 1; UpdateUrl = 'https://api.github.com/repos/JensBorrisholt/Delphi-JsonToDelphiClass/releases'; - ProgramUrl = 'https://github.com/PKGeorgiev/Delphi-JsonToDelphiClass'; + ProgramUrl = 'https://github.com/JensBorrisholt/Delphi-JsonToDelphiClass'; function InternalCheckForUpdate: TObject; procedure NewCheckForUpdateTask(AOnFinish: TProc); From 214628fd7ba98f47737369768a1a07d2f905a865 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 3 Mar 2020 14:34:35 +0100 Subject: [PATCH 010/129] TObjectList Generation Generator now generates TObjectList instrad of TArray The JSON generated are now ISO compliant --- JSON_PAS.res | Bin 4548 -> 5344 bytes Pkg.Json.DTO.pas | 33 +++++++++++++++++++++--- Pkg.Json.Mapper.pas | 60 +++++++++++++++++++++++++++++++++----------- uMainForm.pas | 25 ++++++++---------- 4 files changed, 87 insertions(+), 31 deletions(-) diff --git a/JSON_PAS.res b/JSON_PAS.res index 41e2e838635f6f6eab7be0c6510472d5d548cdad..1cf718c974b0d9c7b78a2fddb0f32dbd71fe44cf 100644 GIT binary patch delta 813 zcmaJ+4S$#=e_FpvGEx`K;wSxalKfLV1SmyvCZ@VlN2SrzPvR$06o-blsr+E zDqx?;s8LP`J0R28+F&lL2E(W4#>P``dF%aQd2^+pn<=)M0K>U@hYHj2ktQ?}r<9qx z-thRWe>w+*oH@-$sgisGNOCPnWg7aUOGnjqGkt}|6$%bwirX+O-#g%2w80jRvYvzv zVIlpb%IiSp@{Af|hYO<~yPZ$BW#Au%cMR9v7l{!+s1*yi{X?zQyowETk#y~N4~UeL zNq9}3E9lyPTBCs^nST?A!H5|1YgPKfd6aMrCFVp{(~rRT(^b delta 52 zcmaE$c|>`F0#mWzM5X$Tn>R5{KF_Qz5R_V6qUTkdpBI#xmXn%XviS$IE+1!VUWy(s I7cUnB01kT*!2kdN diff --git a/Pkg.Json.DTO.pas b/Pkg.Json.DTO.pas index b824857..95ffeea 100644 --- a/Pkg.Json.DTO.pas +++ b/Pkg.Json.DTO.pas @@ -3,7 +3,7 @@ interface uses - System.Classes, System.Json, Rest.Json; + System.Classes, System.Json, Rest.Json, Rest.JsonReflect; type TJsonDTO = class @@ -20,10 +20,15 @@ TJsonDTO = class property AsJson: string read GetAsJson write SetAsJson; end; + GenericListReflectAttribute = class(JsonReflectAttribute) + public + constructor Create; + end; + implementation uses - System.Sysutils, Rest.JsonReflect, System.JSONConsts, System.Rtti, System.Generics.Collections; + System.Sysutils, System.JSONConsts, System.Rtti, System.Generics.Collections; { TJsonDTO } @@ -159,5 +164,27 @@ procedure TJsonDTO.SetAsJson(aValue: string); end; end; -end. +type + TGenericListFieldInterceptor = class(TJSONInterceptor) + public + function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override; + end; + + { TListFieldInterceptor } +function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; +var + ctx: TRttiContext; + List: TList; +begin + List := TList(ctx.GetType(Data.ClassInfo).GetField(Field).GetValue(Data).AsObject); + Result := TListOfObjects(List.List); + SetLength(Result, List.Count); +end; + +constructor GenericListReflectAttribute.Create; +begin + inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); +end; + +end. diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 94fd17f..5caea4e 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -258,7 +258,7 @@ function TPkgJsonMapper.GenerateUnit: string; StringList.Add('interface'); StringList.Add(''); StringList.Add('uses'); - StringList.Add(' Pkg.Json.DTO' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); + StringList.Add(' Pkg.Json.DTO, System.Generics.Collections' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); StringList.Add(''); StringList.Add('{$M+}'); StringList.Add(''); @@ -483,6 +483,7 @@ function TStubClass.GetImplementationPart: string; var Lines: TStringList; StubField: TStubField; + StubArrayField: TStubArrayField; begin Lines := TStringList.Create; try @@ -509,27 +510,33 @@ function TStubClass.GetImplementationPart: string; if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin Lines.Add(Format('destructor %s.Destroy;', [FName])); - if FArrayItems.Count > 0 then - begin - Lines.Add('var'); - Lines.Add(' Element: TObject;'); - end; - Lines.Add('begin'); for StubField in FComplexItems do Lines.AddFormat(' %s.Free;', [StubField.FieldName]); for StubField in FArrayItems do - begin - Lines.AddFormat(' for Element in %s do', [StubField.FieldName]); - Lines.Add(' Element.Free;'); - end; + Lines.AddFormat(' Get%s.Free;', [StubField.Name]); Lines.Add(' inherited;'); Lines.Add('end;'); end; + for StubField in FArrayItems do + begin + StubArrayField := StubField as TStubArrayField; + Lines.Add(''); + Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [FName, StubArrayField.Name, StubArrayField.FieldClass.Name]); + Lines.Add('begin'); + Lines.AddFormat(' if not Assigned(%s) then', [StubArrayField.FieldName]); + Lines.Add(' begin'); + Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubArrayField.FieldName, StubArrayField.FieldClass.Name]); + Lines.AddFormat(' %s.AddRange(%sArray);', [StubArrayField.FieldName, StubArrayField.FieldName]); + Lines.Add(' end;'); + Lines.AddFormat(' Result := %s;', [StubArrayField.FieldName]); + Lines.Add('end;'); + end; + Lines.TrailingLineBreak := False; Result := Lines.Text; finally @@ -552,6 +559,7 @@ function TStubClass.GetDeclarationPart(const BaseClass: string): string; var Lines: TStringList; StubField: TStubField; + StubArrayField: TStubArrayField; i: Integer; begin Lines := TStringList.Create; @@ -562,10 +570,27 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + for StubField in FItems do begin - if StubField.NeedsAttribute then + if StubField is TStubArrayField then + begin + StubArrayField := StubField as TStubArrayField; Lines.Add(' ' + StubField.NameAttribute); + Lines.AddFormat(' %sArray: %s;', [StubField.FieldName, StubField.GetTypeAsString]); + Lines.Add(' [GenericListReflect]'); + Lines.AddFormat(' %s: TObjectList<%s>;', [StubField.FieldName, StubArrayField.FieldClass.Name]); + end + else + begin + if StubField.NeedsAttribute then + Lines.Add(' ' + StubField.NameAttribute); + + Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); + end; + end; - Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); + for StubField in FArrayItems do + begin + StubArrayField := StubField as TStubArrayField; + Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.Name, StubArrayField.FieldClass.Name]); end; if FItems.Count > 0 then @@ -576,7 +601,14 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + if (StubField.FieldType = jtUnknown) or ((StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = jtUnknown)) then raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [StubField.PropertyName]); - Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.GetTypeAsString, StubField.FieldName, StubField.FieldName]); + if StubField is TStubArrayField then + begin + StubArrayField := StubField as TStubArrayField; + Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.FieldClass.Name, StubArrayField.Name]); + end + else + Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.GetTypeAsString, StubField.FieldName, StubField.FieldName]); + end; if FComplexItems.Count > 0 then diff --git a/uMainForm.pas b/uMainForm.pas index 1cb6a41..5554c6b 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -3,21 +3,17 @@ interface uses - System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, - FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.DialogService, FMX.Dialogs, - FMX.Layouts, FMX.TreeView, FMX.Edit, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, - FMX.Menus, FMX.Controls.Presentation, - System.Json, Rest.Json, TypInfo, RTTI, - regularexpressions, generics.collections, Pkg.Json.Mapper, NetEncoding, - FMX.ConstrainedForm, Rest.Client, - uUpdate, System.Threading, uGitHub, FMX.Objects, uUpdateForm, SyncObjs, - System.Actions, FMX.ActnList; + System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Threading, System.SyncObjs, System.NetEncoding, + + FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.DialogService, FMX.Dialogs, FMX.Layouts, FMX.TreeView, FMX.Edit, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, + FMX.Menus, FMX.Controls.Presentation, FMX.Objects, System.Actions, FMX.ActnList, FMX.ConstrainedForm, + + Pkg.Json.Mapper, uUpdate, uGitHub, uUpdateForm; const JsonValidatorUrl = 'http://jsonlint.com'; type - TMainForm = class(TConstrainedForm) Memo1: TMemo; StyleBook1: TStyleBook; @@ -103,12 +99,12 @@ implementation Winapi.ShellAPI, Winapi.Windows; {$ENDIF MSWINDOWS} {$IFDEF POSIX} -Posix.Stdlib; + Posix.Stdlib; {$ENDIF POSIX} procedure TMainForm.btnExitClick(Sender: TObject); begin - CLose; + Close; end; procedure TMainForm.btnVisualizeClick(Sender: TObject); @@ -256,7 +252,7 @@ procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); TThread.Queue(nil, procedure begin - CLose; + Close; end); end); @@ -320,7 +316,7 @@ procedure TMainForm.FormDestroy(Sender: TObject); procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if Key = 27 then - CLose; + Close; end; procedure TMainForm.Label1Click(Sender: TObject); @@ -343,6 +339,7 @@ procedure TMainForm.Label1Click(Sender: TObject); procedure TMainForm.Memo1Change(Sender: TObject); begin + exit; actPrettyPrintJSON.Execute; end; From 1059e7921ff5694115f3e16f7bc3bf3ffe830a68 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 3 Mar 2020 14:49:35 +0100 Subject: [PATCH 011/129] Update README.md --- README.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index d936431..c3e68c3 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ Lots of changes in this version: * Socurce Code restructored * Parser logic are seperated from GUI logic * Fixed bug in the RegEx for recognizing an ISO8601 Date - +* Serialization removed the "noise" of List i.e. includes internal properties that did not exist in the original JSON string. +* Generated code uses TobjectList + Generates Delphi Classes based on JSON string. Just like XML Data Binding, but for JSON. Main features: @@ -34,16 +36,13 @@ Main features: - Allows you to change the names of the stub classes; - Supports JSON pretty print to format the input string; - Simple and responsive GUI; -- *** Automatic check for update, based on ITask (Parallel Programming Library)! +- Automatic check for update, based on ITask (Parallel Programming Library)! - It's open source! You can find the source code and binary releases on GitHub. - The program uses MadExcept to report unhanded exceptions; * If the JSON array is empty the contained type is unknown. Unit generation works only with known and supported types. -** This is because serialization of TList adds "noise" i.e. includes internal properties that did not exist in the original JSON string. - *** The releases of JsonToDelphiClass (source and binaries) are public and reside on GitHub. The update unit uses GitHub's REST API to enumerate tags/releases. Report any problems/suggestions using GitHub's facilities. -You can find more information here: http://www.pgeorgiev.com/?p=1832 From 45b8e9807a44f901b8bae067935d315d658a2c29 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Wed, 4 Mar 2020 17:06:30 +0100 Subject: [PATCH 012/129] Create WebAPP.json --- Demo Data/WebAPP.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 Demo Data/WebAPP.json diff --git a/Demo Data/WebAPP.json b/Demo Data/WebAPP.json new file mode 100644 index 0000000..58311fe --- /dev/null +++ b/Demo Data/WebAPP.json @@ -0,0 +1 @@ +{"web-app":{"servlet":[{"init-param":{"cachePackageTagsRefresh":60,"cachePackageTagsStore":200,"cachePackageTagsTrack":200,"cachePagesDirtyRead":10,"cachePagesRefresh":10,"cachePagesStore":100,"cachePagesTrack":200,"cacheTemplatesRefresh":15,"cacheTemplatesStore":50,"cacheTemplatesTrack":100,"configGlossary:adminEmail":"ksm@pobox.com","configGlossary:installationAt":"Philadelphia, PA","configGlossary:poweredBy":"Cofax","configGlossary:poweredByIcon":"/images/cofax.gif","configGlossary:staticPath":"/content/static","dataStoreClass":"org.cofax.SqlDataStore","dataStoreConnUsageLimit":100,"dataStoreDriver":"com.microsoft.jdbc.sqlserver.SQLServerDriver","dataStoreInitConns":10,"dataStoreLogFile":"/usr/local/tomcat/logs/datastore.log","dataStoreLogLevel":"debug","dataStoreMaxConns":100,"dataStoreName":"cofax","dataStorePassword":"dataStoreTestQuery","dataStoreTestQuery":"SET NOCOUNT ON;select test='test';","dataStoreUrl":"jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon","dataStoreUser":"sa","defaultFileTemplate":"articleTemplate.htm","defaultListTemplate":"listTemplate.htm","jspFileTemplate":"articleTemplate.jsp","jspListTemplate":"listTemplate.jsp","maxUrlLength":500,"redirectionClass":"org.cofax.SqlRedirection","searchEngineFileTemplate":"forSearchEngines.htm","searchEngineListTemplate":"forSearchEnginesList.htm","searchEngineRobotsDb":"WEB-INF/robots.db","templateLoaderClass":"org.cofax.FilesTemplateLoader","templateOverridePath":"","templatePath":"templates","templateProcessorClass":"org.cofax.WysiwygTemplate","useDataStore":true,"useJSP":false},"servlet-class":"org.cofax.cds.CDSServlet","servlet-name":"cofaxCDS"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cds.EmailServlet","servlet-name":"cofaxEmail"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cds.AdminServlet","servlet-name":"cofaxAdmin"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cds.FileServlet","servlet-name":"fileServlet"},{"init-param":{"cachePackageTagsRefresh":0,"cachePackageTagsStore":0,"cachePackageTagsTrack":0,"cachePagesDirtyRead":0,"cachePagesRefresh":0,"cachePagesStore":0,"cachePagesTrack":0,"cacheTemplatesRefresh":0,"cacheTemplatesStore":0,"cacheTemplatesTrack":0,"configGlossary:adminEmail":"","configGlossary:installationAt":"","configGlossary:poweredBy":"","configGlossary:poweredByIcon":"","configGlossary:staticPath":"","dataStoreClass":"","dataStoreConnUsageLimit":0,"dataStoreDriver":"","dataStoreInitConns":0,"dataStoreLogFile":"","dataStoreLogLevel":"","dataStoreMaxConns":0,"dataStoreName":"","dataStorePassword":"","dataStoreTestQuery":"","dataStoreUrl":"","dataStoreUser":"","defaultFileTemplate":"","defaultListTemplate":"","jspFileTemplate":"","jspListTemplate":"","maxUrlLength":0,"redirectionClass":"","searchEngineFileTemplate":"","searchEngineListTemplate":"","searchEngineRobotsDb":"","templateLoaderClass":"","templateOverridePath":"","templatePath":"toolstemplates/","templateProcessorClass":"","useDataStore":false,"useJSP":false},"servlet-class":"org.cofax.cms.CofaxToolsServlet","servlet-name":"cofaxTools"}],"servlet-mapping":{"cofaxAdmin":"/admin/*","cofaxCDS":"/","cofaxEmail":"/cofaxutil/aemail/*","cofaxTools":"/tools/*","fileServlet":"/static/*"},"taglib":{"taglib-location":"/WEB-INF/tlds/cofax.tld","taglib-uri":"cofax.tld"}}} \ No newline at end of file From 1609b9d67fced931443052c8d2fa1bb759d4e58a Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Thu, 9 Apr 2020 17:34:06 +0200 Subject: [PATCH 013/129] Added missing using --- Pkg.Json.Mapper.pas | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 5caea4e..54e229a 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -223,32 +223,9 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: function TPkgJsonMapper.GenerateUnit: string; var - StubClass: TStubClass; - StubField: TStubField; StringList: TStringList; - NeedsAttribute: Boolean; i: Integer; begin - NeedsAttribute := False; - for StubClass in FStubClasses do - begin - if StubClass.NeedsAttribute then - begin - NeedsAttribute := True; - Break; - end; - - for StubField in StubClass.Items do - if StubField.NeedsAttribute then - begin - NeedsAttribute := True; - Break; - end; - - if NeedsAttribute then - Break; - end; - StringList := TStringList.Create; try StringList.TrailingLineBreak := False; @@ -258,7 +235,7 @@ function TPkgJsonMapper.GenerateUnit: string; StringList.Add('interface'); StringList.Add(''); StringList.Add('uses'); - StringList.Add(' Pkg.Json.DTO, System.Generics.Collections' + IfThen(NeedsAttribute, ', REST.Json.Types', '') + ';'); + StringList.Add(' Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types;'); StringList.Add(''); StringList.Add('{$M+}'); StringList.Add(''); From 35a0cdca1b2d8ebe0ffa4b98aacb7e9a62b0b1aa Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Thu, 9 Apr 2020 18:34:20 +0200 Subject: [PATCH 014/129] Bugfix in generator I the JSON Node started with _ then the private Field wasn't decorated --- Pkg.Json.Mapper.pas | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 54e229a..ffcc9ac 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -746,7 +746,7 @@ constructor TSOJName.Create(aItemName: string); if aItemName.IsEmpty then raise Exception.Create('aItemName can not be empty'); - + FNeedsAttribute := False; FJsonName := aItemName; @@ -756,7 +756,7 @@ constructor TSOJName.Create(aItemName: string); else s := s + '_'; - FNeedsAttribute := s <> FJsonName; + FNeedsAttribute := (s <> FJsonName) or (aItemName.StartsWith('_')); if s.StartsWith('_') then s := s.Substring(1); From 886af2450d735ac6af7239e72378430c96e1e170 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Thu, 14 May 2020 14:47:15 +0200 Subject: [PATCH 015/129] Bugfix for number parsting Numbers inside a string was't recognized as a number --- Win32/Debug/Pkg.Json.DTO.pas | 71 --- Win32/Debug/Project38.dpr | 16 - Win32/Debug/Project38.dproj | 843 ----------------------------------- Win32/Debug/Project38.res | Bin 59520 -> 0 bytes Win32/Debug/Root.pas | 218 --------- Win32/Debug/Unit38.dfm | 25 -- Win32/Debug/Unit38.pas | 51 --- 7 files changed, 1224 deletions(-) delete mode 100644 Win32/Debug/Pkg.Json.DTO.pas delete mode 100644 Win32/Debug/Project38.dpr delete mode 100644 Win32/Debug/Project38.dproj delete mode 100644 Win32/Debug/Project38.res delete mode 100644 Win32/Debug/Root.pas delete mode 100644 Win32/Debug/Unit38.dfm delete mode 100644 Win32/Debug/Unit38.pas diff --git a/Win32/Debug/Pkg.Json.DTO.pas b/Win32/Debug/Pkg.Json.DTO.pas deleted file mode 100644 index 059555b..0000000 --- a/Win32/Debug/Pkg.Json.DTO.pas +++ /dev/null @@ -1,71 +0,0 @@ -unit Pkg.Json.DTO; - -interface - -uses - Rest.Json; - -type - TJsonDTO = class - private - FOptions: TJsonOptions; - function GetAsJson: string; - procedure SetAsJson(const Value: string); - public - constructor Create; overload; - constructor Create(const aJson: string; AOptions: TJsonOptions = [joDateIsUTC, joDateFormatISO8601]); overload; - property AsJson: string read GetAsJson write SetAsJson; - end; - -implementation - -uses - System.Json, System.Sysutils, Rest.JsonReflect, System.JSONConsts; - -{ TJsonDTO } - -constructor TJsonDTO.Create(const aJson: string; AOptions: TJsonOptions); -begin - inherited Create; - FOptions := AOptions; - AsJson := aJson; -end; - -constructor TJsonDTO.Create; -begin - inherited; - FOptions := [joDateIsUTC, joDateFormatISO8601]; -end; - -function TJsonDTO.GetAsJson: string; -begin - Result := TJson.ObjectToJsonString(Self, FOptions); -end; - -procedure TJsonDTO.SetAsJson(const Value: string); -var - Json: string; - JSONValue: TJSONValue; - JSONObject: TJSONObject; -begin - JSONValue := TJSONObject.ParseJSONValue(Value); - try - if Assigned(JSONValue) and (JSONValue is TJSONObject) then - JSONObject := JSONValue as TJSONObject - else - begin - Json := Value.Trim; - if (Json = '') and not Assigned(JSONValue) or (Json <> '') and Assigned(JSONValue) and JSONValue.Null then - Exit - else - raise EConversionError.Create(SCannotCreateObject); - end; - - TJson.JsonToObject(Self, JSONObject, FOptions); - - finally - JSONValue.Free; - end; -end; - -end. diff --git a/Win32/Debug/Project38.dpr b/Win32/Debug/Project38.dpr deleted file mode 100644 index 04c2d6b..0000000 --- a/Win32/Debug/Project38.dpr +++ /dev/null @@ -1,16 +0,0 @@ -program Project38; - -uses - Vcl.Forms, - Unit38 in 'Unit38.pas' {Form38}, - Root in 'Root.pas', - Pkg.Json.DTO in 'Pkg.Json.DTO.pas'; - -{$R *.res} - -begin - Application.Initialize; - Application.MainFormOnTaskbar := True; - Application.CreateForm(TForm38, Form38); - Application.Run; -end. diff --git a/Win32/Debug/Project38.dproj b/Win32/Debug/Project38.dproj deleted file mode 100644 index cd70f88..0000000 --- a/Win32/Debug/Project38.dproj +++ /dev/null @@ -1,843 +0,0 @@ - - - {1300D295-9935-41DA-98C8-36A156A06F11} - 18.7 - VCL - Project38.dpr - True - Debug - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - Project38 - - - DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;rbBDE2026;rbRAP2026;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;rbRest2026;FireDACMSSQLDriver;vcltouch;vcldb;svn;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPDFViewerRS26;dxPsPrVwAdvRS26;vclx;dxPScxTLLnkRS26;rbRIDE2026;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;rbRCL2026;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dclRBE2026;dxFireDACServerModeRS26;bindcompdbx;dclRBFireDAC2026;IndyIPServer;DBXSybaseASEDriver;cxPivotGridRS26;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;rbADO2026;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;rbTCUI2026;dclRBDBE2026;emshosting;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;rbUSERDesign2026;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;rbFireDAC2026;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;svnui;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;rbDBE2026;bindcompfmx;DBXOracleDriver;inetdb;rbDB2026;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;rbTC2026;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;rbCIDE2026;rbDIDE2026;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;dxPSRichEditControlLnkRS26;FireDACASADriver;cxPivotGridChartRS26;rbRTL2026;dxPSDBTeeChartRS26;Tee;DataSnapServer;rbDAD2026;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;rbUSER2026;dclRBADO2026;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;rbIDE2026;fmxase;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(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 - $(BDS)\bin\default_app.manifest - - - DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;FireDACMSSQLDriver;vcltouch;vcldb;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPDFViewerRS26;dxPsPrVwAdvRS26;vclx;dxPScxTLLnkRS26;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dxFireDACServerModeRS26;bindcompdbx;IndyIPServer;DBXSybaseASEDriver;cxPivotGridRS26;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;DBXOracleDriver;inetdb;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;dxPSRichEditControlLnkRS26;FireDACASADriver;cxPivotGridChartRS26;dxPSDBTeeChartRS26;Tee;DataSnapServer;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;fmxase;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - - MainSource - - -
Form38
- dfm -
- - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
- - Delphi.Personality.12 - Application - - - - Project38.dpr - - - - - - Project38.exe - true - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 1 - - - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - - - res\values - 1 - - - - - res\values-v21 - 1 - - - - - res\values - 1 - - - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - 1 - - - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - True - False - - - 12 - - - - -
diff --git a/Win32/Debug/Project38.res b/Win32/Debug/Project38.res deleted file mode 100644 index 23497de5f7cc857f26ab67b71bc721c4ee5fb91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59520 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 diff --git a/Win32/Debug/Root.pas b/Win32/Debug/Root.pas deleted file mode 100644 index ab574cd..0000000 --- a/Win32/Debug/Root.pas +++ /dev/null @@ -1,218 +0,0 @@ -unit Root; - -interface - -uses - Pkg.Json.DTO; - -{$M+} - -type - TUploaderDTO = class - strict private - FAvatar_Url: String; - FEvents_Url: String; - FFollowers_Url: String; - FFollowing_Url: String; - FGists_Url: String; - FGravatar_Id: String; - FHtml_Url: String; - FId: Integer; - FLogin: String; - FOrganizations_Url: String; - FReceived_Events_Url: String; - FRepos_Url: String; - FSite_Admin: Boolean; - FStarred_Url: String; - FSubscriptions_Url: String; - FType: String; - FUrl: String; - published - property Avatar_Url: String read FAvatar_Url write FAvatar_Url; - property Events_Url: String read FEvents_Url write FEvents_Url; - property Followers_Url: String read FFollowers_Url write FFollowers_Url; - property Following_Url: String read FFollowing_Url write FFollowing_Url; - property Gists_Url: String read FGists_Url write FGists_Url; - property Gravatar_Id: String read FGravatar_Id write FGravatar_Id; - property Html_Url: String read FHtml_Url write FHtml_Url; - property Id: Integer read FId write FId; - property Login: String read FLogin write FLogin; - property Organizations_Url: String read FOrganizations_Url write FOrganizations_Url; - property Received_Events_Url: String read FReceived_Events_Url write FReceived_Events_Url; - property Repos_Url: String read FRepos_Url write FRepos_Url; - property Site_Admin: Boolean read FSite_Admin write FSite_Admin; - property Starred_Url: String read FStarred_Url write FStarred_Url; - property Subscriptions_Url: String read FSubscriptions_Url write FSubscriptions_Url; - property &Type: String read FType write FType; - property Url: String read FUrl write FUrl; - end; - - TAssetsDTO = class - strict private - FBrowser_Download_Url: String; - FContent_Type: String; - FCreated_At: String; - FDownload_Count: Integer; - FId: Integer; - FName: String; - FSize: Integer; - FState: String; - FUpdated_At: String; - FUploader: TUploaderDTO; - FUrl: String; - published - property Browser_Download_Url: String read FBrowser_Download_Url write FBrowser_Download_Url; - property Content_Type: String read FContent_Type write FContent_Type; - property Created_At: String read FCreated_At write FCreated_At; - property Download_Count: Integer read FDownload_Count write FDownload_Count; - property Id: Integer read FId write FId; - property Name: String read FName write FName; - property Size: Integer read FSize write FSize; - property State: String read FState write FState; - property Updated_At: String read FUpdated_At write FUpdated_At; - property Uploader: TUploaderDTO read FUploader write FUploader; - property Url: String read FUrl write FUrl; - public - constructor Create; - destructor Destroy; override; - end; - - TAuthorDTO = class - strict private - FAvatar_Url: String; - FEvents_Url: String; - FFollowers_Url: String; - FFollowing_Url: String; - FGists_Url: String; - FGravatar_Id: String; - FHtml_Url: String; - FId: Integer; - FLogin: String; - FOrganizations_Url: String; - FReceived_Events_Url: String; - FRepos_Url: String; - FSite_Admin: Boolean; - FStarred_Url: String; - FSubscriptions_Url: String; - FType: String; - FUrl: String; - published - property Avatar_Url: String read FAvatar_Url write FAvatar_Url; - property Events_Url: String read FEvents_Url write FEvents_Url; - property Followers_Url: String read FFollowers_Url write FFollowers_Url; - property Following_Url: String read FFollowing_Url write FFollowing_Url; - property Gists_Url: String read FGists_Url write FGists_Url; - property Gravatar_Id: String read FGravatar_Id write FGravatar_Id; - property Html_Url: String read FHtml_Url write FHtml_Url; - property Id: Integer read FId write FId; - property Login: String read FLogin write FLogin; - property Organizations_Url: String read FOrganizations_Url write FOrganizations_Url; - property Received_Events_Url: String read FReceived_Events_Url write FReceived_Events_Url; - property Repos_Url: String read FRepos_Url write FRepos_Url; - property Site_Admin: Boolean read FSite_Admin write FSite_Admin; - property Starred_Url: String read FStarred_Url write FStarred_Url; - property Subscriptions_Url: String read FSubscriptions_Url write FSubscriptions_Url; - property &Type: String read FType write FType; - property Url: String read FUrl write FUrl; - end; - - TItemDTO = class - strict private - FAssets: TArray; - FAssets_Url: String; - FAuthor: TAuthorDTO; - FBody: String; - FCreated_At: String; - FDraft: Boolean; - FHtml_Url: String; - FId: Integer; - FName: String; - FPrerelease: Boolean; - FPublished_At: String; - FTag_Name: String; - FTarball_Url: String; - FTarget_Commitish: String; - FUpload_Url: String; - FUrl: String; - FZipball_Url: String; - published - property Assets: TArray read FAssets write FAssets; - property Assets_Url: String read FAssets_Url write FAssets_Url; - property Author: TAuthorDTO read FAuthor write FAuthor; - property Body: String read FBody write FBody; - property Created_At: String read FCreated_At write FCreated_At; - property Draft: Boolean read FDraft write FDraft; - property Html_Url: String read FHtml_Url write FHtml_Url; - property Id: Integer read FId write FId; - property Name: String read FName write FName; - property Prerelease: Boolean read FPrerelease write FPrerelease; - property Published_At: String read FPublished_At write FPublished_At; - property Tag_Name: String read FTag_Name write FTag_Name; - property Tarball_Url: String read FTarball_Url write FTarball_Url; - property Target_Commitish: String read FTarget_Commitish write FTarget_Commitish; - property Upload_Url: String read FUpload_Url write FUpload_Url; - property Url: String read FUrl write FUrl; - property Zipball_Url: String read FZipball_Url write FZipball_Url; - public - constructor Create; - destructor Destroy; override; - end; - - TRootDTO = class(TJsonDTO) - strict private - FItems: TArray; - published - property Items: TArray read FItems write FItems; - public - destructor Destroy; override; - end; - -implementation - -{ TAssetsDTO } - -constructor TAssetsDTO.Create; -begin - inherited; - FUploader := TUploaderDTO.Create; -end; - -destructor TAssetsDTO.Destroy; -begin - FUploader.Free; - inherited; -end; - -{ TItemDTO } - -constructor TItemDTO.Create; -begin - inherited; - FAuthor := TAuthorDTO.Create; -end; - -destructor TItemDTO.Destroy; -var - AssetsItem: TAssetsDTO; -begin - for AssetsItem in FAssets do - AssetsItem.Free; - - FAuthor.Free; - inherited; -end; - -{ TRootDTO } - -destructor TRootDTO.Destroy; -var - ItemsItem: TItemDTO; -begin - for ItemsItem in FItems do - ItemsItem.Free; - - inherited; -end; - -end. - diff --git a/Win32/Debug/Unit38.dfm b/Win32/Debug/Unit38.dfm deleted file mode 100644 index 6e4b6ca..0000000 --- a/Win32/Debug/Unit38.dfm +++ /dev/null @@ -1,25 +0,0 @@ -object Form38: TForm38 - Left = 0 - Top = 0 - Caption = 'Form38' - ClientHeight = 411 - ClientWidth = 852 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - OldCreateOrder = False - PixelsPerInch = 96 - TextHeight = 13 - object Button1: TButton - Left = 400 - Top = 216 - Width = 75 - Height = 25 - Caption = 'Button1' - TabOrder = 0 - OnClick = Button1Click - end -end diff --git a/Win32/Debug/Unit38.pas b/Win32/Debug/Unit38.pas deleted file mode 100644 index 1f8d7fa..0000000 --- a/Win32/Debug/Unit38.pas +++ /dev/null @@ -1,51 +0,0 @@ -unit Unit38; - -interface - -uses - Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; - -type - TForm38 = class(TForm) - Button1: TButton; - procedure Button1Click(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form38: TForm38; - -implementation - -{$R *.dfm} - -uses - Rest.Json, - Root; - -procedure TForm38.Button1Click(Sender: TObject); - -begin - - with TStringList.Create do - try - LoadFromFile('C:\aa\Text.json'); - - with TJson.JsonToObject(Text) do -// with TRootClass.FromJsonString(Text) do - try - Caption := Items[0].Assets[0].Browser_download_url; - finally - Free; - end; - finally - Free; - end; - -end; - -end. From e7fdb73a2e835c6076e960e63810c6acdebae19e Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Thu, 14 May 2020 14:47:55 +0200 Subject: [PATCH 016/129] Bugfix for numbers inside a string Numbers inside a string wasn't recognized as a number --- .gitignore | 2 ++ Pkg.Json.Mapper.pas | 37 ++++++++++++++++++++----------------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index c0821f2..8b7a466 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,5 @@ __recover/ __recovery/uMainForm.pas __recovery/uMainForm.fmx __recovery/__recovery.ini + +Win32/Debug/ diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index ffcc9ac..069fc5f 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -255,7 +255,7 @@ function TPkgJsonMapper.GenerateUnit: string; Result := StringList.Text; finally - StringList.Free; + StringList.free; end; end; @@ -339,24 +339,29 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; j: Int64; b: Boolean; begin + Result := jtUnknown; + if aJsonValue is TJSONObject then Result := jtObject else if aJsonValue is TJSONArray then Result := jtArray - else if (aJsonValue is TJSONNumber) then + else if (aJsonValue is TJSONNumber) or (aJsonValue is TJSONString) then begin if TryStrToInt(aJsonValue.Value, i) then - Result := jtInteger - else if TryStrToInt64(aJsonValue.Value, j) then - Result := jtInteger64 - else - Result := jtNumber + exit(jtInteger); + + if TryStrToInt64(aJsonValue.Value, j) then + exit(jtInteger64); + + if (aJsonValue is TJSONNumber) then + exit(jtNumber); end else if aJsonValue is TJSONTrue then Result := jtTrue else if aJsonValue is TJSONFalse then - Result := jtFalse - else if aJsonValue is TJSONString then + Result := jtFalse; + + if aJsonValue is TJSONString then begin JsonString := (aJsonValue as TJSONString); if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then @@ -372,9 +377,7 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; end else Result := jtString - end - else - Result := jtUnknown; + end; end; function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; @@ -414,7 +417,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; end; end; finally - JSONValue.Free; + JSONValue.free; end; end else @@ -517,7 +520,7 @@ function TStubClass.GetImplementationPart: string; Lines.TrailingLineBreak := False; Result := Lines.Text; finally - Lines.Free; + Lines.free; end; end; @@ -606,7 +609,7 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + Lines.TrailingLineBreak := False; Result := Lines.Text; finally - Lines.Free; + Lines.free; end; end; @@ -733,7 +736,7 @@ function TSOJName.CapitaiazeFirst(const Value: string): string; List.Delimiter := '_'; Result := List.DelimitedText; finally - List.Free; + List.free; end; end; @@ -746,7 +749,7 @@ constructor TSOJName.Create(aItemName: string); if aItemName.IsEmpty then raise Exception.Create('aItemName can not be empty'); - + FNeedsAttribute := False; FJsonName := aItemName; From 21ad021c4409411b8649ee6cb07ae5aa8b3d4745 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Fri, 15 May 2020 06:54:25 +0200 Subject: [PATCH 017/129] Mapping fix --- Pkg.Json.Mapper.pas | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 069fc5f..073f57e 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -339,13 +339,13 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; j: Int64; b: Boolean; begin - Result := jtUnknown; + Result := jtUnknown; if aJsonValue is TJSONObject then Result := jtObject else if aJsonValue is TJSONArray then Result := jtArray - else if (aJsonValue is TJSONNumber) or (aJsonValue is TJSONString) then + else if (aJsonValue is TJSONNumber) then begin if TryStrToInt(aJsonValue.Value, i) then exit(jtInteger); @@ -355,28 +355,24 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; if (aJsonValue is TJSONNumber) then exit(jtNumber); - end - else if aJsonValue is TJSONTrue then - Result := jtTrue - else if aJsonValue is TJSONFalse then - Result := jtFalse; + end; + + if aJsonValue is TJSONTrue then + exit(jtTrue); + + if aJsonValue is TJSONFalse then + exit(jtFalse); if aJsonValue is TJSONString then begin JsonString := (aJsonValue as TJSONString); if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then - Result := jtDateTime - else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then - Result := jtDate - else if TryStrToBool(JsonString.Value, b) then - begin - if b then - Result := jtTrue - else - Result := jtFalse - end - else - Result := jtString + exit(jtDateTime); + + if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then + exit(jtDate); + + Result := jtString end; end; From 5e6b8419d0690695f50538fff9a420d745ab52f0 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sat, 16 May 2020 07:36:55 +0200 Subject: [PATCH 018/129] Multible Items New feature: If the Objects inside contains different properties, now all properties are added! --- .gitignore | 2 + JsonToDelphiClass.skincfg | 57 ----------------------- Pkg.Json.Mapper.pas | 97 ++++++++++++++++++++++++++++----------- 3 files changed, 72 insertions(+), 84 deletions(-) delete mode 100644 JsonToDelphiClass.skincfg diff --git a/.gitignore b/.gitignore index 8b7a466..741d283 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,5 @@ __recovery/uMainForm.fmx __recovery/__recovery.ini Win32/Debug/ + +*.skincfg diff --git a/JsonToDelphiClass.skincfg b/JsonToDelphiClass.skincfg deleted file mode 100644 index e074481..0000000 --- a/JsonToDelphiClass.skincfg +++ /dev/null @@ -1,57 +0,0 @@ -[ExpressSkins] -Default=1 -ShowNotifications=1 -Enabled=0 -dxSkinBlack=1 -dxSkinBlue=1 -dxSkinBlueprint=1 -dxSkinCaramel=1 -dxSkinCoffee=1 -dxSkinDarkroom=1 -dxSkinDarkSide=1 -dxSkinDevExpressDarkStyle=1 -dxSkinDevExpressStyle=1 -dxSkinFoggy=1 -dxSkinGlassOceans=1 -dxSkinHighContrast=1 -dxSkiniMaginary=1 -dxSkinLilian=1 -dxSkinLiquidSky=1 -dxSkinLondonLiquidSky=1 -dxSkinMcSkin=1 -dxSkinMetropolis=1 -dxSkinMetropolisDark=1 -dxSkinMoneyTwins=1 -dxSkinOffice2007Black=1 -dxSkinOffice2007Blue=1 -dxSkinOffice2007Green=1 -dxSkinOffice2007Pink=1 -dxSkinOffice2007Silver=1 -dxSkinOffice2010Black=1 -dxSkinOffice2010Blue=1 -dxSkinOffice2010Silver=1 -dxSkinOffice2013DarkGray=1 -dxSkinOffice2013LightGray=1 -dxSkinOffice2013White=1 -dxSkinOffice2016Colorful=1 -dxSkinOffice2016Dark=1 -dxSkinOffice2019Colorful=1 -dxSkinPumpkin=1 -dxSkinSeven=1 -dxSkinSevenClassic=1 -dxSkinSharp=1 -dxSkinSharpPlus=1 -dxSkinSilver=1 -dxSkinSpringtime=1 -dxSkinStardust=1 -dxSkinSummer2008=1 -dxSkinTheAsphaltWorld=1 -dxSkinTheBezier=1 -dxSkinsDefaultPainters=1 -dxSkinValentine=1 -dxSkinVisualStudio2013Blue=1 -dxSkinVisualStudio2013Dark=1 -dxSkinVisualStudio2013Light=1 -dxSkinVS2010=1 -dxSkinWhiteprint=1 -dxSkinXmas2008Blue=1 diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 073f57e..6dbf7a5 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -86,20 +86,24 @@ TStubClass = class(TSOJName) FMapper: TPkgJsonMapper; FPureClassName: string; FArrayProperty: string; + FStubClasses: TDictionary; procedure SetName(const Value: string); public constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); destructor Destroy; override; function GetDeclarationPart(const BaseClass: string = ''): string; function GetImplementationPart: string; + function HasPropety(aJsonName: string): Boolean; + function GetItemFromName(aJsonName: string): TStubField; procedure SortFields; published - property name: string read FName write SetName; - property Items: TObjectList read FItems write FItems; - property PureClassName: string read FPureClassName write FPureClassName; + property name: string read FName; + property Items: TObjectList read FItems; + property PureClassName: string read FPureClassName; property ArrayProperty: string read FArrayProperty write FArrayProperty; property ComplexItems: TList read FComplexItems; property ArrayItems: TList read FArrayItems; + property StubClasses: TDictionary read FStubClasses; end; TPkgJsonMapper = class @@ -167,8 +171,18 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: JSONObject: TJSONObject; JsonPair: TJSONPair; JSONValue, JsonValue2: TJsonValue; + JsonArray: TJSONArray; JsonType, JsonType2: TJsonType; StubClass: TStubClass; + JsonName: string; + + function GetStub(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper): TStubClass; + begin + aParentClass.StubClasses.TryGetValue(aClassName, Result); + if Result = nil then + Exit(TStubClass.Create(aParentClass, JsonName, Self)); + end; + begin JSONObject := aJsonValue as TJSONObject; @@ -176,45 +190,50 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: begin JSONValue := JsonPair.JSONValue; JsonType := GetJsonType(JSONValue); + JsonName := JsonPair.JsonString.Value; case JsonType of jtUnknown: { do nothing }; jtObject: begin - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); - TStubObjectField.Create(aParentClass, JsonPair.JsonString.Value, StubClass); + StubClass := TStubClass.Create(aParentClass, JsonName, Self); + TStubObjectField.Create(aParentClass, JsonName, StubClass); ProcessJsonObject(JSONValue, StubClass); end; jtArray: begin StubClass := nil; - JsonValue2 := GetFirstArrayItem(JSONValue); - if JsonValue2 <> nil then + JsonArray := JSONValue as TJSONArray; + + if JsonArray.Count = 0 then // if we meet an empty array then + begin + JsonType2 := jtObject; + StubClass := GetStub(aParentClass, JsonName, Self); + end; + + for JsonValue2 in JsonArray do begin JsonType2 := GetJsonType(JsonValue2); case JsonType2 of jtObject: begin - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + StubClass := GetStub(aParentClass, JsonName, Self); ProcessJsonObject(JsonValue2, StubClass); end; jtArray: raise EJsonMapper.Create('Nested Arrays are not supported!'); end; - end - else - begin - // if we meet an empty array then - JsonType2 := jtObject; - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); end; - TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType2, StubClass); + TStubArrayField.Create(aParentClass, JsonName, JsonType2, StubClass); end; else - TStubField.Create(aParentClass, JsonPair.JsonString.Value, JsonType); + begin + if (aParentClass = nil) or (not aParentClass.HasPropety(JsonName)) then + TStubField.Create(aParentClass, JsonName, JsonType); + end; end; end; @@ -265,9 +284,9 @@ function TPkgJsonMapper.GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; begin JsonArray := aJsonValue as TJSONArray; if JsonArray.Count = 0 then - exit(nil) + Exit(nil) else - exit(JsonArray.Items[0]); + Exit(JsonArray.Items[0]); end; constructor TPkgJsonMapper.Create; @@ -337,7 +356,6 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; JsonString: TJSONString; i: Integer; j: Int64; - b: Boolean; begin Result := jtUnknown; @@ -348,29 +366,29 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; else if (aJsonValue is TJSONNumber) then begin if TryStrToInt(aJsonValue.Value, i) then - exit(jtInteger); + Exit(jtInteger); if TryStrToInt64(aJsonValue.Value, j) then - exit(jtInteger64); + Exit(jtInteger64); if (aJsonValue is TJSONNumber) then - exit(jtNumber); + Exit(jtNumber); end; if aJsonValue is TJSONTrue then - exit(jtTrue); + Exit(jtTrue); if aJsonValue is TJSONFalse then - exit(jtFalse); + Exit(jtFalse); if aJsonValue is TJSONString then begin JsonString := (aJsonValue as TJSONString); if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then - exit(jtDateTime); + Exit(jtDateTime); if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then - exit(jtDate); + Exit(jtDate); Result := jtString end; @@ -431,9 +449,13 @@ constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMap FArrayItems := TList.Create; FMapper.StubClasses.Add(Self); FArrayProperty := aArrayProperty; + FStubClasses := TDictionary.Create(); FParentClass := aParentClass; + if FParentClass <> nil then + FParentClass.StubClasses.Add(aClassName, Self); + FComparison := function(const Left, Right: TStubField): Integer begin if Left.FName > Right.FName then @@ -520,6 +542,27 @@ function TStubClass.GetImplementationPart: string; end; end; +function TStubClass.GetItemFromName(aJsonName: string): TStubField; +var + StubField: TStubField; +begin + for StubField in FItems do + if AnsiSameText(aJsonName, StubField.JsonName) then + Exit(StubField); + + Result := nil; +end; + +function TStubClass.HasPropety(aJsonName: string): Boolean; +var + StubField: TStubField; +begin + for StubField in FItems do + if AnsiSameText(aJsonName, StubField.JsonName) then + Exit(True); + Result := False; +end; + procedure TStubClass.SetName(const Value: string); begin FPureClassName := Value; @@ -767,7 +810,7 @@ constructor TSOJName.Create(aItemName: string); function TSOJName.NameAttribute: string; begin - exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); + Exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); end; initialization From 98a2e87ad93ad2400fc844829aefe0e8188d8d89 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sat, 16 May 2020 07:39:44 +0200 Subject: [PATCH 019/129] Removed a Warning --- Pkg.Json.Mapper.pas | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 6dbf7a5..f764540 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -207,11 +207,10 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: StubClass := nil; JsonArray := JSONValue as TJSONArray; + JsonType2 := jtObject; + if JsonArray.Count = 0 then // if we meet an empty array then - begin - JsonType2 := jtObject; StubClass := GetStub(aParentClass, JsonName, Self); - end; for JsonValue2 in JsonArray do begin From 1d1e870a6b620e15e5d61880ebf7ebc29815fe42 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sat, 16 May 2020 07:54:06 +0200 Subject: [PATCH 020/129] Update README.md --- README.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c3e68c3..dee18c8 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,35 @@ Delphi-JsonToDelphiClass ## This is a fork of Petar Georgiev original work ## +New feature: +* Support for objects with diffrents properties in an Array + +Eg this JSON +``` +{ + "ArrayTest":[ + { + "S1":"5102" + }, + { + "S2":"True" + } + ] +} +``` + +Generates the following DTO: +``` + TArrayTestDTO = class + private + FS1: string; + FS2: string; + published + property S1: string read FS1 write FS1; + property S2: string read FS2 write FS2; + end; +``` + Lots of changes in this version: * Only floating poiunt numbers are mapped to Double * Numbers are mapped to Integer or Int64 depending on their size @@ -12,7 +41,7 @@ Lots of changes in this version: * Parser logic are seperated from GUI logic * Fixed bug in the RegEx for recognizing an ISO8601 Date * Serialization removed the "noise" of List i.e. includes internal properties that did not exist in the original JSON string. -* Generated code uses TobjectList +* Generated code uses TObjectList Generates Delphi Classes based on JSON string. Just like XML Data Binding, but for JSON. From 0928018a822b5ab52d8a85a4a4b9830dbf2e0c89 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sat, 30 May 2020 18:38:03 +0200 Subject: [PATCH 021/129] Rollbaack Array feature --- JSON_PAS.res | Bin 5344 -> 5156 bytes JsonToDelphiClass.dproj | 68 +++++++++++++++++++++++++++- Pkg.Json.Mapper.pas | 97 ++++++++++++---------------------------- 3 files changed, 95 insertions(+), 70 deletions(-) diff --git a/JSON_PAS.res b/JSON_PAS.res index 1cf718c974b0d9c7b78a2fddb0f32dbd71fe44cf..9a766a0368fa1530bd73027baecf943522152aaa 100644 GIT binary patch delta 1379 zcmZuxO>7fK6pjm9 zM`@%e5~p0S-ld1CCxp25RQ1q9uN)99CnUrHB!tAN>X8E~Z)SFFx3HJl_y4{3zM0oE z52qi{&gap_sig=ZhRK<=sTUa`HJjOu`obh3e6Pv~rTMFN#azwj=prqab=yW&)iQQ< z&Kj>q8y_ePduHHw4~3Fv1J7OgUkiL66ppn**(k!VofGh)GX-N^3k0>yENOT`E;b5B zT_?Y8I^qwd#foWjt5)O{i>_D<>uAjwW2ahXJIv%dH!7wA3-7wt`U%-@0X-m)_KrnK zfo&Nk#v0~rW*MB7H2A@L-bZA8_{|&lDHnL_y)>@0L{`U`bapkB&EHy2-$-HO=QUUh z#Nij>hwbj=S+c8JB5#tWad2DA5(v{J#MP#e)!}9LL`b;OTU;l;f z#C~E%gR1W{* zINjrx!;`|Fo)I_-PQs&L9G(UX0*e~QWs-LD9+M@n$P3TONEbT58_x-MRDGc-AF8;u z2g%Sy5w3)KXdHeF&7YBqO~cg7DBdIc0(`M*xWZ3lgo5#eh7_=fOhwFZW-oQ z#;|$QTjEn7#S$t#8`ZCZp(RY*MqrX-2m><+qs$nZChE z)a$t#uhzJ#YtJp0O49-zu2^+;Gib37&;x3 zgOy})&?5@)M1~>)0Ok;1s%~Jba5FpthyL#Hj07ibiYh<#PYIH!Pi*#C|H^7p(Y_t! z(psaCRS(LdDmArOG6DC)XT@+7ecP%&36H_MaBZ+zNCZ2AWcqGIz7{T7{)k+hM{_%z z&zaTYihRCccHnZ`J7f-g*CPC11EY9B{vOyIa>icdb)55c&W)7{Uh6v7;BIu#C4M7% f3;u~FU??`>-jkKsyldT$<@=p&B7`~8(b4ep%S39=vM7(r6rh!vSqlg(A6As$6(S7 zFuzn|X4Q7Ho~x2BlY8s+iVZ8y?F zx*t@wFH(%Q41SJAu1q^`MZ>LnUbC{kh{JayT8C!E-xuw@sAyxnoM-9~GG;MTDQ~97FT< z&fl>#R9P++P8ay6&Yq@X1?-9F`Y%5QtnxjH=4Foe(J={3so&_pr(-8E%X(}C&;8g& zOH-djbG>j5CNpprMsG=MKF8DAm57&;-_!c>?rh@clutUsU15%CZ}GqMeryE*bM^>- zt4+!5N<0xC#1LXo_@REBFUNm6?}-)DHY{t;695)hmWr!}Rj1?g4)sQ;F+}`vd~i}Y zw%qZO7fhE0S3KZ8{G<4N#N|x`H}u|_27Lw7rdhzbMfkE8MS536!pGxC;S5D9=Au8HsvjJ49CIcqzCm#Ncs{Uj09KLqxBPL(|DL}t=4Is^h zu6lofLB#YW@2ULPl_M&E+EIh4sY^oBg7*j0)iNsnn&pe#1N>>~M9W5em0CL^A_n#0 z(h}1$Z&GVh>wg+r?fjGiJ_J(Qy~q=l^#11)J+__igd6(xZ58 ariYpa;6ZvKaC@09;luM0;CGy8$G!r3ke%27 diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index aea3d6b..300d323 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -1,7 +1,7 @@  {FC0815BD-2831-42AD-BC2C-0CC105026B1F} - 18.8 + 19.0 FMX JsonToDelphiClass.dpr True @@ -686,6 +686,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -697,6 +707,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -796,6 +816,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -807,6 +837,16 @@ 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + 1 @@ -851,6 +891,26 @@ 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 + + 1 @@ -898,6 +958,12 @@ 1 + + + ..\$(PROJECTNAME).launchscreen + 64 + + 1 diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index f764540..fa0ae5a 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -86,24 +86,20 @@ TStubClass = class(TSOJName) FMapper: TPkgJsonMapper; FPureClassName: string; FArrayProperty: string; - FStubClasses: TDictionary; procedure SetName(const Value: string); public constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); destructor Destroy; override; function GetDeclarationPart(const BaseClass: string = ''): string; function GetImplementationPart: string; - function HasPropety(aJsonName: string): Boolean; - function GetItemFromName(aJsonName: string): TStubField; procedure SortFields; published - property name: string read FName; - property Items: TObjectList read FItems; - property PureClassName: string read FPureClassName; + property name: string read FName write SetName; + property Items: TObjectList read FItems write FItems; + property PureClassName: string read FPureClassName write FPureClassName; property ArrayProperty: string read FArrayProperty write FArrayProperty; property ComplexItems: TList read FComplexItems; property ArrayItems: TList read FArrayItems; - property StubClasses: TDictionary read FStubClasses; end; TPkgJsonMapper = class @@ -171,18 +167,8 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: JSONObject: TJSONObject; JsonPair: TJSONPair; JSONValue, JsonValue2: TJsonValue; - JsonArray: TJSONArray; JsonType, JsonType2: TJsonType; StubClass: TStubClass; - JsonName: string; - - function GetStub(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper): TStubClass; - begin - aParentClass.StubClasses.TryGetValue(aClassName, Result); - if Result = nil then - Exit(TStubClass.Create(aParentClass, JsonName, Self)); - end; - begin JSONObject := aJsonValue as TJSONObject; @@ -190,49 +176,45 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: begin JSONValue := JsonPair.JSONValue; JsonType := GetJsonType(JSONValue); - JsonName := JsonPair.JsonString.Value; case JsonType of jtUnknown: { do nothing }; jtObject: begin - StubClass := TStubClass.Create(aParentClass, JsonName, Self); - TStubObjectField.Create(aParentClass, JsonName, StubClass); + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + TStubObjectField.Create(aParentClass, JsonPair.JsonString.Value, StubClass); ProcessJsonObject(JSONValue, StubClass); end; jtArray: begin StubClass := nil; - JsonArray := JSONValue as TJSONArray; - - JsonType2 := jtObject; - - if JsonArray.Count = 0 then // if we meet an empty array then - StubClass := GetStub(aParentClass, JsonName, Self); - - for JsonValue2 in JsonArray do + JsonValue2 := GetFirstArrayItem(JSONValue); + if JsonValue2 <> nil then begin JsonType2 := GetJsonType(JsonValue2); case JsonType2 of jtObject: begin - StubClass := GetStub(aParentClass, JsonName, Self); + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); ProcessJsonObject(JsonValue2, StubClass); end; jtArray: raise EJsonMapper.Create('Nested Arrays are not supported!'); end; + end + else + begin + // if we meet an empty array then + JsonType2 := jtObject; + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); end; - TStubArrayField.Create(aParentClass, JsonName, JsonType2, StubClass); + TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType2, StubClass); end; else - begin - if (aParentClass = nil) or (not aParentClass.HasPropety(JsonName)) then - TStubField.Create(aParentClass, JsonName, JsonType); - end; + TStubField.Create(aParentClass, JsonPair.JsonString.Value, JsonType); end; end; @@ -283,9 +265,9 @@ function TPkgJsonMapper.GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; begin JsonArray := aJsonValue as TJSONArray; if JsonArray.Count = 0 then - Exit(nil) + exit(nil) else - Exit(JsonArray.Items[0]); + exit(JsonArray.Items[0]); end; constructor TPkgJsonMapper.Create; @@ -355,6 +337,7 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; JsonString: TJSONString; i: Integer; j: Int64; + b: Boolean; begin Result := jtUnknown; @@ -365,29 +348,29 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; else if (aJsonValue is TJSONNumber) then begin if TryStrToInt(aJsonValue.Value, i) then - Exit(jtInteger); + exit(jtInteger); if TryStrToInt64(aJsonValue.Value, j) then - Exit(jtInteger64); + exit(jtInteger64); if (aJsonValue is TJSONNumber) then - Exit(jtNumber); + exit(jtNumber); end; if aJsonValue is TJSONTrue then - Exit(jtTrue); + exit(jtTrue); if aJsonValue is TJSONFalse then - Exit(jtFalse); + exit(jtFalse); if aJsonValue is TJSONString then begin JsonString := (aJsonValue as TJSONString); if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then - Exit(jtDateTime); + exit(jtDateTime); if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then - Exit(jtDate); + exit(jtDate); Result := jtString end; @@ -448,13 +431,9 @@ constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMap FArrayItems := TList.Create; FMapper.StubClasses.Add(Self); FArrayProperty := aArrayProperty; - FStubClasses := TDictionary.Create(); FParentClass := aParentClass; - if FParentClass <> nil then - FParentClass.StubClasses.Add(aClassName, Self); - FComparison := function(const Left, Right: TStubField): Integer begin if Left.FName > Right.FName then @@ -541,27 +520,6 @@ function TStubClass.GetImplementationPart: string; end; end; -function TStubClass.GetItemFromName(aJsonName: string): TStubField; -var - StubField: TStubField; -begin - for StubField in FItems do - if AnsiSameText(aJsonName, StubField.JsonName) then - Exit(StubField); - - Result := nil; -end; - -function TStubClass.HasPropety(aJsonName: string): Boolean; -var - StubField: TStubField; -begin - for StubField in FItems do - if AnsiSameText(aJsonName, StubField.JsonName) then - Exit(True); - Result := False; -end; - procedure TStubClass.SetName(const Value: string); begin FPureClassName := Value; @@ -809,7 +767,7 @@ constructor TSOJName.Create(aItemName: string); function TSOJName.NameAttribute: string; begin - Exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); + exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); end; initialization @@ -833,3 +791,4 @@ finalization FreeAndNil(ReservedWords); end. + From 098a93ac4617e1dbfde9a7a823fdac31c320f8ca Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 7 Jul 2020 15:41:57 +0200 Subject: [PATCH 022/129] Updated .GitIgnore --- .gitignore | 2 + JsonToDelphiClass.skincfg | 57 --- Win32/Debug/Pkg.Json.DTO.pas | 71 --- Win32/Debug/Project38.dpr | 16 - Win32/Debug/Project38.dproj | 843 ----------------------------------- Win32/Debug/Project38.res | Bin 59520 -> 0 bytes Win32/Debug/Root.pas | 218 --------- Win32/Debug/Unit38.dfm | 25 -- Win32/Debug/Unit38.pas | 51 --- 9 files changed, 2 insertions(+), 1281 deletions(-) delete mode 100644 JsonToDelphiClass.skincfg delete mode 100644 Win32/Debug/Pkg.Json.DTO.pas delete mode 100644 Win32/Debug/Project38.dpr delete mode 100644 Win32/Debug/Project38.dproj delete mode 100644 Win32/Debug/Project38.res delete mode 100644 Win32/Debug/Root.pas delete mode 100644 Win32/Debug/Unit38.dfm delete mode 100644 Win32/Debug/Unit38.pas diff --git a/.gitignore b/.gitignore index c0821f2..8b7a466 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,5 @@ __recover/ __recovery/uMainForm.pas __recovery/uMainForm.fmx __recovery/__recovery.ini + +Win32/Debug/ diff --git a/JsonToDelphiClass.skincfg b/JsonToDelphiClass.skincfg deleted file mode 100644 index e074481..0000000 --- a/JsonToDelphiClass.skincfg +++ /dev/null @@ -1,57 +0,0 @@ -[ExpressSkins] -Default=1 -ShowNotifications=1 -Enabled=0 -dxSkinBlack=1 -dxSkinBlue=1 -dxSkinBlueprint=1 -dxSkinCaramel=1 -dxSkinCoffee=1 -dxSkinDarkroom=1 -dxSkinDarkSide=1 -dxSkinDevExpressDarkStyle=1 -dxSkinDevExpressStyle=1 -dxSkinFoggy=1 -dxSkinGlassOceans=1 -dxSkinHighContrast=1 -dxSkiniMaginary=1 -dxSkinLilian=1 -dxSkinLiquidSky=1 -dxSkinLondonLiquidSky=1 -dxSkinMcSkin=1 -dxSkinMetropolis=1 -dxSkinMetropolisDark=1 -dxSkinMoneyTwins=1 -dxSkinOffice2007Black=1 -dxSkinOffice2007Blue=1 -dxSkinOffice2007Green=1 -dxSkinOffice2007Pink=1 -dxSkinOffice2007Silver=1 -dxSkinOffice2010Black=1 -dxSkinOffice2010Blue=1 -dxSkinOffice2010Silver=1 -dxSkinOffice2013DarkGray=1 -dxSkinOffice2013LightGray=1 -dxSkinOffice2013White=1 -dxSkinOffice2016Colorful=1 -dxSkinOffice2016Dark=1 -dxSkinOffice2019Colorful=1 -dxSkinPumpkin=1 -dxSkinSeven=1 -dxSkinSevenClassic=1 -dxSkinSharp=1 -dxSkinSharpPlus=1 -dxSkinSilver=1 -dxSkinSpringtime=1 -dxSkinStardust=1 -dxSkinSummer2008=1 -dxSkinTheAsphaltWorld=1 -dxSkinTheBezier=1 -dxSkinsDefaultPainters=1 -dxSkinValentine=1 -dxSkinVisualStudio2013Blue=1 -dxSkinVisualStudio2013Dark=1 -dxSkinVisualStudio2013Light=1 -dxSkinVS2010=1 -dxSkinWhiteprint=1 -dxSkinXmas2008Blue=1 diff --git a/Win32/Debug/Pkg.Json.DTO.pas b/Win32/Debug/Pkg.Json.DTO.pas deleted file mode 100644 index 059555b..0000000 --- a/Win32/Debug/Pkg.Json.DTO.pas +++ /dev/null @@ -1,71 +0,0 @@ -unit Pkg.Json.DTO; - -interface - -uses - Rest.Json; - -type - TJsonDTO = class - private - FOptions: TJsonOptions; - function GetAsJson: string; - procedure SetAsJson(const Value: string); - public - constructor Create; overload; - constructor Create(const aJson: string; AOptions: TJsonOptions = [joDateIsUTC, joDateFormatISO8601]); overload; - property AsJson: string read GetAsJson write SetAsJson; - end; - -implementation - -uses - System.Json, System.Sysutils, Rest.JsonReflect, System.JSONConsts; - -{ TJsonDTO } - -constructor TJsonDTO.Create(const aJson: string; AOptions: TJsonOptions); -begin - inherited Create; - FOptions := AOptions; - AsJson := aJson; -end; - -constructor TJsonDTO.Create; -begin - inherited; - FOptions := [joDateIsUTC, joDateFormatISO8601]; -end; - -function TJsonDTO.GetAsJson: string; -begin - Result := TJson.ObjectToJsonString(Self, FOptions); -end; - -procedure TJsonDTO.SetAsJson(const Value: string); -var - Json: string; - JSONValue: TJSONValue; - JSONObject: TJSONObject; -begin - JSONValue := TJSONObject.ParseJSONValue(Value); - try - if Assigned(JSONValue) and (JSONValue is TJSONObject) then - JSONObject := JSONValue as TJSONObject - else - begin - Json := Value.Trim; - if (Json = '') and not Assigned(JSONValue) or (Json <> '') and Assigned(JSONValue) and JSONValue.Null then - Exit - else - raise EConversionError.Create(SCannotCreateObject); - end; - - TJson.JsonToObject(Self, JSONObject, FOptions); - - finally - JSONValue.Free; - end; -end; - -end. diff --git a/Win32/Debug/Project38.dpr b/Win32/Debug/Project38.dpr deleted file mode 100644 index 04c2d6b..0000000 --- a/Win32/Debug/Project38.dpr +++ /dev/null @@ -1,16 +0,0 @@ -program Project38; - -uses - Vcl.Forms, - Unit38 in 'Unit38.pas' {Form38}, - Root in 'Root.pas', - Pkg.Json.DTO in 'Pkg.Json.DTO.pas'; - -{$R *.res} - -begin - Application.Initialize; - Application.MainFormOnTaskbar := True; - Application.CreateForm(TForm38, Form38); - Application.Run; -end. diff --git a/Win32/Debug/Project38.dproj b/Win32/Debug/Project38.dproj deleted file mode 100644 index cd70f88..0000000 --- a/Win32/Debug/Project38.dproj +++ /dev/null @@ -1,843 +0,0 @@ - - - {1300D295-9935-41DA-98C8-36A156A06F11} - 18.7 - VCL - Project38.dpr - True - Debug - Win32 - 1 - Application - - - true - - - true - Base - true - - - true - Base - true - - - true - Base - true - - - true - Cfg_1 - true - true - - - true - Base - true - - - true - Cfg_2 - true - true - - - .\$(Platform)\$(Config) - .\$(Platform)\$(Config) - false - false - false - false - false - System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) - $(BDS)\bin\delphi_PROJECTICON.ico - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png - $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png - Project38 - - - DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;rbBDE2026;rbRAP2026;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;rbRest2026;FireDACMSSQLDriver;vcltouch;vcldb;svn;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPDFViewerRS26;dxPsPrVwAdvRS26;vclx;dxPScxTLLnkRS26;rbRIDE2026;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;rbRCL2026;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dclRBE2026;dxFireDACServerModeRS26;bindcompdbx;dclRBFireDAC2026;IndyIPServer;DBXSybaseASEDriver;cxPivotGridRS26;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;rbADO2026;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;rbTCUI2026;dclRBDBE2026;emshosting;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;rbUSERDesign2026;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;rbFireDAC2026;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;svnui;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;rbDBE2026;bindcompfmx;DBXOracleDriver;inetdb;rbDB2026;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;rbTC2026;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;rbCIDE2026;rbDIDE2026;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;dxPSRichEditControlLnkRS26;FireDACASADriver;cxPivotGridChartRS26;rbRTL2026;dxPSDBTeeChartRS26;Tee;DataSnapServer;rbDAD2026;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;rbUSER2026;dclRBADO2026;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;rbIDE2026;fmxase;$(DCC_UsePackage) - Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(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 - $(BDS)\bin\default_app.manifest - - - DBXSqliteDriver;dxFlowChartRS26;dxPSdxMapControlLnkRS26;DBXDb2Driver;vclactnband;dxBarRS26;vclFireDAC;dxFireDACEMFRS26;tethering;dxSpreadSheetInplaceRichEditRS26;FireDACADSDriver;dxRichEditCoreRS26;dxPSdxSpreadSheetLnkRS26;FireDACMSSQLDriver;vcltouch;vcldb;dxPSTeeChartRS26;dxGDIPlusRS26;dxPSdxFCLnkRS26;dxCloudServiceLibraryRS26;dxPSLnksRS26;FireDACDBXDriver;cxGridRS26;dxPDFViewerRS26;dxPsPrVwAdvRS26;vclx;dxPScxTLLnkRS26;RESTBackendComponents;VCLRESTComponents;vclie;bindengine;CloudService;dxmdsRS26;FireDACMySQLDriver;dxdborRS26;DataSnapClient;dxFireDACServerModeRS26;bindcompdbx;IndyIPServer;DBXSybaseASEDriver;cxPivotGridRS26;IndySystem;cxTreeListdxBarPopupMenuRS26;dsnapcon;cxTreeListRS26;dxPScxPivotGridLnkRS26;cxSchedulerRibbonStyleEventEditorRS26;dxPSCoreRS26;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;dxSpreadSheetRS26;dxBarExtItemsRS26;dxPSdxGaugeControlLnkRS26;emshosting;DBXOdbcDriver;FireDACTDataDriver;FMXTee;dxdbtrRS26;dxRichEditControlCoreRS26;soaprtl;DbxCommonDriver;dxFlowChartAdvancedCustomizeFormRS26;dxDockingRS26;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;cxLibraryRS26;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;dxPScxSchedulerLnkRS26;dxSpreadSheetConditionalFormattingDialogsRS26;appanalytics;dxRibbonCustomizationFormRS26;cxSchedulerGridRS26;IndyIPClient;bindcompvcl;dxFlowChartLayoutsRS26;TeeUI;dxADOEMFRS26;VclSmp;FireDACODBCDriver;dxRibbonRS26;DataSnapIndy10ServerTransport;dxPScxCommonRS26;dxRichEditDocumentModelRS26;DataSnapProviderClient;FireDACMongoDBDriver;dxFlowChartDesignerRS26;dxPScxGridLnkRS26;dxSpreadSheetCoreRS26;DataSnapServerMidas;RESTComponents;DBXInterBaseDriver;dxPScxExtCommonRS26;emsclientfiredac;DataSnapFireDAC;DBXMSSQLDriver;dxRichEditControlRS26;DatasnapConnectorsFreePascal;dxGaugeControlRS26;dxorgcRS26;dxPScxVGridLnkRS26;bindcompfmx;DBXOracleDriver;inetdb;dxBarDBNavRS26;dxDBXServerModeRS26;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;dxServerModeRS26;dxWizardControlRS26;dxTabbedMDIRS26;dxEMFRS26;dbexpress;IndyCore;dxComnRS26;dsnap;emsclient;DataSnapCommon;FireDACCommon;DataSnapConnectors;cxSchedulerTreeBrowserRS26;dxADOServerModeRS26;soapserver;cxPivotGridOLAPRS26;cxVerticalGridRS26;dxtrmdRS26;FireDACOracleDriver;DBXMySQLDriver;cxSchedulerRS26;cxSchedulerWebServiceStorageRS26;dxPSdxLCLnkRS26;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;dxMapControlRS26;inet;dxSpellCheckerRS26;IndyIPCommon;dxSpreadSheetCoreConditionalFormattingDialogsRS26;vcl;dxPSdxDBOCLnkRS26;FireDACDb2Driver;dxSpreadSheetReportDesignerRS26;dxPScxPCProdRS26;dxNavBarRS26;dxCoreRS26;cxExportRS26;TeeDB;FireDAC;dxHttpIndyRequestRS26;dxPSPrVwRibbonRS26;FireDACSqliteDriver;FireDACPgDriver;dxPSRichEditControlLnkRS26;FireDACASADriver;cxPivotGridChartRS26;dxPSDBTeeChartRS26;Tee;DataSnapServer;dxPSdxDBTVLnkRS26;vclwinx;FireDACDSDriver;dxTileControlRS26;dxSkinsCoreRS26;CustomIPTransport;vcldsnap;bindcomp;dxPSdxOCLnkRS26;DBXInformixDriver;dbxcds;adortl;dxSpreadSheetCoreDialogsRS26;dxBarExtDBItemsRS26;dsnapxml;dbrtl;IndyProtocols;inetdbxpress;dxPSdxPDFViewerLnkRS26;dxRichEditInplaceRS26;fmxase;$(DCC_UsePackage) - - - DEBUG;$(DCC_Define) - true - false - true - true - true - - - false - true - PerMonitorV2 - - - false - RELEASE;$(DCC_Define) - 0 - 0 - - - true - PerMonitorV2 - - - - MainSource - - -
Form38
- dfm -
- - - - Cfg_2 - Base - - - Base - - - Cfg_1 - Base - -
- - Delphi.Personality.12 - Application - - - - Project38.dpr - - - - - - Project38.exe - true - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - classes - 1 - - - - - res\xml - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - library\lib\armeabi - 1 - - - - - library\lib\mips - 1 - - - - - library\lib\armeabi-v7a - 1 - - - - - res\drawable - 1 - - - - - res\values - 1 - - - - - res\values-v21 - 1 - - - - - res\values - 1 - - - - - res\drawable - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-ldpi - 1 - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-mdpi - 1 - - - - - res\drawable-hdpi - 1 - - - - - res\drawable-xhdpi - 1 - - - - - res\drawable-xxhdpi - 1 - - - - - res\drawable-xxxhdpi - 1 - - - - - res\drawable-small - 1 - - - - - res\drawable-normal - 1 - - - - - res\drawable-large - 1 - - - - - res\drawable-xlarge - 1 - - - - - res\values - 1 - - - - - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - Contents\MacOS - 1 - .framework - - - Contents\MacOS - 1 - .framework - - - 0 - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .dll;.bpl - - - - - 1 - .dylib - - - 1 - .dylib - - - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - Contents\MacOS - 1 - .dylib - - - 0 - .bpl - - - - - 0 - - - 0 - - - 0 - - - 0 - - - Contents\Resources\StartUp\ - 0 - - - Contents\Resources\StartUp\ - 0 - - - 0 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - 1 - - - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - 1 - - - 1 - - - 1 - - - - - 1 - - - 1 - - - 1 - - - - - ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF - 1 - - - - - ..\ - 1 - - - ..\ - 1 - - - - - Contents - 1 - - - Contents - 1 - - - - - Contents\Resources - 1 - - - Contents\Resources - 1 - - - - - library\lib\armeabi-v7a - 1 - - - 1 - - - 1 - - - 1 - - - 1 - - - Contents\MacOS - 1 - - - Contents\MacOS - 1 - - - 0 - - - - - 1 - - - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - Assets - 1 - - - Assets - 1 - - - - - - - - - - - - - - True - False - - - 12 - - - - -
diff --git a/Win32/Debug/Project38.res b/Win32/Debug/Project38.res deleted file mode 100644 index 23497de5f7cc857f26ab67b71bc721c4ee5fb91d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59520 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 diff --git a/Win32/Debug/Root.pas b/Win32/Debug/Root.pas deleted file mode 100644 index ab574cd..0000000 --- a/Win32/Debug/Root.pas +++ /dev/null @@ -1,218 +0,0 @@ -unit Root; - -interface - -uses - Pkg.Json.DTO; - -{$M+} - -type - TUploaderDTO = class - strict private - FAvatar_Url: String; - FEvents_Url: String; - FFollowers_Url: String; - FFollowing_Url: String; - FGists_Url: String; - FGravatar_Id: String; - FHtml_Url: String; - FId: Integer; - FLogin: String; - FOrganizations_Url: String; - FReceived_Events_Url: String; - FRepos_Url: String; - FSite_Admin: Boolean; - FStarred_Url: String; - FSubscriptions_Url: String; - FType: String; - FUrl: String; - published - property Avatar_Url: String read FAvatar_Url write FAvatar_Url; - property Events_Url: String read FEvents_Url write FEvents_Url; - property Followers_Url: String read FFollowers_Url write FFollowers_Url; - property Following_Url: String read FFollowing_Url write FFollowing_Url; - property Gists_Url: String read FGists_Url write FGists_Url; - property Gravatar_Id: String read FGravatar_Id write FGravatar_Id; - property Html_Url: String read FHtml_Url write FHtml_Url; - property Id: Integer read FId write FId; - property Login: String read FLogin write FLogin; - property Organizations_Url: String read FOrganizations_Url write FOrganizations_Url; - property Received_Events_Url: String read FReceived_Events_Url write FReceived_Events_Url; - property Repos_Url: String read FRepos_Url write FRepos_Url; - property Site_Admin: Boolean read FSite_Admin write FSite_Admin; - property Starred_Url: String read FStarred_Url write FStarred_Url; - property Subscriptions_Url: String read FSubscriptions_Url write FSubscriptions_Url; - property &Type: String read FType write FType; - property Url: String read FUrl write FUrl; - end; - - TAssetsDTO = class - strict private - FBrowser_Download_Url: String; - FContent_Type: String; - FCreated_At: String; - FDownload_Count: Integer; - FId: Integer; - FName: String; - FSize: Integer; - FState: String; - FUpdated_At: String; - FUploader: TUploaderDTO; - FUrl: String; - published - property Browser_Download_Url: String read FBrowser_Download_Url write FBrowser_Download_Url; - property Content_Type: String read FContent_Type write FContent_Type; - property Created_At: String read FCreated_At write FCreated_At; - property Download_Count: Integer read FDownload_Count write FDownload_Count; - property Id: Integer read FId write FId; - property Name: String read FName write FName; - property Size: Integer read FSize write FSize; - property State: String read FState write FState; - property Updated_At: String read FUpdated_At write FUpdated_At; - property Uploader: TUploaderDTO read FUploader write FUploader; - property Url: String read FUrl write FUrl; - public - constructor Create; - destructor Destroy; override; - end; - - TAuthorDTO = class - strict private - FAvatar_Url: String; - FEvents_Url: String; - FFollowers_Url: String; - FFollowing_Url: String; - FGists_Url: String; - FGravatar_Id: String; - FHtml_Url: String; - FId: Integer; - FLogin: String; - FOrganizations_Url: String; - FReceived_Events_Url: String; - FRepos_Url: String; - FSite_Admin: Boolean; - FStarred_Url: String; - FSubscriptions_Url: String; - FType: String; - FUrl: String; - published - property Avatar_Url: String read FAvatar_Url write FAvatar_Url; - property Events_Url: String read FEvents_Url write FEvents_Url; - property Followers_Url: String read FFollowers_Url write FFollowers_Url; - property Following_Url: String read FFollowing_Url write FFollowing_Url; - property Gists_Url: String read FGists_Url write FGists_Url; - property Gravatar_Id: String read FGravatar_Id write FGravatar_Id; - property Html_Url: String read FHtml_Url write FHtml_Url; - property Id: Integer read FId write FId; - property Login: String read FLogin write FLogin; - property Organizations_Url: String read FOrganizations_Url write FOrganizations_Url; - property Received_Events_Url: String read FReceived_Events_Url write FReceived_Events_Url; - property Repos_Url: String read FRepos_Url write FRepos_Url; - property Site_Admin: Boolean read FSite_Admin write FSite_Admin; - property Starred_Url: String read FStarred_Url write FStarred_Url; - property Subscriptions_Url: String read FSubscriptions_Url write FSubscriptions_Url; - property &Type: String read FType write FType; - property Url: String read FUrl write FUrl; - end; - - TItemDTO = class - strict private - FAssets: TArray; - FAssets_Url: String; - FAuthor: TAuthorDTO; - FBody: String; - FCreated_At: String; - FDraft: Boolean; - FHtml_Url: String; - FId: Integer; - FName: String; - FPrerelease: Boolean; - FPublished_At: String; - FTag_Name: String; - FTarball_Url: String; - FTarget_Commitish: String; - FUpload_Url: String; - FUrl: String; - FZipball_Url: String; - published - property Assets: TArray read FAssets write FAssets; - property Assets_Url: String read FAssets_Url write FAssets_Url; - property Author: TAuthorDTO read FAuthor write FAuthor; - property Body: String read FBody write FBody; - property Created_At: String read FCreated_At write FCreated_At; - property Draft: Boolean read FDraft write FDraft; - property Html_Url: String read FHtml_Url write FHtml_Url; - property Id: Integer read FId write FId; - property Name: String read FName write FName; - property Prerelease: Boolean read FPrerelease write FPrerelease; - property Published_At: String read FPublished_At write FPublished_At; - property Tag_Name: String read FTag_Name write FTag_Name; - property Tarball_Url: String read FTarball_Url write FTarball_Url; - property Target_Commitish: String read FTarget_Commitish write FTarget_Commitish; - property Upload_Url: String read FUpload_Url write FUpload_Url; - property Url: String read FUrl write FUrl; - property Zipball_Url: String read FZipball_Url write FZipball_Url; - public - constructor Create; - destructor Destroy; override; - end; - - TRootDTO = class(TJsonDTO) - strict private - FItems: TArray; - published - property Items: TArray read FItems write FItems; - public - destructor Destroy; override; - end; - -implementation - -{ TAssetsDTO } - -constructor TAssetsDTO.Create; -begin - inherited; - FUploader := TUploaderDTO.Create; -end; - -destructor TAssetsDTO.Destroy; -begin - FUploader.Free; - inherited; -end; - -{ TItemDTO } - -constructor TItemDTO.Create; -begin - inherited; - FAuthor := TAuthorDTO.Create; -end; - -destructor TItemDTO.Destroy; -var - AssetsItem: TAssetsDTO; -begin - for AssetsItem in FAssets do - AssetsItem.Free; - - FAuthor.Free; - inherited; -end; - -{ TRootDTO } - -destructor TRootDTO.Destroy; -var - ItemsItem: TItemDTO; -begin - for ItemsItem in FItems do - ItemsItem.Free; - - inherited; -end; - -end. - diff --git a/Win32/Debug/Unit38.dfm b/Win32/Debug/Unit38.dfm deleted file mode 100644 index 6e4b6ca..0000000 --- a/Win32/Debug/Unit38.dfm +++ /dev/null @@ -1,25 +0,0 @@ -object Form38: TForm38 - Left = 0 - Top = 0 - Caption = 'Form38' - ClientHeight = 411 - ClientWidth = 852 - Color = clBtnFace - Font.Charset = DEFAULT_CHARSET - Font.Color = clWindowText - Font.Height = -11 - Font.Name = 'Tahoma' - Font.Style = [] - OldCreateOrder = False - PixelsPerInch = 96 - TextHeight = 13 - object Button1: TButton - Left = 400 - Top = 216 - Width = 75 - Height = 25 - Caption = 'Button1' - TabOrder = 0 - OnClick = Button1Click - end -end diff --git a/Win32/Debug/Unit38.pas b/Win32/Debug/Unit38.pas deleted file mode 100644 index 1f8d7fa..0000000 --- a/Win32/Debug/Unit38.pas +++ /dev/null @@ -1,51 +0,0 @@ -unit Unit38; - -interface - -uses - Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, - Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; - -type - TForm38 = class(TForm) - Button1: TButton; - procedure Button1Click(Sender: TObject); - private - { Private declarations } - public - { Public declarations } - end; - -var - Form38: TForm38; - -implementation - -{$R *.dfm} - -uses - Rest.Json, - Root; - -procedure TForm38.Button1Click(Sender: TObject); - -begin - - with TStringList.Create do - try - LoadFromFile('C:\aa\Text.json'); - - with TJson.JsonToObject(Text) do -// with TRootClass.FromJsonString(Text) do - try - Caption := Items[0].Assets[0].Browser_download_url; - finally - Free; - end; - finally - Free; - end; - -end; - -end. From 024dd3ee2d2958b0f51a4822ff80a14b8479a6d2 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 7 Jul 2020 15:50:46 +0200 Subject: [PATCH 023/129] Support for Arrays with simple types --- Demo Data/NonObjectArray.json | 30 ++++++ Pkg.Json.Mapper.pas | 178 ++++++++++++++++++---------------- Pkg.Json.Visualizer.pas | 7 +- uMainForm.fmx | 148 ++++++++-------------------- uMainForm.pas | 84 ++++++++++++++-- 5 files changed, 244 insertions(+), 203 deletions(-) create mode 100644 Demo Data/NonObjectArray.json diff --git a/Demo Data/NonObjectArray.json b/Demo Data/NonObjectArray.json new file mode 100644 index 0000000..db0db1b --- /dev/null +++ b/Demo Data/NonObjectArray.json @@ -0,0 +1,30 @@ +{ + "LastName": "Farhat", + "FirstName": "Joe", + "Mail": "string", + "MailAlias": "string", + "PayId": "string", + "PayId2": "string", + "PayId3": "string", + "PayId4": "string", + "PayId5": "string", + "PayId6": "string", + "Language": "string", + "LocalCurrency": "string", + "LocalCountry": "string", + "ManagerId": "string", + "ReviewerId": "string", + "UserType": 0, + "Vendor": "string", + "UserRole": 0, + "DefaultProjectId": "string", + "IKRatesId": "string", + "AdditionalValidators": [{ + "Mail": "string", + "MinimumAmount": 0.24776703043946879 + }], + "Tags": [ + "string" + ] +} + diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index fa0ae5a..485aded 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -16,41 +16,53 @@ EJsonMapper = class(Exception); TStubClass = class; TPkgJsonMapper = class; - TSOJName = class - private + TSOJName = class abstract + strict private FJsonName: string; FDelphiName: string; FNeedsAttribute: Boolean; + FMapper: TPkgJsonMapper; + FName: string; + FPureClassName: string; protected + procedure SetName(const Value: string); virtual; function CapitaiazeFirst(const Value: string): string; published property JsonName: string read FJsonName; property DelphiName: string read FDelphiName; property NeedsAttribute: Boolean read FNeedsAttribute; + property PureClassName: string read FPureClassName write FPureClassName; + property Name: string read FName write SetName; public - constructor Create(aItemName: string); reintroduce; + constructor Create(aMapper: TPkgJsonMapper; aItemName: string); reintroduce; function NameAttribute: string; end; TStubField = class(TSOJName) private - FName: string; FPropertyName: string; FFieldName: string; FFieldType: TJsonType; FParentClass: TStubClass; FJsonFieldName: string; + FName: string; + strict protected + procedure SetName(const Value: string); override; class function GetTypeAsString(AType: TJsonType): string; overload; - procedure SetName(const Value: string); + function GetTypeAsString: string; overload; virtual; + public + function IsObjectArrayField: Boolean; published - property name: string read FName write SetName; + property Name: string read FName write SetName; property FieldName: string read FFieldName; property JsonFieldName: string read FJsonFieldName; property PropertyName: string read FPropertyName; property FieldType: TJsonType read FFieldType; + public constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); - function GetTypeAsString: string; overload; virtual; + property TypeAsString: string read GetTypeAsString; + end; TStubContainerField = class(TStubField) @@ -63,15 +75,17 @@ TStubContainerField = class(TStubField) end; TStubObjectField = class(TStubContainerField) + strict protected + function GetTypeAsString: string; override; public constructor Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); - function GetTypeAsString: string; override; end; TStubArrayField = class(TStubContainerField) + strict protected + function GetTypeAsString: string; override; public constructor Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); - function GetTypeAsString: string; override; end; TStubClass = class(TSOJName) @@ -79,24 +93,19 @@ TStubClass = class(TSOJName) FArrayItems: TList; FComplexItems: TList; FItems: TObjectList; - FName: string; FComparison: TComparison; FComparer: IComparer; FParentClass: TStubClass; FMapper: TPkgJsonMapper; - FPureClassName: string; FArrayProperty: string; - procedure SetName(const Value: string); public - constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); + constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); virtual; destructor Destroy; override; function GetDeclarationPart(const BaseClass: string = ''): string; function GetImplementationPart: string; procedure SortFields; published - property name: string read FName write SetName; property Items: TObjectList read FItems write FItems; - property PureClassName: string read FPureClassName write FPureClassName; property ArrayProperty: string read FArrayProperty write FArrayProperty; property ComplexItems: TList read FComplexItems; property ArrayItems: TList read FArrayItems; @@ -255,7 +264,7 @@ function TPkgJsonMapper.GenerateUnit: string; Result := StringList.Text; finally - StringList.free; + StringList.Free; end; end; @@ -289,7 +298,7 @@ procedure TPkgJsonMapper.Debug(aLines: TStrings); aLines.Add('-------'); aLines.Add(StubClass.Name); for StubField in StubClass.Items do - aLines.AddFormat('%-15s | %s', [StubField.FieldName, StubField.GetTypeAsString]); + aLines.AddFormat('%-15s | %s', [StubField.FieldName, StubField.TypeAsString]); end; end; @@ -309,12 +318,11 @@ function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; MaxValue := 0; for StubClass in FStubClasses do - begin if StubClass.Name.StartsWith(aSuggestedClassName, True) then begin - s := Copy(StubClass.Name, length(aSuggestedClassName) + 2); + s := Copy(StubClass.Name, Length(aSuggestedClassName) + 2); - if (s.length = 3) then + if (s.Length = 3) then begin if TryStrToInt(s, i) then begin @@ -326,7 +334,6 @@ function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; else MaxValue := 1; end; - end; if MaxValue > 0 then Result := Format('%s_%0.3d', [aSuggestedClassName, MaxValue]); @@ -339,8 +346,6 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; j: Int64; b: Boolean; begin - Result := jtUnknown; - if aJsonValue is TJSONObject then Result := jtObject else if aJsonValue is TJSONArray then @@ -348,32 +353,35 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; else if (aJsonValue is TJSONNumber) then begin if TryStrToInt(aJsonValue.Value, i) then - exit(jtInteger); - - if TryStrToInt64(aJsonValue.Value, j) then - exit(jtInteger64); - - if (aJsonValue is TJSONNumber) then - exit(jtNumber); - end; - - if aJsonValue is TJSONTrue then - exit(jtTrue); - - if aJsonValue is TJSONFalse then - exit(jtFalse); - - if aJsonValue is TJSONString then + Result := jtInteger + else if TryStrToInt64(aJsonValue.Value, j) then + Result := jtInteger64 + else + Result := jtNumber + end + else if aJsonValue is TJSONTrue then + Result := jtTrue + else if aJsonValue is TJSONFalse then + Result := jtFalse + else if aJsonValue is TJSONString then begin JsonString := (aJsonValue as TJSONString); if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then - exit(jtDateTime); - - if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then - exit(jtDate); - - Result := jtString - end; + Result := jtDateTime + else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then + Result := jtDate + else if TryStrToBool(JsonString.Value, b) then + begin + if b then + Result := jtTrue + else + Result := jtFalse + end + else + Result := jtString + end + else + Result := jtUnknown; end; function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; @@ -413,7 +421,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; end; end; finally - JSONValue.free; + JSONValue.Free; end; end else @@ -422,7 +430,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string); begin - inherited Create(aClassName); + inherited Create(aMapper, aClassName); FMapper := aMapper; SetName(DelphiName); @@ -436,9 +444,9 @@ constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMap FComparison := function(const Left, Right: TStubField): Integer begin - if Left.FName > Right.FName then + if Left.Name > Right.Name then Result := 1 - else if Left.FName < Right.FName then + else if Left.Name < Right.Name then Result := -1 else Result := 0; @@ -466,18 +474,18 @@ function TStubClass.GetImplementationPart: string; if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin Lines.Add(''); - Lines.AddFormat('{ %s }', [FName]); + Lines.AddFormat('{ %s }', [Name]); Lines.Add(''); end; if (FComplexItems.Count > 0) then begin - Lines.AddFormat('constructor %s.Create;', [FName]); + Lines.AddFormat('constructor %s.Create;', [Name]); Lines.Add('begin'); Lines.Add(' inherited;'); for StubField in FComplexItems do - Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.GetTypeAsString]); + Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); Lines.Add('end;'); Lines.Add(''); @@ -485,7 +493,7 @@ function TStubClass.GetImplementationPart: string; if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin - Lines.Add(Format('destructor %s.Destroy;', [FName])); + Lines.Add(Format('destructor %s.Destroy;', [Name])); Lines.Add('begin'); for StubField in FComplexItems do @@ -502,11 +510,11 @@ function TStubClass.GetImplementationPart: string; begin StubArrayField := StubField as TStubArrayField; Lines.Add(''); - Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [FName, StubArrayField.Name, StubArrayField.FieldClass.Name]); + Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [Name, StubArrayField.Name, StubArrayField.TypeAsString]); Lines.Add('begin'); Lines.AddFormat(' if not Assigned(%s) then', [StubArrayField.FieldName]); Lines.Add(' begin'); - Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubArrayField.FieldName, StubArrayField.FieldClass.Name]); + Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubArrayField.FieldName, StubArrayField.TypeAsString]); Lines.AddFormat(' %s.AddRange(%sArray);', [StubArrayField.FieldName, StubArrayField.FieldName]); Lines.Add(' end;'); Lines.AddFormat(' Result := %s;', [StubArrayField.FieldName]); @@ -516,16 +524,10 @@ function TStubClass.GetImplementationPart: string; Lines.TrailingLineBreak := False; Result := Lines.Text; finally - Lines.free; + Lines.Free; end; end; -procedure TStubClass.SetName(const Value: string); -begin - FPureClassName := Value; - FName := FMapper.SuggestClassName('T' + FPureClassName + 'DTO'); -end; - procedure TStubClass.SortFields; begin FItems.Sort(FComparer); @@ -540,33 +542,33 @@ function TStubClass.GetDeclarationPart(const BaseClass: string): string; begin Lines := TStringList.Create; try - Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); + Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); if FItems.Count > 0 then Lines.Add('private'); for StubField in FItems do begin - if StubField is TStubArrayField then + if StubField.IsObjectArrayField then begin StubArrayField := StubField as TStubArrayField; Lines.Add(' ' + StubField.NameAttribute); - Lines.AddFormat(' %sArray: %s;', [StubField.FieldName, StubField.GetTypeAsString]); + Lines.AddFormat(' %sArray: TArray<%s>;', [StubField.FieldName, StubField.TypeAsString]); Lines.Add(' [GenericListReflect]'); - Lines.AddFormat(' %s: TObjectList<%s>;', [StubField.FieldName, StubArrayField.FieldClass.Name]); + Lines.AddFormat(' %s: TObjectList<%s>;', [StubField.FieldName, StubArrayField.TypeAsString]); end else begin if StubField.NeedsAttribute then Lines.Add(' ' + StubField.NameAttribute); - Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.GetTypeAsString]); + Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.TypeAsString]); end; end; for StubField in FArrayItems do begin StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.Name, StubArrayField.FieldClass.Name]); + Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.Name, StubArrayField.TypeAsString]); end; if FItems.Count > 0 then @@ -577,13 +579,13 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + if (StubField.FieldType = jtUnknown) or ((StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = jtUnknown)) then raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [StubField.PropertyName]); - if StubField is TStubArrayField then + if StubField.IsObjectArrayField then begin StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.FieldClass.Name, StubArrayField.Name]); + Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); end else - Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.GetTypeAsString, StubField.FieldName, StubField.FieldName]); + Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName, StubField.FieldName]); end; @@ -605,7 +607,7 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + Lines.TrailingLineBreak := False; Result := Lines.Text; finally - Lines.free; + Lines.Free; end; end; @@ -613,7 +615,7 @@ Lines.Add(FName + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + constructor TStubField.Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); begin - inherited Create(aItemName); + inherited Create(nil, aItemName); FParentClass := aParentClass; FFieldType := aFieldType; @@ -649,9 +651,10 @@ class function TStubField.GetTypeAsString(AType: TJsonType): string; procedure TStubField.SetName(const Value: string); begin - if (FParentClass.ArrayProperty <> '') and (FParentClass.ArrayProperty = FName) then + if (FParentClass.ArrayProperty <> '') and (FParentClass.ArrayProperty = Name) then FParentClass.ArrayProperty := Value; + PureClassName := Value; FName := Value; FFieldName := 'F' + DelphiName; @@ -666,6 +669,11 @@ function TStubField.GetTypeAsString: string; Result := GetTypeAsString(FFieldType); end; +function TStubField.IsObjectArrayField: Boolean; +begin + Result := (Self is TStubArrayField) and ((Self as TStubArrayField).ContainedType = jtObject); +end; + { TArrayItem } constructor TStubArrayField.Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); @@ -678,19 +686,15 @@ constructor TStubArrayField.Create(aClass: TStubClass; aItemName: string; aItemS end; function TStubArrayField.GetTypeAsString: string; -var - SubType: string; begin case ContainedType of jtObject: - SubType := FieldClass.Name; + Result := FieldClass.Name; jtArray: raise EJsonMapper.Create('Nested arrays are not supported!'); else - SubType := GetTypeAsString(ContainedType); + Result := Format('TArray<%s>', [GetTypeAsString(ContainedType)]); end; - - Result := Format('TArray<%s>', [SubType]); end; { TStubObjectField } @@ -732,11 +736,11 @@ function TSOJName.CapitaiazeFirst(const Value: string): string; List.Delimiter := '_'; Result := List.DelimitedText; finally - List.free; + List.Free; end; end; -constructor TSOJName.Create(aItemName: string); +constructor TSOJName.Create(aMapper: TPkgJsonMapper; aItemName: string); var s: string; ch: Char; @@ -746,6 +750,7 @@ constructor TSOJName.Create(aItemName: string); if aItemName.IsEmpty then raise Exception.Create('aItemName can not be empty'); + FMapper := aMapper; FNeedsAttribute := False; FJsonName := aItemName; @@ -770,6 +775,12 @@ function TSOJName.NameAttribute: string; exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); end; +procedure TSOJName.SetName(const Value: string); +begin + FPureClassName := Value; + FName := FMapper.SuggestClassName('T' + FPureClassName + 'DTO'); +end; + initialization ReservedWords := TList.Create; @@ -791,4 +802,3 @@ finalization FreeAndNil(ReservedWords); end. - diff --git a/Pkg.Json.Visualizer.pas b/Pkg.Json.Visualizer.pas index cf5af8c..58cc441 100644 --- a/Pkg.Json.Visualizer.pas +++ b/Pkg.Json.Visualizer.pas @@ -91,19 +91,19 @@ class procedure JsonVisualizer.InternalVisualize(aTreeViewItem: TTreeViewItem; a case StubField.FieldType of jtObject: begin - TreeViewItem.Text := StubField.Name + ': {} ' + StubField.GetTypeAsString; + TreeViewItem.Text := StubField.Name + ': {} ' + StubField.TypeAsString; InternalVisualize(TreeViewItem, (StubField as TStubObjectField).FieldClass, AItemStyleLookup); end; jtArray: begin - TreeViewItem.Text := StubField.Name + ': [] ' + StubField.GetTypeAsString; + TreeViewItem.Text := StubField.Name + ': [] ' + StubField.TypeAsString; if (StubField as TStubArrayField).ContainedType = jtObject then InternalVisualize(TreeViewItem, (StubField as TStubArrayField).FieldClass, AItemStyleLookup); end; else - TreeViewItem.Text := StubField.Name + ': ' + StubField.GetTypeAsString; + TreeViewItem.Text := StubField.Name + ': ' + StubField.TypeAsString; end; aTreeViewItem.AddObject(TreeViewItem); @@ -137,3 +137,4 @@ class procedure JsonVisualizer.Visualize(aTreeView: TTreeView; AItemStyleLookup: end; end. + diff --git a/uMainForm.fmx b/uMainForm.fmx index e05935f..80934c9 100644 --- a/uMainForm.fmx +++ b/uMainForm.fmx @@ -1490,8 +1490,8 @@ object MainForm: TMainForm 740500000000000000A404401453697A652E506C6174666F726D44656661756C 74080B5374726F6B652E4B696E6407044E6F6E650756697369626C65080000} end> - Left = 32 - Top = 32 + Left = 65216 + Top = 65520 end object MainPopupMenu: TPopupMenu OnPopup = MainPopupMenuPopup @@ -1528,7 +1528,7 @@ object MainForm: TMainForm Padding.Top = 2.000000000000000000 Padding.Right = 6.000000000000000000 Padding.Bottom = 6.000000000000000000 - Size.Width = 669.000000000000000000 + Size.Width = 852.000000000000000000 Size.Height = 479.000000000000000000 Size.PlatformDefault = False StyleLookup = 'Panel2Style1' @@ -1537,120 +1537,23 @@ object MainForm: TMainForm Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] DataDetectorTypes = [] Lines.Strings = ( - '{"web-app": {' - ' "servlet": [ ' - ' {' - ' "servlet-name": "cofaxCDS",' - ' "servlet-class": "org.cofax.cds.CDSServlet",' - ' "init-param": {' - ' "configGlossary:installationAt": "Philadelphia, PA",' - ' "configGlossary:adminEmail": "ksm@pobox.com",' - ' "configGlossary:poweredBy": "Cofax",' - ' "configGlossary:poweredByIcon": "/images/cofax.gif",' - ' "configGlossary:staticPath": "/content/static",' - ' "templateProcessorClass": "org.cofax.WysiwygTemplate",' - ' "templateLoaderClass": "org.cofax.FilesTemplateLoader",' - ' "templatePath": "templates",' - ' "templateOverridePath": "",' - ' "defaultListTemplate": "listTemplate.htm",' - ' "defaultFileTemplate": "articleTemplate.htm",' - ' "useJSP": false,' - ' "jspListTemplate": "listTemplate.jsp",' - ' "jspFileTemplate": "articleTemplate.jsp",' - ' "cachePackageTagsTrack": 200,' - ' "cachePackageTagsStore": 200,' - ' "cachePackageTagsRefresh": 60,' - ' "cacheTemplatesTrack": 100,' - ' "cacheTemplatesStore": 50,' - ' "cacheTemplatesRefresh": 15,' - ' "cachePagesTrack": 200,' - ' "cachePagesStore": 100,' - ' "cachePagesRefresh": 10,' - ' "cachePagesDirtyRead": 10,' - ' "searchEngineListTemplate": "forSearchEnginesList.htm",' - ' "searchEngineFileTemplate": "forSearchEngines.htm",' - ' "searchEngineRobotsDb": "WEB-INF/robots.db",' - ' "useDataStore": true,' - ' "dataStoreClass": "org.cofax.SqlDataStore",' - ' "redirectionClass": "org.cofax.SqlRedirection",' - ' "dataStoreName": "cofax",' - - ' "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServ' + - 'erDriver",' - - ' "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:14' + - '33;DatabaseName=goon",' - ' "dataStoreUser": "sa",' - ' "dataStorePassword": "dataStoreTestQuery",' - - ' "dataStoreTestQuery": "SET NOCOUNT ON;select test='#39'test'#39 + - ';",' - - ' "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.lo' + - 'g",' - ' "dataStoreInitConns": 10,' - ' "dataStoreMaxConns": 100,' - ' "dataStoreConnUsageLimit": 100,' - ' "dataStoreLogLevel": "debug",' - ' "maxUrlLength": 500}},' - ' {' - ' "servlet-name": "cofaxEmail",' - ' "servlet-class": "org.cofax.cds.EmailServlet",' - ' "init-param": {' - ' "mailHost": "mail1",' - ' "mailHostOverride": "mail2"}},' - ' {' - ' "servlet-name": "cofaxAdmin",' - ' "servlet-class": "org.cofax.cds.AdminServlet"},' - ' ' - ' {' - ' "servlet-name": "fileServlet",' - ' "servlet-class": "org.cofax.cds.FileServlet"},' - ' {' - ' "servlet-name": "cofaxTools",' - ' "servlet-class": "org.cofax.cms.CofaxToolsServlet",' - ' "init-param": {' - ' "templatePath": "toolstemplates/",' - ' "log": 1,' - ' "logLocation": "/usr/local/tomcat/logs/CofaxTools.log",' - ' "logMaxSize": "",' - ' "dataLog": 1,' - ' "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log",' - ' "dataLogMaxSize": "",' - - ' "removePageCache": "/content/admin/remove?cache=pages&id' + - '=",' - - ' "removeTemplateCache": "/content/admin/remove?cache=temp' + - 'lates&id=",' - - ' "fileTransferFolder": "/usr/local/tomcat/webapps/content' + - '/fileTransferFolder",' - ' "lookInContext": 1,' - ' "adminGroupID": 4,' - ' "betaServer": true}}],' - ' "servlet-mapping": {' - ' "cofaxCDS": "/",' - ' "cofaxEmail": "/cofaxutil/aemail/*",' - ' "cofaxAdmin": "/admin/*",' - ' "fileServlet": "/static/*",' - ' "cofaxTools": "/tools/*"},' - ' ' - ' "taglib": {' - ' "taglib-uri": "cofax.tld",' - ' "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}') + '{' + ' "Tags": [' + ' "Teast Tag"' + ' ]' + '}') StyledSettings = [Size, Style, FontColor] TextSettings.Font.Family = 'Consolas' OnChange = Memo1Change Align = Client Margins.Bottom = 6.000000000000000000 PopupMenu = MemoPopupMenu - Size.Width = 657.000000000000000000 + Size.Width = 840.000000000000000000 Size.Height = 448.000000000000000000 Size.PlatformDefault = False StyleLookup = 'Memo1Style1' TabOrder = 0 - Viewport.Width = 637.000000000000000000 + Viewport.Width = 836.000000000000000000 Viewport.Height = 444.000000000000000000 end object Label4: TLabel @@ -1658,7 +1561,7 @@ object MainForm: TMainForm Margins.Left = 2.000000000000000000 Position.X = 8.000000000000000000 Position.Y = 2.000000000000000000 - Size.Width = 655.000000000000000000 + Size.Width = 838.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False Text = 'Paste JSON String here:' @@ -1668,7 +1571,7 @@ object MainForm: TMainForm Align = Left Cursor = crHSplit MinSize = 20.000000000000000000 - Position.X = 348.000000000000000000 + Position.X = 165.000000000000000000 Position.Y = 3.000000000000000000 Size.Width = 4.000000000000000000 Size.Height = 479.000000000000000000 @@ -1803,12 +1706,13 @@ object MainForm: TMainForm Padding.Top = 2.000000000000000000 Padding.Right = 6.000000000000000000 Padding.Bottom = 6.000000000000000000 - Position.X = 3.000000000000000000 + Position.X = 165.000000000000000000 Position.Y = 3.000000000000000000 Size.Width = 345.000000000000000000 Size.Height = 479.000000000000000000 Size.PlatformDefault = False StyleLookup = 'Panel2Style1' + Visible = False TabOrder = 7 OnResize = Panel1Resize object TreeView: TTreeView @@ -1842,6 +1746,30 @@ object MainForm: TMainForm Visible = False end end + object Splitter2: TSplitter + Align = Left + Cursor = crHSplit + MinSize = 20.000000000000000000 + Position.X = 161.000000000000000000 + Position.Y = 3.000000000000000000 + Size.Width = 4.000000000000000000 + Size.Height = 479.000000000000000000 + Size.PlatformDefault = False + end + object ListView1: TListView + ItemAppearanceClassName = 'TListItemAppearance' + ItemEditAppearanceClassName = 'TListItemShowCheckAppearance' + HeaderAppearanceClassName = 'TListHeaderObjects' + FooterAppearanceClassName = 'TListHeaderObjects' + Align = Left + Position.X = 3.000000000000000000 + Position.Y = 3.000000000000000000 + Size.Width = 158.000000000000000000 + Size.Height = 479.000000000000000000 + Size.PlatformDefault = False + OnChange = ListView1Change + OnItemClick = ListView1ItemClick + end object ActionList1: TActionList OnUpdate = ActionList1Update Left = 168 diff --git a/uMainForm.pas b/uMainForm.pas index 5554c6b..a19cdd5 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -8,7 +8,9 @@ interface FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.DialogService, FMX.Dialogs, FMX.Layouts, FMX.TreeView, FMX.Edit, FMX.StdCtrls, FMX.ScrollBox, FMX.Memo, FMX.Menus, FMX.Controls.Presentation, FMX.Objects, System.Actions, FMX.ActnList, FMX.ConstrainedForm, - Pkg.Json.Mapper, uUpdate, uGitHub, uUpdateForm; + Pkg.Json.Mapper, uUpdate, uGitHub, uUpdateForm, FMX.Memo.Types, + FMX.ListView.Types, FMX.ListView.Appearances, FMX.ListView.Adapters.Base, + FMX.ListView; const JsonValidatorUrl = 'http://jsonlint.com'; @@ -50,6 +52,8 @@ TMainForm = class(TConstrainedForm) actValidateJSON: TAction; MenuItem4: TMenuItem; actRenameProperty: TAction; + Splitter2: TSplitter; + ListView1: TListView; procedure btnVisualizeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); @@ -69,6 +73,8 @@ TMainForm = class(TConstrainedForm) procedure actRenamePropertyExecute(Sender: TObject); procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean); procedure btnExitClick(Sender: TObject); + procedure ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); + procedure ListView1Change(Sender: TObject); private { Private declarations } FJsonMapper: TPkgJsonMapper; @@ -94,14 +100,18 @@ implementation {$R *.fmx} uses + System.IoUtils, uSaveUnitForm, Pkg.Json.Visualizer, Pkg.Json.DTO, {$IFDEF MSWINDOWS} Winapi.ShellAPI, Winapi.Windows; {$ENDIF MSWINDOWS} {$IFDEF POSIX} - Posix.Stdlib; +Posix.Stdlib; {$ENDIF POSIX} +const + DemoDataRoot = '../../Demo Data/'; + procedure TMainForm.btnExitClick(Sender: TObject); begin Close; @@ -111,7 +121,7 @@ procedure TMainForm.btnVisualizeClick(Sender: TObject); begin if FChanged then TDialogService.MessageDialog('You made changes to the structure. Do you want to load original class?', TMsgDlgType.mtWarning, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbYes, 0, - procedure(const AResult: TModalResult) + procedure(const AResult: TModalResult) begin if AResult = mrYes then VisualizeClass; @@ -165,6 +175,8 @@ procedure TMainForm.ActionList1Update(Action: TBasicAction; var Handled: Boolean begin actRenameProperty.Enabled := false; + Panel1.Visible := TreeView.Count > 0; + if TreeView.Selected = nil then exit; @@ -250,7 +262,7 @@ procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); // We enqueue the handler TThread.Queue(nil, - procedure + procedure begin Close; end); @@ -266,12 +278,14 @@ procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); end; procedure TMainForm.FormCreate(Sender: TObject); +var + FileName: String; begin FApplicationStatus := 0; FUpdateCheckEvent := TEvent.Create(nil, True, false, ''); - self.Constraints.MinWidth := 1024; - self.Constraints.MinHeight := 560; + Constraints.MinWidth := 1024; + Constraints.MinHeight := 560; Caption := 'JsonToDelphiClass - ' + FloatToStr(ProgramVersion, PointDsFormatSettings) + ' | By Jens Borrisholt'; @@ -304,6 +318,28 @@ procedure TMainForm.FormCreate(Sender: TObject); FUpdateCheckEvent.SetEvent; end); + ListView1.BeginUpdate; + try + for FileName in TDirectory.GetFiles(DemoDataRoot, '*.json') do + ListView1.Items.Add.Text := TPath.GetFileName(FileName); + finally + ListView1.EndUpdate; + end; + + TTask.Run( + procedure + begin + Sleep(50); + TThread.Queue(nil, + procedure + begin + if ListView1.Items.Count > 0 then + begin + ListView1.ItemIndex := 0; + ListView1.OnChange(nil); + end; + end); + end); end; procedure TMainForm.FormDestroy(Sender: TObject); @@ -337,6 +373,42 @@ procedure TMainForm.Label1Click(Sender: TObject); end; end; +procedure TMainForm.ListView1Change(Sender: TObject); +var + Item: TListViewItem; +begin + TreeView.Clear; + Item := ListView1.Selected as TListViewItem; + if Item = nil then + begin + Memo1.Lines.Clear; + exit; + end; + + with TStringList.Create do + try + LoadFromFile(DemoDataRoot + Item.Text); + Memo1.Lines.Text := TJsonDTO.PrettyPrintJSON(Text); + finally + Free; + end; + +end; + +procedure TMainForm.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); +begin + exit; + TreeView.Clear; + + with TStringList.Create do + try + LoadFromFile(DemoDataRoot + AItem.Text); + Memo1.Lines.Text := TJsonDTO.PrettyPrintJSON(Text); + finally + Free; + end; +end; + procedure TMainForm.Memo1Change(Sender: TObject); begin exit; From 374d57ef0b35a51b9aa4cf88909e5fdc9ce93b3f Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 7 Jul 2020 16:06:31 +0200 Subject: [PATCH 024/129] More demo data --- Demo Data/StringTest.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Demo Data/StringTest.json diff --git a/Demo Data/StringTest.json b/Demo Data/StringTest.json new file mode 100644 index 0000000..b452816 --- /dev/null +++ b/Demo Data/StringTest.json @@ -0,0 +1,13 @@ +{ + "StringTest":[ + { + "S1":"5102", + "S2":"True", + "S3":"Test", + "s4":5102, + "s5":true, + "s6":"Test", + "s7":"2012-04-23T18:25:43.511Z" + } + ] +} \ No newline at end of file From a356038aedb4b8b8bcf665bcc93774db56d66ccb Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jul 2020 14:46:18 +0200 Subject: [PATCH 025/129] More demo data --- Demo Data/MailChimp.json | 109 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 Demo Data/MailChimp.json diff --git a/Demo Data/MailChimp.json b/Demo Data/MailChimp.json new file mode 100644 index 0000000..3213e43 --- /dev/null +++ b/Demo Data/MailChimp.json @@ -0,0 +1,109 @@ +{ + "id": "c266cac4b1560b2e88cc893a9a0a1d2c", + "email_address": "phil@strategyseven.co.uk", + "unique_email_id": "e0b2ed8624", + "web_id": 153925945, + "email_type": "text", + "status": "subscribed", + "merge_fields": { + "FNAME": "Phil", + "LNAME": "Hutchinson", + "ADDRESS": "", + "PHONE": "", + "BIRTHDAY": "", + "MMERGE6": "39999999" + }, + "stats": { + "avg_open_rate": 0, + "avg_click_rate": 0 + }, + "ip_signup": "", + "timestamp_signup": "", + "ip_opt": "82.33.161.254", + "timestamp_opt": "2020-06-24T14:14:23+00:00", + "member_rating": 2, + "last_changed": "2020-06-25T09:07:01+00:00", + "language": "", + "vip": false, + "email_client": "", + "location": { + "latitude": 0, + "longitude": 0, + "gmtoff": 0, + "dstoff": 0, + "country_code": "", + "timezone": "" + }, + "source": "Admin Add", + "tags_count": 1, + "tags": [ + { + "id": 157429, + "name": "New Customer" + } + ], + "list_id": "dc2af4377f", + "_links": [ + { + "rel": "self", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json" + }, + { + "rel": "parent", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/CollectionResponse.json", + "schema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/CollectionLinks\/Lists\/Members.json" + }, + { + "rel": "update", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "PATCH", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json", + "schema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/PATCH.json" + }, + { + "rel": "upsert", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "PUT", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Response.json", + "schema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/PUT.json" + }, + { + "rel": "delete", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c", + "method": "DELETE" + }, + { + "rel": "activity", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/activity", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Activity\/Response.json" + }, + { + "rel": "goals", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/goals", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Goals\/Response.json" + }, + { + "rel": "notes", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/notes", + "method": "GET", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Notes\/CollectionResponse.json" + }, + { + "rel": "events", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/events", + "method": "POST", + "targetSchema": "https:\/\/us10.api.mailchimp.com\/schema\/3.0\/Definitions\/Lists\/Members\/Events\/POST.json" + }, + { + "rel": "delete_permanent", + "href": "https:\/\/us10.api.mailchimp.com\/3.0\/lists\/dc2af4377f\/members\/c266cac4b1560b2e88cc893a9a0a1d2c\/actions\/delete-permanent", + "method": "POST" + } + ] +} From d41767a5de4c8226a13b308832ea1d7d867c3700 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jul 2020 16:26:28 +0200 Subject: [PATCH 026/129] Demo data --- Demo Data/ArrayTest1.json | 11 +++++++++++ Demo Data/ArrayTest2.json | 10 ++++++++++ Demo Data/ArrayTest3.json | 22 ++++++++++++++++++++++ 3 files changed, 43 insertions(+) create mode 100644 Demo Data/ArrayTest1.json create mode 100644 Demo Data/ArrayTest2.json create mode 100644 Demo Data/ArrayTest3.json diff --git a/Demo Data/ArrayTest1.json b/Demo Data/ArrayTest1.json new file mode 100644 index 0000000..360cf46 --- /dev/null +++ b/Demo Data/ArrayTest1.json @@ -0,0 +1,11 @@ +{ + "ArrayTest":[ + { + "S1":"5102" + }, + { + "S1":"5102", + "S2":"True" + } + ] +} \ No newline at end of file diff --git a/Demo Data/ArrayTest2.json b/Demo Data/ArrayTest2.json new file mode 100644 index 0000000..5843014 --- /dev/null +++ b/Demo Data/ArrayTest2.json @@ -0,0 +1,10 @@ +{ + "ArrayTest":[ + { + "S1":"5102" + }, + { + "S2":"True" + } + ] +} \ No newline at end of file diff --git a/Demo Data/ArrayTest3.json b/Demo Data/ArrayTest3.json new file mode 100644 index 0000000..d6e6ca1 --- /dev/null +++ b/Demo Data/ArrayTest3.json @@ -0,0 +1,22 @@ +{ + "glossary": { + "title": "example glossary", + "GlossDiv": { + "title": "S", + "GlossList": { + "GlossEntry": { + "ID": "SGML", + "SortAs": "SGML", + "GlossTerm": "Standard Generalized Markup Language", + "Acronym": "SGML", + "Abbrev": "ISO 8879:1986", + "GlossDef": { + "para": "A meta-markup language, used to create markup languages such as DocBook.", + "GlossSeeAlso": ["GML", "XML"] + }, + "GlossSee": "markup" + } + } + } + } +} \ No newline at end of file From 7875cded4360692b159e63245690411184d07530 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jul 2020 17:02:53 +0200 Subject: [PATCH 027/129] Support for Empty Anonymous Array --- Demo Data/Anonymous Array.json | 9 ++++++++ Demo Data/Empty Anonymous Array.json | 3 +++ Pkg.Json.Mapper.pas | 33 +++++++++++++++++++++++----- 3 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 Demo Data/Anonymous Array.json create mode 100644 Demo Data/Empty Anonymous Array.json diff --git a/Demo Data/Anonymous Array.json b/Demo Data/Anonymous Array.json new file mode 100644 index 0000000..7f24bd2 --- /dev/null +++ b/Demo Data/Anonymous Array.json @@ -0,0 +1,9 @@ +[ + { + "S1":"5102" + }, + { + "S1":"5102", + "S2":"True" + } +] \ No newline at end of file diff --git a/Demo Data/Empty Anonymous Array.json b/Demo Data/Empty Anonymous Array.json new file mode 100644 index 0000000..609889a --- /dev/null +++ b/Demo Data/Empty Anonymous Array.json @@ -0,0 +1,3 @@ +[ + +] \ No newline at end of file diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 485aded..ff0335c 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -179,6 +179,9 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: JsonType, JsonType2: TJsonType; StubClass: TStubClass; begin + if aJsonValue = nil then + exit; + JSONObject := aJsonValue as TJSONObject; for JsonPair in JSONObject do @@ -387,8 +390,9 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; var JSONValue, JsonValue2: TJsonValue; - JsonType: TJsonType; + JsonType, JsonType2: TJsonType; StubClass: TStubClass; + JsonArray: TJSONArray; begin Result := Self; FStubClasses.Clear; @@ -407,14 +411,33 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; begin JsonType := jtUnknown; StubClass := nil; + JsonArray := TJSONArray(JSONValue); - JsonValue2 := GetFirstArrayItem(JSONValue); - if JsonValue2 <> nil then + if JsonArray.Count = 0 then begin - JsonType := GetJsonType(JsonValue2); + JsonType := jtObject; + JsonValue2 := nil; StubClass := TStubClass.Create(FRootClass, 'Item', Self); - end; + end + else + begin + + +// begin +// // if we meet an empty array then +// JsonType2 := jtObject; +// StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); +// end; + + JsonValue2 := GetFirstArrayItem(JSONValue); + if JsonValue2 <> nil then + begin + JsonType := GetJsonType(JsonValue2); + StubClass := TStubClass.Create(FRootClass, 'Item', Self); + end; + + end; FRootClass.ArrayProperty := 'Items'; TStubArrayField.Create(FRootClass, 'Items', JsonType, StubClass); ProcessJsonObject(JsonValue2, StubClass); From a29afdb2a03bc5625e2d096f6c905c12f6527d75 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jul 2020 17:35:51 +0200 Subject: [PATCH 028/129] Support for Anonymous Arrays --- Pkg.Json.Mapper.pas | 78 +++++++++++++-------------------------------- 1 file changed, 22 insertions(+), 56 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index ff0335c..e02c6f5 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -175,9 +175,10 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: var JSONObject: TJSONObject; JsonPair: TJSONPair; - JSONValue, JsonValue2: TJsonValue; - JsonType, JsonType2: TJsonType; + JSONValue: TJsonValue; + JsonType: TJsonType; StubClass: TStubClass; + JsonArray: TJSONArray; begin if aJsonValue = nil then exit; @@ -201,29 +202,15 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: jtArray: begin - StubClass := nil; - JsonValue2 := GetFirstArrayItem(JSONValue); - if JsonValue2 <> nil then - begin - JsonType2 := GetJsonType(JsonValue2); - case JsonType2 of - jtObject: - begin - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); - ProcessJsonObject(JsonValue2, StubClass); - end; - jtArray: - raise EJsonMapper.Create('Nested Arrays are not supported!'); - end; - end - else - begin - // if we meet an empty array then - JsonType2 := jtObject; - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); - end; + JsonArray := TJSONArray(JSONValue); + JsonValue := GetFirstArrayItem(JSONValue); + JsonType := GetJsonType(JsonValue); - TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType2, StubClass); + StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType, StubClass); + + for JSONValue in JsonArray do + ProcessJsonObject(JSONValue, StubClass); end; else TStubField.Create(aParentClass, JsonPair.JsonString.Value, JsonType); @@ -349,6 +336,9 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; j: Int64; b: Boolean; begin + if aJsonValue = nil then + exit(jtObject); + if aJsonValue is TJSONObject then Result := jtObject else if aJsonValue is TJSONArray then @@ -389,8 +379,8 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; var - JSONValue, JsonValue2: TJsonValue; - JsonType, JsonType2: TJsonType; + JSONValue: TJsonValue; + JsonType: TJsonType; StubClass: TStubClass; JsonArray: TJSONArray; begin @@ -409,38 +399,14 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; jtArray: begin - JsonType := jtUnknown; - StubClass := nil; JsonArray := TJSONArray(JSONValue); - - if JsonArray.Count = 0 then - begin - JsonType := jtObject; - JsonValue2 := nil; - StubClass := TStubClass.Create(FRootClass, 'Item', Self); - - end - else - begin - - -// begin -// // if we meet an empty array then -// JsonType2 := jtObject; -// StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); -// end; - - JsonValue2 := GetFirstArrayItem(JSONValue); - if JsonValue2 <> nil then - begin - JsonType := GetJsonType(JsonValue2); - StubClass := TStubClass.Create(FRootClass, 'Item', Self); - end; - - end; FRootClass.ArrayProperty := 'Items'; - TStubArrayField.Create(FRootClass, 'Items', JsonType, StubClass); - ProcessJsonObject(JsonValue2, StubClass); + StubClass := TStubClass.Create(FRootClass, FRootClass.ArrayProperty, Self); + JsonType := GetJsonType(GetFirstArrayItem(JSONValue)); + TStubArrayField.Create(FRootClass, FRootClass.ArrayProperty, JsonType, StubClass); + + for JSONValue in JsonArray do + ProcessJsonObject(JSONValue, StubClass); end; end; finally From 64383aeb60d6413155c0b33c594177ac0a48bc71 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jul 2020 19:20:01 +0200 Subject: [PATCH 029/129] WIP --- JsonToDelphiClass.dpr | 3 +- JsonToDelphiClass.dproj | 5 ++ Pkg.Json.Mapper.pas | 102 +++++++++++++------------------- Pkg.Json.ReservedWords.pas | 115 +++++++++++++++++++++++++++++++++++++ 4 files changed, 163 insertions(+), 62 deletions(-) create mode 100644 Pkg.Json.ReservedWords.pas diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr index ab1f8eb..eb3c7c5 100644 --- a/JsonToDelphiClass.dpr +++ b/JsonToDelphiClass.dpr @@ -13,7 +13,8 @@ uses uUpdate in 'uUpdate.pas', uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, Pkg.Json.Visualizer in 'Pkg.Json.Visualizer.pas', - Pkg.Json.DTO in 'Pkg.Json.DTO.pas'; + Pkg.Json.DTO in 'Pkg.Json.DTO.pas', + Pkg.Json.ReservedWords in 'Pkg.Json.ReservedWords.pas'; {$R *.res} diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index 300d323..c727999 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -146,6 +146,7 @@
+ Cfg_2 Base @@ -963,6 +964,10 @@ ..\$(PROJECTNAME).launchscreen 64 + + ..\$(PROJECTNAME).launchscreen + 64 + diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index e02c6f5..05feea2 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -119,7 +119,7 @@ TPkgJsonMapper = class FClassName: string; strict protected function GetJsonType(aJsonValue: TJsonValue): TJsonType; - function GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; + function GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; procedure ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); public constructor Create; @@ -141,34 +141,11 @@ implementation uses System.RegularExpressions, System.StrUtils, System.Character, - uUpdate; - -var - ReservedWords: TList; + Pkg.Json.ReservedWords, uUpdate; const INDENT_SIZE = 2; -type - TStringsHelper = class helper for TStrings - public - procedure AddFormat(const aFormat: string; const Args: array of const); - procedure AddIfNotEmpty(const s: string); - end; - - { TStringsHelper } - -procedure TStringsHelper.AddIfNotEmpty(const s: string); -begin - if s <> '' then - inherited Add(s); -end; - -procedure TStringsHelper.AddFormat(const aFormat: string; const Args: array of const); -begin - Add(Format(aFormat, Args)); -end; - { TPkgJsonMapper } procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); @@ -183,8 +160,14 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: if aJsonValue = nil then exit; - JSONObject := aJsonValue as TJSONObject; + if not(aJsonValue is TJSONObject) then + begin + JsonType := GetJsonType(aJsonValue); + TStubField.Create(aParentClass, (aJsonValue as TJsonString).Value, JsonType); + exit; + end; + JSONObject := aJsonValue as TJSONObject; for JsonPair in JSONObject do begin JSONValue := JsonPair.JSONValue; @@ -203,8 +186,8 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: jtArray: begin JsonArray := TJSONArray(JSONValue); - JsonValue := GetFirstArrayItem(JSONValue); - JsonType := GetJsonType(JsonValue); + JSONValue := GetFirstArrayItem(JsonArray); + JsonType := GetJsonType(JSONValue); StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType, StubClass); @@ -242,7 +225,6 @@ function TPkgJsonMapper.GenerateUnit: string; for i := FStubClasses.Count - 1 downto 1 do StringList.AddIfNotEmpty(FStubClasses[i].GetDeclarationPart); - StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO')); StringList.Add('implementation'); @@ -258,15 +240,12 @@ function TPkgJsonMapper.GenerateUnit: string; end; end; -function TPkgJsonMapper.GetFirstArrayItem(aJsonValue: TJsonValue): TJsonValue; -var - JsonArray: TJSONArray; +function TPkgJsonMapper.GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; begin - JsonArray := aJsonValue as TJSONArray; - if JsonArray.Count = 0 then - exit(nil) - else - exit(JsonArray.Items[0]); + if (aJSONArray = nil) or (aJSONArray.Count = 0) then + exit(nil); + + Result := aJSONArray.Items[0]; end; constructor TPkgJsonMapper.Create; @@ -331,7 +310,7 @@ function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; var - JsonString: TJSONString; + JsonString: TJsonString; i: Integer; j: Int64; b: Boolean; @@ -356,9 +335,9 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; Result := jtTrue else if aJsonValue is TJSONFalse then Result := jtFalse - else if aJsonValue is TJSONString then + else if aJsonValue is TJsonString then begin - JsonString := (aJsonValue as TJSONString); + JsonString := (aJsonValue as TJsonString); if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then Result := jtDateTime else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then @@ -402,7 +381,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; JsonArray := TJSONArray(JSONValue); FRootClass.ArrayProperty := 'Items'; StubClass := TStubClass.Create(FRootClass, FRootClass.ArrayProperty, Self); - JsonType := GetJsonType(GetFirstArrayItem(JSONValue)); + JsonType := GetJsonType(GetFirstArrayItem(JsonArray)); TStubArrayField.Create(FRootClass, FRootClass.ArrayProperty, JsonType, StubClass); for JSONValue in JsonArray do @@ -518,7 +497,28 @@ function TStubClass.GetImplementationPart: string; end; procedure TStubClass.SortFields; +var + StubFieldsNames: TStringList; + i: Integer; begin + // remove dublicates + + FItems.Sort(FComparer); + i := 0; +exit; + StubFieldsNames := TStringList.Create; + while i < Items.Count do + begin + if (StubFieldsNames.IndexOf(FItems[i].Name) >= 0) and (FComplexItems.IndexOf(FItems[i]) < 0) then + FItems.Delete(i) + else + begin + StubFieldsNames.Add(FItems[i].Name); + inc(i); + end; + end; + + StubFieldsNames.Free; FItems.Sort(FComparer); end; @@ -770,24 +770,4 @@ procedure TSOJName.SetName(const Value: string); FName := FMapper.SuggestClassName('T' + FPureClassName + 'DTO'); end; -initialization - -ReservedWords := TList.Create; -ReservedWords.Add('type'); -ReservedWords.Add('for'); -ReservedWords.Add('var'); -ReservedWords.Add('begin'); -ReservedWords.Add('end'); -ReservedWords.Add('function'); -ReservedWords.Add('procedure'); -ReservedWords.Add('class'); -ReservedWords.Add('record'); -ReservedWords.Add('string'); -ReservedWords.Add('initialization'); -ReservedWords.Add('finalization'); - -finalization - -FreeAndNil(ReservedWords); - end. diff --git a/Pkg.Json.ReservedWords.pas b/Pkg.Json.ReservedWords.pas new file mode 100644 index 0000000..c0e1f9b --- /dev/null +++ b/Pkg.Json.ReservedWords.pas @@ -0,0 +1,115 @@ +unit Pkg.Json.ReservedWords; + +interface + +uses + System.Classes; + +type + TStringsHelper = class helper for TStrings + public + procedure AddFormat(const aFormat: string; const Args: array of const); + procedure AddIfNotEmpty(const s: string); + function Contains(const s: string): boolean; + end; + +var + ReservedWords: TStringlist; + + { TStringsHelper } +implementation + +uses + System.SysUtils; + +procedure TStringsHelper.AddIfNotEmpty(const s: string); +begin + if s <> '' then + inherited Add(s); +end; + +function TStringsHelper.Contains(const s: string): boolean; +begin + Result := IndexOf(s) >= 0; +end; + +procedure TStringsHelper.AddFormat(const aFormat: string; const Args: array of const); +begin + Add(Format(aFormat, Args)); +end; + +initialization + +ReservedWords := TStringlist.Create; +ReservedWords.Add('and'); +ReservedWords.Add('array'); +ReservedWords.Add('as'); +ReservedWords.Add('asm'); +ReservedWords.Add('begin'); +ReservedWords.Add('case'); +ReservedWords.Add('class'); +ReservedWords.Add('const'); +ReservedWords.Add('constructor'); +ReservedWords.Add('destructor'); +ReservedWords.Add('dispinterface'); +ReservedWords.Add('div'); +ReservedWords.Add('do'); +ReservedWords.Add('downto'); +ReservedWords.Add('else'); +ReservedWords.Add('end'); +ReservedWords.Add('except'); +ReservedWords.Add('exports'); +ReservedWords.Add('file'); +ReservedWords.Add('finalization'); +ReservedWords.Add('finally'); +ReservedWords.Add('for'); +ReservedWords.Add('function'); +ReservedWords.Add('goto'); +ReservedWords.Add('if'); +ReservedWords.Add('implementation'); +ReservedWords.Add('in'); +ReservedWords.Add('inherited'); +ReservedWords.Add('initialization'); +ReservedWords.Add('inline'); +ReservedWords.Add('interface'); +ReservedWords.Add('is'); +ReservedWords.Add('label'); +ReservedWords.Add('library'); +ReservedWords.Add('mod'); +ReservedWords.Add('nil'); +ReservedWords.Add('not'); +ReservedWords.Add('object'); +ReservedWords.Add('of'); +ReservedWords.Add('or'); +ReservedWords.Add('out'); +ReservedWords.Add('packed'); +ReservedWords.Add('procedure'); +ReservedWords.Add('program'); +ReservedWords.Add('property'); +ReservedWords.Add('raise'); +ReservedWords.Add('record'); +ReservedWords.Add('repeat'); +ReservedWords.Add('resourcestring'); +ReservedWords.Add('set'); +ReservedWords.Add('shl'); +ReservedWords.Add('shr'); +ReservedWords.Add('string'); +ReservedWords.Add('then'); +ReservedWords.Add('threadvar'); +ReservedWords.Add('to'); +ReservedWords.Add('try'); +ReservedWords.Add('type'); +ReservedWords.Add('unit'); +ReservedWords.Add('until'); +ReservedWords.Add('uses'); +ReservedWords.Add('var'); +ReservedWords.Add('while'); +ReservedWords.Add('with'); +ReservedWords.Add('xor'); +ReservedWords.Sorted := True; + +finalization + +FreeAndNil(ReservedWords); + +end. From c1b4e413632fc8ce2632ab97a32ab9aea8e68e3f Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 13 Jul 2020 19:38:01 +0200 Subject: [PATCH 030/129] DEV DONE - Needs test --- Pkg.Json.Mapper.pas | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 05feea2..925f6a3 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -26,7 +26,7 @@ TSOJName = class abstract FPureClassName: string; protected procedure SetName(const Value: string); virtual; - function CapitaiazeFirst(const Value: string): string; + function CapitalizeFirst(const Value: string): string; published property JsonName: string read FJsonName; property DelphiName: string read FDelphiName; @@ -58,11 +58,9 @@ TStubField = class(TSOJName) property JsonFieldName: string read FJsonFieldName; property PropertyName: string read FPropertyName; property FieldType: TJsonType read FFieldType; - public constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); property TypeAsString: string read GetTypeAsString; - end; TStubContainerField = class(TStubField) @@ -499,21 +497,30 @@ function TStubClass.GetImplementationPart: string; procedure TStubClass.SortFields; var StubFieldsNames: TStringList; + Item: TStubField; i: Integer; begin // remove dublicates FItems.Sort(FComparer); i := 0; -exit; StubFieldsNames := TStringList.Create; while i < Items.Count do begin - if (StubFieldsNames.IndexOf(FItems[i].Name) >= 0) and (FComplexItems.IndexOf(FItems[i]) < 0) then - FItems.Delete(i) + Item := FItems[i]; + if (StubFieldsNames.IndexOf(Item.Name) >= 0) then + begin + if FComplexItems.Contains(Item) then + FComplexItems.Remove(Item); + + if FArrayItems.Contains(Item) then + FArrayItems.Remove(Item); + + FItems.Delete(i); + end else begin - StubFieldsNames.Add(FItems[i].Name); + StubFieldsNames.Add(Item.Name); inc(i); end; end; @@ -703,7 +710,7 @@ function TStubObjectField.GetTypeAsString: string; { TSOJName } -function TSOJName.CapitaiazeFirst(const Value: string): string; +function TSOJName.CapitalizeFirst(const Value: string): string; var List: TStringList; s: string; @@ -754,7 +761,7 @@ constructor TSOJName.Create(aMapper: TPkgJsonMapper; aItemName: string); if s.StartsWith('_') then s := s.Substring(1); - FDelphiName := CapitaiazeFirst(s); + FDelphiName := CapitalizeFirst(s); if not FDelphiName[1].IsLetter then FDelphiName := '_' + FDelphiName; end; @@ -767,7 +774,7 @@ function TSOJName.NameAttribute: string; procedure TSOJName.SetName(const Value: string); begin FPureClassName := Value; - FName := FMapper.SuggestClassName('T' + FPureClassName + 'DTO'); + FName := 'T' + FPureClassName + 'DTO'; end; end. From c22d24905f34c503ad14f2824833526c88e3e0bb Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 14 Jul 2020 15:40:14 +0200 Subject: [PATCH 031/129] Fixed CapitalizeFirst --- Pkg.Json.Mapper.pas | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 925f6a3..6b80093 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -26,7 +26,7 @@ TSOJName = class abstract FPureClassName: string; protected procedure SetName(const Value: string); virtual; - function CapitalizeFirst(const Value: string): string; + function CapitalizeFirst(Value: string): string; published property JsonName: string read FJsonName; property DelphiName: string read FDelphiName; @@ -410,12 +410,7 @@ constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMap FComparison := function(const Left, Right: TStubField): Integer begin - if Left.Name > Right.Name then - Result := 1 - else if Left.Name < Right.Name then - Result := -1 - else - Result := 0; + Result := CompareStr(Left.Name, Right.Name); end; FComparer := TComparer.Construct(FComparison); @@ -710,12 +705,17 @@ function TStubObjectField.GetTypeAsString: string; { TSOJName } -function TSOJName.CapitalizeFirst(const Value: string): string; +function TSOJName.CapitalizeFirst(Value: string): string; var List: TStringList; s: string; i: Integer; begin + Value := Value.ToLower; + + if Value.Substring(1, 4) = 'name' then + Value := Value[1] + 'Name' + Value.Substring(4); + List := TStringList.Create; try ExtractStrings(['_'], [], PChar(Value), List); From 3dafc9feffd3fab826b8393e7fc9c270dde0627d Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Thu, 16 Jul 2020 18:05:29 +0200 Subject: [PATCH 032/129] WIP: Classes only generated once! --- Pkg.Json.Mapper.pas | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 6b80093..4ad87cd 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -96,8 +96,10 @@ TStubClass = class(TSOJName) FParentClass: TStubClass; FMapper: TPkgJsonMapper; FArrayProperty: string; - public + strict protected constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); virtual; + public + class function Construct(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''): TStubClass; destructor Destroy; override; function GetDeclarationPart(const BaseClass: string = ''): string; function GetImplementationPart: string; @@ -176,7 +178,7 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: { do nothing }; jtObject: begin - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + StubClass := TStubClass.Construct(aParentClass, JsonPair.JsonString.Value, Self); TStubObjectField.Create(aParentClass, JsonPair.JsonString.Value, StubClass); ProcessJsonObject(JSONValue, StubClass); end; @@ -187,7 +189,7 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: JSONValue := GetFirstArrayItem(JsonArray); JsonType := GetJsonType(JSONValue); - StubClass := TStubClass.Create(aParentClass, JsonPair.JsonString.Value, Self); + StubClass := TStubClass.Construct(aParentClass, JsonPair.JsonString.Value, Self); TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType, StubClass); for JSONValue in JsonArray do @@ -368,7 +370,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; if JSONValue <> nil then begin try - FRootClass := TStubClass.Create(nil, FClassName, Self); + FRootClass := TStubClass.Construct(nil, FClassName, Self); case GetJsonType(JSONValue) of jtObject: @@ -378,7 +380,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; begin JsonArray := TJSONArray(JSONValue); FRootClass.ArrayProperty := 'Items'; - StubClass := TStubClass.Create(FRootClass, FRootClass.ArrayProperty, Self); + StubClass := TStubClass.Construct(FRootClass, FRootClass.ArrayProperty, Self); JsonType := GetJsonType(GetFirstArrayItem(JsonArray)); TStubArrayField.Create(FRootClass, FRootClass.ArrayProperty, JsonType, StubClass); @@ -394,6 +396,18 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; raise EJsonMapper.Create('Unable to parse the JSON String!'); end; +class function TStubClass.Construct(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string): TStubClass; +var + StubClass: TStubClass; +begin + for StubClass in aMapper.StubClasses do + if SameText(StubClass.JsonName, aClassName) then + exit(StubClass); + + Result := TStubClass.Create(aParentClass, aClassName, aMapper, aArrayProperty); + +end; + constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string); begin inherited Create(aMapper, aClassName); From ef61e9368d3654ff69ef796c0e690c15e49a3c9d Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Fri, 17 Jul 2020 08:25:08 +0200 Subject: [PATCH 033/129] Code restructure --- JsonToDelphiClass.dpr | 6 +- JsonToDelphiClass.dproj | 4 +- Mapper/Pkg.Json.JSONName.pas | 107 +++++++++ Mapper/Pkg.Json.Mapper.pas | 299 ++++++++++++++++++++++++ Mapper/Pkg.Json.StubField.pas | 418 ++++++++++++++++++++++++++++++++++ Pkg.Json.Mapper.pas | 3 +- Pkg.Json.Visualizer.pas | 2 +- ProjectGroup1.groupproj | 48 ---- RootUnit.pas | 174 -------------- uMainForm.pas | 2 +- 10 files changed, 834 insertions(+), 229 deletions(-) create mode 100644 Mapper/Pkg.Json.JSONName.pas create mode 100644 Mapper/Pkg.Json.Mapper.pas create mode 100644 Mapper/Pkg.Json.StubField.pas delete mode 100644 ProjectGroup1.groupproj delete mode 100644 RootUnit.pas diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr index eb3c7c5..8c30c80 100644 --- a/JsonToDelphiClass.dpr +++ b/JsonToDelphiClass.dpr @@ -6,7 +6,7 @@ uses System.StartUpCopy, FMX.Forms, uMainForm in 'uMainForm.pas' {MainForm}, - Pkg.Json.Mapper in 'Pkg.Json.Mapper.pas', + Pkg.Json.Mapper in 'Mapper\Pkg.Json.Mapper.pas', uSaveUnitForm in 'uSaveUnitForm.pas' {SaveUnitForm}, uGitHub in 'uGitHub.pas', FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {/ IdSSLOpenSSLHeaders,}, @@ -14,7 +14,9 @@ uses uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, Pkg.Json.Visualizer in 'Pkg.Json.Visualizer.pas', Pkg.Json.DTO in 'Pkg.Json.DTO.pas', - Pkg.Json.ReservedWords in 'Pkg.Json.ReservedWords.pas'; + Pkg.Json.ReservedWords in 'Pkg.Json.ReservedWords.pas', + Pkg.Json.JSONName in 'Mapper\Pkg.Json.JSONName.pas', + Pkg.Json.StubField in 'Mapper\Pkg.Json.StubField.pas'; {$R *.res} diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index c727999..18d4b19 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -130,7 +130,7 @@
MainForm
fmx
- +
SaveUnitForm
fmx @@ -147,6 +147,8 @@ + + Cfg_2 Base diff --git a/Mapper/Pkg.Json.JSONName.pas b/Mapper/Pkg.Json.JSONName.pas new file mode 100644 index 0000000..bb432f2 --- /dev/null +++ b/Mapper/Pkg.Json.JSONName.pas @@ -0,0 +1,107 @@ +unit Pkg.Json.JSONName; + +interface +{$M+} + +type + TJSONName = class abstract + strict private + FJsonName: string; + FDelphiName: string; + FNeedsAttribute: Boolean; + FName: string; + FPureClassName: string; + protected + procedure SetName(const Value: string); virtual; + function CapitalizeFirst(Value: string): string; + published + property JSONName: string read FJsonName; + property DelphiName: string read FDelphiName; + property NeedsAttribute: Boolean read FNeedsAttribute; + property PureClassName: string read FPureClassName write FPureClassName; + property Name: string read FName write SetName; + public + constructor Create(aItemName: string); reintroduce; + function NameAttribute: string; + end; + +implementation + +uses + System.Classes, System.Sysutils, System.Character; + +{ TJSONName } + +function TJSONName.CapitalizeFirst(Value: string): string; +var + List: TStringList; + s: string; + i: Integer; +begin + Value := Value.ToLower; + + if Value.Substring(1, 4) = 'name' then + Value := Value[1] + 'Name' + Value.Substring(4); + + List := TStringList.Create; + try + ExtractStrings(['_'], [], PChar(Value), List); + for i := 0 to List.Count - 1 do + begin + s := List[i]; + if s.StartsWith('&') then + s[2] := s.ToUpper[2] + else + s[1] := s.ToUpper[1]; + List[i] := s; + end; + + List.Delimiter := '_'; + Result := List.DelimitedText; + finally + List.Free; + end; +end; + +constructor TJSONName.Create(aItemName: string); +var + s: string; + ch: Char; +begin + inherited Create; + + if aItemName.IsEmpty then + raise Exception.Create('aItemName can not be empty'); + + FNeedsAttribute := False; + FJsonName := aItemName; + + for ch in FJsonName do + if ch.IsLetterOrDigit then + s := s + ch + else + s := s + '_'; + + FNeedsAttribute := (s <> FJsonName) or (aItemName.StartsWith('_')); + + if s.StartsWith('_') then + s := s.Substring(1); + + FDelphiName := CapitalizeFirst(s); + if not FDelphiName[1].IsLetter then + FDelphiName := '_' + FDelphiName; +end; + +function TJSONName.NameAttribute: string; +begin + exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); +end; + +procedure TJSONName.SetName(const Value: string); +begin + FPureClassName := Value; + FName := 'T' + FPureClassName + 'DTO'; +end; + + +end. diff --git a/Mapper/Pkg.Json.Mapper.pas b/Mapper/Pkg.Json.Mapper.pas new file mode 100644 index 0000000..5d43810 --- /dev/null +++ b/Mapper/Pkg.Json.Mapper.pas @@ -0,0 +1,299 @@ +unit Pkg.Json.Mapper; + +interface + +uses + System.Json, Rest.Json, System.SysUtils, System.Classes, System.Generics.Collections, System.Generics.Defaults, + + Pkg.Json.JSONName, Pkg.Json.StubField; + +{$M+} + +type + TPkgJsonMapper = class + strict private + FStubClasses: TStubClassList; + FRootClass: TStubClass; + FUnitName: string; + FClassName: string; + strict protected + function GetJsonType(aJsonValue: TJsonValue): TJsonType; + function GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; + procedure ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); + public + constructor Create; + destructor Destroy; override; + // Parses a JSON string and creates internal stub class structure + function Parse(aJsonString: string): TPkgJsonMapper; + // Generates result unit + function GenerateUnit: string; + function SuggestClassName(aSuggestedClassName: string): string; + procedure Debug(aLines: TStrings); + published + property DestinationClassName: string read FClassName write FClassName; + property DestinationUnitName: string read FUnitName write FUnitName; + property RootClass: TStubClass read FRootClass; + property StubClasses: TStubClassList read FStubClasses; + end; + +implementation + +uses + System.RegularExpressions, System.StrUtils, System.Character, + Pkg.Json.ReservedWords, uUpdate; + +const + INDENT_SIZE = 2; + +{ TPkgJsonMapper } + +procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); +var + JSONObject: TJSONObject; + JsonPair: TJSONPair; + JSONValue: TJsonValue; + JsonType: TJsonType; + StubClass: TStubClass; + JsonArray: TJSONArray; +begin + if aJsonValue = nil then + exit; + + if not(aJsonValue is TJSONObject) then + begin + JsonType := GetJsonType(aJsonValue); + TStubField.Create(aParentClass, (aJsonValue as TJsonString).Value, JsonType); + exit; + end; + + JSONObject := aJsonValue as TJSONObject; + for JsonPair in JSONObject do + begin + JSONValue := JsonPair.JSONValue; + JsonType := GetJsonType(JSONValue); + + case JsonType of + jtUnknown: + { do nothing }; + jtObject: + begin + StubClass := TStubClass.Construct(aParentClass, JsonPair.JsonString.Value, Self.FStubClasses); + TStubObjectField.Create(aParentClass, JsonPair.JsonString.Value, StubClass); + ProcessJsonObject(JSONValue, StubClass); + end; + + jtArray: + begin + JsonArray := TJSONArray(JSONValue); + JSONValue := GetFirstArrayItem(JsonArray); + JsonType := GetJsonType(JSONValue); + + StubClass := TStubClass.Construct(aParentClass, JsonPair.JsonString.Value, Self.FStubClasses); + TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType, StubClass); + + for JSONValue in JsonArray do + ProcessJsonObject(JSONValue, StubClass); + end; + else + TStubField.Create(aParentClass, JsonPair.JsonString.Value, JsonType); + end; + end; + + aParentClass.SortFields; +end; + +function TPkgJsonMapper.GenerateUnit: string; +var + StringList: TStringList; + i: Integer; +begin + StringList := TStringList.Create; + try + StringList.TrailingLineBreak := False; + + StringList.Add('unit ' + FUnitName + ';'); + StringList.Add(''); + StringList.Add('interface'); + StringList.Add(''); + StringList.Add('uses'); + StringList.Add(' Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types;'); + StringList.Add(''); + StringList.Add('{$M+}'); + StringList.Add(''); + StringList.Add('type'); + + for i := FStubClasses.Count - 1 downto 1 do + StringList.AddIfNotEmpty(FStubClasses[i].GetDeclarationPart); + StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO')); + StringList.Add('implementation'); + + for i := FStubClasses.Count - 1 downto 0 do + StringList.AddIfNotEmpty(FStubClasses[i].GetImplementationPart); + + StringList.Add(''); + StringList.Add('end.'); + + Result := StringList.Text; + finally + StringList.Free; + end; +end; + +function TPkgJsonMapper.GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; +begin + if (aJSONArray = nil) or (aJSONArray.Count = 0) then + exit(nil); + + Result := aJSONArray.Items[0]; +end; + +constructor TPkgJsonMapper.Create; +begin + inherited Create; + FStubClasses := TStubClassList.Create; + FClassName := 'Root'; +end; + +procedure TPkgJsonMapper.Debug(aLines: TStrings); +var + StubClass: TStubClass; + StubField: TStubField; +begin + aLines.Clear; + + for StubClass in FStubClasses do + begin + aLines.Add('-------'); + aLines.Add(StubClass.Name); + for StubField in StubClass.Items do + aLines.AddFormat('%-15s | %s', [StubField.FieldName, StubField.TypeAsString]); + end; +end; + +destructor TPkgJsonMapper.Destroy; +begin + FreeAndNil(FStubClasses); + inherited; +end; + +function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; +var + StubClass: TStubClass; + MaxValue, i: Integer; + s: string; +begin + Result := aSuggestedClassName; + MaxValue := 0; + + for StubClass in FStubClasses do + if StubClass.Name.StartsWith(aSuggestedClassName, True) then + begin + s := Copy(StubClass.Name, Length(aSuggestedClassName) + 2); + + if (s.Length = 3) then + begin + if TryStrToInt(s, i) then + begin + inc(i); + if i > MaxValue then + MaxValue := i; + end; + end + else + MaxValue := 1; + end; + + if MaxValue > 0 then + Result := Format('%s_%0.3d', [aSuggestedClassName, MaxValue]); +end; + +function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; +var + JsonString: TJsonString; + i: Integer; + j: Int64; + b: Boolean; +begin + if aJsonValue = nil then + exit(jtObject); + + if aJsonValue is TJSONObject then + Result := jtObject + else if aJsonValue is TJSONArray then + Result := jtArray + else if (aJsonValue is TJSONNumber) then + begin + if TryStrToInt(aJsonValue.Value, i) then + Result := jtInteger + else if TryStrToInt64(aJsonValue.Value, j) then + Result := jtInteger64 + else + Result := jtNumber + end + else if aJsonValue is TJSONTrue then + Result := jtTrue + else if aJsonValue is TJSONFalse then + Result := jtFalse + else if aJsonValue is TJsonString then + begin + JsonString := (aJsonValue as TJsonString); + if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then + Result := jtDateTime + else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then + Result := jtDate + else if TryStrToBool(JsonString.Value, b) then + begin + if b then + Result := jtTrue + else + Result := jtFalse + end + else + Result := jtString + end + else + Result := jtUnknown; +end; + +function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; +var + JSONValue: TJsonValue; + JsonType: TJsonType; + StubClass: TStubClass; + JsonArray: TJSONArray; +begin + Result := Self; + FStubClasses.Clear; + + JSONValue := TJSONObject.ParseJSONValue(aJsonString); + if JSONValue <> nil then + begin + try + FRootClass := TStubClass.Construct(nil, FClassName, Self.FStubClasses); + + case GetJsonType(JSONValue) of + jtObject: + ProcessJsonObject(JSONValue, FRootClass); + + jtArray: + begin + JsonArray := TJSONArray(JSONValue); + FRootClass.ArrayProperty := 'Items'; + StubClass := TStubClass.Construct(FRootClass, FRootClass.ArrayProperty, Self.FStubClasses); + JsonType := GetJsonType(GetFirstArrayItem(JsonArray)); + TStubArrayField.Create(FRootClass, FRootClass.ArrayProperty, JsonType, StubClass); + + for JSONValue in JsonArray do + ProcessJsonObject(JSONValue, StubClass); + end; + end; + finally + JSONValue.Free; + end; + end + else + raise EJsonMapper.Create('Unable to parse the JSON String!'); +end; + + +end. diff --git a/Mapper/Pkg.Json.StubField.pas b/Mapper/Pkg.Json.StubField.pas new file mode 100644 index 0000000..461746a --- /dev/null +++ b/Mapper/Pkg.Json.StubField.pas @@ -0,0 +1,418 @@ +unit Pkg.Json.StubField; + +interface + +uses + System.SysUtils, System.Generics.Defaults, System.Generics.Collections, + Pkg.Json.JSONName; + +type + EJsonMapper = class(Exception); + TJsonType = (jtUnknown, jtObject, jtArray, jtString, jtTrue, jtFalse, jtNumber, jtDate, jtDateTime, jtBytes, jtInteger, jtInteger64); + + TStubClass = class; + + TStubClassList = class(TObjectList) + end; + + TStubField = class(TJSONName) + private + FPropertyName: string; + FFieldName: string; + FFieldType: TJsonType; + FParentClass: TStubClass; + FJsonFieldName: string; + FName: string; + strict protected + procedure SetName(const Value: string); override; + class function GetTypeAsString(AType: TJsonType): string; overload; + function GetTypeAsString: string; overload; virtual; + public + function IsObjectArrayField: Boolean; + published + property Name: string read FName write SetName; + property FieldName: string read FFieldName; + property JsonFieldName: string read FJsonFieldName; + property PropertyName: string read FPropertyName; + property FieldType: TJsonType read FFieldType; + public + constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); + property TypeAsString: string read GetTypeAsString; + end; + + TStubContainerField = class abstract(TStubField) + strict private + FFieldClass: TStubClass; + FContainedType: TJsonType; + published + property ContainedType: TJsonType read FContainedType write FContainedType; + property FieldClass: TStubClass read FFieldClass write FFieldClass; + end; + + TStubObjectField = class(TStubContainerField) + strict protected + function GetTypeAsString: string; override; + public + constructor Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); + end; + + TStubArrayField = class(TStubContainerField) + strict protected + function GetTypeAsString: string; override; + public + constructor Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); + end; + + TStubClass = class(TJSONName) + strict private + FArrayItems: TList; + FComplexItems: TList; + FItems: TObjectList; + FComparison: TComparison; + FComparer: IComparer; + FParentClass: TStubClass; + FStubClasses: TStubClassList; + FArrayProperty: string; + strict protected + constructor Create(aParentClass: TStubClass; aClassName: string; aStubClasses: TStubClassList; aArrayProperty: string = ''); virtual; + public + class function Construct(aParentClass: TStubClass; aClassName: string; aStubClasses: TStubClassList; aArrayProperty: string = ''): TStubClass; + destructor Destroy; override; + function GetDeclarationPart(const BaseClass: string = ''): string; + function GetImplementationPart: string; + procedure SortFields; + published + property Items: TObjectList read FItems write FItems; + property ArrayProperty: string read FArrayProperty write FArrayProperty; + property ComplexItems: TList read FComplexItems; + property ArrayItems: TList read FArrayItems; + end; + +implementation + +uses + System.Classes, System.StrUtils, + + Pkg.Json.ReservedWords; + +class function TStubClass.Construct(aParentClass: TStubClass; aClassName: string; aStubClasses: TStubClassList; aArrayProperty: string): TStubClass; +var + StubClass: TStubClass; +begin + for StubClass in aStubClasses do + if SameText(StubClass.JSONName, aClassName) then + exit(StubClass); + + Result := TStubClass.Create(aParentClass, aClassName, aStubClasses, aArrayProperty); +end; + +constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aStubClasses: TStubClassList; aArrayProperty: string); +begin + inherited Create(aClassName); + FStubClasses := aStubClasses; + SetName(DelphiName); + + FItems := TObjectList.Create; + FComplexItems := TList.Create; + FArrayItems := TList.Create; + FStubClasses.Add(Self); + FArrayProperty := aArrayProperty; + + FParentClass := aParentClass; + + FComparison := function(const Left, Right: TStubField): Integer + begin + Result := CompareStr(Left.Name, Right.Name); + end; + + FComparer := TComparer.Construct(FComparison); +end; + +destructor TStubClass.Destroy; +begin + FreeAndNil(FComplexItems); + FreeAndNil(FItems); + FreeAndNil(FArrayItems); + inherited; +end; + +function TStubClass.GetImplementationPart: string; +var + Lines: TStringList; + StubField: TStubField; + StubArrayField: TStubArrayField; +begin + Lines := TStringList.Create; + try + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + begin + Lines.Add(''); + Lines.AddFormat('{ %s }', [Name]); + Lines.Add(''); + end; + + if (FComplexItems.Count > 0) then + begin + Lines.AddFormat('constructor %s.Create;', [Name]); + Lines.Add('begin'); + Lines.Add(' inherited;'); + + for StubField in FComplexItems do + Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); + + Lines.Add('end;'); + Lines.Add(''); + end; + + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + begin + Lines.Add(Format('destructor %s.Destroy;', [Name])); + Lines.Add('begin'); + + for StubField in FComplexItems do + Lines.AddFormat(' %s.Free;', [StubField.FieldName]); + + for StubField in FArrayItems do + Lines.AddFormat(' Get%s.Free;', [StubField.Name]); + + Lines.Add(' inherited;'); + Lines.Add('end;'); + end; + + for StubField in FArrayItems do + begin + StubArrayField := StubField as TStubArrayField; + Lines.Add(''); + Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [Name, StubArrayField.Name, StubArrayField.TypeAsString]); + Lines.Add('begin'); + Lines.AddFormat(' if not Assigned(%s) then', [StubArrayField.FieldName]); + Lines.Add(' begin'); + Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubArrayField.FieldName, StubArrayField.TypeAsString]); + Lines.AddFormat(' %s.AddRange(%sArray);', [StubArrayField.FieldName, StubArrayField.FieldName]); + Lines.Add(' end;'); + Lines.AddFormat(' Result := %s;', [StubArrayField.FieldName]); + Lines.Add('end;'); + end; + + Lines.TrailingLineBreak := False; + Result := Lines.Text; + finally + Lines.Free; + end; +end; + +procedure TStubClass.SortFields; +var + StubFieldsNames: TStringList; + Item: TStubField; + i: Integer; +begin + // remove dublicates + + FItems.Sort(FComparer); + i := 0; + StubFieldsNames := TStringList.Create; + while i < Items.Count do + begin + Item := FItems[i]; + if (StubFieldsNames.IndexOf(Item.Name) >= 0) then + begin + if FComplexItems.Contains(Item) then + FComplexItems.Remove(Item); + + if FArrayItems.Contains(Item) then + FArrayItems.Remove(Item); + + FItems.Delete(i); + end + else + begin + StubFieldsNames.Add(Item.Name); + inc(i); + end; + end; + + StubFieldsNames.Free; + FItems.Sort(FComparer); +end; + +function TStubClass.GetDeclarationPart(const BaseClass: string): string; +var + Lines: TStringList; + StubField: TStubField; + StubArrayField: TStubArrayField; + i: Integer; +begin + Lines := TStringList.Create; + try + Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); + if FItems.Count > 0 then + Lines.Add('private'); + + for StubField in FItems do + begin + if StubField.IsObjectArrayField then + begin + StubArrayField := StubField as TStubArrayField; + Lines.Add(' ' + StubField.NameAttribute); + Lines.AddFormat(' %sArray: TArray<%s>;', [StubField.FieldName, StubField.TypeAsString]); + Lines.Add(' [GenericListReflect]'); + Lines.AddFormat(' %s: TObjectList<%s>;', [StubField.FieldName, StubArrayField.TypeAsString]); + end + else + begin + if StubField.NeedsAttribute then + Lines.Add(' ' + StubField.NameAttribute); + + Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.TypeAsString]); + end; + end; + + for StubField in FArrayItems do + begin + StubArrayField := StubField as TStubArrayField; + Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.Name, StubArrayField.TypeAsString]); + end; + + if FItems.Count > 0 then + Lines.Add('published'); + + for StubField in FItems do + begin + if (StubField.FieldType = jtUnknown) or ((StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = jtUnknown)) then + raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [StubField.PropertyName]); + + if StubField.IsObjectArrayField then + begin + StubArrayField := StubField as TStubArrayField; + Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); + end + else + Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName, StubField.FieldName]); + + end; + + if FComplexItems.Count > 0 then + begin + Lines.Add('public'); + Lines.Add(' constructor Create;' + IfThen(BaseClass = '', '', ' override;')); + end; + + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then + Lines.Add(' destructor Destroy; override;'); + + Lines.Add('end;'); + Lines.Add(''); + + for i := 0 to Lines.Count - 1 do + Lines[i] := ' ' + Lines[i]; + + Lines.TrailingLineBreak := False; + Result := Lines.Text; + finally + Lines.Free; + end; +end; + +{ TVirtualClassItemBase } + +constructor TStubField.Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); +begin + inherited Create(aItemName); + + FParentClass := aParentClass; + FFieldType := aFieldType; + SetName(DelphiName); + + if FParentClass <> nil then + FParentClass.Items.Add(Self); +end; + +class function TStubField.GetTypeAsString(AType: TJsonType): string; +begin + case AType of + jtUnknown: + Result := 'Unknown'; + jtString: + Result := 'string'; + jtTrue, jtFalse: + Result := 'Boolean'; + jtNumber: + Result := 'Double'; + jtDate: + Result := 'TDate'; + jtDateTime: + Result := 'TDateTime'; + jtBytes: + Result := 'Byte'; + jtInteger: + Result := 'Integer'; + jtInteger64: + Result := 'Int64'; + end; +end; + +procedure TStubField.SetName(const Value: string); +begin + if (FParentClass.ArrayProperty <> '') and (FParentClass.ArrayProperty = Name) then + FParentClass.ArrayProperty := Value; + + PureClassName := Value; + FName := Value; + FFieldName := 'F' + DelphiName; + + if ReservedWords.Contains(Value.ToLower) then + FPropertyName := '&' + Value + else + FPropertyName := Value; +end; + +function TStubField.GetTypeAsString: string; +begin + Result := GetTypeAsString(FFieldType); +end; + +function TStubField.IsObjectArrayField: Boolean; +begin + Result := (Self is TStubArrayField) and ((Self as TStubArrayField).ContainedType = jtObject); +end; + +{ TArrayItem } + +constructor TStubArrayField.Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); +begin + inherited Create(aClass, aItemName, jtArray); + ContainedType := aItemSubType; + FieldClass := aItemClass; + if ContainedType = TJsonType.jtObject then + aClass.ArrayItems.Add(Self); +end; + +function TStubArrayField.GetTypeAsString: string; +begin + case ContainedType of + jtObject: + Result := FieldClass.Name; + jtArray: + raise EJsonMapper.Create('Nested arrays are not supported!'); + else + Result := Format('TArray<%s>', [GetTypeAsString(ContainedType)]); + end; +end; + +{ TStubObjectField } + +constructor TStubObjectField.Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); +begin + inherited Create(aParentClass, aItemName, jtObject); + FieldClass := aItemClass; + aParentClass.ComplexItems.Add(Self); + ContainedType := jtObject; +end; + +function TStubObjectField.GetTypeAsString: string; +begin + Result := FieldClass.Name; +end; + +end. diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas index 4ad87cd..6efe92a 100644 --- a/Pkg.Json.Mapper.pas +++ b/Pkg.Json.Mapper.pas @@ -63,7 +63,7 @@ TStubField = class(TSOJName) property TypeAsString: string read GetTypeAsString; end; - TStubContainerField = class(TStubField) + TStubContainerField = class abstract(TStubField) strict private FFieldClass: TStubClass; FContainedType: TJsonType; @@ -405,7 +405,6 @@ class function TStubClass.Construct(aParentClass: TStubClass; aClassName: string exit(StubClass); Result := TStubClass.Create(aParentClass, aClassName, aMapper, aArrayProperty); - end; constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string); diff --git a/Pkg.Json.Visualizer.pas b/Pkg.Json.Visualizer.pas index 58cc441..9afa1f4 100644 --- a/Pkg.Json.Visualizer.pas +++ b/Pkg.Json.Visualizer.pas @@ -5,7 +5,7 @@ interface uses FMX.TreeView, - Pkg.Json.Mapper; + Pkg.Json.Mapper, Pkg.Json.StubField; Type JsonVisualizer = class diff --git a/ProjectGroup1.groupproj b/ProjectGroup1.groupproj deleted file mode 100644 index 79be8fa..0000000 --- a/ProjectGroup1.groupproj +++ /dev/null @@ -1,48 +0,0 @@ - - - {353C9ED7-1E10-4228-A4AE-D6F9671EEA80} - - - - - - - - - - - Default.Personality.12 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RootUnit.pas b/RootUnit.pas deleted file mode 100644 index e098755..0000000 --- a/RootUnit.pas +++ /dev/null @@ -1,174 +0,0 @@ -unit RootUnit; - -interface - -uses - Generics.Collections, Rest.Json; - -{$M+} - -type - - TProductsDTO = class - strict private - FActivationDate: String; - FCampaignPrice: Extended; - FDiscountCode: String; - FFrame: String; - FGlassType: String; - FInsurance: String; - FLeftGlass: String; - FOpusNr: String; - FReason: String; - FRightGlass: String; - FSalesPrice: Extended; - FState: String; - FSubscriptionPrice: Extended; - published - property ActivationDate: String read FActivationDate write FActivationDate; - property CampaignPrice: Extended read FCampaignPrice write FCampaignPrice; - property DiscountCode: String read FDiscountCode write FDiscountCode; - property Frame: String read FFrame write FFrame; - property GlassType: String read FGlassType write FGlassType; - property Insurance: String read FInsurance write FInsurance; - property LeftGlass: String read FLeftGlass write FLeftGlass; - property OpusNr: String read FOpusNr write FOpusNr; - property Reason: String read FReason write FReason; - property RightGlass: String read FRightGlass write FRightGlass; - property SalesPrice: Extended read FSalesPrice write FSalesPrice; - property State: String read FState write FState; - property SubscriptionPrice: Extended read FSubscriptionPrice write FSubscriptionPrice; - public - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TProductsDTO; - end; - - TSubscriptionsDTO = class - strict private - FCountryCode: String; - FCreatedDate: String; - FCustomerId: String; - FEarliestSubscriptionEndDate: String; - FPOSUserId: String; - FProducts: TArray; - FShopNumber: String; - FSubscriptionId: String; - FSubscriptionStartDate: String; - FSubscriptionState: String; - published - property CountryCode: String read FCountryCode write FCountryCode; - property CreatedDate: String read FCreatedDate write FCreatedDate; - property CustomerId: String read FCustomerId write FCustomerId; - property EarliestSubscriptionEndDate: String read FEarliestSubscriptionEndDate write FEarliestSubscriptionEndDate; - property POSUserId: String read FPOSUserId write FPOSUserId; - property Products: TArray read FProducts write FProducts; - property ShopNumber: String read FShopNumber write FShopNumber; - property SubscriptionId: String read FSubscriptionId write FSubscriptionId; - property SubscriptionStartDate: String read FSubscriptionStartDate write FSubscriptionStartDate; - property SubscriptionState: String read FSubscriptionState write FSubscriptionState; - public - destructor Destroy; override; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TSubscriptionsDTO; - end; - - TRootDTO = class - strict private - FCode: Extended; - FMessage: String; - FSubscriptions: TArray; - private - function GetAsJson: string; - procedure SetAsJson(const Value: string); - published - property Code: Extended read FCode write FCode; - property Message: String read FMessage write FMessage; - property Subscriptions: TArray read FSubscriptions write FSubscriptions; - public - destructor Destroy; override; - function ToJsonString: string; - class function FromJsonString(AJsonString: string): TRootDTO; - - property AsJson: string read GetAsJson write SetAsJson; - end; - -implementation - -uses - System.Json; -{ TProductsDTO } - -function TProductsDTO.ToJsonString: string; -begin - Result := TJson.ObjectToJsonString(Self); -end; - -class function TProductsDTO.FromJsonString(AJsonString: string): TProductsDTO; -begin - Result := TJson.JsonToObject(AJsonString) -end; - -{ TSubscriptionsDTO } - -destructor TSubscriptionsDTO.Destroy; -var - LProductsItem: TProductsDTO; -begin - - for LProductsItem in FProducts do - LProductsItem.Free; - - inherited; -end; - -function TSubscriptionsDTO.ToJsonString: string; -begin - Result := TJson.ObjectToJsonString(Self); -end; - -class function TSubscriptionsDTO.FromJsonString(AJsonString: string): TSubscriptionsDTO; -begin - Result := TJson.JsonToObject(AJsonString) -end; - -{ TRootDTO } - -destructor TRootDTO.Destroy; -var - LSubscriptionsItem: TSubscriptionsDTO; -begin - - for LSubscriptionsItem in FSubscriptions do - LSubscriptionsItem.Free; - - inherited; -end; - -function TRootDTO.ToJsonString: string; -begin - Result := TJson.ObjectToJsonString(Self); -end; - -class function TRootDTO.FromJsonString(AJsonString: string): TRootDTO; -begin - Result := TJson.JsonToObject(AJsonString) -end; - -function TRootDTO.GetAsJson: string; -begin - Result := TJson.ObjectToJsonString(Self); -end; - -procedure TRootDTO.SetAsJson(const Value: string); -var - LJSONValue: TJSONValue; -begin - LJSONValue := TJSONObject.ParseJSONValue(Value); - try - TJson.JsonToObject(Self, LJSONValue); - finally - LJSONValue.Free; - end; -end; - -end. diff --git a/uMainForm.pas b/uMainForm.pas index a19cdd5..2d72cc9 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -101,7 +101,7 @@ implementation uses System.IoUtils, - uSaveUnitForm, Pkg.Json.Visualizer, Pkg.Json.DTO, + uSaveUnitForm, Pkg.Json.Visualizer, Pkg.Json.DTO, Pkg.Json.StubField, {$IFDEF MSWINDOWS} Winapi.ShellAPI, Winapi.Windows; {$ENDIF MSWINDOWS} From 0e061ae7a10684b91a9e08cea9a6d4e5e3e59fc1 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Fri, 17 Jul 2020 22:37:45 +0200 Subject: [PATCH 034/129] Bugfix for missing constructor --- JsonToDelphiClass.dpr | 3 +- JsonToDelphiClass.dproj | 1 + Mapper/Pkg.Json.StubField.pas | 74 +++++++++++++++++------------------ Pkg.Json.Lists.pas | 53 +++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 39 deletions(-) create mode 100644 Pkg.Json.Lists.pas diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr index 8c30c80..40a21fd 100644 --- a/JsonToDelphiClass.dpr +++ b/JsonToDelphiClass.dpr @@ -16,7 +16,8 @@ uses Pkg.Json.DTO in 'Pkg.Json.DTO.pas', Pkg.Json.ReservedWords in 'Pkg.Json.ReservedWords.pas', Pkg.Json.JSONName in 'Mapper\Pkg.Json.JSONName.pas', - Pkg.Json.StubField in 'Mapper\Pkg.Json.StubField.pas'; + Pkg.Json.StubField in 'Mapper\Pkg.Json.StubField.pas', + Pkg.Json.Lists in 'Pkg.Json.Lists.pas'; {$R *.res} diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index 18d4b19..e0a0859 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -149,6 +149,7 @@ + Cfg_2 Base diff --git a/Mapper/Pkg.Json.StubField.pas b/Mapper/Pkg.Json.StubField.pas index 461746a..e99040e 100644 --- a/Mapper/Pkg.Json.StubField.pas +++ b/Mapper/Pkg.Json.StubField.pas @@ -4,18 +4,16 @@ interface uses System.SysUtils, System.Generics.Defaults, System.Generics.Collections, - Pkg.Json.JSONName; + Pkg.Json.JSONName, Pkg.Json.Lists; type EJsonMapper = class(Exception); TJsonType = (jtUnknown, jtObject, jtArray, jtString, jtTrue, jtFalse, jtNumber, jtDate, jtDateTime, jtBytes, jtInteger, jtInteger64); TStubClass = class; + TStubClassList = class; - TStubClassList = class(TObjectList) - end; - - TStubField = class(TJSONName) + TStubField = class(TJsonName) private FPropertyName: string; FFieldName: string; @@ -63,11 +61,17 @@ TStubArrayField = class(TStubContainerField) constructor Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); end; - TStubClass = class(TJSONName) + TStubFieldList = class(TJsonNameList) + end; + + TStubFieldObjectList = class(TJsonNameObjectList) + end; + + TStubClass = class(TJsonName) strict private - FArrayItems: TList; - FComplexItems: TList; - FItems: TObjectList; + FArrayItems: TStubFieldList; + FComplexItems: TStubFieldList; + FItems: TStubFieldObjectList; FComparison: TComparison; FComparer: IComparer; FParentClass: TStubClass; @@ -82,10 +86,13 @@ TStubClass = class(TJSONName) function GetImplementationPart: string; procedure SortFields; published - property Items: TObjectList read FItems write FItems; + property Items: TStubFieldObjectList read FItems write FItems; property ArrayProperty: string read FArrayProperty write FArrayProperty; - property ComplexItems: TList read FComplexItems; - property ArrayItems: TList read FArrayItems; + property ComplexItems: TStubFieldList read FComplexItems; + property ArrayItems: TStubFieldList read FArrayItems; + end; + + TStubClassList = class(TJsonNameList) end; implementation @@ -97,13 +104,13 @@ implementation class function TStubClass.Construct(aParentClass: TStubClass; aClassName: string; aStubClasses: TStubClassList; aArrayProperty: string): TStubClass; var - StubClass: TStubClass; + StubClass: TJsonName; begin - for StubClass in aStubClasses do - if SameText(StubClass.JSONName, aClassName) then - exit(StubClass); - - Result := TStubClass.Create(aParentClass, aClassName, aStubClasses, aArrayProperty); + StubClass := aStubClasses.ItemByName(aClassName); + if StubClass = nil then + Result := TStubClass.Create(aParentClass, aClassName, aStubClasses, aArrayProperty) + else + Result := StubClass as TStubClass; end; constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aStubClasses: TStubClassList; aArrayProperty: string); @@ -112,9 +119,9 @@ constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aStu FStubClasses := aStubClasses; SetName(DelphiName); - FItems := TObjectList.Create; - FComplexItems := TList.Create; - FArrayItems := TList.Create; + FItems := TStubFieldObjectList.Create; + FComplexItems := TStubFieldList.Create; + FArrayItems := TStubFieldList.Create; FStubClasses.Add(Self); FArrayProperty := aArrayProperty; @@ -149,23 +156,20 @@ function TStubClass.GetImplementationPart: string; Lines.Add(''); Lines.AddFormat('{ %s }', [Name]); Lines.Add(''); - end; - if (FComplexItems.Count > 0) then - begin Lines.AddFormat('constructor %s.Create;', [Name]); Lines.Add('begin'); Lines.Add(' inherited;'); + for StubField in FArrayItems do + Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubField.FieldName, StubField.TypeAsString]); + for StubField in FComplexItems do Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); Lines.Add('end;'); Lines.Add(''); - end; - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then - begin Lines.Add(Format('destructor %s.Destroy;', [Name])); Lines.Add('begin'); @@ -215,14 +219,11 @@ procedure TStubClass.SortFields; while i < Items.Count do begin Item := FItems[i]; + if (StubFieldsNames.IndexOf(Item.Name) >= 0) then begin - if FComplexItems.Contains(Item) then - FComplexItems.Remove(Item); - - if FArrayItems.Contains(Item) then - FArrayItems.Remove(Item); - + FComplexItems.Remove(Item); + FArrayItems.Remove(Item); FItems.Delete(i); end else @@ -289,17 +290,14 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' end else Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName, StubField.FieldName]); - end; - if FComplexItems.Count > 0 then + if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then begin Lines.Add('public'); Lines.Add(' constructor Create;' + IfThen(BaseClass = '', '', ' override;')); - end; - - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then Lines.Add(' destructor Destroy; override;'); + end; Lines.Add('end;'); Lines.Add(''); diff --git a/Pkg.Json.Lists.pas b/Pkg.Json.Lists.pas new file mode 100644 index 0000000..37b0431 --- /dev/null +++ b/Pkg.Json.Lists.pas @@ -0,0 +1,53 @@ +unit Pkg.Json.Lists; + +interface + +uses + System.SysUtils, System.Generics.Defaults, System.Generics.Collections, + Pkg.Json.JSONName; + +type + TJsonNameList = class abstract(TObjectList) + strict protected + constructor Create(AOwnsObjects: Boolean); reintroduce; overload; + public + constructor Create; reintroduce; overload; + function ItemByName(aJsonName: string): T; + end; + + TJsonNameObjectList = class abstract(TJsonNameList) + public + constructor Create; reintroduce; + end; + +implementation + +constructor TJsonNameList.Create; +begin + inherited Create(false); +end; + +constructor TJsonNameList.Create(AOwnsObjects: Boolean); +begin + inherited; +end; + +function TJsonNameList.ItemByName(aJsonName: string): T; +var + JSONName: TJsonName; +begin + for JSONName in Self do + if SameText(JSONName.JSONName, aJsonName) then + exit(JSONName as T); + + Result := nil; +end; + +{ TJsonNameObjectList } + +constructor TJsonNameObjectList.Create; +begin + inherited Create(True); +end; + +end. From 10da609918909c17a0390911518548ac3d2f0cb6 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sun, 19 Jul 2020 17:38:06 +0200 Subject: [PATCH 035/129] Merge Array EOD Merge of arrays are now considered done --- JSON_PAS.res | Bin 5156 -> 5552 bytes Mapper/Pkg.Json.Mapper.pas | 2 +- Mapper/Pkg.Json.StubField.pas | 70 +++---- Pkg.Json.DTO.pas | 383 +++++++++++++++++----------------- 4 files changed, 220 insertions(+), 235 deletions(-) diff --git a/JSON_PAS.res b/JSON_PAS.res index 9a766a0368fa1530bd73027baecf943522152aaa..a53de674d18cf7ac868c6dc6c2bb2dc31d3a2c92 100644 GIT binary patch literal 5552 zcmcH-%Wm67kY@uv_CA+D6si(V4nbih0aV!z6gZX;F+J393tC#)o6@APTskp=e0w@G z`{0sd6*oZz*j(<;&ilzIiXy%H+bVgVX+8!xn{Tx&i|W{b+Bd`j_}kRQ zicaCR(36T#9Ydv+EN(2oR+THUu9bkLgNU==v%D4#aA+Z!I+Awq3njFESRgLF$fSz1 zH_Q2jy_wRQcE^y-YrU=Yl8F+Nb~T3ctkTEuTUq8JE5cC5w1yPW`h~3ws z5K6AjWu>hbPc)kRy2d-!b7OM9?%|OAdB4;I;wZ_xZ7%N6Q8IGto@m3MtF_F7a6{Wn zNtMmkJFTS;N6UGYOv{|2k79|1`rO3c7a|ne!$oCc4Rd&KEp8<810aiA)PxqslU#Jd z@k_Y;P@bR_XVv?3Is)@@R;s&9&zAFFpC3KFLb^^+Z&gpKFN8f+Oeb}&i3-Cf^Xm^N zOIni7O~l1Zk#9ymT~K^ES}YmyKD#(My-5FB&i*(>t36{ibmQLhv+HiCX`cYTBNBJ;Ej9-9VG4Kvt+NWZEbT^sQhEdgRc_ zUdd#=j*T|wo9S();sFdshPxq>9(*3Sw6(#YHIzY@A(bF;4AJH4Lc=fc6xJoNN54R= zoL2)5TX*TOx|CO=4wECKOJ3mRYTfb_9otqh|5?;8R#fyM;#}mF0NJZuPK;i;Edfm` zWnQ~kb@+pFIi`$S+g0dWc5GZENlRnzR=7|d4k}?^M0CZW>WmiQ?H?-=eG%e4_HlA@ zrEP}_yYD62lr+|M-#{PUf2_xP$}PLv^5gPBGQ&Qo-&al8x~M@1lJFu3(I7%xbW)78 z#k_34Hg~Ql^xKDfU@?A215Oz(FLnw2o8R>46NCC0>-36s>M)vQx|`dBptri~E!{pp z8mFXc>pQ9(UzmGBu$zX1oY`FFdSPDadQ;5+w0bb1 zx3L~>zyraHS5U}2NCusZN06}x#~RITBgyG7Z)B0>x#bNS)XA9=g5__T1w!5w#s*iC zicdyYEo=dRM`jGyHeb^N_eK8y)eQS0ou0m3oKI4!(1Rz{@so<2)@FrsS@_1Cm2n|H z_IZg9TYLT(N7(gI=V(b_F^dq(3rB@B8!<*iOurL58Afm!B$uXH@p*RysgifG#ma^o zUKyk<+c|)a;mCy@X=C12;qD1s3R=3s+C$$hO3jl>;Ij@PKbx%4PBfe=2!fb({?p?* z`^GM7RIgn-;+YADM57ZEjkdm+7o_M7>@R;Sd>O0JtdCwR|D>wqO(E7zWDWy$0Gxi3 zW@x2=!#fR}Z?U-Wg||F|bmybgx28b8FWzEWxy^E$i-N`|$Vqeu=WC(Qq{!E%)|&Qq zz@-M8vVe!owt0pJ=aGb=&Op4;T2&bv9B zT);4EdO^1aP?^Nm@DxWdoUkjLu1=LIl{Ig?oMr`vm>Hw2#;h=*hRskz`5`S0lpSZ9 z2xyNs9osg%d;1#nj)?!<5)88JT=Y3Yt;Ck5a5u46(kz8(u3TJR*v50L(B} z&HfmegqzH9L{BMM&o}m(8P%0sn{4EG1;Eji0CyPVIn@(S_sC)g#P8f^~pzBVWL?**|&%1jAOzw`95}bik{4mC9G#}Px#ikt6J}V>U z|1^s6-2tC48NOm--(@xWj>BiktYYvWsgXa&*s9PC@@0~QGiXbs`0+e-IY}m!v9jT* z-EcR8lVtpME{YpWlHsgKtZ

0Y5cgNn$x{2sL$xdkOn#DR7eR$C;)d^d|9NH|!@V g)PQx?5vXRl&-F&s0*+vlVSXdwom=BGIf$Zv07u!kjsO4v delta 1389 zcmZuxO-vI(6sA!6Go`e&VlaRmw1gtsAR38XB$85N6+xuI#DiwpPGNQ3*4trF-=aHybjP)@06I&CuEDd`0eIh9fWEc~f?j5p6&xYe-3PbY_D*gCaYCt9 zHEnJ=8n0S3Z!yfHZ12&p*9>-@nOx<1)s$r6OWXMvA?r<|8w5`K`;%meE$b%k)y)-V z>711nSoeKRgZ(!t3yoAR=p#BgIDCd*o!wi@U%r-CUm0Z9G;<8U`8)yy)E1C|xX)4qzB= z)j^3I6%nOTkEGy1WHjbFD!Qo}MjhwiOC&`LG!p-eqz|6=1s`I8F# zisq6C)GO4iayp~hobnZB!nw|#edt%`9A0y{Jc*s1Dwi{Y9jYo1akn$;7pz4g;X`L{ z&}&tgjEqDVRl^ZbS;z5MI*L>A71nf)9dtR~+dXAjYJJ$v=`KpuAI8!`Z}|yD-p2CN z+m4+zmXJnyrR7rlBbD$=!k6Pia3_99oLM%aJCRvm#rxrF-09g)BzSs;=vi3pa&LVj z*2}J=qV^u0t;DVbT5cN2Ks-Azk~qHO{ir4`HhcA5q7Qrfd!jP#39s=r?9U6F>-j2P z$2BYxrJnR+m?+IHU1b`dR6O 0) or (FArrayItems.Count > 0) then - begin - Lines.Add(''); - Lines.AddFormat('{ %s }', [Name]); - Lines.Add(''); - - Lines.AddFormat('constructor %s.Create;', [Name]); - Lines.Add('begin'); - Lines.Add(' inherited;'); - - for StubField in FArrayItems do - Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubField.FieldName, StubField.TypeAsString]); + Lines.Add(''); + Lines.AddFormat('{ %s }', [Name]); + Lines.Add(''); - for StubField in FComplexItems do - Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); + Lines.AddFormat('constructor %s.Create;', [Name]); + Lines.Add('begin'); + Lines.Add(' inherited;'); - Lines.Add('end;'); - Lines.Add(''); + for StubField in FArrayItems do + Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubField.FieldName, StubField.TypeAsString]); - Lines.Add(Format('destructor %s.Destroy;', [Name])); - Lines.Add('begin'); + for StubField in FComplexItems do + Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); - for StubField in FComplexItems do - Lines.AddFormat(' %s.Free;', [StubField.FieldName]); + Lines.Add('end;'); + Lines.Add(''); - for StubField in FArrayItems do - Lines.AddFormat(' Get%s.Free;', [StubField.Name]); + Lines.Add(Format('destructor %s.Destroy;', [Name])); + Lines.Add('begin'); - Lines.Add(' inherited;'); - Lines.Add('end;'); - end; + for StubField in FComplexItems do + Lines.AddFormat(' %s.Free;', [StubField.FieldName]); for StubField in FArrayItems do - begin - StubArrayField := StubField as TStubArrayField; - Lines.Add(''); - Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [Name, StubArrayField.Name, StubArrayField.TypeAsString]); - Lines.Add('begin'); - Lines.AddFormat(' if not Assigned(%s) then', [StubArrayField.FieldName]); - Lines.Add(' begin'); - Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubArrayField.FieldName, StubArrayField.TypeAsString]); - Lines.AddFormat(' %s.AddRange(%sArray);', [StubArrayField.FieldName, StubArrayField.FieldName]); - Lines.Add(' end;'); - Lines.AddFormat(' Result := %s;', [StubArrayField.FieldName]); - Lines.Add('end;'); - end; + Lines.AddFormat(' %s.Free;', [StubField.FieldName]); + + Lines.Add(' inherited;'); + Lines.Add('end;'); Lines.TrailingLineBreak := False; Result := Lines.Text; @@ -269,12 +253,6 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' end; end; - for StubField in FArrayItems do - begin - StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.Name, StubArrayField.TypeAsString]); - end; - if FItems.Count > 0 then Lines.Add('published'); @@ -286,7 +264,7 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' if StubField.IsObjectArrayField then begin StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); + Lines.AddFormat(' property %s: TObjectList<%s> read F%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); end else Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName, StubField.FieldName]); diff --git a/Pkg.Json.DTO.pas b/Pkg.Json.DTO.pas index 95ffeea..fe95eeb 100644 --- a/Pkg.Json.DTO.pas +++ b/Pkg.Json.DTO.pas @@ -1,190 +1,197 @@ unit Pkg.Json.DTO; - -interface - -uses - System.Classes, System.Json, Rest.Json, Rest.JsonReflect; - -type - TJsonDTO = class - private - FOptions: TJsonOptions; - function GetAsJson: string; - procedure SetAsJson(aValue: string); - class procedure PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); - class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; - class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); - public - constructor Create; virtual; - class function PrettyPrintJSON(aJson: string): string; overload; - property AsJson: string read GetAsJson write SetAsJson; - end; - - GenericListReflectAttribute = class(JsonReflectAttribute) - public - constructor Create; - end; - -implementation - -uses - System.Sysutils, System.JSONConsts, System.Rtti, System.Generics.Collections; - -{ TJsonDTO } - -constructor TJsonDTO.Create; -begin - inherited; - FOptions := [joDateIsUTC, joDateFormatISO8601]; -end; - -function TJsonDTO.GetAsJson: string; -begin - Result := TJson.ObjectToJsonString(Self, FOptions); -end; - -const - INDENT_SIZE = 2; -class procedure TJsonDTO.PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer); -var - i: Integer; - Ident: Integer; -begin - Ident := Indent + INDENT_SIZE; - i := 0; - - if aJSONValue is TJSONObject then - begin - aOutputStrings.Add(StringOfChar(' ', Ident) + '{'); - for i := 0 to TJSONObject(aJSONValue).Count - 1 do - PrettyPrintPair(TJSONObject(aJSONValue).Pairs[i], aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident); - - aOutputStrings.Add(StringOfChar(' ', Ident) + '}'); - end - else if aJSONValue is TJSONArray then - PrettyPrintArray(TJSONArray(aJSONValue), aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident) - else - aOutputStrings.Add(StringOfChar(' ', Ident) + aJSONValue.ToString); -end; - -class procedure TJsonDTO.PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); -var - i: Integer; -begin - aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); - - for i := 0 to aJSONValue.Count - 1 do - begin - PrettyPrintJSON(aJSONValue.Items[i], aOutputStrings, Indent); - if i < aJSONValue.Count - 1 then - aOutputStrings[aOutputStrings.Count - 1] := aOutputStrings[aOutputStrings.Count - 1] + ','; - end; - - aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); -end; - -class function TJsonDTO.PrettyPrintJSON(aJson: string): string; -var - StringList: TStringlist; - JSONValue: TJsonValue; -begin - StringList := TStringlist.Create; - try - JSONValue := TJSONObject.ParseJSONValue(aJson); - try - if JSONValue <> nil then - PrettyPrintJSON(JSONValue, StringList); - finally - JSONValue.Free; - end; - - Result := StringList.Text; - finally - StringList.Free; - end; -end; - -class procedure TJsonDTO.PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); -const - TEMPLATE = '%s:%s'; -var - Line: string; - NewList: TStringlist; -begin - NewList := TStringlist.Create; - try - PrettyPrintJSON(aJSONValue.JSONValue, NewList, Indent); - Line := Format(TEMPLATE, [aJSONValue.JsonString.ToString, Trim(NewList.Text)]); - finally - NewList.Free; - end; - - Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; - if not Last then - Line := Line + ','; - aOutputStrings.Add(Line); -end; - -procedure TJsonDTO.SetAsJson(aValue: string); -var - JSONValue: TJsonValue; - JSONObject: TJSONObject; -begin - JSONValue := TJSONObject.ParseJSONValue(aValue); - try - if not Assigned(JSONValue) then - Exit; - - if (JSONValue is TJSONArray) then - begin - with TJSONUnMarshal.Create do - try - SetFieldArray(Self, 'Items', (JSONValue as TJSONArray)); - finally - Free; - end; - - Exit; - end; - - if (JSONValue is TJSONObject) then - JSONObject := JSONValue as TJSONObject - else - begin - aValue := aValue.Trim; - if (aValue = '') and not Assigned(JSONValue) or (aValue <> '') and Assigned(JSONValue) and JSONValue.Null then - Exit - else - raise EConversionError.Create(SCannotCreateObject); - end; - - TJson.JsonToObject(Self, JSONObject, FOptions); - finally - JSONValue.Free; - end; -end; - -type - TGenericListFieldInterceptor = class(TJSONInterceptor) - public - function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override; - end; - - { TListFieldInterceptor } - -function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; -var - ctx: TRttiContext; - List: TList; -begin - List := TList(ctx.GetType(Data.ClassInfo).GetField(Field).GetValue(Data).AsObject); - Result := TListOfObjects(List.List); - SetLength(Result, List.Count); -end; - -constructor GenericListReflectAttribute.Create; -begin - inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); -end; - + +interface + +uses + System.Classes, System.Json, Rest.Json, Rest.JsonReflect; + +type + TJsonDTO = class + private + FOptions: TJsonOptions; + function GetAsJson: string; + procedure SetAsJson(aValue: string); + class procedure PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; + class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); + public + constructor Create; virtual; + class function PrettyPrintJSON(aJson: string): string; overload; + property AsJson: string read GetAsJson write SetAsJson; + end; + + GenericListReflectAttribute = class(JsonReflectAttribute) + public + constructor Create; + end; + +implementation + +uses + System.Sysutils, System.JSONConsts, System.Rtti, System.Generics.Collections; + +{ TJsonDTO } + +constructor TJsonDTO.Create; +begin + inherited; + FOptions := [joDateIsUTC, joDateFormatISO8601]; +end; + +function TJsonDTO.GetAsJson: string; +begin + Result := TJson.ObjectToJsonString(Self, FOptions); +end; + +const + INDENT_SIZE = 2; + +class procedure TJsonDTO.PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer); +var + i: Integer; + Ident: Integer; +begin + Ident := Indent + INDENT_SIZE; + i := 0; + + if aJSONValue is TJSONObject then + begin + aOutputStrings.Add(StringOfChar(' ', Ident) + '{'); + for i := 0 to TJSONObject(aJSONValue).Count - 1 do + PrettyPrintPair(TJSONObject(aJSONValue).Pairs[i], aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident); + + aOutputStrings.Add(StringOfChar(' ', Ident) + '}'); + end + else if aJSONValue is TJSONArray then + PrettyPrintArray(TJSONArray(aJSONValue), aOutputStrings, i = TJSONObject(aJSONValue).Count - 1, Ident) + else + aOutputStrings.Add(StringOfChar(' ', Ident) + aJSONValue.ToString); +end; + +class procedure TJsonDTO.PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +var + i: Integer; +begin + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE) + '['); + + for i := 0 to aJSONValue.Count - 1 do + begin + PrettyPrintJSON(aJSONValue.Items[i], aOutputStrings, Indent); + if i < aJSONValue.Count - 1 then + aOutputStrings[aOutputStrings.Count - 1] := aOutputStrings[aOutputStrings.Count - 1] + ','; + end; + + aOutputStrings.Add(StringOfChar(' ', Indent + INDENT_SIZE - 2) + ']'); +end; + +class function TJsonDTO.PrettyPrintJSON(aJson: string): string; +var + StringList: TStringlist; + JSONValue: TJsonValue; +begin + StringList := TStringlist.Create; + try + JSONValue := TJSONObject.ParseJSONValue(aJson); + try + if JSONValue <> nil then + PrettyPrintJSON(JSONValue, StringList); + finally + JSONValue.Free; + end; + + Result := StringList.Text; + finally + StringList.Free; + end; +end; + +class procedure TJsonDTO.PrettyPrintPair(aJSONValue: TJSONPair; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); +const + TEMPLATE = '%s:%s'; +var + Line: string; + NewList: TStringlist; +begin + NewList := TStringlist.Create; + try + PrettyPrintJSON(aJSONValue.JSONValue, NewList, Indent); + Line := Format(TEMPLATE, [aJSONValue.JsonString.ToString, Trim(NewList.Text)]); + finally + NewList.Free; + end; + + Line := StringOfChar(' ', Indent + INDENT_SIZE) + Line; + if not Last then + Line := Line + ','; + aOutputStrings.Add(Line); +end; + +procedure TJsonDTO.SetAsJson(aValue: string); +var + JSONValue: TJsonValue; + JSONObject: TJSONObject; +begin + JSONValue := TJSONObject.ParseJSONValue(aValue); + try + if not Assigned(JSONValue) then + Exit; + + if (JSONValue is TJSONArray) then + begin + with TJSONUnMarshal.Create do + try + SetFieldArray(Self, 'Items', (JSONValue as TJSONArray)); + finally + Free; + end; + + Exit; + end; + + if (JSONValue is TJSONObject) then + JSONObject := JSONValue as TJSONObject + else + begin + aValue := aValue.Trim; + if (aValue = '') and not Assigned(JSONValue) or (aValue <> '') and Assigned(JSONValue) and JSONValue.Null then + Exit + else + raise EConversionError.Create(SCannotCreateObject); + end; + + TJson.JsonToObject(Self, JSONObject, FOptions); + finally + JSONValue.Free; + end; +end; + +type + TGenericListFieldInterceptor = class(TJSONInterceptor) + public + function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override; + end; + + { TListFieldInterceptor } + +function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; +var + ctx: TRttiContext; + List: TList; + ArrayValue: TValue; + i: Integer; +begin + ArrayValue := ctx.GetType(Data.ClassInfo).GetField(Field + 'Array').GetValue(Data); + if not ArrayValue.IsArray then + Exit(nil); + + List := TList(ctx.GetType(Data.ClassInfo).GetField(Field).GetValue(Data).AsObject); + for i := 0 to ArrayValue.GetArrayLength - 1 do + List.Add(ArrayValue.GetArrayElement(i).AsObject) +end; + +constructor GenericListReflectAttribute.Create; +begin + inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); +end; + end. From e8e792c745a17c08e3d0a26a408c7fe2eb17cc95 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Sun, 26 Jul 2020 14:31:55 +0200 Subject: [PATCH 036/129] Demo Generator first check in --- Demo Generator/DemoProject.rc | 1 + Demo Generator/DemoTemplate.zip | Bin 0 -> 60759 bytes Demo Generator/Pkg.Json.DemoGenerator.pas | 148 ++++++++++++++++++++++ DemoProject.res | Bin 0 -> 60860 bytes FMX.ConstrainedForm.pas | 4 - JSON_PAS.res | Bin 5552 -> 5804 bytes JsonToDelphiClass.dpr | 10 +- JsonToDelphiClass.dproj | 18 ++- Mapper/Pkg.Json.JSONName.pas | 7 +- Mapper/Pkg.Json.Mapper.pas | 44 ++++++- Mapper/Pkg.Json.StubField.pas | 4 +- Pkg.Json.DTO.pas | 56 +++++--- uMainForm.fmx | 43 +++++-- uMainForm.pas | 68 ++++++---- uSaveUnitForm.fmx | 4 +- uSaveUnitForm.pas | 3 +- 16 files changed, 328 insertions(+), 82 deletions(-) create mode 100644 Demo Generator/DemoProject.rc create mode 100644 Demo Generator/DemoTemplate.zip create mode 100644 Demo Generator/Pkg.Json.DemoGenerator.pas create mode 100644 DemoProject.res diff --git a/Demo Generator/DemoProject.rc b/Demo Generator/DemoProject.rc new file mode 100644 index 0000000..24ca419 --- /dev/null +++ b/Demo Generator/DemoProject.rc @@ -0,0 +1 @@ +DemoTemplate ZipFile "./DemoTemplate.zip" diff --git a/Demo Generator/DemoTemplate.zip b/Demo Generator/DemoTemplate.zip new file mode 100644 index 0000000000000000000000000000000000000000..67438e07313416c1bcb59f5e317afd93d0e48ebe GIT binary patch literal 60759 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 n38#AY5%#Zjl1Ej02s?EZg=4^nSbOx!pV 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 z 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 Byq5p~ delta 374 zcmY+A!AiqG5I`Fhgkb0;9+kmM6H9|$qY0$6luDr6-H#sMMSR@@+tEQG^L$DK4M~=a6tY(Ol^SNn-t7C6`j!Fe8tIp+#*c5X}$R chE7-_t$NIvzBZ5@>x^JTxTIC`t~3reSS_y7O^ diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr index 40a21fd..9787cb3 100644 --- a/JsonToDelphiClass.dpr +++ b/JsonToDelphiClass.dpr @@ -1,23 +1,25 @@ program JsonToDelphiClass; {$R 'JSON_PAS.res' 'JSON_PAS.rc'} +{$R 'DemoProject.res' 'Demo Generator\DemoProject.rc'} uses System.StartUpCopy, FMX.Forms, uMainForm in 'uMainForm.pas' {MainForm}, - Pkg.Json.Mapper in 'Mapper\Pkg.Json.Mapper.pas', uSaveUnitForm in 'uSaveUnitForm.pas' {SaveUnitForm}, + FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {TFormConstraints}, + uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, uGitHub in 'uGitHub.pas', - FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {/ IdSSLOpenSSLHeaders,}, uUpdate in 'uUpdate.pas', - uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, + Pkg.Json.Mapper in 'Mapper\Pkg.Json.Mapper.pas', Pkg.Json.Visualizer in 'Pkg.Json.Visualizer.pas', Pkg.Json.DTO in 'Pkg.Json.DTO.pas', Pkg.Json.ReservedWords in 'Pkg.Json.ReservedWords.pas', Pkg.Json.JSONName in 'Mapper\Pkg.Json.JSONName.pas', Pkg.Json.StubField in 'Mapper\Pkg.Json.StubField.pas', - Pkg.Json.Lists in 'Pkg.Json.Lists.pas'; + Pkg.Json.Lists in 'Pkg.Json.Lists.pas', + Pkg.Json.DemoGenerator in 'Demo Generator\Pkg.Json.DemoGenerator.pas'; {$R *.res} diff --git a/JsonToDelphiClass.dproj b/JsonToDelphiClass.dproj index e0a0859..6cf69c8 100644 --- a/JsonToDelphiClass.dproj +++ b/JsonToDelphiClass.dproj @@ -62,6 +62,8 @@ false false false + 1033 + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 1033 @@ -126,30 +128,34 @@

JSON_PAS.res + +
DemoProject.res
+
MainForm
fmx
-
SaveUnitForm
fmx
- -
/ IdSSLOpenSSLHeaders,
+
TFormConstraints
-
UpdateForm
fmx
+ + + + Cfg_2 Base @@ -171,8 +177,8 @@ JsonToDelphiClass.dpr - Microsoft Office 2000 Sample Automation Server Wrapper Components - Microsoft Office XP Sample Automation Server Wrapper Components + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components diff --git a/Mapper/Pkg.Json.JSONName.pas b/Mapper/Pkg.Json.JSONName.pas index bb432f2..288ed9a 100644 --- a/Mapper/Pkg.Json.JSONName.pas +++ b/Mapper/Pkg.Json.JSONName.pas @@ -1,6 +1,7 @@ unit Pkg.Json.JSONName; interface + {$M+} type @@ -42,6 +43,11 @@ function TJSONName.CapitalizeFirst(Value: string): string; if Value.Substring(1, 4) = 'name' then Value := Value[1] + 'Name' + Value.Substring(4); + if Value.EndsWith('Test', True) then + begin + i := Value.Length - 4; + Value := Value.Substring(0, i) + 'Test'; + end; List := TStringList.Create; try @@ -103,5 +109,4 @@ procedure TJSONName.SetName(const Value: string); FName := 'T' + FPureClassName + 'DTO'; end; - end. diff --git a/Mapper/Pkg.Json.Mapper.pas b/Mapper/Pkg.Json.Mapper.pas index 670286c..40936b9 100644 --- a/Mapper/Pkg.Json.Mapper.pas +++ b/Mapper/Pkg.Json.Mapper.pas @@ -16,7 +16,9 @@ TPkgJsonMapper = class FRootClass: TStubClass; FUnitName: string; FClassName: string; - strict protected + strict private + FJsonString: string; + protected function GetJsonType(aJsonValue: TJsonValue): TJsonType; function GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; procedure ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); @@ -29,17 +31,19 @@ TPkgJsonMapper = class function GenerateUnit: string; function SuggestClassName(aSuggestedClassName: string): string; procedure Debug(aLines: TStrings); + procedure SaveToFile(aFileName: string); published property DestinationClassName: string read FClassName write FClassName; property DestinationUnitName: string read FUnitName write FUnitName; property RootClass: TStubClass read FRootClass; property StubClasses: TStubClassList read FStubClasses; + property JsonString: string read FJsonString; end; implementation uses - System.RegularExpressions, System.StrUtils, System.Character, + System.RegularExpressions, System.StrUtils, System.Character, System.IOUtils, Pkg.Json.ReservedWords, uUpdate; const @@ -105,6 +109,7 @@ procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: function TPkgJsonMapper.GenerateUnit: string; var StringList: TStringList; + Tmp : string; i: Integer; begin StringList := TStringList.Create; @@ -118,12 +123,16 @@ function TPkgJsonMapper.GenerateUnit: string; StringList.Add('uses'); StringList.Add(' Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types;'); StringList.Add(''); - StringList.Add('{$M+} {$HINTS OFF}'); + StringList.Add('{$M+}'); StringList.Add(''); StringList.Add('type'); for i := FStubClasses.Count - 1 downto 1 do - StringList.AddIfNotEmpty(FStubClasses[i].GetDeclarationPart); + begin + Tmp := IfThen(FStubClasses[i].ArrayItems.Count > 0, 'TArrayMapper'); + StringList.AddIfNotEmpty(FStubClasses[i].GetDeclarationPart(Tmp)); + end; + StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO')); StringList.Add('implementation'); @@ -176,6 +185,31 @@ destructor TPkgJsonMapper.Destroy; inherited; end; +procedure TPkgJsonMapper.SaveToFile(aFileName: string); +var + ResourceStream: TResourceStream; + Buffer: TStringList; +begin + with TStringList.Create do + try + Text := GenerateUnit; + SaveToFile(aFileName); + finally + Free; + end; + + Buffer := TStringList.Create; + ResourceStream := TResourceStream.Create(HInstance, 'JsonDTO', 'PAS'); + try + ResourceStream.Position := 0; + Buffer.LoadFromStream(ResourceStream); + Buffer.SaveToFile(TPath.GetDirectoryName(aFileName) + TPath.DirectorySeparatorChar + 'Pkg.Json.DTO.pas'); + finally + ResourceStream.Free; + Buffer.Free; + end; +end; + function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; var StubClass: TStubClass; @@ -264,6 +298,7 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; begin Result := Self; FStubClasses.Clear; + FJsonString := aJsonString; JSONValue := TJSONObject.ParseJSONValue(aJsonString); if JSONValue <> nil then @@ -295,5 +330,4 @@ function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; raise EJsonMapper.Create('Unable to parse the JSON String!'); end; - end. diff --git a/Mapper/Pkg.Json.StubField.pas b/Mapper/Pkg.Json.StubField.pas index fc97154..20da62f 100644 --- a/Mapper/Pkg.Json.StubField.pas +++ b/Mapper/Pkg.Json.StubField.pas @@ -162,7 +162,7 @@ function TStubClass.GetImplementationPart: string; Lines.Add(' inherited;'); for StubField in FArrayItems do - Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubField.FieldName, StubField.TypeAsString]); + Lines.AddFormat(' %s := ObjectList<%s>(%s);', [StubField.FieldName, StubField.TypeAsString, StubField.FieldName + 'Array']); for StubField in FComplexItems do Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); @@ -241,7 +241,7 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' StubArrayField := StubField as TStubArrayField; Lines.Add(' ' + StubField.NameAttribute); Lines.AddFormat(' %sArray: TArray<%s>;', [StubField.FieldName, StubField.TypeAsString]); - Lines.Add(' [GenericListReflect]'); + Lines.Add(' [JSONMarshalled(False)]'); Lines.AddFormat(' %s: TObjectList<%s>;', [StubField.FieldName, StubArrayField.TypeAsString]); end else diff --git a/Pkg.Json.DTO.pas b/Pkg.Json.DTO.pas index fe95eeb..0f3bf03 100644 --- a/Pkg.Json.DTO.pas +++ b/Pkg.Json.DTO.pas @@ -1,12 +1,19 @@ unit Pkg.Json.DTO; - + interface uses - System.Classes, System.Json, Rest.Json, Rest.JsonReflect; + System.Classes, System.Json, Rest.Json, System.Generics.Collections, Rest.JsonReflect; type - TJsonDTO = class + TArrayMapper = class + protected + function ObjectList(aSource: TArray): TObjectList; + public + constructor Create; virtual; + end; + + TJsonDTO = class(TArrayMapper) private FOptions: TJsonOptions; function GetAsJson: string; @@ -15,7 +22,7 @@ TJsonDTO = class class procedure PrettyPrintJSON(aJSONValue: TJsonValue; aOutputStrings: TStrings; Indent: Integer = 0); overload; class procedure PrettyPrintArray(aJSONValue: TJSONArray; aOutputStrings: TStrings; Last: Boolean; Indent: Integer); public - constructor Create; virtual; + constructor Create; override; class function PrettyPrintJSON(aJson: string): string; overload; property AsJson: string read GetAsJson write SetAsJson; end; @@ -28,7 +35,7 @@ GenericListReflectAttribute = class(JsonReflectAttribute) implementation uses - System.Sysutils, System.JSONConsts, System.Rtti, System.Generics.Collections; + System.Sysutils, System.JSONConsts, System.Rtti; { TJsonDTO } @@ -175,23 +182,36 @@ TGenericListFieldInterceptor = class(TJSONInterceptor) function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; var - ctx: TRttiContext; - List: TList; - ArrayValue: TValue; - i: Integer; + ctx: TRttiContext; + List: TList; +begin + List := TList(ctx.GetType(Data.ClassInfo).GetField(Field).GetValue(Data).AsObject); + Result := TListOfObjects(List.List); + SetLength(Result, List.Count); +end; + +constructor GenericListReflectAttribute.Create; begin - ArrayValue := ctx.GetType(Data.ClassInfo).GetField(Field + 'Array').GetValue(Data); - if not ArrayValue.IsArray then - Exit(nil); + inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); +end; + +{ TArrayMapper } - List := TList(ctx.GetType(Data.ClassInfo).GetField(Field).GetValue(Data).AsObject); - for i := 0 to ArrayValue.GetArrayLength - 1 do - List.Add(ArrayValue.GetArrayElement(i).AsObject) +constructor TArrayMapper.Create; +begin + inherited; end; -constructor GenericListReflectAttribute.Create; +function TArrayMapper.ObjectList(aSource: TArray): TObjectList; +var + Element: T; begin - inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); + Result := TObjectList.Create; + for Element in aSource do + Result.Add(Element); end; -end. +end. + + + \ No newline at end of file diff --git a/uMainForm.fmx b/uMainForm.fmx index 80934c9..3c646f1 100644 --- a/uMainForm.fmx +++ b/uMainForm.fmx @@ -1544,7 +1544,6 @@ object MainForm: TMainForm '}') StyledSettings = [Size, Style, FontColor] TextSettings.Font.Family = 'Consolas' - OnChange = Memo1Change Align = Client Margins.Bottom = 6.000000000000000000 PopupMenu = MemoPopupMenu @@ -1606,9 +1605,9 @@ object MainForm: TMainForm object btnVisualize: TButton Align = Right Margins.Right = 9.000000000000000000 - Position.X = 843.000000000000000000 + Position.X = 875.000000000000000000 Position.Y = 6.000000000000000000 - Size.Width = 80.000000000000000000 + Size.Width = 67.000000000000000000 Size.Height = 41.000000000000000000 Size.PlatformDefault = False TabOrder = 0 @@ -1621,9 +1620,9 @@ object MainForm: TMainForm Enabled = True ImageIndex = -1 Margins.Right = 9.000000000000000000 - Position.X = 552.000000000000000000 + Position.X = 672.000000000000000000 Position.Y = 6.000000000000000000 - Size.Width = 169.000000000000000000 + Size.Width = 104.000000000000000000 Size.Height = 41.000000000000000000 Size.PlatformDefault = False TabOrder = 2 @@ -1631,9 +1630,9 @@ object MainForm: TMainForm object btnExit: TButton Align = Right ModalResult = 1 - Position.X = 932.000000000000000000 + Position.X = 951.000000000000000000 Position.Y = 6.000000000000000000 - Size.Width = 80.000000000000000000 + Size.Width = 61.000000000000000000 Size.Height = 41.000000000000000000 Size.PlatformDefault = False TabOrder = 3 @@ -1641,9 +1640,11 @@ object MainForm: TMainForm OnClick = btnExitClick end object Panel4: TPanel - Align = Client + Align = Left Margins.Right = 6.000000000000000000 - Size.Width = 540.000000000000000000 + Position.X = 6.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 491.000000000000000000 Size.Height = 41.000000000000000000 Size.PlatformDefault = False StyleLookup = 'Panel4Style1' @@ -1690,15 +1691,27 @@ object MainForm: TMainForm object btnGenerateUnit: TButton Align = Right Margins.Right = 9.000000000000000000 - Position.X = 730.000000000000000000 + Position.X = 785.000000000000000000 Position.Y = 6.000000000000000000 - Size.Width = 104.000000000000000000 + Size.Width = 81.000000000000000000 Size.Height = 41.000000000000000000 Size.PlatformDefault = False TabOrder = 1 Text = 'Preview Unit' OnClick = PreviewUnitClick end + object Button3: TButton + Action = actFMXDemo + Align = Right + Enabled = True + ImageIndex = -1 + Margins.Right = 9.000000000000000000 + Position.X = 528.000000000000000000 + Position.Y = 6.000000000000000000 + Size.Width = 135.000000000000000000 + Size.Height = 41.000000000000000000 + Size.PlatformDefault = False + end end object Panel1: TPanel Align = Left @@ -1768,7 +1781,6 @@ object MainForm: TMainForm Size.Height = 479.000000000000000000 Size.PlatformDefault = False OnChange = ListView1Change - OnItemClick = ListView1ItemClick end object ActionList1: TActionList OnUpdate = ActionList1Update @@ -1781,7 +1793,7 @@ object MainForm: TMainForm end object actValidateJSON: TAction Category = 'Memo Actions' - Text = 'Validate JSON string Online' + Text = 'Online validation' OnExecute = actValidateJSONExecute end object actRenameProperty: TAction @@ -1789,5 +1801,10 @@ object MainForm: TMainForm Text = 'Rename Property' OnExecute = actRenamePropertyExecute end + object actFMXDemo: TAction + Category = 'Demo Actions' + Text = 'Create Demo project' + OnExecute = ActDemoExecute + end end end diff --git a/uMainForm.pas b/uMainForm.pas index 2d72cc9..c6b8119 100644 --- a/uMainForm.pas +++ b/uMainForm.pas @@ -54,6 +54,8 @@ TMainForm = class(TConstrainedForm) actRenameProperty: TAction; Splitter2: TSplitter; ListView1: TListView; + actFMXDemo: TAction; + Button3: TButton; procedure btnVisualizeClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); @@ -68,13 +70,12 @@ TMainForm = class(TConstrainedForm) procedure Panel1Resize(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure actPrettyPrintJSONExecute(Sender: TObject); - procedure Memo1Change(Sender: TObject); procedure actValidateJSONExecute(Sender: TObject); procedure actRenamePropertyExecute(Sender: TObject); procedure ActionList1Update(Action: TBasicAction; var Handled: Boolean); procedure btnExitClick(Sender: TObject); - procedure ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); procedure ListView1Change(Sender: TObject); + procedure ActDemoExecute(Sender: TObject); private { Private declarations } FJsonMapper: TPkgJsonMapper; @@ -101,7 +102,7 @@ implementation uses System.IoUtils, - uSaveUnitForm, Pkg.Json.Visualizer, Pkg.Json.DTO, Pkg.Json.StubField, + uSaveUnitForm, Pkg.Json.Visualizer, Pkg.Json.DTO, Pkg.Json.StubField, Pkg.Json.DemoGenerator, {$IFDEF MSWINDOWS} Winapi.ShellAPI, Winapi.Windows; {$ENDIF MSWINDOWS} @@ -228,10 +229,45 @@ procedure TMainForm.actValidateJSONExecute(Sender: TObject); begin {$IFDEF MSWINDOWS} ShellExecute(0, 'OPEN', PChar(JsonValidatorUrl), '', '', SW_SHOWNORMAL); -{$ENDIF MSWINDOWS} +{$ENDIF} {$IFDEF POSIX} _system(PAnsiChar('open ' + AnsiString(JsonValidatorUrl))); -{$ENDIF POSIX} +{$ENDIF} +end; + +procedure TMainForm.ActDemoExecute(Sender: TObject); +var + Destination: string; +begin + if not SelectDirectory('Select a directory', Destination, Destination) then + exit; + + FJsonMapper.DestinationClassName := Edit1.Text; + FJsonMapper.DestinationUnitName := Edit2.Text; + FJsonMapper.Parse(Memo1.Lines.Text); + + with TDemoGenerator.Create(FJsonMapper) do + try + DestinationDirectory := Destination; + Execute; + finally + free; + end; + + TDialogService.MessageDialog('Demo project sucessfull genereted. Do you want to open the destination folder?', TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo], TMsgDlgBtn.mbYes, 0, + procedure(const AResult: TModalResult) + begin + if AResult <> mrYes then + exit; + +{$IFDEF MSWINDOWS} + ShellExecute(0, 'OPEN', PChar(Destination), '', '', SW_SHOWNORMAL); +{$ENDIF} +{$IFDEF POSIX} + _system(PAnsiChar('open ' + AnsiString(Destination))); +{$ENDIF} + end) + end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); @@ -390,29 +426,9 @@ procedure TMainForm.ListView1Change(Sender: TObject); LoadFromFile(DemoDataRoot + Item.Text); Memo1.Lines.Text := TJsonDTO.PrettyPrintJSON(Text); finally - Free; - end; - -end; - -procedure TMainForm.ListView1ItemClick(const Sender: TObject; const AItem: TListViewItem); -begin - exit; - TreeView.Clear; - - with TStringList.Create do - try - LoadFromFile(DemoDataRoot + AItem.Text); - Memo1.Lines.Text := TJsonDTO.PrettyPrintJSON(Text); - finally - Free; + free; end; -end; -procedure TMainForm.Memo1Change(Sender: TObject); -begin - exit; - actPrettyPrintJSON.Execute; end; procedure TMainForm.MenuItem5Click(Sender: TObject); diff --git a/uSaveUnitForm.fmx b/uSaveUnitForm.fmx index ccc1d97..b2c2aea 100644 --- a/uSaveUnitForm.fmx +++ b/uSaveUnitForm.fmx @@ -30,8 +30,8 @@ object SaveUnitForm: TSaveUnitForm Size.PlatformDefault = False StyleLookup = 'Memo1Style1' TabOrder = 1 - Viewport.Width = 917.000000000000000000 - Viewport.Height = 551.000000000000000000 + Viewport.Width = 913.000000000000000000 + Viewport.Height = 547.000000000000000000 end object Panel1: TPanel Align = Bottom diff --git a/uSaveUnitForm.pas b/uSaveUnitForm.pas index 9757a2f..b992e92 100644 --- a/uSaveUnitForm.pas +++ b/uSaveUnitForm.pas @@ -5,7 +5,8 @@ interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, - FMX.Layouts, FMX.Memo, FMX.Controls.Presentation, FMX.ScrollBox; + FMX.Layouts, FMX.Memo, FMX.Controls.Presentation, FMX.ScrollBox, + FMX.Memo.Types; type TSaveUnitForm = class(TForm) From 59a1e80e67c464d0c75035a60507f0cb34f88bcf Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 27 Jul 2020 08:33:52 +0200 Subject: [PATCH 037/129] Code restructored. Start on E2E test --- .../Pkg.Json.Visualizer.pas | 1 - uGitHub.pas => Components/uGitHub.pas | 0 uUpdate.pas => Components/uUpdate.pas | 0 Demo Data/Unicode Test.json | 20 + End To End Test/EndToEndTest.dpr | 17 + End To End Test/EndToEndTest.dproj | 166 ++++ End To End Test/EndToEndTest.res | Bin 0 -> 96 bytes .../DemoProject.res | Bin .../FMX.ConstrainedForm.pas | 0 JSON_PAS.res => Generator GUI/JSON_PAS.res | Bin Generator GUI/JsonToDelphiClass.dpr | 34 + .../JsonToDelphiClass.dproj | 28 +- .../JsonToDelphiClass.res | Bin .../JsonToDelphiClass_Icon.ico | Bin .../JsonToDelphiClass_Icon1.ico | Bin uMainForm.fmx => Generator GUI/uMainForm.fmx | 0 uMainForm.pas => Generator GUI/uMainForm.pas | 2 +- .../uSaveUnitForm.fmx | 0 .../uSaveUnitForm.pas | 0 .../uUpdateForm.fmx | 76 +- .../uUpdateForm.pas | 0 JsonToDelphi.groupproj | 48 ++ JsonToDelphiClass.dpr | 34 - JsonToDelphiClass.mes | 163 ---- JSON_PAS.rc => Lib/JSON_PAS.rc | 0 Pkg.Json.DTO.pas => Lib/Pkg.Json.DTO.pas | 0 {Mapper => Lib}/Pkg.Json.JSONName.pas | 0 Pkg.Json.Lists.pas => Lib/Pkg.Json.Lists.pas | 0 {Mapper => Lib}/Pkg.Json.Mapper.pas | 0 .../Pkg.Json.ReservedWords.pas | 0 {Mapper => Lib}/Pkg.Json.StubField.pas | 0 Pkg.Json.Mapper.pas | 793 ------------------ README.md | 6 +- RESTMapper.res | Bin 62704 -> 0 bytes 34 files changed, 344 insertions(+), 1044 deletions(-) rename Pkg.Json.Visualizer.pas => Components/Pkg.Json.Visualizer.pas (99%) rename uGitHub.pas => Components/uGitHub.pas (100%) rename uUpdate.pas => Components/uUpdate.pas (100%) create mode 100644 Demo Data/Unicode Test.json create mode 100644 End To End Test/EndToEndTest.dpr create mode 100644 End To End Test/EndToEndTest.dproj create mode 100644 End To End Test/EndToEndTest.res rename DemoProject.res => Generator GUI/DemoProject.res (100%) rename FMX.ConstrainedForm.pas => Generator GUI/FMX.ConstrainedForm.pas (100%) rename JSON_PAS.res => Generator GUI/JSON_PAS.res (100%) create mode 100644 Generator GUI/JsonToDelphiClass.dpr rename JsonToDelphiClass.dproj => Generator GUI/JsonToDelphiClass.dproj (96%) rename JsonToDelphiClass.res => Generator GUI/JsonToDelphiClass.res (100%) rename JsonToDelphiClass_Icon.ico => Generator GUI/JsonToDelphiClass_Icon.ico (100%) rename JsonToDelphiClass_Icon1.ico => Generator GUI/JsonToDelphiClass_Icon1.ico (100%) rename uMainForm.fmx => Generator GUI/uMainForm.fmx (100%) rename uMainForm.pas => Generator GUI/uMainForm.pas (96%) rename uSaveUnitForm.fmx => Generator GUI/uSaveUnitForm.fmx (100%) rename uSaveUnitForm.pas => Generator GUI/uSaveUnitForm.pas (100%) rename uUpdateForm.fmx => Generator GUI/uUpdateForm.fmx (62%) rename uUpdateForm.pas => Generator GUI/uUpdateForm.pas (100%) create mode 100644 JsonToDelphi.groupproj delete mode 100644 JsonToDelphiClass.dpr delete mode 100644 JsonToDelphiClass.mes rename JSON_PAS.rc => Lib/JSON_PAS.rc (100%) rename Pkg.Json.DTO.pas => Lib/Pkg.Json.DTO.pas (100%) rename {Mapper => Lib}/Pkg.Json.JSONName.pas (100%) rename Pkg.Json.Lists.pas => Lib/Pkg.Json.Lists.pas (100%) rename {Mapper => Lib}/Pkg.Json.Mapper.pas (100%) rename Pkg.Json.ReservedWords.pas => Lib/Pkg.Json.ReservedWords.pas (100%) rename {Mapper => Lib}/Pkg.Json.StubField.pas (100%) delete mode 100644 Pkg.Json.Mapper.pas delete mode 100644 RESTMapper.res diff --git a/Pkg.Json.Visualizer.pas b/Components/Pkg.Json.Visualizer.pas similarity index 99% rename from Pkg.Json.Visualizer.pas rename to Components/Pkg.Json.Visualizer.pas index 9afa1f4..d911aee 100644 --- a/Pkg.Json.Visualizer.pas +++ b/Components/Pkg.Json.Visualizer.pas @@ -38,7 +38,6 @@ class procedure JsonVisualizer.Visualize(aTreeView: TTreeView; AItemStyleLookup: finally JsonMapper.Free; end; - end; class procedure JsonVisualizer.FormatFields(aTreeView: TTreeView); diff --git a/uGitHub.pas b/Components/uGitHub.pas similarity index 100% rename from uGitHub.pas rename to Components/uGitHub.pas diff --git a/uUpdate.pas b/Components/uUpdate.pas similarity index 100% rename from uUpdate.pas rename to Components/uUpdate.pas diff --git a/Demo Data/Unicode Test.json b/Demo Data/Unicode Test.json new file mode 100644 index 0000000..870b5cc --- /dev/null +++ b/Demo Data/Unicode Test.json @@ -0,0 +1,20 @@ +{ + "Category":{ + "name":"Categoria Teste", + "description":"Categoria de Teste da Loja", + "slug":"categoria-teste", + "order":"2", + "title":"Categoria de Teste", + "small_description":"Categoria de Teste da Loja", + "has_acceptance_term":"1", + "acceptance_term":"Eu aceito os termos de uso ...", + "metatag":{ + "keywords":"categoria teste 123", + "description":"categoria teste da loja 123" + }, + "property":[ + "Característica Teste 1 123", + "Característica Teste 2 123" + ] + } +} \ No newline at end of file diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr new file mode 100644 index 0000000..d9d0012 --- /dev/null +++ b/End To End Test/EndToEndTest.dpr @@ -0,0 +1,17 @@ +program EndToEndTest; + +{$APPTYPE CONSOLE} + +{$R *.res} + +uses + System.SysUtils; + +begin + try + { TODO -oUser -cConsole Main : Insert code here } + except + on E: Exception do + Writeln(E.ClassName, ': ', E.Message); + end; +end. diff --git a/End To End Test/EndToEndTest.dproj b/End To End Test/EndToEndTest.dproj new file mode 100644 index 0000000..62054bd --- /dev/null +++ b/End To End Test/EndToEndTest.dproj @@ -0,0 +1,166 @@ + + + {B28DDA19-BBFB-4F36-B6BE-A7A994625A1E} + 19.0 + None + True + Debug + Win32 + 1 + Console + EndToEndTest.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + .\$(Platform)\$(Config) + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) + EndToEndTest + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + + + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png + $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png + $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png + $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(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 + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + true + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png + $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + EndToEndTest.dpr + + + + False + False + True + False + + + + 12 + + + + + diff --git a/End To End Test/EndToEndTest.res b/End To End Test/EndToEndTest.res new file mode 100644 index 0000000000000000000000000000000000000000..743599575b02e97248bade49ed2e3eabafe25a0a GIT binary patch literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& literal 0 HcmV?d00001 diff --git a/DemoProject.res b/Generator GUI/DemoProject.res similarity index 100% rename from DemoProject.res rename to Generator GUI/DemoProject.res diff --git a/FMX.ConstrainedForm.pas b/Generator GUI/FMX.ConstrainedForm.pas similarity index 100% rename from FMX.ConstrainedForm.pas rename to Generator GUI/FMX.ConstrainedForm.pas diff --git a/JSON_PAS.res b/Generator GUI/JSON_PAS.res similarity index 100% rename from JSON_PAS.res rename to Generator GUI/JSON_PAS.res diff --git a/Generator GUI/JsonToDelphiClass.dpr b/Generator GUI/JsonToDelphiClass.dpr new file mode 100644 index 0000000..4b25a8b --- /dev/null +++ b/Generator GUI/JsonToDelphiClass.dpr @@ -0,0 +1,34 @@ +program JsonToDelphiClass; + +{$R 'DemoProject.res' '..\Demo Generator\DemoProject.rc'} +{$R 'JSON_PAS.res' '..\Lib\JSON_PAS.rc'} + +uses + System.StartUpCopy, + FMX.Forms, + uMainForm in 'uMainForm.pas' {MainForm}, + uSaveUnitForm in 'uSaveUnitForm.pas' {SaveUnitForm}, + FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {TFormConstraints}, + uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, + uGitHub in '..\Components\uGitHub.pas', + uUpdate in '..\Components\uUpdate.pas', + Pkg.Json.Visualizer in '..\Components\Pkg.Json.Visualizer.pas', + Pkg.Json.DemoGenerator in '..\Demo Generator\Pkg.Json.DemoGenerator.pas', + Pkg.Json.Lists in '..\Lib\Pkg.Json.Lists.pas', + Pkg.Json.Mapper in '..\Lib\Pkg.Json.Mapper.pas', + Pkg.Json.ReservedWords in '..\Lib\Pkg.Json.ReservedWords.pas', + Pkg.Json.DTO in '..\Lib\Pkg.Json.DTO.pas', + Pkg.Json.StubField in '..\Lib\Pkg.Json.StubField.pas', + Pkg.Json.JSONName in '..\Lib\Pkg.Json.JSONName.pas'; + +{$R *.res} + +{$WEAKLINKRTTI OFF} + +begin + Application.Initialize; + Application.CreateForm(TMainForm, MainForm); + Application.CreateForm(TSaveUnitForm, SaveUnitForm); + Application.CreateForm(TUpdateForm, UpdateForm); + Application.Run; +end. diff --git a/JsonToDelphiClass.dproj b/Generator GUI/JsonToDelphiClass.dproj similarity index 96% rename from JsonToDelphiClass.dproj rename to Generator GUI/JsonToDelphiClass.dproj index 6cf69c8..d818f9c 100644 --- a/JsonToDelphiClass.dproj +++ b/Generator GUI/JsonToDelphiClass.dproj @@ -125,12 +125,12 @@ MainSource - -
JSON_PAS.res
-
- +
DemoProject.res
+ +
JSON_PAS.res
+
MainForm
fmx @@ -146,16 +146,16 @@
UpdateForm
fmx
- - - - - - - - - - + + + + + + + + + + Cfg_2 Base diff --git a/JsonToDelphiClass.res b/Generator GUI/JsonToDelphiClass.res similarity index 100% rename from JsonToDelphiClass.res rename to Generator GUI/JsonToDelphiClass.res diff --git a/JsonToDelphiClass_Icon.ico b/Generator GUI/JsonToDelphiClass_Icon.ico similarity index 100% rename from JsonToDelphiClass_Icon.ico rename to Generator GUI/JsonToDelphiClass_Icon.ico diff --git a/JsonToDelphiClass_Icon1.ico b/Generator GUI/JsonToDelphiClass_Icon1.ico similarity index 100% rename from JsonToDelphiClass_Icon1.ico rename to Generator GUI/JsonToDelphiClass_Icon1.ico diff --git a/uMainForm.fmx b/Generator GUI/uMainForm.fmx similarity index 100% rename from uMainForm.fmx rename to Generator GUI/uMainForm.fmx diff --git a/uMainForm.pas b/Generator GUI/uMainForm.pas similarity index 96% rename from uMainForm.pas rename to Generator GUI/uMainForm.pas index c6b8119..30d4be7 100644 --- a/uMainForm.pas +++ b/Generator GUI/uMainForm.pas @@ -111,7 +111,7 @@ implementation {$ENDIF POSIX} const - DemoDataRoot = '../../Demo Data/'; + DemoDataRoot = '../../../Demo Data/'; procedure TMainForm.btnExitClick(Sender: TObject); begin diff --git a/uSaveUnitForm.fmx b/Generator GUI/uSaveUnitForm.fmx similarity index 100% rename from uSaveUnitForm.fmx rename to Generator GUI/uSaveUnitForm.fmx diff --git a/uSaveUnitForm.pas b/Generator GUI/uSaveUnitForm.pas similarity index 100% rename from uSaveUnitForm.pas rename to Generator GUI/uSaveUnitForm.pas diff --git a/uUpdateForm.fmx b/Generator GUI/uUpdateForm.fmx similarity index 62% rename from uUpdateForm.fmx rename to Generator GUI/uUpdateForm.fmx index 4767c5a..c0dae4f 100644 --- a/uUpdateForm.fmx +++ b/Generator GUI/uUpdateForm.fmx @@ -143,51 +143,57 @@ object UpdateForm: TUpdateForm end object Memo1: TMemo Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] + DataDetectorTypes = [] + ReadOnly = True Align = Client Margins.Bottom = 4.000000000000000000 Size.Width = 654.000000000000000000 Size.Height = 101.000000000000000000 Size.PlatformDefault = False TabOrder = 1 - ReadOnly = True + Viewport.Width = 650.000000000000000000 + Viewport.Height = 97.000000000000000000 end end object StyleBook1: TStyleBook + Styles = < + item + ResourcesBin = { + 464D585F5354594C4520322E3501060C50616E656C315374796C653103E10006 + 0C4C6162656C345374796C6531038601060C4C6162656C315374796C65310371 + 0100545046300A5452656374616E676C6500095374796C654E616D65060C5061 + 6E656C315374796C65310A46696C6C2E436F6C6F720709784646463446344634 + 0748697454657374080A506F736974696F6E2E5805000000000000009A07400A + 506F736974696F6E2E590500000000000000A507400553696465730B000A5369 + 7A652E576964746805000000000000008908400B53697A652E48656967687405 + 00000000000000F003401453697A652E506C6174666F726D44656661756C7408 + 0C5374726F6B652E436F6C6F7207097846463937393739370756697369626C65 + 0800005450463007544C61796F757400095374796C654E616D65060C4C616265 + 6C345374796C653106437572736F72070B637248616E64506F696E7407486974 + 54657374090A506F736974696F6E2E5805000000000000009A07400A506F7369 + 74696F6E2E590500000000000000A807400A53697A652E576964746805000000 + 000000008908400B53697A652E48656967687405000000000000008803401453 + 697A652E506C6174666F726D44656661756C74080756697369626C6508085461 + 624F7264657202010005545465787400095374796C654E616D65060474657874 + 05416C69676E0706436C69656E74064C6F636B6564090A53697A652E57696474 + 6805000000000000008908400B53697A652E4865696768740500000000000000 + 8803401453697A652E506C6174666F726D44656661756C74081A546578745365 + 7474696E67732E466F6E742E5374796C654578740A0D00000004040000000000 + 000004000000165465787453657474696E67732E466F6E74436F6C6F72070763 + 6C61426C75650000005450463007544C61796F757400095374796C654E616D65 + 060C4C6162656C315374796C653106437572736F72070B637248616E64506F69 + 6E740748697454657374090A506F736974696F6E2E5805000000000000009407 + 400A506F736974696F6E2E590500000000000000A807400A53697A652E576964 + 746805000000000000C08E08400B53697A652E48656967687405000000000000 + 008803401453697A652E506C6174666F726D44656661756C7408085461624F72 + 64657202020005545465787400095374796C654E616D6506047465787405416C + 69676E0706436C69656E7406437572736F72070B637248616E64506F696E7406 + 4C6F636B6564090A53697A652E576964746805000000000000C08E08400B5369 + 7A652E48656967687405000000000000008803401453697A652E506C6174666F + 726D44656661756C74081A5465787453657474696E67732E466F6E742E537479 + 6C654578740A0D00000000070000000000000004000000000000} + end> Left = 496 Top = 24 - ResourcesBin = { - 464D585F5354594C4520322E3501060C50616E656C315374796C653103E10006 - 0C4C6162656C345374796C6531037F01060C4C6162656C315374796C65310365 - 0100545046300A5452656374616E676C6500095374796C654E616D65060C5061 - 6E656C315374796C65310A46696C6C2E436F6C6F720709784646463446344634 - 0748697454657374080A506F736974696F6E2E5805000000000000009A07400A - 506F736974696F6E2E590500000000000000A507400553696465730B000A5369 - 7A652E576964746805000000000000008908400B53697A652E48656967687405 - 00000000000000F003401453697A652E506C6174666F726D44656661756C7408 - 0C5374726F6B652E436F6C6F7207097846463937393739370756697369626C65 - 0800005450463007544C61796F757400095374796C654E616D65060C4C616265 - 6C345374796C653106437572736F72070B637248616E64506F696E7407486974 - 54657374090A506F736974696F6E2E5805000000000000009A07400A506F7369 - 74696F6E2E590500000000000000A807400A53697A652E576964746805000000 - 000000008908400B53697A652E48656967687405000000000000008803401453 - 697A652E506C6174666F726D44656661756C74080756697369626C6508085461 - 624F7264657202010005545465787400095374796C654E616D65060474657874 - 05416C69676E0706436C69656E74064C6F636B6564090A53697A652E57696474 - 6805000000000000008908400B53697A652E4865696768740500000000000000 - 8803401453697A652E506C6174666F726D44656661756C740817546578745365 - 7474696E67732E466F6E742E5374796C650B0B6673556E6465726C696E650016 - 5465787453657474696E67732E466F6E74436F6C6F720707636C61426C756500 - 00005450463007544C61796F757400095374796C654E616D65060C4C6162656C - 315374796C653106437572736F72070B637248616E64506F696E740748697454 - 657374090A506F736974696F6E2E5805000000000000009407400A506F736974 - 696F6E2E590500000000000000A807400A53697A652E57696474680500000000 - 0000C08E08400B53697A652E4865696768740500000000000000880340145369 - 7A652E506C6174666F726D44656661756C7408085461624F7264657202020005 - 545465787400095374796C654E616D6506047465787405416C69676E0706436C - 69656E7406437572736F72070B637248616E64506F696E74064C6F636B656409 - 0A53697A652E576964746805000000000000C08E08400B53697A652E48656967 - 687405000000000000008803401453697A652E506C6174666F726D4465666175 - 6C7408175465787453657474696E67732E466F6E742E5374796C650B06667342 - 6F6C6400000000} end end diff --git a/uUpdateForm.pas b/Generator GUI/uUpdateForm.pas similarity index 100% rename from uUpdateForm.pas rename to Generator GUI/uUpdateForm.pas diff --git a/JsonToDelphi.groupproj b/JsonToDelphi.groupproj new file mode 100644 index 0000000..5f74507 --- /dev/null +++ b/JsonToDelphi.groupproj @@ -0,0 +1,48 @@ + + + {560647DB-14E8-40D3-BA10-4E1D58DB5EE0} + + + + + + + + + + + Default.Personality.12 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/JsonToDelphiClass.dpr b/JsonToDelphiClass.dpr deleted file mode 100644 index 9787cb3..0000000 --- a/JsonToDelphiClass.dpr +++ /dev/null @@ -1,34 +0,0 @@ -program JsonToDelphiClass; - -{$R 'JSON_PAS.res' 'JSON_PAS.rc'} -{$R 'DemoProject.res' 'Demo Generator\DemoProject.rc'} - -uses - System.StartUpCopy, - FMX.Forms, - uMainForm in 'uMainForm.pas' {MainForm}, - uSaveUnitForm in 'uSaveUnitForm.pas' {SaveUnitForm}, - FMX.ConstrainedForm in 'FMX.ConstrainedForm.pas' {TFormConstraints}, - uUpdateForm in 'uUpdateForm.pas' {UpdateForm}, - uGitHub in 'uGitHub.pas', - uUpdate in 'uUpdate.pas', - Pkg.Json.Mapper in 'Mapper\Pkg.Json.Mapper.pas', - Pkg.Json.Visualizer in 'Pkg.Json.Visualizer.pas', - Pkg.Json.DTO in 'Pkg.Json.DTO.pas', - Pkg.Json.ReservedWords in 'Pkg.Json.ReservedWords.pas', - Pkg.Json.JSONName in 'Mapper\Pkg.Json.JSONName.pas', - Pkg.Json.StubField in 'Mapper\Pkg.Json.StubField.pas', - Pkg.Json.Lists in 'Pkg.Json.Lists.pas', - Pkg.Json.DemoGenerator in 'Demo Generator\Pkg.Json.DemoGenerator.pas'; - -{$R *.res} - -{$WEAKLINKRTTI OFF} - -begin - Application.Initialize; - Application.CreateForm(TMainForm, MainForm); - Application.CreateForm(TSaveUnitForm, SaveUnitForm); - Application.CreateForm(TUpdateForm, UpdateForm); - Application.Run; -end. diff --git a/JsonToDelphiClass.mes b/JsonToDelphiClass.mes deleted file mode 100644 index a518cb5..0000000 --- a/JsonToDelphiClass.mes +++ /dev/null @@ -1,163 +0,0 @@ -[GeneralSettings] -MesVersion=4 -HandleExceptions=1 -LinkInCode=1 -AppendMapFileToBinary=1 -NoOwnMadExceptSettings=0 -CheckFileCrc=1 -CheckForFrozenMainThread=0 -FreezeTimeout=60000 -ReportLeaks=0 -WindowsLogo=0 -CrashOnBuffer=0 -CrashOnUnderrun=0 -AutomaticallySaveBugReport=1 -AutoSaveBugReportIfNotSent=1 -AutomaticallyMailBugReport=0 -AutoMailProgressBox=0 -CopyBugReportToClipboard=0 -SuspendAllRunningThreads=0 -ShowPleaseWaitBox=1 -PleaseWaitIcon=plwait1 -AutomaticallyContinueApplication=0 -AutomaticallyRestartApplication=0 -AutomaticallyCloseApplication=0 -SendInBackground=1 -SendHelper=196608 -Send32Icon=send321 -UploadViaHttp=0 -HttpServer= -HttpSsl=0 -HttpPort=0 -HttpAccount= -HttpPassword= -UploadToFogBugz=0 -UploadToBugZilla=0 -UploadToMantis=0 -BugTrackerAccount= -BugTrackerPassword= -BugTrackerProject= -BugTrackerArea= -BugTrackerAssignTo= -MailAsSmtpServer=0 -MailAsSmtpClient=0 -SmtpServer= -SmtpSsl=0 -SmtpTls=0 -SmtpPort=0 -SmtpAccount= -SmtpPassword= -MailViaMapi=1 -MailViaMailto=1 -MailAddress=petar@pgeorgiev.com -BugReportFile=bugreport.txt -AttachBugReport=1 -AttachBugReportFile=1 -DeleteBugReportFile=1 -BugReportSendAs=bugreport.txt -BugReportZip= -ScreenShotDepth=8 -ScreenShotAppOnly=1 -ScreenShotSendAs=screenshot.png -ScreenShotZip= -AdditionalAttachments= -AppendBugReports=1 -BugReportFileSize=100000 -DontSaveDuplicateExceptions=1 -DontSaveDuplicateFreezings=1 -DuplicateExceptionDefinition=1 -DuplicateFreezeDefinition=2 -ShowExceptionBox=1 -OkBtnText=&OK -DetailsBtnText=&Details -PleaseWaitTitle=Information -PleaseWaitText=Please wait a moment... -BugTrackerTitle=%25appname%25, %25exceptMsg%25 -BugTrackerDescr=error details: %0d%0a%25errorDetails%25 -MailSubject=bug report -MailBody=please find the bug report attached -SendBoxTitle=Sending bug report... -PrepareAttachMsg=Preparing attachments... -MxLookupMsg=Searching for mail server... -ConnectMsg=Connecting to server... -SendMailMsg=Sending mail... -FieldsMsg=Setting fields... -SendAttachMsg=Sending attachments... -SendFinalizeMsg=Finalizing... -MailFailureMsg=Sorry, sending the bug report didn't work. -VersionVariable= -[ExceptionBox] -ShowButtonMailBugReport=1 -ShowButtonSaveBugReport=0 -ShowButtonPrintBugReport=0 -ShowButtonShowBugReport=1 -ShowButtonContinueApplication=1 -ShowButtonRestartApplication=1 -ShowButtonCloseApplication=1 -IconButtonSendBugReport=send1 -IconButtonSaveBugReport=save1 -IconButtonPrintBugReport=print1 -IconButtonShowBugReport=show1 -IconButtonContinueApplication=continue1 -IconButtonCantContinueApplication=cantContinue1 -IconButtonRestartApplication=restart1 -IconButtonCloseApplication=close1 -FocusedButton=0 -SendAssistant=SendAssistant -SaveAssistant=SaveAssistant -PrintAssistant=PrintAssistant -AutomaticallyShowBugReport=0 -NoOwnerDrawButtons=0 -BigExceptionIcon=big1 -TitleBar=%25appname%25 -ExceptionMessage=An error occurred in the application. -FrozenMessage=The application seems to be frozen. -BitFaultMsg=The file "%25modname%25" seems to be corrupt! -MailBugReportText=send bug report -SaveBugReportText=save bug report -PrintBugReportText=print bug report -ShowBugReportText=show bug report -ContinueApplicationText=continue application -RestartApplicationText=restart application -CloseApplicationText=close application -[BugReport] -ListThreads=1 -ListModules=1 -ListHardware=1 -ShowCpuRegisters=1 -ShowStackDump=1 -Disassembly=1 -HideUglyItems=0 -ShowRelativeAddrs=1 -ShowRelativeLines=1 -FormatDisassembly=0 -LimitDisassembly=5 -EnabledPlugins=modules|processes|hardware -[Filters] -Filter1ExceptionClasses=EDBEditError, EJsonMapper -Filter1DontCreateBugReport=1 -Filter1DontCreateScreenshot=1 -Filter1DontSuspendThreads=1 -Filter1DontCallHandlers=1 -Filter1ShowBox=3 -Filter1Assis= -Filter2ExceptionClasses= -Filter2DontCreateBugReport=0 -Filter2DontCreateScreenshot=0 -Filter2DontSuspendThreads=0 -Filter2DontCallHandlers=0 -Filter2ShowBox=0 -Filter2Assis= -GeneralDontCreateBugReport=0 -GeneralDontCreateScreenshot=0 -GeneralDontSuspendThreads=0 -GeneralDontCallHandlers=0 -GeneralShowBox=0 -GeneralAssis= -[Assistants] -Assistant1=SendAssistant|Send Assistant|ContactForm|DetailsForm|ScrShotForm -Assistant2=SaveAssistant|Save Assistant|ContactForm|DetailsForm -Assistant3=PrintAssistant|Print Assistant|ContactForm|DetailsForm -Forms1=TPF0%0eTMEContactForm%0bContactForm%07Message%0c%13%00%00%00Contact Information%08MinWidth%04%00%00%00%00%08OnAction%0c%1b%00%00%00madExcept.HandleContactForm%05Timer%04%00%00%00%00%00%09INVButton%0bContinueBtn%07Caption%0c%08%00%00%00Continue%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%07SkipBtn%07Caption%0c%04%00%00%00Skip%07Enabled%08%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%09CancelBtn%07Caption%0c%06%00%00%00Cancel%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%08INVLabel%06Label1%07Caption%0c%0a%00%00%00your name:%07Enabled%09%07Spacing%04%00%00%00%00%00%00%07INVEdit%08NameEdit%07Colored%09%07Enabled%09%05Lines%04%01%00%00%00%08Optional%09%0aOutputName%0c%0c%00%00%00contact name%0aOutputType%07%09nvoHeader%07Spacing%04%00%00%00%00%04Text%0c%00%00%00%00%05Valid%09%00%00%08INVLabel%06Label2%07Caption%0c%0b%00%00%00your email:%07Enabled%09%07Spacing%04%00%00%00%00%00%00%07INVEdit%09EmailEdit%07Colored%09%07Enabled%09%05Lines%04%01%00%00%00%08Optional%08%0aOutputName%0c%0d%00%00%00contact email%0aOutputType%07%09nvoHeader%07Spacing%04%00%00%00%00%04Text%0c%00%00%00%00%05Valid%09%00%00%0bINVCheckBox%08MemCheck%07Caption%0c%0b%00%00%00remember me%07Checked%08%07Enabled%09%0aOutputName%0c%00%00%00%00%07Spacing%04%00%00%00%00%00%00%00 -Forms2=TPF0%0eTMEDetailsForm%0bDetailsForm%07Message%0c%0d%00%00%00Error Details%08MinWidth%04%00%00%00%00%08OnAction%0c%00%00%00%00%05Timer%04%00%00%00%00%00%09INVButton%0bContinueBtn%07Caption%0c%08%00%00%00Continue%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%07SkipBtn%07Caption%0c%04%00%00%00Skip%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%09CancelBtn%07Caption%0c%06%00%00%00Cancel%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%08INVLabel%06Label1%07Caption%0c,%00%00%00what were you doing when the error occurred?%07Enabled%09%07Spacing%04%00%00%00%00%00%00%07INVEdit%0bDetailsMemo%07Colored%09%07Enabled%09%05Lines%04%09%00%00%00%08Optional%08%0aOutputName%0c%0d%00%00%00error details%0aOutputType%07%0dnvoOwnSection%07Spacing%04%00%00%00%00%04Text%0c%00%00%00%00%05Valid%09%00%00%00 -Forms3=TPF0%0eTMEScrShotForm%0bScrShotForm%0dActiveControl%07%0bContinueBtn%07Message%0c%18%00%00%00Screenshot Configuration%08MinWidth%04%00%00%00%00%08OnAction%0c%1e%00%00%00madExcept.HandleScreenshotForm%05Timer%04%fa%00%00%00%00%09INVButton%0bContinueBtn%07Caption%0c%08%00%00%00Continue%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%07SkipBtn%07Caption%0c%04%00%00%00Skip%07Enabled%08%0bNoOwnerDraw%08%07Visible%09%00%00%09INVButton%09CancelBtn%07Caption%0c%06%00%00%00Cancel%07Enabled%09%0bNoOwnerDraw%08%07Visible%09%00%00%0bINVCheckBox%0bAttachCheck%07Caption%0c%25%00%00%00attach a screenshot to the bug report%07Checked%09%07Enabled%09%0aOutputName%0c%00%00%00%00%07Spacing%04%00%00%00%00%00%00%08INVImage%0aScrShotImg%06Border%09%09Clickable%09%07Enabled%09%04File%0c%00%00%00%00%06Height%04%00%00%00%00%07Spacing%04%00%00%00%00%05Width%04%00%00%00%00%00%00%08INVLabel%06Label1%07Caption%0c%15%00%00%00(click to edit image)%07Enabled%09%07Spacing%04%00%00%00%00%00%00%00 diff --git a/JSON_PAS.rc b/Lib/JSON_PAS.rc similarity index 100% rename from JSON_PAS.rc rename to Lib/JSON_PAS.rc diff --git a/Pkg.Json.DTO.pas b/Lib/Pkg.Json.DTO.pas similarity index 100% rename from Pkg.Json.DTO.pas rename to Lib/Pkg.Json.DTO.pas diff --git a/Mapper/Pkg.Json.JSONName.pas b/Lib/Pkg.Json.JSONName.pas similarity index 100% rename from Mapper/Pkg.Json.JSONName.pas rename to Lib/Pkg.Json.JSONName.pas diff --git a/Pkg.Json.Lists.pas b/Lib/Pkg.Json.Lists.pas similarity index 100% rename from Pkg.Json.Lists.pas rename to Lib/Pkg.Json.Lists.pas diff --git a/Mapper/Pkg.Json.Mapper.pas b/Lib/Pkg.Json.Mapper.pas similarity index 100% rename from Mapper/Pkg.Json.Mapper.pas rename to Lib/Pkg.Json.Mapper.pas diff --git a/Pkg.Json.ReservedWords.pas b/Lib/Pkg.Json.ReservedWords.pas similarity index 100% rename from Pkg.Json.ReservedWords.pas rename to Lib/Pkg.Json.ReservedWords.pas diff --git a/Mapper/Pkg.Json.StubField.pas b/Lib/Pkg.Json.StubField.pas similarity index 100% rename from Mapper/Pkg.Json.StubField.pas rename to Lib/Pkg.Json.StubField.pas diff --git a/Pkg.Json.Mapper.pas b/Pkg.Json.Mapper.pas deleted file mode 100644 index 6efe92a..0000000 --- a/Pkg.Json.Mapper.pas +++ /dev/null @@ -1,793 +0,0 @@ -unit Pkg.Json.Mapper; - -interface - -uses - System.Json, Rest.Json, System.SysUtils, - System.Classes, Generics.Collections, Generics.Defaults; - -type -{$M+} - EJsonMapper = class(Exception); - - TJsonType = (jtUnknown, jtObject, jtArray, jtString, jtTrue, jtFalse, jtNumber, jtDate, jtDateTime, jtBytes, jtInteger, jtInteger64); - -type - TStubClass = class; - TPkgJsonMapper = class; - - TSOJName = class abstract - strict private - FJsonName: string; - FDelphiName: string; - FNeedsAttribute: Boolean; - FMapper: TPkgJsonMapper; - FName: string; - FPureClassName: string; - protected - procedure SetName(const Value: string); virtual; - function CapitalizeFirst(Value: string): string; - published - property JsonName: string read FJsonName; - property DelphiName: string read FDelphiName; - property NeedsAttribute: Boolean read FNeedsAttribute; - property PureClassName: string read FPureClassName write FPureClassName; - property Name: string read FName write SetName; - public - constructor Create(aMapper: TPkgJsonMapper; aItemName: string); reintroduce; - function NameAttribute: string; - end; - - TStubField = class(TSOJName) - private - FPropertyName: string; - FFieldName: string; - FFieldType: TJsonType; - FParentClass: TStubClass; - FJsonFieldName: string; - FName: string; - strict protected - procedure SetName(const Value: string); override; - class function GetTypeAsString(AType: TJsonType): string; overload; - function GetTypeAsString: string; overload; virtual; - public - function IsObjectArrayField: Boolean; - published - property Name: string read FName write SetName; - property FieldName: string read FFieldName; - property JsonFieldName: string read FJsonFieldName; - property PropertyName: string read FPropertyName; - property FieldType: TJsonType read FFieldType; - public - constructor Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); - property TypeAsString: string read GetTypeAsString; - end; - - TStubContainerField = class abstract(TStubField) - strict private - FFieldClass: TStubClass; - FContainedType: TJsonType; - published - property ContainedType: TJsonType read FContainedType write FContainedType; - property FieldClass: TStubClass read FFieldClass write FFieldClass; - end; - - TStubObjectField = class(TStubContainerField) - strict protected - function GetTypeAsString: string; override; - public - constructor Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); - end; - - TStubArrayField = class(TStubContainerField) - strict protected - function GetTypeAsString: string; override; - public - constructor Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); - end; - - TStubClass = class(TSOJName) - strict private - FArrayItems: TList; - FComplexItems: TList; - FItems: TObjectList; - FComparison: TComparison; - FComparer: IComparer; - FParentClass: TStubClass; - FMapper: TPkgJsonMapper; - FArrayProperty: string; - strict protected - constructor Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''); virtual; - public - class function Construct(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string = ''): TStubClass; - destructor Destroy; override; - function GetDeclarationPart(const BaseClass: string = ''): string; - function GetImplementationPart: string; - procedure SortFields; - published - property Items: TObjectList read FItems write FItems; - property ArrayProperty: string read FArrayProperty write FArrayProperty; - property ComplexItems: TList read FComplexItems; - property ArrayItems: TList read FArrayItems; - end; - - TPkgJsonMapper = class - strict private - FStubClasses: TObjectList; - FRootClass: TStubClass; - FUnitName: string; - FClassName: string; - strict protected - function GetJsonType(aJsonValue: TJsonValue): TJsonType; - function GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; - procedure ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); - public - constructor Create; - destructor Destroy; override; - // Parses a JSON string and creates internal stub class structure - function Parse(aJsonString: string): TPkgJsonMapper; - // Generates result unit - function GenerateUnit: string; - function SuggestClassName(aSuggestedClassName: string): string; - procedure Debug(aLines: TStrings); - published - property DestinationClassName: string read FClassName write FClassName; - property DestinationUnitName: string read FUnitName write FUnitName; - property RootClass: TStubClass read FRootClass; - property StubClasses: TObjectList read FStubClasses; - end; - -implementation - -uses - System.RegularExpressions, System.StrUtils, System.Character, - Pkg.Json.ReservedWords, uUpdate; - -const - INDENT_SIZE = 2; - -{ TPkgJsonMapper } - -procedure TPkgJsonMapper.ProcessJsonObject(aJsonValue: TJsonValue; aParentClass: TStubClass); -var - JSONObject: TJSONObject; - JsonPair: TJSONPair; - JSONValue: TJsonValue; - JsonType: TJsonType; - StubClass: TStubClass; - JsonArray: TJSONArray; -begin - if aJsonValue = nil then - exit; - - if not(aJsonValue is TJSONObject) then - begin - JsonType := GetJsonType(aJsonValue); - TStubField.Create(aParentClass, (aJsonValue as TJsonString).Value, JsonType); - exit; - end; - - JSONObject := aJsonValue as TJSONObject; - for JsonPair in JSONObject do - begin - JSONValue := JsonPair.JSONValue; - JsonType := GetJsonType(JSONValue); - - case JsonType of - jtUnknown: - { do nothing }; - jtObject: - begin - StubClass := TStubClass.Construct(aParentClass, JsonPair.JsonString.Value, Self); - TStubObjectField.Create(aParentClass, JsonPair.JsonString.Value, StubClass); - ProcessJsonObject(JSONValue, StubClass); - end; - - jtArray: - begin - JsonArray := TJSONArray(JSONValue); - JSONValue := GetFirstArrayItem(JsonArray); - JsonType := GetJsonType(JSONValue); - - StubClass := TStubClass.Construct(aParentClass, JsonPair.JsonString.Value, Self); - TStubArrayField.Create(aParentClass, JsonPair.JsonString.Value, JsonType, StubClass); - - for JSONValue in JsonArray do - ProcessJsonObject(JSONValue, StubClass); - end; - else - TStubField.Create(aParentClass, JsonPair.JsonString.Value, JsonType); - end; - end; - - aParentClass.SortFields; -end; - -function TPkgJsonMapper.GenerateUnit: string; -var - StringList: TStringList; - i: Integer; -begin - StringList := TStringList.Create; - try - StringList.TrailingLineBreak := False; - - StringList.Add('unit ' + FUnitName + ';'); - StringList.Add(''); - StringList.Add('interface'); - StringList.Add(''); - StringList.Add('uses'); - StringList.Add(' Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types;'); - StringList.Add(''); - StringList.Add('{$M+}'); - StringList.Add(''); - StringList.Add('type'); - - for i := FStubClasses.Count - 1 downto 1 do - StringList.AddIfNotEmpty(FStubClasses[i].GetDeclarationPart); - StringList.Add(FStubClasses.First.GetDeclarationPart('TJsonDTO')); - StringList.Add('implementation'); - - for i := FStubClasses.Count - 1 downto 0 do - StringList.AddIfNotEmpty(FStubClasses[i].GetImplementationPart); - - StringList.Add(''); - StringList.Add('end.'); - - Result := StringList.Text; - finally - StringList.Free; - end; -end; - -function TPkgJsonMapper.GetFirstArrayItem(aJSONArray: TJSONArray): TJsonValue; -begin - if (aJSONArray = nil) or (aJSONArray.Count = 0) then - exit(nil); - - Result := aJSONArray.Items[0]; -end; - -constructor TPkgJsonMapper.Create; -begin - inherited Create; - FStubClasses := TObjectList.Create; - FClassName := 'Root'; -end; - -procedure TPkgJsonMapper.Debug(aLines: TStrings); -var - StubClass: TStubClass; - StubField: TStubField; -begin - aLines.Clear; - - for StubClass in FStubClasses do - begin - aLines.Add('-------'); - aLines.Add(StubClass.Name); - for StubField in StubClass.Items do - aLines.AddFormat('%-15s | %s', [StubField.FieldName, StubField.TypeAsString]); - end; -end; - -destructor TPkgJsonMapper.Destroy; -begin - FreeAndNil(FStubClasses); - inherited; -end; - -function TPkgJsonMapper.SuggestClassName(aSuggestedClassName: string): string; -var - StubClass: TStubClass; - MaxValue, i: Integer; - s: string; -begin - Result := aSuggestedClassName; - MaxValue := 0; - - for StubClass in FStubClasses do - if StubClass.Name.StartsWith(aSuggestedClassName, True) then - begin - s := Copy(StubClass.Name, Length(aSuggestedClassName) + 2); - - if (s.Length = 3) then - begin - if TryStrToInt(s, i) then - begin - inc(i); - if i > MaxValue then - MaxValue := i; - end; - end - else - MaxValue := 1; - end; - - if MaxValue > 0 then - Result := Format('%s_%0.3d', [aSuggestedClassName, MaxValue]); -end; - -function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; -var - JsonString: TJsonString; - i: Integer; - j: Int64; - b: Boolean; -begin - if aJsonValue = nil then - exit(jtObject); - - if aJsonValue is TJSONObject then - Result := jtObject - else if aJsonValue is TJSONArray then - Result := jtArray - else if (aJsonValue is TJSONNumber) then - begin - if TryStrToInt(aJsonValue.Value, i) then - Result := jtInteger - else if TryStrToInt64(aJsonValue.Value, j) then - Result := jtInteger64 - else - Result := jtNumber - end - else if aJsonValue is TJSONTrue then - Result := jtTrue - else if aJsonValue is TJSONFalse then - Result := jtFalse - else if aJsonValue is TJsonString then - begin - JsonString := (aJsonValue as TJsonString); - if TRegEx.IsMatch(JsonString.Value, '^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*))(?:Z|(\+|-)([\d|:]*))?$') then - Result := jtDateTime - else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then - Result := jtDate - else if TryStrToBool(JsonString.Value, b) then - begin - if b then - Result := jtTrue - else - Result := jtFalse - end - else - Result := jtString - end - else - Result := jtUnknown; -end; - -function TPkgJsonMapper.Parse(aJsonString: string): TPkgJsonMapper; -var - JSONValue: TJsonValue; - JsonType: TJsonType; - StubClass: TStubClass; - JsonArray: TJSONArray; -begin - Result := Self; - FStubClasses.Clear; - - JSONValue := TJSONObject.ParseJSONValue(aJsonString); - if JSONValue <> nil then - begin - try - FRootClass := TStubClass.Construct(nil, FClassName, Self); - - case GetJsonType(JSONValue) of - jtObject: - ProcessJsonObject(JSONValue, FRootClass); - - jtArray: - begin - JsonArray := TJSONArray(JSONValue); - FRootClass.ArrayProperty := 'Items'; - StubClass := TStubClass.Construct(FRootClass, FRootClass.ArrayProperty, Self); - JsonType := GetJsonType(GetFirstArrayItem(JsonArray)); - TStubArrayField.Create(FRootClass, FRootClass.ArrayProperty, JsonType, StubClass); - - for JSONValue in JsonArray do - ProcessJsonObject(JSONValue, StubClass); - end; - end; - finally - JSONValue.Free; - end; - end - else - raise EJsonMapper.Create('Unable to parse the JSON String!'); -end; - -class function TStubClass.Construct(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string): TStubClass; -var - StubClass: TStubClass; -begin - for StubClass in aMapper.StubClasses do - if SameText(StubClass.JsonName, aClassName) then - exit(StubClass); - - Result := TStubClass.Create(aParentClass, aClassName, aMapper, aArrayProperty); -end; - -constructor TStubClass.Create(aParentClass: TStubClass; aClassName: string; aMapper: TPkgJsonMapper; aArrayProperty: string); -begin - inherited Create(aMapper, aClassName); - FMapper := aMapper; - SetName(DelphiName); - - FItems := TObjectList.Create; - FComplexItems := TList.Create; - FArrayItems := TList.Create; - FMapper.StubClasses.Add(Self); - FArrayProperty := aArrayProperty; - - FParentClass := aParentClass; - - FComparison := function(const Left, Right: TStubField): Integer - begin - Result := CompareStr(Left.Name, Right.Name); - end; - - FComparer := TComparer.Construct(FComparison); -end; - -destructor TStubClass.Destroy; -begin - FreeAndNil(FComplexItems); - FreeAndNil(FItems); - FreeAndNil(FArrayItems); - inherited; -end; - -function TStubClass.GetImplementationPart: string; -var - Lines: TStringList; - StubField: TStubField; - StubArrayField: TStubArrayField; -begin - Lines := TStringList.Create; - try - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then - begin - Lines.Add(''); - Lines.AddFormat('{ %s }', [Name]); - Lines.Add(''); - end; - - if (FComplexItems.Count > 0) then - begin - Lines.AddFormat('constructor %s.Create;', [Name]); - Lines.Add('begin'); - Lines.Add(' inherited;'); - - for StubField in FComplexItems do - Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); - - Lines.Add('end;'); - Lines.Add(''); - end; - - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then - begin - Lines.Add(Format('destructor %s.Destroy;', [Name])); - Lines.Add('begin'); - - for StubField in FComplexItems do - Lines.AddFormat(' %s.Free;', [StubField.FieldName]); - - for StubField in FArrayItems do - Lines.AddFormat(' Get%s.Free;', [StubField.Name]); - - Lines.Add(' inherited;'); - Lines.Add('end;'); - end; - - for StubField in FArrayItems do - begin - StubArrayField := StubField as TStubArrayField; - Lines.Add(''); - Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [Name, StubArrayField.Name, StubArrayField.TypeAsString]); - Lines.Add('begin'); - Lines.AddFormat(' if not Assigned(%s) then', [StubArrayField.FieldName]); - Lines.Add(' begin'); - Lines.AddFormat(' %s := TObjectList<%s>.Create;', [StubArrayField.FieldName, StubArrayField.TypeAsString]); - Lines.AddFormat(' %s.AddRange(%sArray);', [StubArrayField.FieldName, StubArrayField.FieldName]); - Lines.Add(' end;'); - Lines.AddFormat(' Result := %s;', [StubArrayField.FieldName]); - Lines.Add('end;'); - end; - - Lines.TrailingLineBreak := False; - Result := Lines.Text; - finally - Lines.Free; - end; -end; - -procedure TStubClass.SortFields; -var - StubFieldsNames: TStringList; - Item: TStubField; - i: Integer; -begin - // remove dublicates - - FItems.Sort(FComparer); - i := 0; - StubFieldsNames := TStringList.Create; - while i < Items.Count do - begin - Item := FItems[i]; - if (StubFieldsNames.IndexOf(Item.Name) >= 0) then - begin - if FComplexItems.Contains(Item) then - FComplexItems.Remove(Item); - - if FArrayItems.Contains(Item) then - FArrayItems.Remove(Item); - - FItems.Delete(i); - end - else - begin - StubFieldsNames.Add(Item.Name); - inc(i); - end; - end; - - StubFieldsNames.Free; - FItems.Sort(FComparer); -end; - -function TStubClass.GetDeclarationPart(const BaseClass: string): string; -var - Lines: TStringList; - StubField: TStubField; - StubArrayField: TStubArrayField; - i: Integer; -begin - Lines := TStringList.Create; - try - Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ')')); - if FItems.Count > 0 then - Lines.Add('private'); - - for StubField in FItems do - begin - if StubField.IsObjectArrayField then - begin - StubArrayField := StubField as TStubArrayField; - Lines.Add(' ' + StubField.NameAttribute); - Lines.AddFormat(' %sArray: TArray<%s>;', [StubField.FieldName, StubField.TypeAsString]); - Lines.Add(' [GenericListReflect]'); - Lines.AddFormat(' %s: TObjectList<%s>;', [StubField.FieldName, StubArrayField.TypeAsString]); - end - else - begin - if StubField.NeedsAttribute then - Lines.Add(' ' + StubField.NameAttribute); - - Lines.AddFormat(' %s: %s;', [StubField.FieldName, StubField.TypeAsString]); - end; - end; - - for StubField in FArrayItems do - begin - StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.Name, StubArrayField.TypeAsString]); - end; - - if FItems.Count > 0 then - Lines.Add('published'); - - for StubField in FItems do - begin - if (StubField.FieldType = jtUnknown) or ((StubField is TStubContainerField) and ((StubField as TStubContainerField).ContainedType = jtUnknown)) then - raise EJsonMapper.CreateFmt('The property [%s] has unknown type!', [StubField.PropertyName]); - - if StubField.IsObjectArrayField then - begin - StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); - end - else - Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName, StubField.FieldName]); - - end; - - if FComplexItems.Count > 0 then - begin - Lines.Add('public'); - Lines.Add(' constructor Create;' + IfThen(BaseClass = '', '', ' override;')); - end; - - if (FComplexItems.Count > 0) or (FArrayItems.Count > 0) then - Lines.Add(' destructor Destroy; override;'); - - Lines.Add('end;'); - Lines.Add(''); - - for i := 0 to Lines.Count - 1 do - Lines[i] := ' ' + Lines[i]; - - Lines.TrailingLineBreak := False; - Result := Lines.Text; - finally - Lines.Free; - end; -end; - -{ TVirtualClassItemBase } - -constructor TStubField.Create(aParentClass: TStubClass; aItemName: string; aFieldType: TJsonType); -begin - inherited Create(nil, aItemName); - - FParentClass := aParentClass; - FFieldType := aFieldType; - SetName(DelphiName); - - if FParentClass <> nil then - FParentClass.Items.Add(Self); -end; - -class function TStubField.GetTypeAsString(AType: TJsonType): string; -begin - case AType of - jtUnknown: - Result := 'Unknown'; - jtString: - Result := 'string'; - jtTrue, jtFalse: - Result := 'Boolean'; - jtNumber: - Result := 'Double'; - jtDate: - Result := 'TDate'; - jtDateTime: - Result := 'TDateTime'; - jtBytes: - Result := 'Byte'; - jtInteger: - Result := 'Integer'; - jtInteger64: - Result := 'Int64'; - end; -end; - -procedure TStubField.SetName(const Value: string); -begin - if (FParentClass.ArrayProperty <> '') and (FParentClass.ArrayProperty = Name) then - FParentClass.ArrayProperty := Value; - - PureClassName := Value; - FName := Value; - FFieldName := 'F' + DelphiName; - - if ReservedWords.Contains(Value.ToLower) then - FPropertyName := '&' + Value - else - FPropertyName := Value; -end; - -function TStubField.GetTypeAsString: string; -begin - Result := GetTypeAsString(FFieldType); -end; - -function TStubField.IsObjectArrayField: Boolean; -begin - Result := (Self is TStubArrayField) and ((Self as TStubArrayField).ContainedType = jtObject); -end; - -{ TArrayItem } - -constructor TStubArrayField.Create(aClass: TStubClass; aItemName: string; aItemSubType: TJsonType; aItemClass: TStubClass); -begin - inherited Create(aClass, aItemName, jtArray); - ContainedType := aItemSubType; - FieldClass := aItemClass; - if ContainedType = TJsonType.jtObject then - aClass.ArrayItems.Add(Self); -end; - -function TStubArrayField.GetTypeAsString: string; -begin - case ContainedType of - jtObject: - Result := FieldClass.Name; - jtArray: - raise EJsonMapper.Create('Nested arrays are not supported!'); - else - Result := Format('TArray<%s>', [GetTypeAsString(ContainedType)]); - end; -end; - -{ TStubObjectField } - -constructor TStubObjectField.Create(aParentClass: TStubClass; aItemName: string; aItemClass: TStubClass); -begin - inherited Create(aParentClass, aItemName, jtObject); - FieldClass := aItemClass; - aParentClass.ComplexItems.Add(Self); - ContainedType := jtObject; -end; - -function TStubObjectField.GetTypeAsString: string; -begin - Result := FieldClass.Name; -end; - -{ TSOJName } - -function TSOJName.CapitalizeFirst(Value: string): string; -var - List: TStringList; - s: string; - i: Integer; -begin - Value := Value.ToLower; - - if Value.Substring(1, 4) = 'name' then - Value := Value[1] + 'Name' + Value.Substring(4); - - List := TStringList.Create; - try - ExtractStrings(['_'], [], PChar(Value), List); - for i := 0 to List.Count - 1 do - begin - s := List[i]; - if s.StartsWith('&') then - s[2] := s.ToUpper[2] - else - s[1] := s.ToUpper[1]; - List[i] := s; - end; - - List.Delimiter := '_'; - Result := List.DelimitedText; - finally - List.Free; - end; -end; - -constructor TSOJName.Create(aMapper: TPkgJsonMapper; aItemName: string); -var - s: string; - ch: Char; -begin - inherited Create; - - if aItemName.IsEmpty then - raise Exception.Create('aItemName can not be empty'); - - FMapper := aMapper; - FNeedsAttribute := False; - FJsonName := aItemName; - - for ch in FJsonName do - if ch.IsLetterOrDigit then - s := s + ch - else - s := s + '_'; - - FNeedsAttribute := (s <> FJsonName) or (aItemName.StartsWith('_')); - - if s.StartsWith('_') then - s := s.Substring(1); - - FDelphiName := CapitalizeFirst(s); - if not FDelphiName[1].IsLetter then - FDelphiName := '_' + FDelphiName; -end; - -function TSOJName.NameAttribute: string; -begin - exit('[JSONName(' + AnsiQuotedStr(FJsonName, #39) + ')]'); -end; - -procedure TSOJName.SetName(const Value: string); -begin - FPureClassName := Value; - FName := 'T' + FPureClassName + 'DTO'; -end; - -end. diff --git a/README.md b/README.md index dee18c8..3c93b7a 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ Generates the following DTO: ``` Lots of changes in this version: -* Only floating poiunt numbers are mapped to Double +* Only floating point numbers are mapped to Double * Numbers are mapped to Integer or Int64 depending on their size * Generated code restructored, and simplified * Generated classes inheriteds from TJsonDTO @@ -52,9 +52,9 @@ Main features: - Visualizes the structure of the JSON objects in a treeview; - Generates complete delphi unit (declaration and implementation), based on the JSON string input; - Automatically prefixes reserved Delphi words with "&" (ampersand); -- * Blocks unit generation if the JSON string contains empty Array; +- ** Support for JSON string that contains empty Array; - Adds support code to automatically destroy complex sub types. So you don't have to manage subobject's lifetime manually; -- ** Uses TArray to represent lists; +- ** Uses TObjectList to represent lists; - Adds helper serialization/deserialization functions; - Serialization and deserialization results in the same JSON structure! - Automatically detects date/datetime parts and maps them to TDate/TDateTime (as long as dates are ISO8601 compliant); diff --git a/RESTMapper.res b/RESTMapper.res deleted file mode 100644 index 9b9af2e108f572ce0feecbace6ad8cd32655e9f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62704 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 Date: Mon, 27 Jul 2020 12:11:41 +0200 Subject: [PATCH 038/129] End 2 End Test --- Demo Generator/DemoTemplate.zip | Bin 60759 -> 54316 bytes Demo Generator/Pkg.Json.DemoGenerator.pas | 24 +- End To End Test/DelphiBuilderU.pas | 140 ++ End To End Test/DemoProject.res | Bin 0 -> 54416 bytes End To End Test/EndToEndTest.dpr | 82 +- End To End Test/EndToEndTest.dproj | 719 ++++++++++- End To End Test/JSON_PAS.res | Bin 0 -> 5804 bytes End To End Test/RegistryHelperU.pas | 113 ++ End To End Test/System.Console.pas | 1415 +++++++++++++++++++++ Generator GUI/DemoProject.res | Bin 60860 -> 60860 bytes Lib/Pkg.Json.JSONName.pas | 4 +- Lib/Pkg.Json.Mapper.pas | 15 +- 12 files changed, 2457 insertions(+), 55 deletions(-) create mode 100644 End To End Test/DelphiBuilderU.pas create mode 100644 End To End Test/DemoProject.res create mode 100644 End To End Test/JSON_PAS.res create mode 100644 End To End Test/RegistryHelperU.pas create mode 100644 End To End Test/System.Console.pas diff --git a/Demo Generator/DemoTemplate.zip b/Demo Generator/DemoTemplate.zip index 67438e07313416c1bcb59f5e317afd93d0e48ebe..34575451f0fb1307739d0d1fe6d66ab6410a882c 100644 GIT binary patch delta 10540 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 delta 17141 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⪙`hH5Y+WpAD{j%=KATm;zs zKGUU$wJ1v0Q}#yvF0Sf+JgV@q`H(g6u^Hh@Y$oX=I0H?IK%-?=I^oIVPZy;U{9q@V4#K|==pD1*vH$9e_vyaa~==^T9}9b`XRu= z>jfBtUqAFy!EaG#OaK{ZhA%4t^61LXZ>A2*ply~esW>4pXI;m z|K~CMU-c&<{8#$fe%G%h6!56OO``l~`LFu_d0_fi{idL7$A8g(_TTldjt4*L_Z&40 zc`W}`|Id@Hza4D-RX^AB|4Ki{@A`Q;e=bfcJ@wH4LI1xULVVKyxX@rgKE?0-|LaKN zucT>_=={|1R4!ZYO+S+V_d){zK<5_!T+wltqv$NWpqd|3alckmq;p91*wClaDiwpX z!SJb?I1~u%IKi)o;JWB>@?S}KfoggQqL0IBPA>bm)T0yhN8<0V!;zT)0PQwey8n&tnk)&G`3d>Wp|ib6=@5C=)|^WAa>91DAArFy*qua!>50PRtAV&VQtpKtqGp{Fe z8D|3$n6Qb9A0h?*CGd{{0ZrmxqYr8}==Jx2JWlhf?H}#?JE!++3sIX5e)j9BB>!{Z z|DIh~04VbZ{EyV%uLFf__n!)k|4hL?CIWv|_SbC6BV0cs^w;xWHv8Z5WskZ99{cs^ zp@`W3oj&`GFX-A~u}8k1%BKPQqa$&Cx*)!W5y36(<6ewn#g*%##(f+>!bgKR-_V-` zdlClx`TX-kaaqIU;E@g>dGxrs;a}zmnZCSU|4(w`&_>9?+ur=FRB7Y|X1jg#9}}q{ zeYvjl7vB7)*l}4Sh~SiNKdZAeMTr|7LC5$@x*tKV`Dro4-GZuY^#%#P#Go3E{i8Z? zVz5n6L;q-){U|y3ybnkKEsoFzHLiISo#-#YTT-jv7YqOZa{1zpM)80Uet+yCew~tH z2{eMoVS6g`>GAn~|2!<>)*gC-o(Kd${7KF|~O81u26PbEO5De$kA^h-s5ZJK`WnSO1jN6f$P zpnhv_*cH~J7HgN&pW6P?!txiP|K_*L?SmNL!*OxMW4NLw>(72p%Tozx5sm!M?*7w(|Fs?13voVUL?U9d-yWxv z_B!Q{2K@Q_YXko2{{C7I@nYQa7!f_Z|CitD`SV#(1`2c$2>>7g{lf%(pVBTpKK&nv C)&ybz diff --git a/Demo Generator/Pkg.Json.DemoGenerator.pas b/Demo Generator/Pkg.Json.DemoGenerator.pas index 76c3c10..e3b83ee 100644 --- a/Demo Generator/Pkg.Json.DemoGenerator.pas +++ b/Demo Generator/Pkg.Json.DemoGenerator.pas @@ -8,10 +8,13 @@ interface {$M+} type + TDestinationFrameWork = (dfBoth, dfVCL, dfFMX); + TDemoGenerator = class private FDestinationDirectory: string; FJsonMapper: TPkgJsonMapper; + FTDestinationFrameWork: TDestinationFrameWork; procedure Validate; procedure ExtractZipFile; procedure GenerateFrameWorkINC; @@ -20,6 +23,7 @@ TDemoGenerator = class procedure SetDestinationDirectory(const Value: string); published property DestinationDirectory: string read FDestinationDirectory write SetDestinationDirectory; + property DestinationFrameWork: TDestinationFrameWork read FTDestinationFrameWork write FTDestinationFrameWork; public constructor Create(aJsonMapper: TPkgJsonMapper); reintroduce; procedure Execute; @@ -37,6 +41,7 @@ constructor TDemoGenerator.Create(aJsonMapper: TPkgJsonMapper); inherited Create; FJsonMapper := aJsonMapper; FDestinationDirectory := ''; + FTDestinationFrameWork := TDestinationFrameWork.dfBoth; end; procedure TDemoGenerator.Execute; @@ -63,8 +68,23 @@ procedure TDemoGenerator.GenerateFrameWorkINC; begin with TStringList.Create do try - Add('{.$DEFINE FMX}'); - Add('{.$DEFINE VCL}'); + case FTDestinationFrameWork of + dfBoth: + begin + Add('{.$DEFINE FMX}'); + Add('{.$DEFINE VCL}'); + end; + dfVCL: + begin + Add('{.$DEFINE FMX}'); + Add('{$DEFINE VCL}'); + end; + dfFMX: + begin + Add('{$DEFINE FMX}'); + Add('{.$DEFINE VCL}'); + end; + end; Add(''); Add('{$IF not Defined(VCL) and not Defined(FMX)}'); Add(' Please define framework, above.'); diff --git a/End To End Test/DelphiBuilderU.pas b/End To End Test/DelphiBuilderU.pas new file mode 100644 index 0000000..7fdef54 --- /dev/null +++ b/End To End Test/DelphiBuilderU.pas @@ -0,0 +1,140 @@ +unit DelphiBuilderU; + +interface + +uses + Classes; + +Type + DelphiBuilder = class + protected + class function GetDelphiInstallPath: string; + class procedure CaptureConsoleOutput(const lpCommandLine: string; OutPutList: TStrings); + public + class procedure CompileProject(Console: TStrings; const ProjectFile: string); + end; + +implementation + +uses + System.SysUtils, WinApi.ShellAPI, WinApi.Windows, System.Win.Registry, RegistryHelperU; +{ TDelphiBuilder } + +class procedure DelphiBuilder.CaptureConsoleOutput(const lpCommandLine: string; OutPutList: TStrings); +const + ReadBuffer = 1024 * 1024; +var + lpPipeAttributes: TSecurityAttributes; + ReadPipe: THandle; + WritePipe: THandle; + lpStartupInfo: TStartUpInfo; + lpProcessInformation: TProcessInformation; + Buffer: PAnsiChar; + TotalBytesRead: DWORD; + BytesRead: DWORD; + Apprunning: integer; + n: integer; + BytesLeftThisMessage: integer; + TotalBytesAvail: integer; +begin + with lpPipeAttributes do + begin + nlength := SizeOf(TSecurityAttributes); + binherithandle := True; + lpsecuritydescriptor := nil; + end; + + if not CreatePipe(ReadPipe, WritePipe, @lpPipeAttributes, 0) then + exit; + + try + Buffer := AllocMem(ReadBuffer + 1); + try + ZeroMemory(@lpStartupInfo, SizeOf(lpStartupInfo)); + lpStartupInfo.cb := SizeOf(lpStartupInfo); + lpStartupInfo.hStdOutput := WritePipe; + lpStartupInfo.hStdInput := ReadPipe; + lpStartupInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW; + lpStartupInfo.wShowWindow := SW_HIDE; + + OutPutList.Add(lpCommandLine); + if CreateProcess(nil, PChar(lpCommandLine), @lpPipeAttributes, @lpPipeAttributes, True, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS, nil, nil, lpStartupInfo, lpProcessInformation) then + begin + try + n := 0; + TotalBytesRead := 0; + repeat + Inc(n); + Apprunning := WaitForSingleObject(lpProcessInformation.hProcess, 100); + + if not PeekNamedPipe(ReadPipe, @Buffer[TotalBytesRead], ReadBuffer, @BytesRead, @TotalBytesAvail, @BytesLeftThisMessage) then + break + else if BytesRead > 0 then + ReadFile(ReadPipe, Buffer[TotalBytesRead], BytesRead, BytesRead, nil); + + // Inc(TotalBytesRead, BytesRead); + + Buffer[BytesRead] := #0; + OemToAnsi(Buffer, Buffer); + OutPutList.Text := OutPutList.Text + string(Buffer); + + until (Apprunning <> WAIT_TIMEOUT) or (n > 150); + + { + Buffer[TotalBytesRead] := #0; + OemToAnsi(Buffer, Buffer); + OutPutList.Text := OutPutList.Text + String(Buffer); + } + finally + CloseHandle(lpProcessInformation.hProcess); + CloseHandle(lpProcessInformation.hThread); + end; + end; + finally + FreeMem(Buffer); + end; + finally + CloseHandle(ReadPipe); + CloseHandle(WritePipe); + end; +end; + +class procedure DelphiBuilder.CompileProject(Console: TStrings; const ProjectFile: string); +var + Path: string; +begin + Console.Add(''); + with TStringList.Create do + try + LoadFromFile(GetDelphiInstallPath + 'rsvars.bat'); + Path := ExtractFilePath(ProjectFile); + Add(Format('msbuild.exe "%s"', [ProjectFile])); + SaveToFile(Path + 'Build.bat'); + finally + Free; + end; + + CaptureConsoleOutput(Path + 'Build.bat', Console); + Console.Add(''); + DeleteFile(PChar(Path + 'Build.bat')); +end; + +class function DelphiBuilder.GetDelphiInstallPath: string; +var + RegKey: String; + Filename: string; + Found: boolean; +begin + RegKey := '\Software\Embarcadero\BDS\' + FloatToStr(CompilerVersion - 13) + '.0'; + Found := RegKeyExists(RegKey, HKEY_CURRENT_USER); + if Found then + Found := RegReadStr(RegKey, 'App', Filename, HKEY_CURRENT_USER) and FileExists(Filename); + + if not Found then + if RegKeyExists(RegKey, HKEY_LOCAL_MACHINE) then + RegReadStr(RegKey, 'App', Filename, HKEY_LOCAL_MACHINE); + + Result := ExtractFilePath(Filename); +end; + +end. diff --git a/End To End Test/DemoProject.res b/End To End Test/DemoProject.res new file mode 100644 index 0000000000000000000000000000000000000000..d972aeb710fa4c1aaded5a9b08aac21b386c6994 GIT binary patch literal 54416 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 C1<-r| literal 0 HcmV?d00001 diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr index d9d0012..e80dfb3 100644 --- a/End To End Test/EndToEndTest.dpr +++ b/End To End Test/EndToEndTest.dpr @@ -1,17 +1,93 @@ program EndToEndTest; {$APPTYPE CONSOLE} - {$R *.res} +{$R 'DemoProject.res' '..\Demo Generator\DemoProject.rc'} +{$R 'JSON_PAS.res' '..\Lib\JSON_PAS.rc'} uses - System.SysUtils; + Winapi.Windows, + Winapi.ShellAPI, + System.SysUtils, + System.IOUtils, + System.Classes, + System.Console in 'System.Console.pas', + Pkg.Json.Mapper, + Pkg.Json.DemoGenerator, + DelphiBuilderU in 'DelphiBuilderU.pas'; + +const + DemoDataRoot = '../../../Demo Data/'; + +var + FullFileName, FileName: TFileName; + s, OutputDirectory: String; + JsonMapper: TPkgJsonMapper; + OutputBuffer: TStringlist; + Sucess: boolean; begin + Console.ForegroundColor := TConsoleColor.White; + try - { TODO -oUser -cConsole Main : Insert code here } + s := FormatDateTime('yyyymmdd-hhnnns', now); + JsonMapper := TPkgJsonMapper.Create; + OutputBuffer := TStringlist.Create; + + for FullFileName in TDirectory.GetFiles(DemoDataRoot, '*.json') do + begin + OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; + TDirectory.CreateDirectory(OutputDirectory); + + FileName := TPath.GetFileName(FullFileName); + Console.Write('** Generating E2E test for %s ... ', [FileName]); + JsonMapper.DestinationClassName := ChangeFileExt(FileName, '').Replace(#32, ''); + JsonMapper.DestinationUnitName := JsonMapper.DestinationClassName; + JsonMapper.LoadFormFile(FullFileName); + + with TDemoGenerator.Create(JsonMapper) do + try + OutputDirectory := OutputDirectory + JsonMapper.DestinationClassName + TPath.DirectorySeparatorChar; + DestinationDirectory := OutputDirectory; + TDirectory.CreateDirectory(DestinationDirectory); + DestinationFrameWork := TDestinationFrameWork.dfVCL; + Execute; + finally + free; + end; + + OutputBuffer.Clear; + DelphiBuilder.CompileProject(OutputBuffer, OutputDirectory + 'VCL\Demo.dproj'); + + FileName := OutputDirectory + 'Win32\Release\Demo.exe'; + Sucess := TFile.Exists(FileName); + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Green; + Console.Write('Sucess!'); + end + else + begin + Console.ForegroundColor := TConsoleColor.Red; + Console.Write('Failed!'); + end; + + Console.ForegroundColor := TConsoleColor.White; + Console.WriteLine(' **'); + Console.WriteLine(''); + +// if Sucess then +// ShellExecute(0, 'OPEN', Pchar(FileName), '', Pchar(TPath.GetDirectoryName(FileName)), SW_SHOWNORMAL); + end; + + Console.ForegroundColor := TConsoleColor.White; + Console.WriteLine('Press anykey to continue ...'); + Console.ReadLine; + ShellExecute(0, 'OPEN', Pchar(OutputDirectory), '', '', SW_SHOWNORMAL); + OutputBuffer.free; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; + end. diff --git a/End To End Test/EndToEndTest.dproj b/End To End Test/EndToEndTest.dproj index 62054bd..e6267a3 100644 --- a/End To End Test/EndToEndTest.dproj +++ b/End To End Test/EndToEndTest.dproj @@ -2,7 +2,7 @@ {B28DDA19-BBFB-4F36-B6BE-A7A994625A1E} 19.0 - None + FMX True Debug Win32 @@ -13,16 +13,6 @@ true - - true - Base - true - - - true - Base - true - true Base @@ -59,38 +49,9 @@ false System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) EndToEndTest - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png - - - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png - $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png - $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png - $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png + ../Demo Generator/;../Lib/;$(DCC_UnitSearchPath) + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) @@ -118,6 +79,8 @@ false + 1033 + (None) false @@ -129,6 +92,14 @@ MainSource + +
DemoProject.res
+
+ +
JSON_PAS.res
+
+ + Cfg_2 Base @@ -149,14 +120,670 @@ EndToEndTest.dpr + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + - False - False True False - + + + + true + + + + + true + + + + + true + + + + + EndToEndTest.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + 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\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 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 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(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\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + 12 diff --git a/End To End Test/JSON_PAS.res b/End To End Test/JSON_PAS.res new file mode 100644 index 0000000000000000000000000000000000000000..8acb3aa22558e188627a9e762ee2bf80f229a217 GIT binary patch literal 5804 zcmcH-OK;mY*k=R2?)+T}%a|vmJq$yf2JrGI9Henjt2-Fu{(T#tRYe{jC-X^vFzD;tsB)by)u2D<*OjUUeSpPdWz>Cql%*B!jNO_L z$M8;7hH3cyH!4@9URLo@k!5OWbde*HhkK{iv^yaV=5d3Z0Fr50rjKva%|?~*8kWR~ z_BUl=5LT^d0kE!fCI|DI54e4=vZ=^U7XGqS#ynmkEpwUb zGD^=D^9zfa&^PT)Af4A{Q=0`dtx!n&HG%WAGW+m*QDiF3Cos!bD#wi(2F9%_pTU-x zbl9STEW$3n9Y$#8z0m}U2UTW8N=~2v*r6>)P=_x{!rQy}K1bhgMGQ$<>Xm9q>4P~jM5eOz=4mYHbI!M2u;-5T%=5~c{era^P3uRY@S6F zf89d~=-r7zE^(an{U%fQ7%3@5{g&c^HKaB=3#tb?=ZLbe*?MP;M)?Q*&rP;{p>>$0 zE)Qdyu7m!Ky4A=MK<9T@c(7Wq5nKks{%g4UP#j}w&Z_sx(HLZLT9o&xnJwnO{kr$^ z8d01s-f^Clx3+gyz!eKyof+c7@Uaw}q#(0ORz(Yyt;gU5q8xI(STmA+c5!@ik^Hro z{dt0pdBtYvM!T2iX+)theUg7iwvk8=X~{YN-3VC^KM!4LT4N~} z&R~j=OHdp}*qiFyz%TF;Rt1SiKY>}fb_No*aOtqR(%0jTkYnUaQQ-AzVR?>DY-^bR ztm+r5D#j2=uChvj-fCSge%`n(1*KfFtli2v`a!*%P-510r}>s2n-GbULj2uI7rGb( z-ELb(bk(5_j2_|bA8Q2LGQ>yh^Yr9y+D;V?-z)YhS*#ttfjxZu*ogI4>IR>Vcl*{-sEi2_uvC5#x&XFD)`{5cq5F8vruCt&RbSfS}Mjjk5^L#ZVJsst> z&eJTjvOz;SJ}s5I`Z#M7@uo30wBkg45?i&X1puCyka7f{(+mHv3$Jg|$;sQx^JzjI zdibK+e^F7;+NyA_bALJKV7O2pw?&ChTYLVTKzJIXF3{q@W0oMc7tRXjHWG}O$bBbr zI*j2eC@#%q#n;_2B&EKOELC>g=vs)jeCGfp#=RwRDQO9Vt%tFj7lx;i zAZ8sw{@+xMcA?=~K@cRYi=Spf@;zhMXl0%1t!u|PnPNyaI+1L&{Y4hY(L2~9e=B{N zs#w-%uhoBARr)qpt0pr?fjIz9K53bxDd7;Of%8`^ZhRq@7m#p1YI7$I@_qgm%gSAv z*;*7_jDng(IQSx<%&At{N_wqaZ-?A!@KP4YklJgW$lxN9D6~R|HUNA8$Ctk%T_Xh6S{oGlpq|fBo>KcA+S6QN08<#j^S-S z#5<}3#=`8Nw?PsWFKv8LXWbf3mJwm)F6h1i%2eak@C2tUoKGv9%TCI&D6M;=#Zj7L zipdydEoPMoEi6L~)rX`IC_BzH8PFbWI=*dW_x=^~j){K*3T9OfE_!mn_nZyA&A3^W zuX4e`lR4Elc#*Xd<&jW?17M1|D*F>)7H*!ShaxK0^R-2jmj^%7J6Qp6G$p_%0`i>d znI}7Ru><0FOXfSy(tJX(X=p|z4fRznxqLAp84s+khZCtu_LQqp>pVhAG0wONzQ(bc z(-nwD zG6W!FcZUAJoZXj-=H}#c)xQJSCq2~9x^)a?^SR4OW4bJjVVzWZv;Yu+pC2N OO@nTWY1Hozdj9~A6A9J; literal 0 HcmV?d00001 diff --git a/End To End Test/RegistryHelperU.pas b/End To End Test/RegistryHelperU.pas new file mode 100644 index 0000000..500a861 --- /dev/null +++ b/End To End Test/RegistryHelperU.pas @@ -0,0 +1,113 @@ +unit RegistryHelperU; + +interface + +uses + Winapi.Windows; + +function RegReadStr(const RegPath, RegValue: string; var StrValue: string; const RootKey: HKEY): boolean; +function RegReadInt(const RegPath, RegValue: string; var IntValue: integer; const RootKey: HKEY): boolean; +function RegWriteStr(const RegPath, RegValue: string; const StrValue: string; const RootKey: HKEY): boolean; +function RegWriteInt(const RegPath, RegValue: string; IntValue: integer; const RootKey: HKEY): boolean; +function RegKeyExists(const RegPath: string; const RootKey: HKEY): boolean; + +implementation + +uses + System.Win.Registry; + +function RegWriteStr(const RegPath, RegValue: string; const StrValue: string; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + Reg.WriteString(RegValue, StrValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegReadStr(const RegPath, RegValue: string; var StrValue: string; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + StrValue := Reg.ReadString(RegValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegWriteInt(const RegPath, RegValue: string; IntValue: integer; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + Reg.WriteInteger(RegValue, IntValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegReadInt(const RegPath, RegValue: string; var IntValue: integer; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.OpenKey(RegPath, True); + if Result then + IntValue := Reg.ReadInteger(RegValue); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +function RegKeyExists(const RegPath: string; const RootKey: HKEY): boolean; +var + Reg: TRegistry; +begin + try + Reg := TRegistry.Create; + try + Reg.RootKey := RootKey; + Result := Reg.KeyExists(RegPath); + finally + Reg.Free; + end; + except + Result := False; + end; +end; + +end. + diff --git a/End To End Test/System.Console.pas b/End To End Test/System.Console.pas new file mode 100644 index 0000000..345d862 --- /dev/null +++ b/End To End Test/System.Console.pas @@ -0,0 +1,1415 @@ +unit System.Console; + +interface + +uses + SysUtils, Classes, + {$IF CompilerVersion >= 22} + UITypes, Winapi.Windows, + {$ELSE} + Windows, + {$IFEND} + Types; + +{$M+} +{$IFDEF CONDITIONALEXPRESSIONS} +{$IF RTLVersion >= 14.0} +{$DEFINE HASERROUTPUT} +{$IFEND} +{$ENDIF} +{$WARN SYMBOL_PLATFORM OFF} +{$SCOPEDENUMS ON} + +const + Int16_MaxValue = 32767; +{$IF CompilerVersion <= 2500} //Delphi XE4 +const + { Virtual Keys, Standard Set } + vkLButton = $01; { 1 } + vkRButton = $02; { 2 } + vkCancel = $03; { 3 } + vkMButton = $04; { 4 } + vkXButton1 = $05; { 5 } + vkXButton2 = $06; { 6 } + vkBack = $08; { 8 } + vkTab = $09; { 9 } + vkLineFeed = $0A; { 10 } + vkClear = $0C; { 12 } + vkReturn = $0D; { 13 } + vkShift = $10; { 16 } + vkControl = $11; { 17 } + vkMenu = $12; { 18 } + vkPause = $13; { 19 } + vkCapital = $14; { 20 } + vkKana = $15; { 21 } + vkHangul = $15; { 21 } + vkJunja = $17; { 23 } + vkFinal = $18; { 24 } + vkHanja = $19; { 25 } + vkKanji = $19; { 25 } + vkConvert = $1C; { 28 } + vkNonConvert = $1D; { 29 } + vkAccept = $1E; { 30 } + vkModeChange = $1F; { 31 } + vkEscape = $1B; { 27 } + vkSpace = $20; { 32 } + vkPrior = $21; { 33 } + vkNext = $22; { 34 } + vkEnd = $23; { 35 } + vkHome = $24; { 36 } + vkLeft = $25; { 37 } + vkUp = $26; { 38 } + vkRight = $27; { 39 } + vkDown = $28; { 40 } + vkSelect = $29; { 41 } + vkPrint = $2A; { 42 } + vkExecute = $2B; { 43 } + vkSnapshot = $2C; { 44 } + vkInsert = $2D; { 45 } + vkDelete = $2E; { 46 } + vkHelp = $2F; { 47 } + { vk0 thru vk9 are the same as ASCII '0' thru '9' ($30 - $39) } + vk0 = $30; { 48 } + vk1 = $31; { 49 } + vk2 = $32; { 50 } + vk3 = $33; { 51 } + vk4 = $34; { 52 } + vk5 = $35; { 53 } + vk6 = $36; { 54 } + vk7 = $37; { 55 } + vk8 = $38; { 56 } + vk9 = $39; { 57 } + { vkA thru vkZ are the same as ASCII 'A' thru 'Z' ($41 - $5A) } + vkA = $41; { 65 } + vkB = $42; { 66 } + vkC = $43; { 67 } + vkD = $44; { 68 } + vkE = $45; { 69 } + vkF = $46; { 70 } + vkG = $47; { 71 } + vkH = $48; { 72 } + vkI = $49; { 73 } + vkJ = $4A; { 74 } + vkK = $4B; { 75 } + vkL = $4C; { 76 } + vkM = $4D; { 77 } + vkN = $4E; { 78 } + vkO = $4F; { 79 } + vkP = $50; { 80 } + vkQ = $51; { 81 } + vkR = $52; { 82 } + vkS = $53; { 83 } + vkT = $54; { 84 } + vkU = $55; { 85 } + vkV = $56; { 86 } + vkW = $57; { 87 } + vkX = $58; { 88 } + vkY = $59; { 89 } + vkZ = $5A; { 90 } + vkLWin = $5B; { 91 } + vkRWin = $5C; { 92 } + vkApps = $5D; { 93 } + vkSleep = $5F; { 95 } + vkNumpad0 = $60; { 96 } + vkNumpad1 = $61; { 97 } + vkNumpad2 = $62; { 98 } + vkNumpad3 = $63; { 99 } + vkNumpad4 = $64; { 100 } + vkNumpad5 = $65; { 101 } + vkNumpad6 = $66; { 102 } + vkNumpad7 = $67; { 103 } + vkNumpad8 = $68; { 104 } + vkNumpad9 = $69; { 105 } + vkMultiply = $6A; { 106 } + vkAdd = $6B; { 107 } + vkSeparator = $6C; { 108 } + vkSubtract = $6D; { 109 } + vkDecimal = $6E; { 110 } + vkDivide = $6F; { 111 } + vkF1 = $70; { 112 } + vkF2 = $71; { 113 } + vkF3 = $72; { 114 } + vkF4 = $73; { 115 } + vkF5 = $74; { 116 } + vkF6 = $75; { 117 } + vkF7 = $76; { 118 } + vkF8 = $77; { 119 } + vkF9 = $78; { 120 } + vkF10 = $79; { 121 } + vkF11 = $7A; { 122 } + vkF12 = $7B; { 123 } + vkF13 = $7C; { 124 } + vkF14 = $7D; { 125 } + vkF15 = $7E; { 126 } + vkF16 = $7F; { 127 } + vkF17 = $80; { 128 } + vkF18 = $81; { 129 } + vkF19 = $82; { 130 } + vkF20 = $83; { 131 } + vkF21 = $84; { 132 } + vkF22 = $85; { 133 } + vkF23 = $86; { 134 } + vkF24 = $87; { 135 } + + vkCamera = $88; { 136 } + vkHardwareBack = $89; { 137 } + + vkNumLock = $90; { 144 } + vkScroll = $91; { 145 } + vkLShift = $A0; { 160 } + vkRShift = $A1; { 161 } + vkLControl = $A2; { 162 } + vkRControl = $A3; { 163 } + vkLMenu = $A4; { 164 } + vkRMenu = $A5; { 165 } + + vkBrowserBack = $A6; { 166 } + vkBrowserForward = $A7; { 167 } + vkBrowserRefresh = $A8; { 168 } + vkBrowserStop = $A9; { 169 } + vkBrowserSearch = $AA; { 170 } + vkBrowserFavorites = $AB; { 171 } + vkBrowserHome = $AC; { 172 } + vkVolumeMute = $AD; { 173 } + vkVolumeDown = $AE; { 174 } + vkVolumeUp = $AF; { 175 } + vkMediaNextTrack = $B0; { 176 } + vkMediaPrevTrack = $B1; { 177 } + vkMediaStop = $B2; { 178 } + vkMediaPlayPause = $B3; { 179 } + vkLaunchMail = $B4; { 180 } + vkLaunchMediaSelect= $B5; { 181 } + vkLaunchApp1 = $B6; { 182 } + vkLaunchApp2 = $B7; { 183 } + + vkSemicolon = $BA; { 186 } + vkEqual = $BB; { 187 } + vkComma = $BC; { 188 } + vkMinus = $BD; { 189 } + vkPeriod = $BE; { 190 } + vkSlash = $BF; { 191 } + vkTilde = $C0; { 192 } + vkLeftBracket = $DB; { 219 } + vkBackslash = $DC; { 220 } + vkRightBracket = $DD; { 221 } + vkQuote = $DE; { 222 } + vkPara = $DF; { 223 } + + vkOem102 = $E2; { 226 } + vkIcoHelp = $E3; { 227 } + vkIco00 = $E4; { 228 } + vkProcessKey = $E5; { 229 } + vkIcoClear = $E6; { 230 } + vkPacket = $E7; { 231 } + vkAttn = $F6; { 246 } + vkCrsel = $F7; { 247 } + vkExsel = $F8; { 248 } + vkErEof = $F9; { 249 } + vkPlay = $FA; { 250 } + vkZoom = $FB; { 251 } + vkNoname = $FC; { 252 } + vkPA1 = $FD; { 253 } + vkOemClear = $FE; { 254 } + vkNone = $FF; { 255 } + {$IFEND} + + +type + ECOnsoleError = class(Exception); + TConsoleColor = ( + Black, + DarkBlue, + DarkGreen, + DarkCyan, + DarkRed, + DarkMagenta, + DarkYellow, + Gray, + DarkGray, + Blue, + Green, + Cyan, + Red, + Magenta, + Yellow, + White + ); + + TConsoleKey = ( + Backspace = vkBack, Tab = vkTab, Clear = vkClear, Enter = vkReturn, Pause = vkPause, Escape = vkEscape, Spacebar = vkSpace, + PageUp = vkPrior, PageDown = vkNext, &End = vkEnd, Home = vkHome, LeftArrow = vkLeft, UpArrow = vkUp, RightArrow = vkRight, + DownArrow = vkDown, Select = vkSelect, Print = vkPrint, Execute = vkExecute, PrintScreen = vkSnapshot, Insert = vkInsert, Delete = vkDelete, + Help = vkHelp, + + D0 = vk0, D1 = vk1, D2 = vk2, D3 = vk3, D4 = vk4, D5 = vk5, D6 = vk6, D7 = vk7, D8 = vk8, D9 = vk9, + A = vkA, B = vkB, C = vkC, D = vkD, E = vkE, F = vkF, G = vkG, H = vkH, I = vkI, J = vkJ, + K = vkK, L = vkL, M = vkM, N = vkN, O = vkO, P = vkP, Q = vkQ, R = vkR, S = vkS, T = vkT, + U = vkU, V = vkV, W = vkW, X = vkX, Y = vkY, Z = vkZ, + + LeftWindows = vkLWin, RightWindows = vkRWin, Applications = vkApps, Sleep = vkSleep, + Multiply = vkMultiply, Add = vkAdd, Separator = vkSeparator, Subtract = vkSubtract, Decimal = vkDecimal, Divide = vkDivide, + + NumPad0 = vkNumpad0, NumPad1 = vkNumpad1, NumPad2 = vkNumpad2, NumPad3 = vkNumpad3, NumPad4 = vkNumpad4, + NumPad5 = vkNumpad5, NumPad6 = vkNumpad6, NumPad7 = vkNumpad7, NumPad8 = vkNumpad8, NumPad9 = vkNumpad9, + + + F1 = vkF1, F2 = vkF2, F3 = vkF3, F4 = vkF4, F5 = vkF5, F6 = vkF6, F7 = vkF7, F8 = vkF8, F9 = vkF9, + F10 = vkF10, F11 = vkF11, F12 = vkF12, F13 = vkF13, F14 = vkF14, F15 = vkF15, F16 = vkF16, F17 = vkF17, F18 = vkF18, + F19 = vkF19, F20 = vkF20, F21 = vkF21, F22 = vkF22, F23 = vkF23, F24 = vkF24, + + BrowserBack = vkBrowserBack, BrowserForward = vkBrowserForward, BrowserRefresh = vkBrowserRefresh, BrowserStop = vkBrowserStop, + BrowserSearch = vkBrowserSearch, BrowserFavorites = vkBrowserFavorites, BrowserHome = vkBrowserHome, VolumeMute = vkVolumeMute, + VolumeDown = vkVolumeDown, VolumeUp = vkVolumeUp, MediaNext = vkMediaNextTrack, MediaPrevious = vkMediaPrevTrack, + MediaStop = vkMediaStop, MediaPlay = vkMediaPlayPause, LaunchMail = vkLaunchMail, LaunchMediaSelect = vkLaunchMediaSelect, + LaunchApp1 = vkLaunchApp1, LaunchApp2 = vkLaunchApp2, Oem1 = vkSemicolon, OemPlus = vkEqual, + OemComma = vkComma, OemMinus = vkMinus, OemPeriod = vkPeriod, Oem2 = vkSlash, + Oem3 = vkTilde, Oem4 = vkLeftBracket, Oem5 = vkBackslash, Oem6 = vkRightBracket, + Oem7 = vkQuote, Oem8 = vkPara, Oem102 = vkOem102, + + Process = vkProcessKey, Packet = vkPacket, Attention = vkAttn, CrSel = vkCrsel, + ExSel = vkExsel, EraseEndOfFile = vkErEof, Play = vkPlay, Zoom = vkZoom, + NoName = vkNoname, Pa1 = vkPA1, OemClear = vkOemClear + ); + + TConsoleModifiers = (Alt, Shift, Control); + + TConsoleModifiersSet = set of TConsoleModifiers; + + TConsoleKeyInfo = record + strict private + FKey: TConsoleKey; + FKeyChar: Char; + FMods: TConsoleModifiersSet; + public + property Key: TConsoleKey read FKey write FKey; + property KeyChar: Char read FKeyChar write FKeyChar; + property Modifiers: TConsoleModifiersSet read FMods; + end; + + TCONSOLE_FONT_INFOEX = record + cbSize: Cardinal; + nFont: LongWord; + dwFontSize: COORD; + FontFamily: Cardinal; + FontWeight: Cardinal; + FaceName: array [0 .. LF_FACESIZE - 1] of WideChar; + end; + + pCONSOLE_FONT_INFOEX = ^TCONSOLE_FONT_INFOEX; + + TFontFamily = + ( + ffDontCare = FF_DONTCARE, + Roman = FF_ROMAN, + Swiss = FF_SWISS, + Modern = FF_MODERN, + Script = FF_SCRIPT, + Decorative = FF_DECORATIVE + ); + + TFontWeight = + ( + fwDontCare = FW_DONTCARE, + Thin = FW_THIN, + ExtraLight = FW_EXTRALIGHT, + Normal = FW_NORMAL, + Medium = FW_MEDIUM, + SemiBold = FW_SEMIBOLD, + Bold = FW_BOLD, + ExtraBold = FW_EXTRABOLD, + Heavy = FW_HEAVY, + UltraLight = FW_ULTRALIGHT, + Regular = FW_NORMAL, + DemiBold = FW_SEMIBOLD, + UltraBold = FW_EXTRABOLD, + Black = FW_HEAVY + ); + + TWinColor = + ( + colBackgroundBlue = $10, + colBackgroundGreen = $20, + colBackgroundRed = $40, + colBackgroundYellow = $60, + colBackgroundIntensity = $80, + colBackgroundMask = $F0, + colBlack = $00, + + colColorMask = $FF, + colForegroundBlue = 1, + colForegroundGreen = 2, + colForegroundRed = 4, + colForegroundYellow = 6, + colForegroundIntensity = 8, + colForegroundMask = 15 + ); + Console = class + private + class var DefaultTextAttributes: Word; + class var FScreenSize: TCoord; + class var FTextWindow: TRect; + class var StdErr: THandle; + class var StdIn: THandle; + class var StdOut: THandle; + class var TextAttr: Word; + class var FAutoAllocateConsole : Boolean; + + class procedure RaiseConsoleError(aCaller : String); + class function ConsoleColorToColorAttribute(ConsoleColor: TConsoleColor; IsBackground: Boolean): TWinColor; static; + class function ConsoleCursorInfo: TConsoleCursorInfo; + class function ConsoleRect: TRect; + class function GetBufferInfo: TConsoleScreenBufferInfo; static; + class function CanGetBufferInfo: Boolean; static; + class function GetConsoleOutputHandle: THandle; static; + class procedure GotoXY(X, Y: SmallInt); + class procedure ScrollScreenBuffer(Left, Top, Right, Bottom: Integer; Distance: Integer = 0); + class procedure SetConsoleOutputHandle(const Value: THandle); static; + class procedure SetConsoleRect(Rect: TRect); + class function WriteString(aValue: string): Cardinal; inline; + class function GenericToString(aValue: T): string; + class function GetConsoleRedirected(const Index: Integer): Boolean; static; + class function GetBackgroundColor: TConsoleColor; static; + class procedure SetBackgroundColor(const Value: TConsoleColor); static; + class function GetForegroundColor: TConsoleColor; static; + class procedure SetForegroundColor(const Value: TConsoleColor); static; + class function GetBufferHeight: Integer; static; + class procedure SetBufferHeight(const Value: Integer); static; + class function GetBufferWidth: Integer; static; + class procedure SetBufferWidth(const Value: Integer); static; + class function GetLargestWindowWidth: Integer; static; + class function GetLargestWindowHeight: Integer; static; + class function GetWindowLeft: Integer; static; + class procedure SetWindowLeft(const Value: Integer); static; + class function GetWindowTop: Integer; static; + class procedure SetWindowTop(const Value: Integer); static; + class function GetCursorLeft: Integer; static; + class procedure SetCursorLeft(const Value: Integer); static; + class function GetCursorTop: Integer; static; + class procedure SetCursorTop(const Value: Integer); static; + class function GetCursorSize: Integer; static; + class procedure SetCursorSize(const Value: Integer); static; + class function GetCursorVisible: Boolean; static; + class procedure SetCursorVisible(const Value: Boolean); static; + class function GetTitle: string; static; + class procedure SetTitle(const Value: string); static; + class function GetKeyAvailable: Boolean; static; + class function GetKey(const Index: Integer): Boolean; static; + class function GetTreatControlCAsInput: Boolean; static; + class procedure SetTreatControlCAsInput(const Value: Boolean); static; + class function GetConsoleInputHandle: Integer; static; + class procedure SetConsoleInputHandle(const Value: Integer); static; + class function GetBufferSize: TCoord; static; + class procedure SetBufferSize(const Value: TCoord); overload; static; + class function GetWindowWidth: Integer; static; + class procedure SetWindowWidth(const Value: Integer); static; + class function GetWindowHeight: Integer; static; + class procedure SetWindowHeight(const Value: Integer); static; + class function GetOutputEncoding: DWORD; static; + class procedure SetOutputEncoding(const Value: DWORD); static; + class function GetConsoleFont: TCONSOLE_FONT_INFOEX; static; + class procedure SetConsoleFont(const Value: TCONSOLE_FONT_INFOEX); static; + public + // Not implemented + // class function OpenStandardError(BufferSize: Integer): TStream; overload; static; + // class function OpenStandardError: TStream; overload; static; + // class function OpenStandardInput(BufferSize: Integer): TStream; overload; static; + // class function OpenStandardInput: TStream; overload; static; + // class function OpenStandardOutput(BufferSize: Integer): TStream; overload; static; + // class function OpenStandardOutput: TStream; overload; static; + // class procedure SetError(NewError: TTextWriter); static; + // class procedure SetIn(NewIn: TTextReader); static; + // Class procedure SetOut(NewOut: TTextWriter); static; + + // Initialize + class constructor Create; + class destructor Destroy; + class function AttatchConsole : Boolean; + class procedure AllocateConsole; + class procedure FreeConsole; + // Methods + class procedure Beep(Frequency, Duration: Cardinal); overload; static; + class procedure Beep; overload; static; + class procedure Clear; static; + class procedure ClearEOL; static; + class procedure DeleteLine; + class procedure InsertLine; + class procedure MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer); overload; + class procedure MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer; SourceChar: Char; SourceForeColor, SourceBackColor: TConsoleColor); overload; + class function Read: Integer; static; + class function ReadKey(Intercept: Boolean): TConsoleKeyInfo; overload; static; + class function ReadKey: TConsoleKeyInfo; overload; static; + class function ReadLine: string; static; + class procedure ResetColor; + class procedure SetCursorPosition(Left, Top: SmallInt); + class procedure SetBufferSize(Width, Height: Integer); overload; static; + class procedure SetWindowPosition(Left, Top: Integer); + class procedure SetWindowSize(Width, Height: Integer); static; + class procedure UpdateConsoleFont(aFontName: string = ''; aFontSize: Cardinal = 0; aFontFamily: TFontFamily = TFontFamily.ffDontCare; aFontWeight: TFontWeight = TFontWeight.fwDontCare); + class procedure Write(aValue: T); overload; static; + class procedure Write(Value: Variant; Args: array of const); overload; static; + class procedure WriteLine(aValue: T); overload; static; + class procedure WriteLine(FormatString: String; Args: array of Variant); overload; static; + class procedure WriteLine; overload; static; + + // properties + class property AutoAllocateConsole : Boolean read FAutoAllocateConsole write FAutoAllocateConsole; + class property BackgroundColor: TConsoleColor read GetBackgroundColor write SetBackgroundColor; + class property BufferHeight: Integer read GetBufferHeight write SetBufferHeight; + class property BufferSize: TCoord read GetBufferSize write SetBufferSize; + class property BufferWidth: Integer read GetBufferWidth write SetBufferWidth; + class property CapsLock: Boolean index VK_CAPITAL read GetKey; + class property ConsoleInputHandle: Integer read GetConsoleInputHandle write SetConsoleInputHandle; + class property ConsoleOutputHandle: THandle read GetConsoleOutputHandle write SetConsoleOutputHandle; + class property ConsoleFont: TCONSOLE_FONT_INFOEX read GetConsoleFont write SetConsoleFont; + class property CursorLeft: Integer read GetCursorLeft write SetCursorLeft; + class property CursorSize: Integer read GetCursorSize write SetCursorSize; + class property CursorTop: Integer read GetCursorTop write SetCursorTop; + class property CursorVisible: Boolean read GetCursorVisible write SetCursorVisible; + class property ForegroundColor: TConsoleColor read GetForegroundColor write SetForegroundColor; + class property IsErrorRedirected: Boolean index STD_ERROR_HANDLE read GetConsoleRedirected; + class property IsInputRedirected: Boolean index STD_INPUT_HANDLE read GetConsoleRedirected; + class property IsOutputRedirected: Boolean index STD_OUTPUT_HANDLE read GetConsoleRedirected; + class property KeyAvailable: Boolean read GetKeyAvailable; + class property LargestWindowWidth: Integer read GetLargestWindowWidth; + class property LargestWindowHeight: Integer read GetLargestWindowHeight; + class property OutputEncoding: DWORD read GetOutputEncoding write SetOutputEncoding; + + class property WindowHeight: Integer read GetWindowHeight write SetWindowHeight; + class property WindowWidth: Integer read GetWindowWidth write SetWindowWidth; + class property NumberLock: Boolean index VK_NUMLOCK read GetKey; + class property Title: string read GetTitle write SetTitle; + class property TreatControlCAsInput: Boolean read GetTreatControlCAsInput write SetTreatControlCAsInput; + class property WindowLeft: Integer read GetWindowLeft write SetWindowLeft; + class property WindowTop: Integer read GetWindowTop write SetWindowTop; + end; + +function AttachConsole(dwProcessId: DWORD): Bool; stdcall; external KERNEL32 name 'AttachConsole'; +function GetConsoleWindow: HWND; stdcall; external kernel32 name 'GetConsoleWindow'; +function GetCurrentConsoleFontEx(ConsoleOutput: THandle; MaximumWindow: BOOL; ConsoleInfo: pCONSOLE_FONT_INFOEX): BOOL; stdcall; external kernel32 name 'GetCurrentConsoleFontEx'; +function SetCurrentConsoleFontEx(ConsoleOutput: THandle; MaximumWindow: BOOL; ConsoleInfo: pCONSOLE_FONT_INFOEX): BOOL; stdcall; external kernel32 name 'SetCurrentConsoleFontEx'; + +implementation + +uses + StrUtils, RTTI, TypInfo; + +var + LockObject: TObject; + +function Lock(ALockObject: TObject; ATimeout: Cardinal = INFINITE): Boolean; +begin + Result := System.TMonitor.Enter(LockObject, ATimeout) +end; + +procedure Release(ALockObject: TObject; ATimeout: Cardinal = INFINITE); +begin + System.TMonitor.Exit(LockObject); +end; +{ Console } + +class function Console.AttatchConsole: Boolean; +const + ATTACH_PARENT_PROCESS : UINT = $0ffffffff; +begin + {$IFNDEF Win32} + if IsDebuggerPresent then + Exit(false); + (* + In the case of a 64-bit debug, it appears that the IDE is creating a console for the debugger, + which hosts the debugged application as a child, and so electing to attach to the parent console succeeds. + + This console is not created for a 32-bit debug session. + *) + {$ENDIF} + + Result := AttachConsole(ATTACH_PARENT_PROCESS); + if Result then + AllocateConsole; +end; + +class procedure Console.Beep; +begin + Beep; +end; + +class procedure Console.Beep(Frequency, Duration: Cardinal); +begin + {$IF CompilerVersion >= 23} + Winapi. + {$IFEND} + Windows.Beep(Frequency, Duration); +end; + +class procedure Console.Clear; +var + StartPos: TCoord; + Buffer : TConsoleScreenBufferInfo; + ConSize : Integer; + NumWritten: DWORD; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + Buffer := GetBufferInfo; + ConSize := Buffer.dwSize.X * Buffer.dwSize.Y; + StartPos.X := 0; + StartPos.y := 0; + + if not FillConsoleOutputCharacter(StdOut, ' ', ConSize, StartPos, NumWritten) then + RaiseConsoleError('FillConsoleOutputCharacter in Console.Clear'); + + NumWritten := 0; + + if not FillConsoleOutputAttribute(StdOut, Buffer.wAttributes, ConSize, StartPos, NumWritten) then + RaiseConsoleError('FillConsoleOutputAttribute in Console.Clear'); + + GotoXY(1, 1); +end; + +class procedure Console.ClearEOL; +var + Len: Integer; + Pos: TCoord; + NumWritten: DWORD; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + Pos := GetBufferInfo.dwCursorPosition; + if Pos.X > FTextWindow.Right then + Exit; + + Len := FTextWindow.Right - Pos.X + 1; + FillConsoleOutputCharacter(StdOut, ' ', Len, Pos, NumWritten); + FillConsoleOutputAttribute(StdOut, TextAttr, Len, Pos, NumWritten); +end; + +class function Console.ConsoleColorToColorAttribute(ConsoleColor: TConsoleColor; IsBackground: Boolean): TWinColor; +begin + if ((Integer(ConsoleColor) and not Integer(TConsoleColor.White)) <> Integer(TConsoleColor.Black)) then + raise EArgumentException.Create('InvalidConsoleColor'); + + Result := TWinColor(ConsoleColor); + + if (IsBackground) then + Result := TWinColor(SmallInt(Integer(Result) shl 4)); +end; + +class function Console.ConsoleCursorInfo: TConsoleCursorInfo; +begin + GetConsoleCursorInfo(ConsoleOutputHandle, Result); +end; + +class function Console.ConsoleRect: TRect; +begin + ZeroMemory(@Result, SizeOf(TRect)); + GetWindowRect(GetConsoleWindow, Result); +end; + +class function Console.GetConsoleRedirected(const Index: Integer): Boolean; +var + FileType: DWORD; +begin + FileType := GetFileType(GetStdHandle(index)); + Result := (FileType = FILE_TYPE_PIPE) or (FileType = FILE_TYPE_DISK); +end; + +class procedure Console.AllocateConsole; +var + BufferInfo: TConsoleScreenBufferInfo; +begin + if not System.Console.AttachConsole(DWORD(-1)) then + begin + if FAutoAllocateConsole then + AllocConsole + else + Exit; + end; + + StdIn := GetStdHandle(STD_INPUT_HANDLE); + StdOut := GetStdHandle(STD_OUTPUT_HANDLE); + StdErr := GetStdHandle(STD_ERROR_HANDLE); + + Reset(Input); + Rewrite(Output); + Rewrite(ErrOutput); + + TextAttr := GetBufferInfo.wAttributes and $FF; + DefaultTextAttributes := TextAttr; + + if not GetConsoleScreenBufferInfo(StdOut, BufferInfo) then + begin + SetInOutRes(GetLastError); + Exit; + end; + + FTextWindow.Left := 0; + FTextWindow.Top := 0; + FTextWindow.Right := BufferInfo.dwSize.X - 1; + FTextWindow.Bottom := BufferInfo.dwSize.Y - 1; + FScreenSize.X := BufferInfo.srWindow.Right - BufferInfo.srWindow.Left + 1; + FScreenSize.Y := BufferInfo.srWindow.Bottom - BufferInfo.srWindow.Top + 1; +end; + +class constructor Console.Create; +begin + StdIn := GetStdHandle(STD_INPUT_HANDLE); + StdOut := GetStdHandle(STD_OUTPUT_HANDLE); + StdErr := GetStdHandle(STD_ERROR_HANDLE); + FAutoAllocateConsole := True; + + if Console.CanGetBufferInfo then + Console.AllocateConsole; +end; + +class procedure Console.DeleteLine; +begin + ScrollScreenBuffer(FTextWindow.Left, GetBufferInfo.dwCursorPosition.Y, FTextWindow.Right, FTextWindow.Bottom, -1); +end; + +class destructor Console.Destroy; +begin + FreeConsole; +end; + +class procedure Console.FreeConsole; +begin + {$IF CompilerVersion >= 23} + Winapi. + {$IFEND} + Windows.FreeConsole; +end; + +class function Console.GenericToString(aValue: T): string; +var + ElementValue, Value: TValue; + Data: PTypeData; + I: Integer; + AContext: TRttiContext; + ARecord: TRttiRecordType; +begin + TValue.Make(@aValue, System.TypeInfo(T), Value); + + if Value.IsArray then + begin + if Value.GetArrayLength = 0 then + Exit('[ø]'); + + Result := '['; + + for I := 0 to Value.GetArrayLength - 1 do + begin + ElementValue := Value.GetArrayElement(I); + Result := Result + ElementValue.ToString + ','; + end; + + Result[Length(Result)] := ']'; + Exit; + end; + + Data := GetTypeData(Value.TypeInfo); + + if (Value.IsObject) and (Value.TypeInfo^.Kind <> tkInterface) then + Exit(Format('0x%p %s', [pointer(Value.AsObject), Data.ClassType.ClassName])); + + if Value.TypeInfo^.Kind = tkRecord then + begin + AContext := TRttiContext.Create; + ARecord := AContext.GetType(Value.TypeInfo).AsRecord; + Exit(Format('0x%p (Record ''%s'' @ %p)', [Value.GetReferenceToRawData, ARecord.Name, Data])); + end; + + Result := Value.ToString; +end; + +class function Console.GetBackgroundColor: TConsoleColor; +begin + Result := TConsoleColor((TextAttr and $0F) shr 4); +end; + +class function Console.GetBufferHeight: Integer; +begin + Result := GetBufferSize.Y; +end; + +class function Console.CanGetBufferInfo: Boolean; +var + Dummy: TConsoleScreenBufferInfo; +begin + Result := GetConsoleScreenBufferInfo(ConsoleOutputHandle, Dummy); +end; + +class function Console.GetBufferInfo: TConsoleScreenBufferInfo; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + if not GetConsoleScreenBufferInfo(ConsoleOutputHandle, Result) then + RaiseConsoleError('GetBufferInfo'); +end; + +class function Console.GetBufferSize: TCoord; +begin + Result := GetBufferInfo.dwSize; +end; + +class function Console.GetBufferWidth: Integer; +begin + Result := GetBufferSize.X; +end; + +class function Console.GetConsoleFont: TCONSOLE_FONT_INFOEX; +begin + FillChar(Result, SizeOf(TCONSOLE_FONT_INFOEX), 0); + Result.cbSize := SizeOf(TCONSOLE_FONT_INFOEX); + GetCurrentConsoleFontEx(ConsoleOutputHandle, FALSE, @Result); +end; + +class function Console.GetConsoleInputHandle: Integer; +begin + Result := StdIn; +end; + +class function Console.GetConsoleOutputHandle: THandle; +begin + Result := StdOut; +end; + +class function Console.GetCursorLeft: Integer; +begin + Result := GetBufferInfo.dwCursorPosition.X +end; + +class function Console.GetCursorSize: Integer; +begin + Result := ConsoleCursorInfo.dwSize; +end; + +class function Console.GetCursorTop: Integer; +begin + Result := GetBufferInfo.dwCursorPosition.Y +end; + +class function Console.GetCursorVisible: Boolean; +begin + Result := ConsoleCursorInfo.bVisible; +end; + +class function Console.GetForegroundColor: TConsoleColor; +begin + Result := TConsoleColor(TextAttr and $0F); +end; + +class function Console.GetKey(const Index: Integer): Boolean; +begin + Result := (GetKeyState(index) and 1) = 1; +end; + +class function Console.GetKeyAvailable: Boolean; +var + NumberOfEvents: DWORD; + Buffer: TInputRecord; + NumberOfEventsRead: DWORD; +begin + Result := FALSE; + + if StdIn = INVALID_HANDLE_VALUE then + exit; + + NumberOfEvents := 0; + GetNumberOfConsoleInputEvents(StdIn, NumberOfEvents); + + if NumberOfEvents = 0 then + Exit; + + PeekConsoleInput(StdIn, Buffer, 1, NumberOfEventsRead); + if NumberOfEventsRead = 0 then + Exit; + + if Buffer.EventType = KEY_EVENT then // is a Keyboard event? + begin + if Buffer.Event.KeyEvent.bKeyDown then // the key was pressed? + Result := True + else + FlushConsoleInputBuffer(StdIn); // flush the buffer + end + else + FlushConsoleInputBuffer(StdIn); // flush the buffer +end; + +class function Console.GetLargestWindowHeight: Integer; +begin + Result := GetLargestConsoleWindowSize(ConsoleOutputHandle).Y; +end; + +class function Console.GetLargestWindowWidth: Integer; +begin + Result := GetLargestConsoleWindowSize(ConsoleOutputHandle).X +end; + +class function Console.GetOutputEncoding: DWORD; +begin + Result := GetConsoleOutputCP; +end; + +class function Console.GetTitle: string; +var + TitleLength: Integer; +begin + if GetConsoleWindow = 0 then + exit(''); + + TitleLength := GetWindowTextLength(GetConsoleWindow); + SetLength(Result, TitleLength); + GetWindowText(GetConsoleWindow, PChar(Result), TitleLength + 1); +end; + +class function Console.GetTreatControlCAsInput: Boolean; +var + Mode: Cardinal; +begin + Result := FALSE; + Mode := 0; + if not GetConsoleMode(ConsoleInputHandle, Mode) then + RaiseLastOSError + else + Result := (Mode and 1) = 0; +end; + +class function Console.GetWindowHeight: Integer; +var + BufferInfo: TConsoleScreenBufferInfo; +begin + BufferInfo := GetBufferInfo; + Result := BufferInfo.srWindow.Bottom - BufferInfo.srWindow.Top + 1; +end; + +class function Console.GetWindowLeft: Integer; +begin + Result := ConsoleRect.Left; +end; + +class function Console.GetWindowTop: Integer; +begin + Result := ConsoleRect.Top; +end; + +class function Console.GetWindowWidth: Integer; +var + BufferInfo: TConsoleScreenBufferInfo; +begin + BufferInfo := GetBufferInfo; + Result := BufferInfo.srWindow.Right - BufferInfo.srWindow.Left + 1; +end; + +class procedure Console.GotoXY(X, Y: SmallInt); +begin + Inc(X, FTextWindow.Left - 1); + Inc(Y, FTextWindow.Top - 1); + if PtInRect(FTextWindow, POINT(X, Y)) then + SetCursorPosition(X, Y); +end; + +class procedure Console.InsertLine; +begin + ScrollScreenBuffer(FTextWindow.Left, GetBufferInfo.dwCursorPosition.Y, FTextWindow.Right, FTextWindow.Bottom, 1); +end; + +class procedure Console.MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer); +begin + MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop, ' ', TConsoleColor.Black, BackgroundColor) +end; + +class procedure Console.MoveBufferArea(SourceLeft, SourceTop, SourceWidth, SourceHeight, TargetLeft, TargetTop: Integer; SourceChar: Char; SourceForeColor, SourceBackColor: TConsoleColor); +var + I: Integer; + CharInfoArray: array of CHAR_INFO; + NumberOfCharsWritten: DWORD; + dwSize: TCoord; + ReadRegion, WriteRegion: SMALL_RECT; + dwWriteCoord, bufferCoord: TCoord; + wColorAttribute, color: TWinColor; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + if ((SourceForeColor < TConsoleColor.Black) or (SourceForeColor > TConsoleColor.White)) then + raise EArgumentException.Create('ParamName: SourceForeColor'); + if ((SourceBackColor < TConsoleColor.Black) or (SourceBackColor > TConsoleColor.White)) then + raise EArgumentException.Create('ParamName: SourceBackColor'); + + dwSize := GetBufferInfo.dwSize; + + if ((SourceLeft < 0) or (SourceLeft > dwSize.X)) then + raise EArgumentOutOfRangeException.Create('SourceLeft ' + IntToStr(SourceLeft) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((SourceTop < 0) or (SourceTop > dwSize.Y)) then + raise EArgumentOutOfRangeException.Create('SourceTop' + IntToStr(SourceTop) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((SourceWidth < 0) or (SourceWidth > (dwSize.X - SourceLeft))) then + raise EArgumentOutOfRangeException.Create('SourceWidth' + IntToStr(SourceWidth) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((SourceHeight < 0) or (SourceTop > (dwSize.Y - SourceHeight))) then + raise EArgumentOutOfRangeException.Create('SourceHeight' + IntToStr(SourceHeight) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((TargetLeft < 0) or (TargetLeft > dwSize.X)) then + raise EArgumentOutOfRangeException.Create('TargetLeft' + IntToStr(TargetLeft) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + if ((TargetTop < 0) or (TargetTop > dwSize.Y)) then + raise EArgumentOutOfRangeException.Create('TargetTop' + IntToStr(TargetTop) + 'ArgumentOutOfRange: ConsoleBufferBoundaries'); + + if ((SourceWidth <> 0) and (SourceHeight <> 0)) then + begin + SetLength(CharInfoArray, (SourceWidth * SourceHeight)); + dwSize.X := SourceWidth; + dwSize.Y := SourceHeight; + ReadRegion.Left := (SourceLeft); + ReadRegion.Right := (((SourceLeft + SourceWidth) - 1)); + ReadRegion.Top := (SourceTop); + ReadRegion.Bottom := (((SourceTop + SourceHeight) - 1)); + + bufferCoord.X := 0; + bufferCoord.Y := 0; + + if (not ReadConsoleOutput(ConsoleOutputHandle, CharInfoArray, dwSize, bufferCoord, ReadRegion)) then + RaiseLastOSError; + + dwWriteCoord.X := SourceLeft; + color := TWinColor(Integer(ConsoleColorToColorAttribute(SourceBackColor, True)) or Integer(ConsoleColorToColorAttribute(SourceForeColor, FALSE))); + wColorAttribute := color; + I := SourceTop; + + while ((I < (SourceTop + SourceHeight))) do + begin + dwWriteCoord.Y := (I); + if (not FillConsoleOutputCharacter(ConsoleOutputHandle, SourceChar, SourceWidth, dwWriteCoord, NumberOfCharsWritten)) then + RaiseLastOSError; + if (not FillConsoleOutputAttribute(ConsoleOutputHandle, Word(wColorAttribute), SourceWidth, dwWriteCoord, NumberOfCharsWritten)) then + RaiseLastOSError; + Inc(I) + end; + + WriteRegion.Left := TargetLeft; + WriteRegion.Right := TargetLeft + SourceWidth; + WriteRegion.Top := TargetTop; + WriteRegion.Bottom := TargetTop + SourceHeight; + + Win32Check(WriteConsoleOutput(ConsoleOutputHandle, CharInfoArray, dwSize, bufferCoord, WriteRegion)); + end +end; + +class function Console.ReadKey: TConsoleKeyInfo; +var + InputRec: TInputRecord; + NumRead: Cardinal; + KeyMode: DWORD; + StdIn: THandle; +begin + StdIn := TTextRec(Input).Handle; + GetConsoleMode(StdIn, KeyMode); + SetConsoleMode(StdIn, 0); + + repeat + ReadConsoleInput(StdIn, InputRec, 1, NumRead); + if (InputRec.EventType and KEY_EVENT <> 0) and InputRec.Event.KeyEvent.bKeyDown then + begin + if InputRec.Event.KeyEvent.AsciiChar <> #0 then + begin + Result.Key := TConsoleKey(InputRec.Event.KeyEvent.wVirtualKeyCode); + Result.KeyChar := InputRec.Event.KeyEvent.UnicodeChar; + Break; + end; + end; + until FALSE; + + SetConsoleMode(StdIn, KeyMode); +end; + +class procedure Console.RaiseConsoleError(aCaller: String); +begin + raise ECOnsoleError.Create('Error calling ' + aCaller +':' + sLineBreak + SysErrorMessage(GetLastError)); +end; + +class function Console.Read: Integer; +begin + System.Read(Result); +end; + +function IsKeyDownEvent(ir: TInputRecord): Boolean; +begin + Result := (ir.EventType = KEY_EVENT) and (ir.Event.KeyEvent.bKeyDown); +end; + +function IsModKey(ir: TInputRecord): Boolean; +begin + // We should also skip over Shift, Control, and Alt, as well as caps lock. + // Apparently we don't need to check for 0xA0 through 0xA5, which are keys like + // Left Control & Right Control. See the ConsoleKey enum for these values. + Result := ir.Event.KeyEvent.wVirtualScanCode in [$10 .. $12, $14, $90, $91]; +end; + +class function Console.ReadKey(Intercept: Boolean): TConsoleKeyInfo; +var + InputRec: TInputRecord; + NumRead: Cardinal; + OldKeyMode: DWORD; +begin + if StdIn = INVALID_HANDLE_VALUE then + exit; + + GetConsoleMode(StdIn, OldKeyMode); + SetConsoleMode(StdIn, 0); + + repeat + ReadConsoleInput(StdIn, InputRec, 1, NumRead); + until (InputRec.EventType and KEY_EVENT <> 0) and InputRec.Event.KeyEvent.bKeyDown; + + Result.Key := TConsoleKey(InputRec.Event.KeyEvent.wVirtualKeyCode); + Result.KeyChar := InputRec.Event.KeyEvent.UnicodeChar; + + SetConsoleMode(StdIn, OldKeyMode); +end; + +class function Console.ReadLine: string; +var + Buffer : Array[0..1024] of Char; + NumberOfCharsRead : DWORD; +begin + if StdIn = INVALID_HANDLE_VALUE then + exit(''); + + ZeroMemory(@Buffer, Length(Buffer)); + ReadConsole(StdIn, @Buffer, Length(Buffer), NumberOfCharsRead , nil); + Result := PChar(@Buffer); +end; + +class procedure Console.ResetColor; +begin + SetConsoleTextAttribute(StdOut, DefaultTextAttributes); +end; + +class procedure Console.ScrollScreenBuffer(Left, Top, Right, Bottom, Distance: Integer); +var + Rect: TSmallRect; + Fill: TCharInfo; + NewPos: TCoord; +begin + Fill.UnicodeChar := ' '; + Fill.Attributes := TextAttr; + if Distance = 0 then + Distance := Bottom - Top + 1; + Rect.Left := Left; + Rect.Right := Right; + Rect.Top := Top; + Rect.Bottom := Bottom; + NewPos.X := Left; + NewPos.Y := Top + Distance; + ScrollConsoleScreenBuffer(StdOut, Rect, @Rect, NewPos, Fill); +end; + +class procedure Console.SetBackgroundColor(const Value: TConsoleColor); +begin + TextAttr := (TextAttr and $0F) or ((Word(Value) shl 4) and $F0); + SetConsoleTextAttribute(StdOut, TextAttr); +end; + +class procedure Console.SetBufferHeight(const Value: Integer); +var + Size: TCoord; +begin + Size.X := GetBufferWidth; + Size.Y := Value; + SetConsoleScreenBufferSize(ConsoleOutputHandle, Size); +end; + +class procedure Console.SetBufferSize(Width, Height: Integer); +var + Size: TCoord; +begin + if StdOut = INVALID_HANDLE_VALUE then + exit; + + Size.X := Width; + Size.Y := Height; + SetConsoleScreenBufferSize(ConsoleOutputHandle, Size) +end; + +class procedure Console.SetBufferSize(const Value: TCoord); +begin + SetBufferSize(Value.X, Value.Y); +end; + +class procedure Console.SetBufferWidth(const Value: Integer); +var + Size: TCoord; +begin + Size.X := Value; + Size.Y := GetBufferHeight; + SetConsoleScreenBufferSize(ConsoleOutputHandle, Size); +end; + +class procedure Console.SetConsoleRect(Rect: TRect); +begin + SetWindowPos(GetConsoleWindow, 0, Rect.Left, Rect.Top, Rect.Right, Rect.Bottom, SWP_SHOWWINDOW); +end; + +class procedure Console.SetCursorLeft(const Value: Integer); +begin + SetCursorPosition(Value, CursorTop) +end; + +class procedure Console.SetCursorPosition(Left, Top: SmallInt); +var + COORD: TCoord; +begin + COORD.X := Left; + COORD.Y := Top; + if not SetConsoleCursorPosition(ConsoleOutputHandle, COORD) then + RaiseLastOSError; +end; + +class procedure Console.SetCursorSize(const Value: Integer); +var + ConsoleCursorInfo: TConsoleCursorInfo; +begin + if ((Value < 1) or (Value > 100)) then + raise ERangeError.Create('value' + IntToStr(Value) + ' out of range for CursorSize'); + + if (not GetConsoleCursorInfo(ConsoleOutputHandle, ConsoleCursorInfo)) then + RaiseLastOSError; + + ConsoleCursorInfo.dwSize := Value; + + if (not SetConsoleCursorInfo(ConsoleOutputHandle, ConsoleCursorInfo)) then + RaiseLastOSError; +end; + +class procedure Console.SetCursorTop(const Value: Integer); +begin + SetCursorPosition(CursorLeft, Value); +end; + +class procedure Console.SetCursorVisible(const Value: Boolean); +var + CursorInfo: TConsoleCursorInfo; +begin + if not GetConsoleCursorInfo(ConsoleOutputHandle, CursorInfo) then + RaiseLastOSError; + + CursorInfo.bVisible := Value; + + if not SetConsoleCursorInfo(ConsoleOutputHandle, CursorInfo) then + RaiseLastOSError; +end; + +class procedure Console.SetConsoleFont(const Value: TCONSOLE_FONT_INFOEX); +begin + SetCurrentConsoleFontEx(StdOut, FALSE, @Value); +end; + +class procedure Console.SetConsoleInputHandle(const Value: Integer); +begin + TTextRec(Input).Handle := Value; +end; + +class procedure Console.SetConsoleOutputHandle(const Value: THandle); +begin + TTextRec(Output).Handle := Value; +end; + +class procedure Console.SetForegroundColor(const Value: TConsoleColor); +begin + TextAttr := (TextAttr and $F0) or (Word(Value) and $0F); + SetConsoleTextAttribute(StdOut, TextAttr); +end; + +class procedure Console.SetOutputEncoding(const Value: DWORD); +begin + SetConsoleOutputCP(Value); +end; + +class procedure Console.SetTitle(const Value: string); +begin + SetConsoleTitle(PChar(Value)); +end; + +class procedure Console.SetTreatControlCAsInput(const Value: Boolean); +begin + if not SetConsoleMode(StdOut, Cardinal(Value)) then + RaiseLastOSError; +end; + +class procedure Console.SetWindowHeight(const Value: Integer); +begin + SetWindowSize(WindowWidth, Value); +end; + +class procedure Console.SetWindowLeft(const Value: Integer); +begin + SetWindowPosition(Value, ConsoleRect.Top); +end; + +class procedure Console.SetWindowPosition(Left, Top: Integer); +var + Rect: TRect; +begin + Rect := ConsoleRect; + Rect.Top := Top; + Rect.Left := Left; + SetConsoleRect(Rect); +end; + +class procedure Console.SetWindowSize(Width, Height: Integer); +var + srWindow: TSmallRect; + Size: TCoord; + BufferInfo: TConsoleScreenBufferInfo; + ResizeBuffer: Boolean; +begin + if Width <= 0 then + raise EArgumentOutOfRangeException.Create('Width must be a positive number required'); + if Height <= 0 then + raise EArgumentOutOfRangeException.Create('Height must be a positive number required'); + + BufferInfo := GetBufferInfo; + ResizeBuffer := FALSE; + + Size.X := BufferInfo.dwSize.X; + Size.Y := BufferInfo.dwSize.Y; + + if BufferInfo.dwSize.X < BufferInfo.srWindow.Left + Width then + begin + if BufferInfo.srWindow.Left >= Int16_MaxValue - Width then + raise EArgumentOutOfRangeException.Create('Width must be a positive number required and les than ' + IntToStr(Int16_MaxValue)); + + Size.X := Short(BufferInfo.srWindow.Left + Width); + ResizeBuffer := True; + end; + + if BufferInfo.dwSize.Y < BufferInfo.srWindow.Top + Height then + begin + if BufferInfo.srWindow.Top >= Int16_MaxValue - Height then + raise EArgumentOutOfRangeException.Create('Height must be a positive number required and lesthan ' + IntToStr(Int16_MaxValue)); + Size.Y := Short(BufferInfo.srWindow.Top + Height); + ResizeBuffer := True; + end; + + if ResizeBuffer then + if not SetConsoleScreenBufferSize(ConsoleOutputHandle, Size) then + RaiseLastOSError; + + srWindow := BufferInfo.srWindow; + // Preserve the position, but change the size. + srWindow.Bottom := Short(srWindow.Top + Height - 1); + srWindow.Right := Short(srWindow.Left + Width - 1); + + if not SetConsoleWindowInfo(ConsoleOutputHandle, True, srWindow) then + begin + // Try to give a better error message here + Size := GetLargestConsoleWindowSize(ConsoleOutputHandle); + if Width > Size.X then + raise EArgumentOutOfRangeException.Create(IntToStr(Width) + 'Is out of range for Console width'); + if Height > Size.Y then + raise EArgumentOutOfRangeException.Create(IntToStr(Height) + 'Is out of range for Console height'); + + RaiseLastOSError; + end; +end; + +class procedure Console.SetWindowTop(const Value: Integer); +begin + SetWindowPosition(ConsoleRect.Left, Value); +end; + +class procedure Console.SetWindowWidth(const Value: Integer); +begin + SetWindowSize(Value, WindowHeight); +end; + +class procedure Console.UpdateConsoleFont(aFontName: string; aFontSize: Cardinal; aFontFamily: TFontFamily; aFontWeight: TFontWeight); +var + CONSOLE_FONT_INFOEX: TCONSOLE_FONT_INFOEX; + Destination: PChar; +begin + CONSOLE_FONT_INFOEX := ConsoleFont; + CONSOLE_FONT_INFOEX.FontFamily := Cardinal(aFontFamily); + if aFontName <> '' then + begin + Destination := @CONSOLE_FONT_INFOEX.FaceName[0]; + StrLCopy(Destination, PChar(aFontName), LF_FACESIZE - 1); + end; + CONSOLE_FONT_INFOEX.dwFontSize.X := 0; + + if aFontSize <> 0 then + CONSOLE_FONT_INFOEX.dwFontSize.Y := aFontSize; + + CONSOLE_FONT_INFOEX.FontWeight := Cardinal(aFontWeight); + + if not SetCurrentConsoleFontEx(StdOut, FALSE, @CONSOLE_FONT_INFOEX) then + RaiseLastOSError; +end; + +class procedure Console.WriteLine(aValue: T); +begin + WriteString(GenericToString(aValue) + sLineBreak); +end; + +class function Console.WriteString(aValue: string): Cardinal; +begin + if StdOut = INVALID_HANDLE_VALUE then + AllocateConsole; + + if StdOut <> INVALID_HANDLE_VALUE then + WriteConsole(StdOut, PWideChar(aValue), Length(aValue), Result, nil); +end; + +class procedure Console.Write(aValue: T); +begin + WriteString(GenericToString(aValue)); +end; + +class procedure Console.Write(Value: Variant; Args: array of const); +var + S: string; + I: Integer; +begin + S := Value; + for I := 0 to high(Args) do + S := ReplaceStr(S, '{' + IntToStr(I) + '}', '%' + IntToStr(I) + ':s'); + + WriteString(Format(S, Args)); +end; + +class procedure Console.WriteLine(FormatString: String; Args: array of Variant); +var + I: Integer; + VarRecArray: array of TVarRec; +begin + for I := 0 to high(Args) do + FormatString := ReplaceStr(FormatString, '{' + IntToStr(I) + '}', '%' + IntToStr(I) + ':s'); + + SetLength(VarRecArray, Length(Args)); + + for I := 0 to high(Args) do + begin + VarRecArray[I].VType := vtUnicodeString; + // nil out first, so no attempt to decrement reference count. + VarRecArray[I].VUnicodeString := nil; + UnicodeString(VarRecArray[I].VUnicodeString) := UnicodeString(Args[I]); + end; + + WriteString(Format(FormatString, VarRecArray) + sLineBreak); +end; + +class procedure Console.WriteLine; +begin + WriteString(sLineBreak); +end; + +initialization + +LockObject := TObject.Create; + +finalization + +LockObject.Free; + +end. + + + diff --git a/Generator GUI/DemoProject.res b/Generator GUI/DemoProject.res index adad3f8af59665b7c69cef26f511e7cca798acd6..e7471dbcdaa3317164ca5ff48d6dfb936c2e18b7 100644 GIT binary patch delta 1254 zcmY+C4>;6!9LMkXQ%+n=lHWbf9Qk3p!^8FGF6ksjVwr?c_n?24;gm?uNv2dPK8;aA zZDrP2;Z}S68n~KC+ya z^2`~B5dp2MEG@8#u?O>d-Ma!W8NGU80yWRInIW)D20PA9pS zImR`3H59jr41abF+VDYH&BTpUe~EY{$7c80eVXdfAZmP)|4DMSt!gGnkIhqOq&oKr z0|#AhY>r6wX=5HMslCd))6Nm^thajq9$OWcmd2uLy!Gn*ugA$flV{^3D>f!O6bcGM zzBL#M(EBO;zKVUvW0hMIc6^upxJeoH0oQs*p`qVo>8=`iUO`S|0ORmI`rWR_N{pI$ zDwdJoC}t&I51nhV?JYSM74eVNE#EHsxsR?cJ$62hJ6pu+Pbx`GH?cPp7e(!{x*S|i zB%yzr>$v#lxS zN8%Z4Gh8QQSg%UA*>_x)VTCsz74`RVUbNSnSxW0qc(xm!%*7A)O;+ywbN08G%&=gI zvhhk=1-~dj;#C=r;Y>{o}NW$pZPTYv{ed4Y!@+6|@+w$Dn zB>|GCjxRH>xy9vgzri8a#W!o5*e_UVDXlpt^dElpB*nE*Wy7rHnZ0aCH;8`lE2pVv zuSwaVGe0Qrwm;1B+xJU9q1GRI$_<>_J;!~uKHlj0O>YaFsS&*z+NhkqN=z3C$C^L3 zHa=>r@6?(eR^?w;{5X`AC!4XeIQe^B-WkE#b&3tow{oSG<>CMO&pH0*QEsL=x`5Sf z*Yo}xU-CT!I{`z?CnUAhDfQ=y;#sT4Ch0vjKtMA z2nPw6AE7~wjDZSv$w-U|Q?hWJPk}x9#Bw`STickZ&qC6m&Tw8v7{6BL7C^Opy>`h8b94wf4da15dT+8wS+~4{5tm5;sYN^N9>NFzSfF#ZeOT z2Fd6eq{opy1g6Shr1vUG{DKgSlUGBHQXA|;pfv^fNA19N%u&0}g|x*N>IlNI0F-PV zBk>jyN?O3nvGoY7QIWVb6QaZ2JIRs~@LEm7=s?rB TBhybqVm6SV@zrNP)4u=zgY69~ delta 1265 zcmY+C3rtg27{~8z9Th2MKr4lofY2+*KsFeoP)4CV1jn>41L{^l6c8LptCQDK8(tci z5AX;MCr+Hecx*5qGbSC~Kyc0n8U`XzTBI*%kunGbhO%>OmW-R++<$)m@BF`WzI$Y& zMA;~@$`wtl-jZ+aEMDPT?&fYUBOpjpbz?Xn+R>{2ah9HlQkBWSJ8rj=OS*`et}NJV z{DOm{GJgA#Q|4{c$K!dFILaK)`yF1YwemM@DVaJJRx+yGu^{5qduH9@-MY{nv8nex ze(<*XpJtoxjYtCO3YX$phw?pcNo0ek_Z(?;n_lD-+u24*{`P017rRs9N^hzw%fkN- zN#XL+P9BuDW^zJAd;c0RnGz@?6&4va(F1=Jt6vUe`xK~mvE;0l1lzlH79~HQ8r+-q zm3LZ^)#CNIA(vpADsgBNi&muyxFNi6?{1m@4O@GJBf9YY(+?@DlzVKa!nK6)=pPrP zQQ3ZucW$aVg0r>$0?+j3i7`fd>Vx!g6(Me`_Z^wE)%%Ct#2%qsm$#$4aZoUQit%}7 zY&(DU!XPPR^A}A5W@gO>Vc0C;P6an{<^0}g7x9?GD>qU7r8B49OFGcYIgLuu{jvgD zNLVX%#BR!IjvJ?oDY~xX?;o{xv~C+>Y`9XfmoEvsLUuiWDKOMF01$Ri$2&h*Vfl0JQ#{Ja~AB|l4D&kx$fvy#bfRbJ~46(rGgq|5{-&b5d_(Y zth;7_qzZFJvN9{94h*5M&q*rqFQWKVK}sD$`5&PKDo9gd1OoxgP0+!rmJB*nOc?kO zLKh;0KEQRti$Fy{iUr-81smXxD|{D$ctU_1zLx8aK45xdtXa`1|6fsSWzMUAVb1HP ztamdgW|ui>b{lNzVBaK}z_vBhZ{JW6l@64XWRwJqlRUUfUp0n?fOxep)a6hogEn;_ zzNZEnJdB!*vVo;02nQxNIuL5e=t+>J;lk<`4Te4f{Tg$%B!>=MwPc8Wv~0XO^e`Pr zAs7Uwv}}lbwHW#W7_>o9V>*mL$pvR~nIKc=2|=|ELnFX#-TP1*p?OFI!txw|mp&MR zbUj8mBZhzquIK|H7=}Q83<4H#pYp_;RTZosghzq7TvlKMYNzl9@+pkaB{7G-n!+;z zrZK|UagZd%07pdzr>B{CPIfUJ#K1EX!INn?kaGqM#lThrz989vS#Bsnkc5ah-$-Dq zp@9Yi{+GKTFRK2Ji#1HJ(a3 Date: Mon, 27 Jul 2020 12:26:47 +0200 Subject: [PATCH 039/129] Removed Shell execute from E2E Test --- End To End Test/EndToEndTest.dpr | 16 ++++++++-------- Generator GUI/DemoProject.res | Bin 60860 -> 54416 bytes 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr index e80dfb3..07933c6 100644 --- a/End To End Test/EndToEndTest.dpr +++ b/End To End Test/EndToEndTest.dpr @@ -40,20 +40,21 @@ begin TDirectory.CreateDirectory(OutputDirectory); FileName := TPath.GetFileName(FullFileName); - Console.Write('** Generating E2E test for %s ... ', [FileName]); + Console.Write('** Building E2E Test for %s ... ', [FileName]); JsonMapper.DestinationClassName := ChangeFileExt(FileName, '').Replace(#32, ''); JsonMapper.DestinationUnitName := JsonMapper.DestinationClassName; JsonMapper.LoadFormFile(FullFileName); + OutputDirectory := OutputDirectory + JsonMapper.DestinationClassName + TPath.DirectorySeparatorChar; + TDirectory.CreateDirectory(OutputDirectory); + with TDemoGenerator.Create(JsonMapper) do try - OutputDirectory := OutputDirectory + JsonMapper.DestinationClassName + TPath.DirectorySeparatorChar; DestinationDirectory := OutputDirectory; - TDirectory.CreateDirectory(DestinationDirectory); DestinationFrameWork := TDestinationFrameWork.dfVCL; Execute; finally - free; + Free; end; OutputBuffer.Clear; @@ -75,16 +76,15 @@ begin Console.ForegroundColor := TConsoleColor.White; Console.WriteLine(' **'); Console.WriteLine(''); - -// if Sucess then -// ShellExecute(0, 'OPEN', Pchar(FileName), '', Pchar(TPath.GetDirectoryName(FileName)), SW_SHOWNORMAL); end; Console.ForegroundColor := TConsoleColor.White; Console.WriteLine('Press anykey to continue ...'); Console.ReadLine; + OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; + ShellExecute(0, 'OPEN', Pchar(OutputDirectory), '', '', SW_SHOWNORMAL); - OutputBuffer.free; + OutputBuffer.Free; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); diff --git a/Generator GUI/DemoProject.res b/Generator GUI/DemoProject.res index e7471dbcdaa3317164ca5ff48d6dfb936c2e18b7..d972aeb710fa4c1aaded5a9b08aac21b386c6994 100644 GIT binary patch delta 10413 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 R%tTLL5>x=-{@d@n{|BdgEP4O{ delta 16983 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 From f3438990002f677b5c9a24bd7ad4df8a5b887fe1 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 27 Jul 2020 12:57:54 +0200 Subject: [PATCH 040/129] Bugfix: Object types now generates readonly properties --- Components/uUpdate.pas | 2 +- Lib/Pkg.Json.StubField.pas | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Components/uUpdate.pas b/Components/uUpdate.pas index a7ae067..a44077f 100644 --- a/Components/uUpdate.pas +++ b/Components/uUpdate.pas @@ -6,7 +6,7 @@ interface IPPeerClient, SysUtils, System.Threading, Classes, Pkg.JSON.Mapper; const - ProgramVersion: double = 1; + ProgramVersion: double = 2.1; UpdateUrl = 'https://api.github.com/repos/JensBorrisholt/Delphi-JsonToDelphiClass/releases'; ProgramUrl = 'https://github.com/JensBorrisholt/Delphi-JsonToDelphiClass'; diff --git a/Lib/Pkg.Json.StubField.pas b/Lib/Pkg.Json.StubField.pas index 20da62f..c72b366 100644 --- a/Lib/Pkg.Json.StubField.pas +++ b/Lib/Pkg.Json.StubField.pas @@ -266,6 +266,8 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' StubArrayField := StubField as TStubArrayField; Lines.AddFormat(' property %s: TObjectList<%s> read F%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); end + else if StubField.FieldType = jtObject then + Lines.AddFormat(' property %s: %s read %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName]) else Lines.AddFormat(' property %s: %s read %s write %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName, StubField.FieldName]); end; From 5089e56537cd88f91acc979ab3a580ff102c8dd5 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 27 Jul 2020 13:01:12 +0200 Subject: [PATCH 041/129] =?UTF-8?q?Changed=20the=20TDateTime=20detection?= =?UTF-8?q?=20part.=20Now=20date=20and=20time,=20with=20optiona=E2=80=A6?= =?UTF-8?q?=20=20=E2=80=A6l=20fractional=20seconds=20and=20time=20zone=20(?= =?UTF-8?q?e.g.,=202008-08-30T01:45:36=20or=202008-08-30T01:45:36.123Z)=20?= =?UTF-8?q?are=20detected.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/Pkg.Json.Mapper.pas | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/Pkg.Json.Mapper.pas b/Lib/Pkg.Json.Mapper.pas index c2b0203..e0195c0 100644 --- a/Lib/Pkg.Json.Mapper.pas +++ b/Lib/Pkg.Json.Mapper.pas @@ -276,6 +276,9 @@ function TPkgJsonMapper.GetJsonType(aJsonValue: TJsonValue): TJsonType; Result := jtDateTime else if TRegEx.IsMatch(JsonString.Value, '^([0-9]{4})(-?)(1[0-2]|0[1-9])\2(3[01]|0[1-9]|[12][0-9])$') then Result := jtDate + else if TRegEx.IsMatch(JsonString.Value, + '^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\.[0-9]+)?(Z|[+-](?:2[0-3]|[01][0-9]):[0-5][0-9])?$') then + Result := jtDateTime else if TryStrToBool(JsonString.Value, b) then begin if b then From 6d5bc4f9af5832830b380d4b1b93fa8a682c0891 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 27 Jul 2020 17:37:41 +0200 Subject: [PATCH 042/129] Fixed type --- End To End Test/EndToEndTest.dpr | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr index 07933c6..bc825d4 100644 --- a/End To End Test/EndToEndTest.dpr +++ b/End To End Test/EndToEndTest.dpr @@ -39,9 +39,9 @@ begin OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; TDirectory.CreateDirectory(OutputDirectory); - FileName := TPath.GetFileName(FullFileName); - Console.Write('** Building E2E Test for %s ... ', [FileName]); - JsonMapper.DestinationClassName := ChangeFileExt(FileName, '').Replace(#32, ''); + FileName := TPath.GetFileName(FullFileName).Replace('.json', ''); + Console.Write('* Building E2E Test for %s ... ', [FileName]); + JsonMapper.DestinationClassName := string(FileName).Replace(#32, ''); JsonMapper.DestinationUnitName := JsonMapper.DestinationClassName; JsonMapper.LoadFormFile(FullFileName); @@ -65,21 +65,38 @@ begin if Sucess then begin Console.ForegroundColor := TConsoleColor.Green; - Console.Write('Sucess!'); + Console.WriteLine('Sucess!'); end else begin Console.ForegroundColor := TConsoleColor.Red; - Console.Write('Failed!'); + Console.WriteLine('Failed!'); + end; + + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Blue; + Console.Write(' Launching [%s] demo ... ', [TPath.GetFileName(FullFileName).Replace('.json', '')]); + + Sucess := ShellExecute(0, 'OPEN', Pchar(FileName), '', Pchar(TPath.GetDirectoryName(FileName)), SW_SHOWNORMAL) > 32; + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Green; + Console.WriteLine('Sucess!'); + end + else + begin + Console.ForegroundColor := TConsoleColor.Red; + Console.WriteLine('Failed!'); + end; end; Console.ForegroundColor := TConsoleColor.White; - Console.WriteLine(' **'); Console.WriteLine(''); end; Console.ForegroundColor := TConsoleColor.White; - Console.WriteLine('Press anykey to continue ...'); + Console.WriteLine('Press any key to continue ...'); Console.ReadLine; OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; From 1493b2e67a131adbbdd09d270db8821468d71aa9 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Mon, 27 Jul 2020 17:37:41 +0200 Subject: [PATCH 043/129] Fixed typo --- End To End Test/EndToEndTest.dpr | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr index 07933c6..bc825d4 100644 --- a/End To End Test/EndToEndTest.dpr +++ b/End To End Test/EndToEndTest.dpr @@ -39,9 +39,9 @@ begin OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; TDirectory.CreateDirectory(OutputDirectory); - FileName := TPath.GetFileName(FullFileName); - Console.Write('** Building E2E Test for %s ... ', [FileName]); - JsonMapper.DestinationClassName := ChangeFileExt(FileName, '').Replace(#32, ''); + FileName := TPath.GetFileName(FullFileName).Replace('.json', ''); + Console.Write('* Building E2E Test for %s ... ', [FileName]); + JsonMapper.DestinationClassName := string(FileName).Replace(#32, ''); JsonMapper.DestinationUnitName := JsonMapper.DestinationClassName; JsonMapper.LoadFormFile(FullFileName); @@ -65,21 +65,38 @@ begin if Sucess then begin Console.ForegroundColor := TConsoleColor.Green; - Console.Write('Sucess!'); + Console.WriteLine('Sucess!'); end else begin Console.ForegroundColor := TConsoleColor.Red; - Console.Write('Failed!'); + Console.WriteLine('Failed!'); + end; + + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Blue; + Console.Write(' Launching [%s] demo ... ', [TPath.GetFileName(FullFileName).Replace('.json', '')]); + + Sucess := ShellExecute(0, 'OPEN', Pchar(FileName), '', Pchar(TPath.GetDirectoryName(FileName)), SW_SHOWNORMAL) > 32; + if Sucess then + begin + Console.ForegroundColor := TConsoleColor.Green; + Console.WriteLine('Sucess!'); + end + else + begin + Console.ForegroundColor := TConsoleColor.Red; + Console.WriteLine('Failed!'); + end; end; Console.ForegroundColor := TConsoleColor.White; - Console.WriteLine(' **'); Console.WriteLine(''); end; Console.ForegroundColor := TConsoleColor.White; - Console.WriteLine('Press anykey to continue ...'); + Console.WriteLine('Press any key to continue ...'); Console.ReadLine; OutputDirectory := TPath.GetDocumentsPath + TPath.DirectorySeparatorChar + 'JsonToDelphiClass E2E Test\' + 'Test Run ' + s + TPath.DirectorySeparatorChar; From 59467be5cb5a893a8a7e55692ddf11b5317e5db5 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 28 Jul 2020 10:49:30 +0200 Subject: [PATCH 044/129] Bugfix for Property Annotations Property Annotations is buggy in Delphi 10.4 --- End To End Test/JSON_PAS.res | Bin 5804 -> 5124 bytes Generator GUI/JSON_PAS.res | Bin 5804 -> 5124 bytes Generator GUI/uUpdateForm.pas | 3 ++- Lib/Pkg.Json.DTO.pas | 47 ++++++++-------------------------- Lib/Pkg.Json.StubField.pas | 26 +++++++++++++++---- 5 files changed, 34 insertions(+), 42 deletions(-) diff --git a/End To End Test/JSON_PAS.res b/End To End Test/JSON_PAS.res index 8acb3aa22558e188627a9e762ee2bf80f229a217..471d72dc613cdf3c2ae43f108c2f95015f48d0d2 100644 GIT binary patch delta 232 zcmZ3Z+oCZ+foYTQLM2A&vcw{VM4!y!5-Wue|D>$c|IT)Yen06-E&`~Uy| delta 876 zcmaJ=-HOvd6t=oofru!0rEpM?1Zp0j*%V7x%dU%sHhAMznw->;ai+|iEGx1U#0L=a z1m1hM58$ggClhO3u{X)&{Cwy8&V2bA{doQjZohl@{mI}u8{E5-g#o|}6&g{V3rh>E zC6+WHGGf&bLI$NQtc}jBRyUJzTMV8CjDV_2!{GY$QFeDrpEk&`d=K`OKv|tCLQ~>~ zwAsPtXUqAUy+q8Nn`R|N$tQriQ6&kjV7~g`h}o%D7ib(%bW%_;g51Yb=thjdZXI*A zj$MZJ%YEetLS!(2+bbi5Zt z!pS7Oq|^mjMz7|$S36FF6|RNqvoOlM2+nVLP2$c|IT)Yen06-E&`~Uy| delta 876 zcmaJ=-HOvd6t=oofru!0rEpM?1Zp0j*%V7x%dU%sHhAMznw->;ai+|iEGx1U#0L=a z1m1hM58$ggClhO3u{X)&{Cwy8&V2bA{doQjZohl@{mI}u8{E5-g#o|}6&g{V3rh>E zC6+WHGGf&bLI$NQtc}jBRyUJzTMV8CjDV_2!{GY$QFeDrpEk&`d=K`OKv|tCLQ~>~ zwAsPtXUqAUy+q8Nn`R|N$tQriQ6&kjV7~g`h}o%D7ib(%bW%_;g51Yb=thjdZXI*A zj$MZJ%YEetLS!(2+bbi5Zt z!pS7Oq|^mjMz7|$S36FF6|RNqvoOlM2+nVLP2(aSource: TArray): TObjectList; + function ObjectList(var aList: TObjectList; aSource: TArray): TObjectList; public constructor Create; virtual; end; @@ -27,11 +27,6 @@ TJsonDTO = class(TArrayMapper) property AsJson: string read GetAsJson write SetAsJson; end; - GenericListReflectAttribute = class(JsonReflectAttribute) - public - constructor Create; - end; - implementation uses @@ -172,29 +167,6 @@ procedure TJsonDTO.SetAsJson(aValue: string); end; end; -type - TGenericListFieldInterceptor = class(TJSONInterceptor) - public - function ObjectsConverter(Data: TObject; Field: string): TListOfObjects; override; - end; - - { TListFieldInterceptor } - -function TGenericListFieldInterceptor.ObjectsConverter(Data: TObject; Field: string): TListOfObjects; -var - ctx: TRttiContext; - List: TList; -begin - List := TList(ctx.GetType(Data.ClassInfo).GetField(Field).GetValue(Data).AsObject); - Result := TListOfObjects(List.List); - SetLength(Result, List.Count); -end; - -constructor GenericListReflectAttribute.Create; -begin - inherited Create(ctObjects, rtObjects, TGenericListFieldInterceptor, nil, false); -end; - { TArrayMapper } constructor TArrayMapper.Create; @@ -202,16 +174,19 @@ constructor TArrayMapper.Create; inherited; end; -function TArrayMapper.ObjectList(aSource: TArray): TObjectList; +function TArrayMapper.ObjectList(var aList: TObjectList; aSource: TArray): TObjectList; var Element: T; begin - Result := TObjectList.Create; - for Element in aSource do - Result.Add(Element); -end; + if aList = nil then + begin + aList := TObjectList.Create; + for Element in aSource do + aList.Add(Element); + end; -end. + Exit(aList); +end; - +end. \ No newline at end of file diff --git a/Lib/Pkg.Json.StubField.pas b/Lib/Pkg.Json.StubField.pas index c72b366..27c8f70 100644 --- a/Lib/Pkg.Json.StubField.pas +++ b/Lib/Pkg.Json.StubField.pas @@ -14,7 +14,7 @@ TStubClass = class; TStubClassList = class; TStubField = class(TJsonName) - private + strict private FPropertyName: string; FFieldName: string; FFieldType: TJsonType; @@ -147,6 +147,7 @@ function TStubClass.GetImplementationPart: string; var Lines: TStringList; StubField: TStubField; + StubArrayField: TStubArrayField; begin if FComplexItems.Count + FArrayItems.Count = 0 then exit(''); @@ -161,9 +162,6 @@ function TStubClass.GetImplementationPart: string; Lines.Add('begin'); Lines.Add(' inherited;'); - for StubField in FArrayItems do - Lines.AddFormat(' %s := ObjectList<%s>(%s);', [StubField.FieldName, StubField.TypeAsString, StubField.FieldName + 'Array']); - for StubField in FComplexItems do Lines.AddFormat(' %s := %s.Create;', [StubField.FieldName, StubField.TypeAsString]); @@ -182,6 +180,17 @@ function TStubClass.GetImplementationPart: string; Lines.Add(' inherited;'); Lines.Add('end;'); + for StubField in FItems do + if StubField.IsObjectArrayField then + begin + StubArrayField := StubField as TStubArrayField; + Lines.Add(''); + Lines.AddFormat('function %s.Get%s: TObjectList<%s>;', [Name, StubField.PropertyName, StubArrayField.TypeAsString]); + Lines.Add('begin'); + Lines.AddFormat(' Result := ObjectList<%s>(%s, %sArray);', [StubArrayField.TypeAsString, StubField.FieldName, StubField.FieldName]); + Lines.Add('end;'); + end; + Lines.TrailingLineBreak := False; Result := Lines.Text; finally @@ -253,6 +262,13 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' end; end; + for StubField in FItems do + if StubField.IsObjectArrayField then + begin + StubArrayField := StubField as TStubArrayField; + Lines.AddFormat(' function Get%s: TObjectList<%s>;', [StubField.PropertyName, StubArrayField.TypeAsString]); + end; + if FItems.Count > 0 then Lines.Add('published'); @@ -264,7 +280,7 @@ Lines.Add(Name + ' = class' + IfThen(BaseClass = '', '', '(' + BaseClass + ' if StubField.IsObjectArrayField then begin StubArrayField := StubField as TStubArrayField; - Lines.AddFormat(' property %s: TObjectList<%s> read F%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); + Lines.AddFormat(' property %s: TObjectList<%s> read Get%s;', [StubField.Name, StubArrayField.TypeAsString, StubArrayField.Name]); end else if StubField.FieldType = jtObject then Lines.AddFormat(' property %s: %s read %s;', [StubField.PropertyName, StubField.TypeAsString, StubField.FieldName]) From ec57b5bc6a8ec9f10f723cd6af6401d9e634a463 Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 28 Jul 2020 15:20:10 +0200 Subject: [PATCH 045/129] WIP --- End To End Test/JSON_PAS.res | Bin 5124 -> 5124 bytes Generator GUI/JsonToDelphiClass.dproj | 3 + Generator GUI/Test/JsonToDelphiClassTests.dpr | 25 + .../Test/JsonToDelphiClassTests.dproj | 121 +++ Generator GUI/Test/JsonToDelphiClassTests.res | Bin 0 -> 96 bytes JsonToDelphi.groupproj | 18 +- Unit Test/DTO/AnonymousArray.pas | 54 ++ Unit Test/Helper/Test.Helper.Helper.pas | 45 + Unit Test/JsonToDelphiClassTests.dpr | 76 ++ Unit Test/JsonToDelphiClassTests.dproj | 787 ++++++++++++++++++ Unit Test/JsonToDelphiClassTests.res | Bin 0 -> 96 bytes Unit Test/Test.AnonymousArrayTest.pas | 62 ++ Unit Test/Win32/Debug/dunit.ini | 25 + Unit Test/Win32/Debug/dunitx-results.xml | 17 + 14 files changed, 1230 insertions(+), 3 deletions(-) create mode 100644 Generator GUI/Test/JsonToDelphiClassTests.dpr create mode 100644 Generator GUI/Test/JsonToDelphiClassTests.dproj create mode 100644 Generator GUI/Test/JsonToDelphiClassTests.res create mode 100644 Unit Test/DTO/AnonymousArray.pas create mode 100644 Unit Test/Helper/Test.Helper.Helper.pas create mode 100644 Unit Test/JsonToDelphiClassTests.dpr create mode 100644 Unit Test/JsonToDelphiClassTests.dproj create mode 100644 Unit Test/JsonToDelphiClassTests.res create mode 100644 Unit Test/Test.AnonymousArrayTest.pas create mode 100644 Unit Test/Win32/Debug/dunit.ini create mode 100644 Unit Test/Win32/Debug/dunitx-results.xml diff --git a/End To End Test/JSON_PAS.res b/End To End Test/JSON_PAS.res index 471d72dc613cdf3c2ae43f108c2f95015f48d0d2..43d6a84394928ca7141e3c566cc074e98e164a37 100644 GIT binary patch delta 17 YcmZqCXwjIUz_?|jq7KVuZTrue True + + C:\Users\Jens Borrisholt\Documents\GitHUB\Delphi-JsonToDelphiClass\Generator GUI\Test\JsonToDelphiClassTests.dproj + 12 diff --git a/Generator GUI/Test/JsonToDelphiClassTests.dpr b/Generator GUI/Test/JsonToDelphiClassTests.dpr new file mode 100644 index 0000000..09fcd1b --- /dev/null +++ b/Generator GUI/Test/JsonToDelphiClassTests.dpr @@ -0,0 +1,25 @@ +program JsonToDelphiClassTests; +{ + + Delphi DUnit Test Project + ------------------------- + This project contains the DUnit test framework and the GUI/Console test runners. + Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options + to use the console test runner. Otherwise the GUI test runner will be used by + default. + +} + +{$IFDEF CONSOLE_TESTRUNNER} +{$APPTYPE CONSOLE} +{$ENDIF} + +uses + DUnitTestRunner; + +{$R *.RES} + +begin + DUnitTestRunner.RunRegisteredTests; +end. + diff --git a/Generator GUI/Test/JsonToDelphiClassTests.dproj b/Generator GUI/Test/JsonToDelphiClassTests.dproj new file mode 100644 index 0000000..74624aa --- /dev/null +++ b/Generator GUI/Test/JsonToDelphiClassTests.dproj @@ -0,0 +1,121 @@ + + + {A67BDFF2-134E-452C-9DE4-A58F042739D8} + 19.0 + None + True + Debug + Win32 + 1 + Console + JsonToDelphiClassTests.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + . + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\Source\DUnit\src;$(DCC_UnitSearchPath) + _CONSOLE_TESTRUNNER;$(DCC_Define) + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(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 + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + JsonToDelphiClassTests.dpr + + + + True + False + + + + DUnit / Delphi Win32 + GUI + C:\Users\Jens Borrisholt\Documents\GitHUB\Delphi-JsonToDelphiClass\Generator GUI\JsonToDelphiClass.dproj + + + 12 + + + + diff --git a/Generator GUI/Test/JsonToDelphiClassTests.res b/Generator GUI/Test/JsonToDelphiClassTests.res new file mode 100644 index 0000000000000000000000000000000000000000..743599575b02e97248bade49ed2e3eabafe25a0a GIT binary patch literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& literal 0 HcmV?d00001 diff --git a/JsonToDelphi.groupproj b/JsonToDelphi.groupproj index 5f74507..eaaace7 100644 --- a/JsonToDelphi.groupproj +++ b/JsonToDelphi.groupproj @@ -9,6 +9,9 @@ + + + Default.Personality.12 @@ -35,14 +38,23 @@ + + + + + + + + + - + - + - +
diff --git a/Unit Test/DTO/AnonymousArray.pas b/Unit Test/DTO/AnonymousArray.pas new file mode 100644 index 0000000..221c864 --- /dev/null +++ b/Unit Test/DTO/AnonymousArray.pas @@ -0,0 +1,54 @@ +unit AnonymousArray; + +interface + +uses + Pkg.Json.DTO, System.Generics.Collections, REST.Json.Types; + +{$M+} + +type + TItemsDTO = class + private + FS1: Boolean; + FS2: Boolean; + published + property S1: Boolean read FS1 write FS1; + property S2: Boolean read FS2 write FS2; + end; + + TAnonymousarrayDTO = class(TJsonDTO) + private + [JSONName('Items')] + FItemsArray: TArray; + [JSONMarshalled(False)] + FItems: TObjectList; + function GetItems: TObjectList; + published + property Items: TObjectList read GetItems; + public + constructor Create; override; + destructor Destroy; override; + end; + +implementation + +{ TAnonymousarrayDTO } + +constructor TAnonymousarrayDTO.Create; +begin + inherited; +end; + +destructor TAnonymousarrayDTO.Destroy; +begin + FItems.Free; + inherited; +end; + +function TAnonymousarrayDTO.GetItems: TObjectList; +begin + Result := ObjectList(FItems, FItemsArray); +end; + +end. diff --git a/Unit Test/Helper/Test.Helper.Helper.pas b/Unit Test/Helper/Test.Helper.Helper.pas new file mode 100644 index 0000000..b3c806b --- /dev/null +++ b/Unit Test/Helper/Test.Helper.Helper.pas @@ -0,0 +1,45 @@ +unit Test.Helper.Helper; + +interface +uses + Pkg.Json.DTO; + +const + DemodataDir = '..\..\..\Demo Data\'; + +type + TDemoData = (AnonymousArray, ArrayTest1, ArrayTest2, ArrayTest3, EmptyAnonymousArray, MailChimp, NonObjectArray, StringTest, UnicodeTest, WebAPP); +const + sDemoData : array[TDemoData] of string = + ('Anonymous Array', 'ArrayTest1', 'ArrayTest2', 'ArrayTest3', 'Empty Anonymous Array', 'MailChimp', 'NonObjectArray', 'StringTest', 'UnicodeTest', 'WebAPP'); +type + + TJsonDTOHelper = class helper for TJsonDTO + public + procedure LoadFromfile(aDemoData : TDemoData); + end; + + TTestHelper = class + + end; +implementation + +uses + System.Classes, System.IOUtils; +{ TJsonDTOHelper } + +procedure TJsonDTOHelper.LoadFromfile(aDemoData: TDemoData); +var + JsonFile : string; +begin + JsonFile := DemodataDir + sDemoData[aDemoData] + '.json'; + with TStringlist.Create do + try + LoadFromFile(JsonFile); + AsJson := Text; + finally + free; + end; +end; + +end. diff --git a/Unit Test/JsonToDelphiClassTests.dpr b/Unit Test/JsonToDelphiClassTests.dpr new file mode 100644 index 0000000..ce2b1e5 --- /dev/null +++ b/Unit Test/JsonToDelphiClassTests.dpr @@ -0,0 +1,76 @@ +program JsonToDelphiClassTests; +{ + + Delphi DUnit Test Project + ------------------------- + This project contains the DUnit test framework and the GUI/Console test runners. + Add "CONSOLE_TESTRUNNER" to the conditional defines entry in the project options + to use the console test runner. Otherwise the GUI test runner will be used by + default. + +} + +{$IFDEF CONSOLE_TESTRUNNER} +{$APPTYPE CONSOLE} +{$ENDIF} +{$IFNDEF TESTINSIGHT} +{$APPTYPE CONSOLE} +{$ENDIF}{$STRONGLINKTYPES ON} + +uses + System.SysUtils, +{$IFDEF TESTINSIGHT} + TestInsight.DUnitX, +{$ENDIF } + DUnitX.Loggers.Console, + DUnitX.Loggers.Xml.NUnit, + DUnitX.TestFramework, + Test.Helper.Helper in 'Helper\Test.Helper.Helper.pas', + Test.AnonymousArrayTest in 'Test.AnonymousArrayTest.pas'; + +{$R *.RES} + +var + runner : ITestRunner; + results : IRunResults; + logger : ITestLogger; + nunitLogger : ITestLogger; +begin +{$IFDEF TESTINSIGHT} + TestInsight.DUnitX.RunRegisteredTests; + exit; +{$ENDIF} + try + //Check command line options, will exit if invalid + TDUnitX.CheckCommandLine; + //Create the test runner + runner := TDUnitX.CreateRunner; + //Tell the runner to use RTTI to find Fixtures + runner.UseRTTI := True; + //tell the runner how we will log things + //Log to the console window + logger := TDUnitXConsoleLogger.Create(true); + runner.AddLogger(logger); + //Generate an NUnit compatible XML File + nunitLogger := TDUnitXXMLNUnitFileLogger.Create(TDUnitX.Options.XMLOutputFile); + runner.AddLogger(nunitLogger); + runner.FailsOnNoAsserts := False; //When true, Assertions must be made during tests; + + //Run tests + results := runner.Execute; + if not results.AllPassed then + System.ExitCode := EXIT_ERRORS; + + {$IFNDEF CI} + //We don't want this happening when running under CI. + if TDUnitX.Options.ExitBehavior = TDUnitXExitBehavior.Pause then + begin + System.Write('Done.. press key to quit.'); + System.Readln; + end; + {$ENDIF} + except + on E: Exception do + System.Writeln(E.ClassName, ': ', E.Message); + end; +end. diff --git a/Unit Test/JsonToDelphiClassTests.dproj b/Unit Test/JsonToDelphiClassTests.dproj new file mode 100644 index 0000000..a95978f --- /dev/null +++ b/Unit Test/JsonToDelphiClassTests.dproj @@ -0,0 +1,787 @@ + + + {A67BDFF2-134E-452C-9DE4-A58F042739D8} + 19.0 + None + True + Debug + Win32 + 1 + Console + JsonToDelphiClassTests.dpr + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_1 + true + true + + + true + Base + true + + + . + .\$(Platform)\$(Config) + false + false + false + false + false + System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace) + $(BDS)\Source\DUnit\src;..\Lib;.\DTO;$(DCC_UnitSearchPath) + _CONSOLE_TESTRUNNER;$(DCC_Define) + JsonToDelphiClassTests + 1033 + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;svnui;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) + Debug + (None) + + + DBXSqliteDriver;RESTComponents;fmxase;DBXDb2Driver;DBXInterBaseDriver;vclactnband;vclFireDAC;bindcompvclsmp;emsclientfiredac;tethering;DataSnapFireDAC;FireDACADSDriver;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;vcldb;bindcompfmx;DBXOracleDriver;inetdb;FmxTeeUI;emsedge;fmx;FireDACIBDriver;fmxdae;vcledge;FireDACDBXDriver;dbexpress;IndyCore;vclx;dsnap;emsclient;DataSnapCommon;FireDACCommon;RESTBackendComponents;DataSnapConnectors;VCLRESTComponents;soapserver;vclie;bindengine;DBXMySQLDriver;CloudService;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;FireDACCommonDriver;DataSnapClient;inet;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;TeeDB;FireDAC;emshosting;FireDACSqliteDriver;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;FMXTee;soaprtl;DbxCommonDriver;Tee;DataSnapServer;xmlrtl;soapmidas;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;emsserverresource;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;TeeUI;dbxcds;VclSmp;adortl;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage) + + + DEBUG;$(DCC_Define) + true + false + true + true + true + + + false + 1033 + (None) + + + false + RELEASE;$(DCC_Define) + 0 + 0 + + + + MainSource + + + + + Cfg_2 + Base + + + Base + + + Cfg_1 + Base + + + + Delphi.Personality.12 + Application + + + + JsonToDelphiClassTests.dpr + + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + + + + True + False + + + + + true + + + + + true + + + + + true + + + + + JsonToDelphiClassTests.exe + true + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + classes + 1 + + + classes + 1 + + + + + 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\values + 1 + + + res\values + 1 + + + + + res\values-v21 + 1 + + + res\values-v21 + 1 + + + + + res\values + 1 + + + res\values + 1 + + + + + res\drawable + 1 + + + res\drawable + 1 + + + + + res\drawable-xxhdpi + 1 + + + res\drawable-xxhdpi + 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 + + + + + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + Contents\MacOS + 1 + .framework + + + Contents\MacOS + 1 + .framework + + + 0 + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .dll;.bpl + + + + + 1 + .dylib + + + 1 + .dylib + + + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + Contents\MacOS + 1 + .dylib + + + 0 + .bpl + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + Contents\Resources\StartUp\ + 0 + + + Contents\Resources\StartUp\ + 0 + + + 0 + + + + + ..\$(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\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset + 1 + + + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + 1 + + + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).launchscreen + 64 + + + ..\$(PROJECTNAME).launchscreen + 64 + + + + + 1 + + + 1 + + + 1 + + + + + ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF + 1 + + + + + ..\ + 1 + + + ..\ + 1 + + + + + Contents + 1 + + + Contents + 1 + + + + + Contents\Resources + 1 + + + Contents\Resources + 1 + + + + + library\lib\armeabi-v7a + 1 + + + library\lib\arm64-v8a + 1 + + + 1 + + + 1 + + + 1 + + + 1 + + + Contents\MacOS + 1 + + + Contents\MacOS + 1 + + + 0 + + + + + library\lib\armeabi-v7a + 1 + + + + + 1 + + + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + Assets + 1 + + + Assets + 1 + + + + + + + + + + + + + + + DUnit / Delphi Win32 + GUI + C:\Users\Jens Borrisholt\Documents\GitHUB\Delphi-JsonToDelphiClass\Generator GUI\JsonToDelphiClass.dproj + + + + 12 + + + + + diff --git a/Unit Test/JsonToDelphiClassTests.res b/Unit Test/JsonToDelphiClassTests.res new file mode 100644 index 0000000000000000000000000000000000000000..743599575b02e97248bade49ed2e3eabafe25a0a GIT binary patch literal 96 zcmZQzU|>)H;{X347|28cOhBFu5dZ(r#Sp;Y!{Epe!r;c>&k)4m3uHM0X?F%!AS)QE O%YcEC1!e#vkO2UW7YiT& literal 0 HcmV?d00001 diff --git a/Unit Test/Test.AnonymousArrayTest.pas b/Unit Test/Test.AnonymousArrayTest.pas new file mode 100644 index 0000000..5d82fbe --- /dev/null +++ b/Unit Test/Test.AnonymousArrayTest.pas @@ -0,0 +1,62 @@ +unit Test.AnonymousArrayTest; + +interface + +uses + DUnitX.TestFramework, DUnitX.Assert.Ex, + + Test.Helper.Helper, AnonymousArray; +{$SCOPEDENUMS ON} + +type + + [TestFixture] + TAnonymousArrayTest = class + strict private + DTO: TAnonymousarrayDTO; + public + [Setup] + procedure Setup; + [TearDown] + procedure TearDown; + + [Test] + procedure ItemAssigned; + + [Test] + procedure ItemElements; + end; + +implementation + +{ TAnonymousArrayTest } + +procedure TAnonymousArrayTest.ItemAssigned; +begin + Assert.IsNotNull(DTO.Items); + Assert.AreEqual(2, DTO.Items.Count); +end; + +procedure TAnonymousArrayTest.ItemElements; +var + Element : TItemsDTO; +begin + Element = DTO.Items[0]; +end; + +procedure TAnonymousArrayTest.Setup; +begin + DTO := TAnonymousarrayDTO.Create; + DTO.LoadFromfile(TDemoData.AnonymousArray); +end; + +procedure TAnonymousArrayTest.TearDown; +begin + DTO.Free; +end; + +initialization + +TDUnitX.RegisterTestFixture(TAnonymousArrayTest); + +end. diff --git a/Unit Test/Win32/Debug/dunit.ini b/Unit Test/Win32/Debug/dunit.ini new file mode 100644 index 0000000..0a7d9be --- /dev/null +++ b/Unit Test/Win32/Debug/dunit.ini @@ -0,0 +1,25 @@ +[GUITestRunner Config] +AutoSave=1 +Left=312 +Top=312 +Width=508 +Height=505 +Maximized=0 +UseRegistry=0 +ResultsPanel.Height=174 +ErrorMessage.Height=75 +ErrorMessage.Visible=1 +FailureList.ColumnWidth[0]=120 +FailureList.ColumnWidth[1]=100 +FailureList.ColumnWidth[2]=200 +FailureList.ColumnWidth[3]=50 +HideTestNodesOnOpen=0 +BreakOnFailures=0 +FailOnNoChecksExecuted=0 +FailOnMemoryLeaked=0 +IgnoreSetUpTearDownLeaks=0 +ReportMemoryLeakTypes=0 +SelectTestedNode=1 +WarnOnFailTestOverride=0 +PopupX=350 +PopupY=30 diff --git a/Unit Test/Win32/Debug/dunitx-results.xml b/Unit Test/Win32/Debug/dunitx-results.xml new file mode 100644 index 0000000..4e66db5 --- /dev/null +++ b/Unit Test/Win32/Debug/dunitx-results.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From 629f1a6d03f62812798f44854ed76a6a332e63ae Mon Sep 17 00:00:00 2001 From: Jens Borrisholt Date: Tue, 28 Jul 2020 15:35:51 +0200 Subject: [PATCH 046/129] Bugfix for string generation --- Generator GUI/JSON_PAS.res | Bin 5124 -> 5124 bytes Lib/Pkg.Json.Mapper.pas | 2 ++ 2 files changed, 2 insertions(+) diff --git a/Generator GUI/JSON_PAS.res b/Generator GUI/JSON_PAS.res index 471d72dc613cdf3c2ae43f108c2f95015f48d0d2..43d6a84394928ca7141e3c566cc074e98e164a37 100644 GIT binary patch delta 17 YcmZqCXwjIUz_?|jq7KVuZ Date: Tue, 28 Jul 2020 18:00:30 +0200 Subject: [PATCH 047/129] WIP --- End To End Test/EndToEndTest.dpr | 3 +- End To End Test/EndToEndTest.dproj | 1 + Unit Test.7z | Bin 0 -> 4287979 bytes Unit Test/DTO/AnonymousArray.pas | 4 +- Unit Test/DTO/ArrayTest1.pas | 54 ++++++++++++++++ Unit Test/Helper/Test.Helper.Helper.pas | 61 ++++++++++++++---- Unit Test/JsonToDelphiClassTests.dpr | 47 ++++++++------ Unit Test/JsonToDelphiClassTests.dproj | 3 + Unit Test/Test.AnonymousArrayTest.pas | 45 ++++++++++--- Unit Test/Test.ArrayTest1.pas | 77 +++++++++++++++++++++++ Unit Test/Test.ArrayTestBase.pas | 38 +++++++++++ Unit Test/Test.TestBase.pas | 38 +++++++++++ Unit Test/Win32/Debug/dunitx-results.xml | 30 +++++++-- 13 files changed, 354 insertions(+), 47 deletions(-) create mode 100644 Unit Test.7z create mode 100644 Unit Test/DTO/ArrayTest1.pas create mode 100644 Unit Test/Test.ArrayTest1.pas create mode 100644 Unit Test/Test.ArrayTestBase.pas create mode 100644 Unit Test/Test.TestBase.pas diff --git a/End To End Test/EndToEndTest.dpr b/End To End Test/EndToEndTest.dpr index bc825d4..8d4b4d5 100644 --- a/End To End Test/EndToEndTest.dpr +++ b/End To End Test/EndToEndTest.dpr @@ -14,7 +14,8 @@ uses System.Console in 'System.Console.pas', Pkg.Json.Mapper, Pkg.Json.DemoGenerator, - DelphiBuilderU in 'DelphiBuilderU.pas'; + DelphiBuilderU in 'DelphiBuilderU.pas', + Test.ArrayTest1 in 'Test.ArrayTest1.pas'; const DemoDataRoot = '../../../Demo Data/'; diff --git a/End To End Test/EndToEndTest.dproj b/End To End Test/EndToEndTest.dproj index e6267a3..0fbeced 100644 --- a/End To End Test/EndToEndTest.dproj +++ b/End To End Test/EndToEndTest.dproj @@ -100,6 +100,7 @@ + Cfg_2 Base diff --git a/Unit Test.7z b/Unit Test.7z new file mode 100644 index 0000000000000000000000000000000000000000..481aa8d6577699532b72f564c09533a10177d562 GIT binary patch literal 4287979 zcmV(oK=Hpfdc3bE8~_Bbh~5&WZ9xD40000b000000002>c9(MF4eP)KT>vJ4yaH4A zTPP&!93sVd z_kILA@O7}M5E`+z{vy?!sWPL`!34S_+)YNS*PMWHI>1^ObcYR4Zgp{$D&icvNV$;1 zZHFq8)t{A*kor}L+v~CadCvK_g)@JlBVDAR*-uzfyWc0lV^UUw|%HKtaKt0(O-C@kq znMYd2Jb6Iux|tW_T>$j=Icw`6v)zkEvO0Qt#iqvKz@8wG(NF{;*$p`8)gG%>{Z@73 zBNOaRaAr^kv@q}#+PX+!R&B)9(yi0)7rK7Ly$EjQziIK@QrSLH>MjHL^#d#ZeLQAv zAMW|yIiF#3i^N>%Rt5z=ZtqfwH)P{4%zC5OT_VSc@q@lW-GW8#h_Nhh^Qdb-P+Fnr z9Yu0c`>Y7q^72?S*FI>iO=omc2JV12}h@uup7^eF#rWPIY)Cy7Pa zBIhX$2d}K!cC#JIzjgbMgqF>+#NOs8198v;7=(w}T2|v)*nkF@d#U%1&{_`)N1HJj z+qV6p9)c5m&t6npn`gmUL$hwlj{iq@l}lN3h{K*46onJ%OS$l)$j*lzn~HC1I-R3F zH8cD31pz7n7rB+flSpV2K&3x{`;_Qt$n;^t8LY@KSqZ*Zwohj5S!%vP^iujK+Ge~HSh?k+h6dGhitKg5{pI&Q)Dr4ADl zjJG58Md!Kz(eg1eKX#aG!+iIOc6i7sWi~lwt%IDJ zISZ@1@*L;f_kT?qOPUj`co6@m`Ggl9;w9ioYkkHG~ zW|3pih^y+_tWJ0<-TK42<(OA>(oX?^7fT42whZ|5d>L$gSt11~@}9rghTg3=W81tC z^t=b~H+>5vN3=%H@45YGO0VLLc9Wd0Abtzay^xtg;_c$CJ?P*Xb1W|t;qeUg-E1lEFvEu{lp}bAiXatYqN|YUT*wWM1>@yL zD_Ud!mdNzT(B@b3Q{chQ)D$tVM~UuXa;m^Qf$URfQ_cR6iS2e@fVwXvISZsJ8yM?+ z6xY2GIZIj;e$L#N?D6zVxFMkbkSozql#jcgO8x3fb_ylSo4$(r$|t+cL05R#^cL*$ zUA8s6Nnaksh}2T#S9bFV5~Wqt7nU3BOl4_zE5tP<8{dwPGSb)L)SwS-SdjE9ls`cT zmJjv4&$1#LXoPy-_Fi^V{zQK4L)Oha{`w&)f4x2Ng+_m5^M6g%FbfWk6LnioX&r1z z%`QDOoHnmJXe3F*TNEk|^2h=DY$jT#M*`Yq!$`*>L{JYqtRJ-hK{j9py8~H-UPZG$ zi=jhi0TPED9`f$yc$=tZmGh^%L@BaL_6QfB{Vn(r6Hj=hMIK|&9x{pLoq$vb=@tjM zqtO$=^N-!t(|eLMgMbfeHZ4%&hz04i%-C&9x|43#_J1#GFa+ppo4^`Q4;gD%@61>f zJxvFSGiJGu{MpVuH2)xkUjy3AR2Y2G-CjKyUh$*h!Oz`7Leam-O!r-QX z>J2`9(OWyfw29xB*oPaSO49oDZ$7IFrmZLX+Ses808M02fV>n;CUV~V2YQ6tt_o+0 zGelJrh(B^>P#<}*PSxc9x1I)2Mkh%)S}jpfNz`kBwW3i!#LIlv5R^Q+Dezw;8j&aE5>iyWm6xWl_6&5q2tZLL_h14Y4b( zL-(hym=Iy>wxoN`hf=l;ObPyRIg^mdt0PIA+<3LC^#9R!P_$bCLwzO6U-n-3=(*YY z!;%HL?i=3SQp*xLD;inLk>>3G(!YZ}ul2}lS{Zl7%nxG9*XHh+Y*f(mvag1uNvCZl zdfoQ~a)+y$@y&7YW<0UH+6xF(P;3C(p34d54)C=ho*N1@Vv)#)tJp(v@+O8zEVCC^ z(>nE3Y4`*4RZ6Lst_)8R$94;Oet!VI^zC2R8~S$9Uyg!iQ)&GExjpW)1QXr!V$vY3 zRV|@dWMJXKpb81RNa8Uz!pGaY4K*i$-1I9#hpvRz8R_Of-=sEU<}zjN2{3Dxaw9G$gVzN{Y(4OKEH3dYsg>Et0Ofs(waFkE+Kv=I3Ji z;*ss_zY+t~LHezNv5p%@dY>T6y?HHnMo(lz@jH9nT`R*11bj9%_A(SDGMcj7dI9r#@HMlKW8FRA8Beb;w`rpC`7{=4^g(h)rla zj~=(-H%C@cjRUIIvo_Ar1jPzbzc>EL%$re7Yz14WWG=4?&6X^II^nq>cWz$K$sMBA z{U|Ehh`=B|!L*o?-pdt~?dD|__tvztI>a`koq=NB!!S)=$ zs4>kW;PIaQ@RBU$biP`NTxUI{Law%}AJ#so!=uk@qd+{rbWBb+OX^SHAMVNEZP%nJ z%+1noMm4bwYlYKen&ufhr0{Dj@Etxsw>st_qHe=_OP%y>5h4Cgs<&Wu*%7muH4{aGAEjTgDY-pc@ z&Mon$ybw<6iJp?Db>$zd!vKs6g?j`sf(adVcH&~{P9j_NA+|&h{e`m(3GzWF3y=tn ze61e_QiUYR4Y6Xdt+dT)Rbbwav$t^A(y>tjKWkI;LGTF*aV*+rUBi-oXG7wd9)$E8 zOupwr+3mV+)Xl7Fsp(*O zyDHiCf&^{@r8#a~uH_C9B*VNrz-o{C;)t}PCA*@qXK=M?hRbR8CkqB=geNO298Xo~ zVvk!VxX6o}Cv`;4Nj}X-y|>)7FE;Cc#OSBGfSnGnB6svIrI3BpCB-*^MfkYAz`H5p zSi?q(4W9E3UK#N|6P<;%%ScJs*6>G}#E!0Zf_WMj*Yl~(56cI%EFLWlrt_uI(FXP zA%%b=@({qw6c5+n4VM5IsZxP9tB7C`^5W>o&67kS^WxY)VoO4*70R84V58%Q;36J&>F~Os$QWvc`>V|pMYLVM(Lw%Y?w;mz?_3P%hC=OfmvbPa2QPYxYC*hMymKzM;mgtI`BLo>$vLMWr4cikU z8b@IZ98jj_M~at@{dckV`>p-rJKISLV01i}M;~yvAL05F=DPTT)H%+^@&JC{m5fpP z<114axEU~~n%Yz(XCPXkTMFo$Y+21|Vlc%6#itR~x5=X*zTZl_Gn#)9ja(@gpZO{C^K^a+`%z`;bzLmDsd>w%1~cl}7jYaeXU zaDp!>Hv4qe3bV-EY2bS%PEuETv3$;>Z||yKy9(J0OomN0z%3(&`fl|yTYt~Ch8*$C zLio{;v~+FxKdCL&woOag`xMC&nq`Mla9wG37+GwFqAYJ{!(mc)bNabV7^hEIVe3Zu z3S7Z?Phs?x?s{LS_`W$?MYqKPq0%8AocwyGMfD}W_?CQJj#(ng$6XD=Qu~8bT4(4k z-R6eH-tUq;pYAgb%Et-$g*~SQ3*>|qhF@w}!YPZSAU5V@wsRXDhMPD9Wvb7WBFYEF zw!U%iS@6lVPu2>TJ-R@46W{2B_s^1n2U8?CcDp6Ca|)qld!_xAO@2;v1pC_mJigXZS_w>NAOh&> zS+mz`b?w;I3)M5qrjCvNb@#tm@h-a0=_Z!-K}vP|HYg@Q@QVtdXrNByVnX6)qAlo* zf=jqmh%cLV_xNw`7v~Z9yuveTEwAL17oo)Xz?7I~@|r|GA7me`lAr zHHvro`d?erWO!!(b~UjB9&DdGrG>MkcSrUSl)w~`e~(h1>69AFW6iXZr||AuE=8jRq8 zi#8~${Z~rkDQ&1P0_UfP0BU*=R7`I>@r5J@SXiJ~V z{VC-@;84rLj;-Na;&lE!RkboBGYN=LyF^a6y~aaRJPbnnGRwl7QSy+7!p|zWW@5JW z@o2v@&WqpJP46eEg21aNGEFqetCh4cGEt4Mlv@<=-|x%yn;P>`E^BSc&b9Ap``nf# zza(g+f{H+Co~KfN=Q`)D;f6>5u=8mNTGgo{i|?IV->4)O zH=Kx3 zG9sEBuj&$bDIdO%YXb$@UA`R0w*B1408t;q@8~yFTwT1@Ce8Y_7zpPvYp%A2?aEPYkp!&Z2>nxxqk4;-X;h}bubjeY}@ zC%T#ED$*ds!(|i`Rea+mN=k6EZXyMNU@1HIm8l$E(XpjHODfrKku9MVn={a)i((bS zn4Ll!{M&Ve$$cTb1 z!}Xyh|92})?}xX1A~ZRXAtAo*2B%A=`1gK9m+q*N=i6e_f{^WJJb_t;0smKj$ah|) zOP@Z&aj*PIk*|QV{Qn&vf+$50J&UDVDHU1BRp#~5la2V*EfNVPqTK_44DK~*__0`u~H;r?%G5&wAz&Vi0V zXTx&Cei!CzIAnB3@92X@Q5*5ZF48wqHW<*0X(V{fGvpMuspm_;r?N#&Ep`6w(M0!hw5q8A)z563u@aRj5gb4>RgM? z34ea4{2Wg@ol47+vND+DjGji(kCrboh!ly9&*&ZlCE$lkS<)wC!(0Xbt=K~9MopFR z12Q&#on#>D0nIo`tIG-T<4*M|0w|)f8Mg0k>Lq!)pXFZ?hU53xdk&_wx70u5xDs7m zzszO?^iL=-^z0lT{AzZ`gzd3uKg9*Ar9*sZtM6^9PFd>B<7}NfviKhwh<5BTi2~+w zw!s0#u`W4`A^5U@ioBa`z<=mt*>`8xO+MZ`0et&jDNp$jGj{*e{F+OJ z)J?}!duAP`{Igo!$aQj2*dmW}-=*J-B0E^Q!%#{$k-T<$00x#Bah*{}U_tG)MylmZ z-PhD4uw#;?cqEmf!PJ}f)1mbP#RR!F#i)u+_cc*5f>an>qPG~)=LtKMSM{d*bk{CI z0tQTn8V-u^j6wyfX} z_HiD>SCtFQ`&I+X4g32Gt1WzJAk(rFtevH^B_^J&}@?2pxuoz0_51iLk zps%qHT+x-nOfb1E#<=rUUZ+-==}->n)Gxi`V@?XoH=PX^@UhorEnB&Thz1&i4!JDM zCC1DR3vqR#b}?aJwAz%TUj~3h;xuL>}fH_fgWzdt41CL)g5a@)-@igVy&0tL<`? z%HzrzbpsY{iiRv@ZFLlvErh|GiJf^=4VTQ0e>fnW)PJh57DOxO$#Z8EleULOo0x+^ zn4V^43G4e|P?-L;f?4|sGPZ7l`TLApa-nTMdZ1;$D8ahIu-j?_G2o6(VWii1&r>oe+fuK&E)Ne98ndGz4EEJKO5%TL}! zDh9Ux$UK^PqvNB-{_yec3OqP1$!lt_63~aPX>zE7W=j(=hZ3zm67t+4TIsb`$~2X; zf!qx1e~!$Z&P3oZLtSFtIWS+wICjMjNVmZSNLTo# zM1kbSNbSS40VH?#p0Db%ZiI-I6xyWpHHI6++nnGF567Zngi=vVq z5!nsG>a7Mz8$~>c!=mIWZ;LyQ8=j7>yx^sRl6>soFgh1exPW}pKlHu?saj>P9`&9T-=KpjKhS091^LTT=MCzuoPYw4?z~|?aG`l$*gkMUrk_GB6AE#2 zL-<5#YAl(}aM#|S$;Lh$))ptKI$VS9Y2c41uBGsx(r~m?*(yY7^{tj6IP<*OP*c)t zk=mj1R}MEWRLqJ^x`A(rmf^;>scJC&wL>~|2g-MEQ+~JC4HAh9d9XmUdh83$qH%T%`0wA}&H)$N}ko5IJlkNd<&ty5=R{ct{uY+E7V!60VWhRq>HQ z%88^qSkB@MX`BZdHn-T#p00R0G$=4p1P#tKV zT_cU&WtYCPfF*)>By7~9l@Z1w8Mwx;Z?r0~r_7X&2i$pGe*=B;$25eog`uzZZlIxe z!^6v}an9vA(1>**72NvK@%8$Dv+~zLd)?<2A%BT`Ud9oUEGjFk7Q;~hp^*F5fFO)} zd|k?>rkrf9GSX-T{0Pq}ha!VM?lvn6BqfA8g1aFJ)gZ>^_M4BQCb>^W_+7>~X=ZCQ zwaE_U7VJ`FKlp7(0hI+^RtrZWg<_7Run9*u% zoX%{}h)+XO4IB#IQoPg9$GTw*ugL$lj&PEKH|dXaNkeSYoKY`I$Esx`-H6>V=~a;@ zb+m#FT56b3&nJt^u+pX-fpTEs(lY8-#FUucUk!9P9u>fnq5=QT=@#l$>hZ+IQp?BD7tQkefwUG$av;RuTBRYGIFU*t~mZ0wfz721eq&M%AU7e z7W5TN9V*SSc>-y9zk zb%jvW)`Bock2HE0G?Ma?D8XUn*#1zu2w%Oqz%sP zo#LV|DsM86Is&o*iiVQwS1~2BN5(E4rHPB`cX~f-_Uz*8c%sI0-hZ1$_x@B{K!}_F zA+GHGijjrXj0w|@CNK?ZT^GQxcTsEM9ntK>_K}2yU$wGDcP-7(-jLuL05B$?FWcA4 z9VuZtJZGSw76s{V6b!>h^HtjcRl=(+#deS9Lxo4D9szHUdA9}H8S;4HSo~* zvMfZDJYH15J2Mm=3U(#)mAS4<p>FE;T5qDfw}f>3ctdV*-*acnlGvU=Jc zlL?w@ULt<4Vu-bmMk%avJb}a8$sZJmyvM7`ELj;Vy6P76BaWSvCT{@q4JM+Ip@r2| z&)4)ZbXJ1u`<$i79rP+xqG+S%2!Pfk3sWE}(v2HSBO(tAlaX+n8GqJ(PE-@_(56fe zYu>-$frP~yTLguRg!4J~paJohWwV8SE&&~QJG6ss$Fs?+X|+lzU@Qley?s3N{;C;pL3K* z_h^F~iu&wQWUAv@D6N>zSaF|s-J7Oth6-M5g7mWvvkQX6$R$#?tVhmM3qfY~YyuXc zt~)bPqcO2(t@UT9$?MU&qy41D{`6VYRwoJfYDmy7rs4u_rFL7O*`lY)~~D z!<<**SuHr9?WN-<8V~9-k zoVYPl@46f(ygZq0l~=65MIx@YB9ZvoONT?=VEa4%yQ$p5{Yw&0MdFA?4#axgllz-w zKa`PTW-d&oU{SLUMu#o$zI7riQ)4W!4cl#FjemjY96c2F>#Y4*L=-Lb5i(h+n;$IFkl551uZ-eHSZF2 z{-g+se<>{@)Py<~ykdRe+-*}|4-xwluxsAOilS-$c{We~b<7X!il9q!o|7s4{w9o! zfaXOLA>S>Y&SE=wyp9oa#f@G=plK_h-6Szny5GL}HvSXR(b8z0J|ahT z+dJZ$pRI=4T&cNEqHeLRH%78k;=BuT9^nH7K5+0v&d+2Ug0dt=j(R5+5c9O~G24Yn zL(=Z`$l0m;&zi(%Z~9=+(PCUo5^i$appdIayXZ~+-QSkb$T7UME3%gax&7hGImjYu zFmohJa0U}eKSkWa4{B6WPakKdC+t&fN*&MwfWozWyx}Z^1!Dr}gpYW>y#&A*ycbR; zHbX3>1r(J~MXd;QK^VPja2@A?DhDbW2>-GNy|Wjr+QW6)mf;eFS$L%r&iNX+nfoy% zLmzB7|_T{raJLGKb$l^eVGO~`otQHqG85@(2Jv@8ZJIOe!F zW>)5uBV7RJOtDg_*KzmtXXWmm>`n5No$4ZGHb6~<;|ftE$PkWsHR^q|6M$!@Dod>X zOy*~cLuvctCBOFV!|0VP`7oo9S`-jHt91~$X0pnaa2ufZ<|=!&%%kQ=2YYZY0gJ|( zIt#vnJBgaPR%s1HL0A1-b#AjA#xcue9r)Hn`HY9khfKC%k7e}i-9hXA65gIb;7bNZ zuKy8K6AerT);=pQke~W$7}atdyCI@o8FU}9EH&*!pt~Rl4aqSLu(e?vg{w>au~f0+ z>jEu9{))BI^8#RV>!ba8o&wk)AEnOS`XqLrtYi;Jvt-E^pd_yEMwP3(mpmw1_xbJo zmro3C7tJ~JArRm5;2qL@o-?*h3uj{eUTT1+9sZ*B+EC6O6m=(i8v1Fp@uEIN>B7?= zvQo=WowmLKo+KVN8yE_p)Hd%(M7n2_b+B=2Z6>feu#!}!dMbA1Iz9S`h0uF%?rXsI zoN1=w7pimGSdVdb%^3LWW7EGRO&u$7H>N3Xl7cRA!2-x;Qkmv_pYU_k+chZT1{Eru z+IxDi^kD6e1oy z3JZxjvC;9!pSWiXm7L>HCQ0J#q2q1KHu1=*0n!Nb%QEuA1#MDUC`|f;LyM2vD(4au z7GFVk<90M_KVsq-N%C`-yiml0MNr8gcgH=}+{O7Keq4cYLOJezycg;$7>{_?^^|VuiCgMY$6CC#KrZ9Gjdxpuy^e3q}VjETw zA+t`eaqZTW+a(h zhuRH#FwnT_imQN8CVl{4Tax|Tmlt(ze^^k@e>>x1It>k!GkPLLL7Qs*HDxKBnb#h3PpI_$(^yNBgeghQ>+NH8ur{+MzD#| zb3#o(L?+EC_TUM1CRVhuV1vGnBzysto~kM}E|~IcKj`JHG?a6lu3cT}n`P^hiWs4* z6(;lreDQ2@fR}ieQ5o9Bp5ak%m zvWjz@FY#f%i9p{|9N))im zll%h#gTUwWTb(}^qZO!NQ*)r4`9-tWOB4S@54s_pWsSpMlB!lEuSC6`67lp{%m+&> z`1JsrmN2c6JK(rhyrZWtpOQpBFcQpVGGh7S&NlYVOt1||7c}KM9~19I z=s%_1-uXu&!RGD?*&8thr^$%Bg9qqL+Fq^Zwh)f@XgEDq5mh69Y3CJZGvTTHC*SlA zr}0!#16^;|@@2O#@3gW4kF`e343I=FrYqU^98 z1`?#e(%v!L<00+Ac9+(J_pRjPBr~@iDQkmUJvQpFgrPJRIE~g?V|;Q_uAWng%L*7} z;1k(o*}bP5lJ|>Uh*N_(M_G8>7UO0|LJz(@y$+n`dQ#<|ud97!k~Zw!rEhobTq%wD z?=1xpcmeC;jfTkax$=|7rTSPN+1Ku-H0cR{I_vQPWocqO2r|JDn{q%(#ZW8_)YF>A zmYh+15?f6NV|2e{zPBl#n6L-vzmbQ6DT$Rc*uz9VwB8cj(OCWuZy%qA8BzwJM0J(3 zbdqjFa<4tPpgHdgB%V8y+~vhF#FShUj2qq0F$Owpv`h7HcFh)(>2mzO^}c~)O3)6pvxGZB^bn@pAIwxfvh+5KIfQcS^Jv_%cJtqt%~3k#?db6CH| zSd#EcMiu!|{%>`|{Z7FASELL}d&K406%=&NH{DKQ30pWmd}=p`#HhionGjYnK{oad z&l|(TG1jS(oU*|fjMUYzH$T~Mvz8@$KDymXi=HF6(_BIrAaISt7S6@T1O~fKax&>E4Vw(A0o3GYJA{eaI5CCqT8!44@xvV%r|6iB zZ(P%hQKlz+QH|1MA|E3OSRQ5nGPM#+e$2&*2u1v3^jrB zGPHFC&rR5;4E}-OlgmF4WO6W-QL_;$P6y~Xbij9_p^l`fcOiyib=Mg4ptNVIx8Y3d zZ%lvJ4=3)Y!Lu4Li2PAn)cU!gSQQOu_ak1v)@VKsEx==PQ{}y%c5^%Flgr$l-}>S5 z-M`44h?>-p(q0Dgi8s?ZinZGNi`G51=MhH`JF;gDq%BQ5iLx%2!ifv1oaY4=X(oVO z(`xZNJ3Ur8*#q0uOAqIapV6?_*)(&%q|32TeaKj}!$ei|-3BUrEzG5Y2o*$k$rORM zAqGFaf?LVq7v`U^M*{J@B=R>zy428j;hL{$-|!FxnCKfi(*v?72qiecXGEor&Y8zA&AOi5C{Pl{O#gJuBp!;@`2wzqH zwjzi#<^!Cd$MTsRf5wp)38GPTjqL~g(Wm09qToeafGVo*QMME!d2rCcn6~kxMK-TU z0`g<$3&Ly-Mgkempsv7kb)WeMK3DBa2lMovlhk6$zqVAY^wL`l_?I7XA0|H`Pg;h# zo#QH=&cO3P^Fn?{IB64X|EiqnCW5JC^tK%|C+6 z6XMiRUG{$uL({f6h|Wn@8@k!crwAjqP~(6sOyUZMhFSGSu^UQA4iYpILdq3IsihE& zo=a$s;S2m35Ac$#iD=H*oKP+w=VBs=g7gIPM}2heL>Zaq*2)?s9aeW_9na}EHC;dT2F7*GY+OE4!pN|Q<>F|{;_!3~O_ zh_%L7zyddbxG&uX(}*-h@s6#Gpj&41?Qt`JI}Jj?-=s`%S&K^2~F2VT1B;| zZ72HS>tT|S^_-%CGt#@G`--aE?N+`^Z_#dmke)AJKe^(f8k*^cDk7JxDTcE@_Rwvn zQs2Im&P8|bgBOob;6?=uGZ&#z1G}qIA?ur*+w-*tSdJ$H)ze4v z-Joe2DeNFUvAt;#TQT~?$LaBkKzCS0c&}j%+RdJ+v!w2o|1s8tmQ`DMj{3mK?|?D{ zwfFyuvB{#66fo$??3V6fh)C=jvmysNK>!g(`wAh3DpMzCGCv91 z2u@3ug7-0-k_l09sb^gm;=wswx~EJb_n$m>AK=40d!2APjn4L?)e(lBOr*nh)oU9) zW2SJLSmnO0G-7nbbE$wJBt2SBUAwe3PsW~VShkohhQVF3%$NiCSy)+)wIhwB7<_Z#32&JJr`h8;C z!1}uOQ(IsGjpYc=(JaT$@J_~CD{cP^qG)5hn#A0JoBBU}BlS_*OKq4aAQ0z%f+6s| zAwh)1BeDhq<8e3*4FXv4&vij(_xr_8xk)g0Q>!DYPKGgdev< z@kH90@k8^Bfgk7#)bABsmUMS793LQ3vac~UU#O#n9&RBV+|%@ zqL5=BLt_1$@}cZbT2Z<=<;nNs`^-g|z+(#Fl0wQP1&`*f_);^jqE~_ImaS5$JGguH9VMPlEo>Z8+2+Q@ z7}c+TbETlzv=0zKFjexdw;b-MUnwd>KZGU15j{>jRK2YE+SJG#y+6}cd$N#+&TgQs zjVWq;I0d?m{vkdvlqBdU#fKcLzC40)Uk`vq3IAsm;R_pE027q{x}fX}%-E=+)ki4j zIOjJbnV8!;t%g#K4H8t6=QgeUxZz9lpKh8^!t^}-D$(}~V@_fJXotd_MHZ0cJt!k= zpn=X)zbAqP5embk_0?5l+;+cZG@?B?PSd~c=hjJJMYq);IP3ck)P<3%4sMktGXhdN z;5;J3rLB;^JsxxPEWTI$^=11c+`F1~mlFq#ljz34dGP+PM;-^CDPJ9g*ShTL$65Rv zc@!rx2%BtM;QWKEq~zYX5xbR?x)f2crH4kuwsUbG)3DB)Gr&g0i{y;<&;) z1Q@(ZqGQ~d=Q z%Hd=T%=vk$w3L}kNXJ;|CIPj;Vf05$vGl5405`S+CA=zVB~-+V31N_j^gpT(e1&x~ z#a!KS$8|gnT-7_`6r<1ZOB>AcCPw+VLvPB8gg7;Ti&CUJYKtCq@3j@i&M{xv!!x}Lxlz47VFlJ~MkH1w#IXQBQ>HS? z#eq}%?Ifggs*M>!P6!0Wgo4EqGIsph&)U~FkE)KaRR$&PCLY{!pLPH&K6@n_7zapb5nK~IIKcX_F{jjYH>6b!L+uRNE^e=OLZZet`RLn3Iigfy^M1~yjP?JSH_Algq@bzJR= z#FO@cL$z}F;=gQL<-_0phrr|@p6xljHFM6!PN%Xjf9t_!l)vwj%D89)CXG5FqWcpb zI63P8F%aNiJs2C%&z+F-Qu`Wb8xtx&{yxyvJ)p_s=W;iEJ47K#Jmz*wIO3Ok`#}KE zX4fMB7TWt-2A90*PPLQiQ}j0yz+V4h$A-Q-&B;>+D#p2(A=y&9Vo^IP#KK3{{j_;h z@n5@C@|@TZDAj3Q>3&th9L9@^Eg)7PeY~I+ML;bTO^7d>w${Up!YQ1+$F-#r^#|r` zj5L%*)`&{N6=89?&03>Z&Hf`rzaqmP10RC0G4imxYx=SM?ncT@8uzWIuEfv_)^v@d z4a*w8V6LX}o`|z>{x?DWY9ffOspDY)9SMAO;Q%aX&W239^e}#I-41>W%)BXR(0wq(^}@J@VlxOYo1Fw%nY z^3@~5Y|8WMc;ugcVN7U$$qp0A{|f|g1^>CYqshlNEGe!;w)kDOe3lqwCxRaXL%dnp0H$I@ z1o(tJ;Ba0h@h~i=)l#%*d3HYB>F$Acv@;i@kp%_xy7^=C_J)G8~KD^o868%*)Yg+@%L5>qLMav6iAb0Y1g z2@{$RKFOX!MX#C(S&D2u&mg&#M8M#s1o+feG->9T4 zAh9*>EmWZ!U0M3*`DvE7Jim9|W%jZ=_y93L&cFQ6dWQ8QC>z;uGOujcmPB|}WD|oV zRdql3xxDBNYK#1WmBL>37c57dBRN@drW#B(6VJO2i)PD25pf|*S%0NX0~4$)z)Q$n z46WQC1#A9ro2V`CJLl9d!&q+oku^#iv&g-qLWk{drUhf}Nlh(ci9RyvP|TCud7#r6 zAYGSPK;JRPo=f`g((j2d&Du{!mK}xhS;@sTZ>>=5$Qk%rUZFmC=40x2<%?10R0HM` z1J2aZbp{7rtxujb7iqdkQiZN(N~1_QEN#5E<0%O=(7$SD{GRh`Us5Aw;#3vGWD%ep z=&8u(Ql&~++^cg2Ee-ZwibcJFlWXb8*1Yt28R!esYo?DP1sL?e;_X)aQb_1R3` zrLUc{)V*qi6*!a@iifrZ10TuMN^gpg_^S9QE=1jqbC`A|D^3`O|w;|4Wm|65$Tb)xGM_TNQ)pYiBXW zZz+T9i+WoI*OI4YZZ!`f24sOHxHw=$eO?xgyh&w9s$s%(Li!1t)<5TQ&t?(h0HLdh zLc%~<+I+Bjb0j0Ui5JT($5Zwo^_dGfRQLvzyzCDRuwb1jX~T?SM1i4b>yJElaQRW|E3{t5N<7=l$Pj z-fw$%I*0oQP6_%&c%smS=xr(xpJFXq+_=SKLn#keV?Dnj1l#ohiLcme89Qx6{zF*^oE@Y7_YlO#;2LCyQ}xh|@&^LlXpd zZ+51)YuoP_ry;&O?@)_o)i_E3 zimNZ&Hiqw70uqnQ{J8deudq493=FcCQ`J%xQtL_42Vg!b$pNXWq(Uo{=Vp_q`Fg`m zc##^cleu?tJU=Mxgxm=5Qm2^UC-YA0u3B~Dv;eMf83lc2^@@LWC3;t>Bde5M!EjZQ z*2M_I*d>u_Y*H=v-=#MO2Ryc`m2Y9z=D!;zp1L^U~0&#Wsq_HW03OrU1bDD5)a z7BK&JHitLR*bfQkHC0isS_rdJP>z7+ZTd<}n}|4j48tPJI^DpEc;euz1_R{ z7}{oG){mMRh&;S<#cUs@^4VeLUy-Dg!hWonQH8-ucnm=`PM3)H$)`Y(s)_9skR7@5 zY{bea`;UGR!u)v@y}f^7jPY5YZ5+OSY{|qL^ETH)?GgOe9Kd|~0(*vZ<|XTS0@sTFR0-KJg^)l)imkU2!=q*N?&3 zpZx+o6l6qtLG){ylFxjG<=zL`2?&smTaH)jjxT*5CV^}VJ$S`Zi(SaAKrPkLZebbXY-&y8U@?bH@{}U+pi=LzCX#war*ESL{TyLbk4y6g z*Y8xj9me*YlF^>{r%>yb64Yue6cyG#Ya(~ok9TZL)#+V(2C=0@pe>lSi`|ejpd1lr zhBlKF;TT%iZ|)$l{D*7^v*qWVI3|}TX`saX$nBCh7E!y;_4>6M?3rvhr5tj9)njaO zl3Xhp~*nRq0%;kT{es*olnTZ%mRdisi!e$_QRt_vn^4^b$}A(c106GE9& zNDn)})qN$kX6pzM{$kb8^N|WkE+1N{OeCSRy~@I)mmYPV)Rx~tUx!p(0V-KyMl=bP zFqtx1gf$OHqjrN8}ld zHFLgK4^g%UX^dG@N^2=w_5EO_((&4yv8JhhQAAuTjub04=w_Wnu?5$_Bn<^`@aYh^ zu);OI#}`mWKAkrFxWmrQ39w5G@OGHriZ!7qJuEx1MrvY^HW-Y90+Ti^B~=?y9KbI* zIjidSWl<2wGE~97G=GDobX|9gNz^7>I~tT7M<~0ZwbH1iRD~c9l0GlQlQ@Pm{8I44 zDywL!^VBNgbaulE(JJxzsdM@QK)R9e2Lozb*dW`3eue%T?IO_?GCmEmx^K^5xA*L7 z>kOSnT5AB9mpjc@e;Jgx)(o9K*6Olp_X6!MDcXt^KNgCriHsdx*P`=AI?-x~O=&-d z#^N47jQQAa0r#cETjlBSawSIZ}Ra1)(_Our~FE+C5a;@m& zquXl&0dS^lqX}1IhIR$e3vn3@kM5YSv@-Yf&Rk*bLe5o(qUNN0T&uU^(RPETssbWq zua*>bwuZ8%SR?!?sK6F+G^aBhcD*&fW$8 zit46HdEXJMNuFEi*@0_4Ww?5NS(yI7PzAk~3eeYe4tLql-buALE20$2A?ZBQGrW17 zf&itd)G&P%8Xig|w}zdy=7iYu-s>W>$8uXYn0TCCI#BP7bJK5=$yeq*Xh+LE3dx}7 zve3aYckwjyCVHIP5=Q7EqL9opl9#0yfW_2;?0Vr&xWO$Ui>*MEJi){NMOXoC%NgmA z%@YcxAH07VP7Ljk9?EdOS`r8T`E0josX?q!G;{<}v`Qxm;4_KpZNN&cQK9U;?sEd1 zA!aCSG)>Mq21?U2z=CY60inbq6$g2PH~bv%f_+EH(iS$OBNsR0LKw0?tvm0hwM8Ks z@5j!gmrJ?m-+!oy>6ka+A*}AH*Q&KKZT9*n%_-q9gi?MJ#24%}5ONw(fs+`y1B?qbYfz*qWi zWi)=5ZW8z3rC^N0)<4Q3z{RK=t*y?NR`4m7NKVd#jga@${=!~XQ#KXLqedN5uUYJb{ajpR$g*B}W06Nxy%gB0fVA8v6d&Qu`qQ2gv z+5RE2L;uhzCbLf0c|)d8hkNV{nXW=qq3OB2%2g*%;wudApr0PQnU)o)AiZz!2XuV& zB{*Fk?GHt#T88=dRFY~R{ng7Z`EGqg{}+T9HxjEo!(DHK$EV>^Unu%~eRWmNlJdJA z-u{#myx2k3WwDyw-kI&E)KOR^@ks!-oXq>fEiZRXqJXzhR)CJ$a($3bZkWs;W8`&G z$*n>*-EDUiqdaUkzbniIr3JJACG+Vb8IQb!xT29= z{C7knl#(>c)L)Xq2Tby3W_-o)+I;3S4+dLS%Ae^d(*INF+RuYg3)|}MQc2F=g=&7- zTvI#`a~f#Xp+8gR{@8U_P6c*e*%VcUn%T#!A0$``=Wr_(O|>l|)%0%YPi{=reE#jT zC-`<%n|vN1ia3kizhAG;dvb7p#?<#IVN0}))lD>!>@6C4GVd2yPTx)|CuJR{D9r^J z-AG(HNkC5LopNWTC>Au?YnE?spJkawDVAuEEntkuYH@pmtom+xkGi4LYQ2FeDi0CS zInhiN&W`72$BN$yug!z~_i zpE3_s!k^YO+WrkOJE zNWx()>$rdNz^eVPsM90>M_sQot67p;{_h;POKOdKOd7)NTzZv>^{xbfnh*xjo~ccE zVLq$Gf?;_q%iz@-lQAru@Y=g{89yzny*gNLLidxyhSq<^Jt7L{b6c+0NHQg|%^ihG z%_Dearf~^ZsZ}&SXH$({aDp)e@u(_rs$6wMDnI||(SbzZ96mY>ON%hhAKX+l;KhDd zr-~lBp34Z2V29Ch*6YUQ`+hro1W;F3_Js^2z1?WZ;re{Sz|I< z3E21PneRVz`GWEXMi8r{fWzY;m+Wn8f(iepwkeHb@{!Oj@)WxOy8BSq%#0H`4rCA^ z!VYCgpKkYThz2iNI8H(_$QimvejH;z@_WDqmZW6~!2trGz>Hxxjn<#W_oyfmNf8hH0n|pguAg1K0jA{j|uP}b3 zI*s(1T0(deVu5GUWY#tR=eoqZl z(ZOB8-n$#aRDdkANn_Strz0Wx;D?#TfVO`1UNix()s*cOCq5E>kYHq0Ye@o>~%1ebpyS_2H5|XyeqI@S^SVyNw(X*R!8CGe@Cb({uB72kb7$A9q@4afq;-oJ<%x3 z3b^>I&S=f3<-O=X}1`{w2-=lJVY;{zL-KmDiOYPQtG7FR*p zYD9G0-Ea_!{JJr0z3c&9AXQ*dea@(m6Sxs2UFGOXSF0L{;$2DuIGeC-pz1`l-2GIQ;c_lEQwIMP=o65Bq9$vB^7l8!(@2f40v$ zC^+lKEdfk(?bg(PSmatv!Wn=J#Onphxe9Ew(kO5v`)&dQ>tO6(8%J6w>A5gm5!=o= zzqJ)A94~B8cNu%iB@VZg1WRdgkL6`7I54cBEm{yY-9!ZF#GoA6yVl z(_1&IC`8+KowgMY>gRQHrkSrI+&B)RpY48a>;?s!24)8K2E+2G0A;Kla}%-gi%-g3 zHT*Vc>+>AcPi4)MnYIoWuP{`td%CU6AaJIJ(**I=1hYyYbfrFlqrP=CV{F*V^wEr$ zLLAWikDjeoGjAhN2Y7DH4^6Gh@D1aq zwrwi@T(P11?wkj4L;c3rcl1^?U;s`tk@n=8PI#j|acnNhSBu}!%i`y`9~d}V5_f)a zKYw=mS&NgN>GvSdooH4uTy5qSm@_v4YTW|`w$Z*(7mSwfsun@5{B1-yys{G92O0O{ zJ5x!G>P42N8mf)zw;j+FI1V~nT9QYIK2meW*oI?vF>4L zCYW7_^=^>*hc=_RX6Vj74^RzlmZ}bR6)JAnXkwP|>6#QV-WI@1szk-Ttoh#x^%xfB zUWjd}HJ&yPgFSA>EKU=2u{D}Tu#T)%LVmv4-U6K+BdFU1Fyx-W`Zg|JLO^{L;F^7e zXc3Hq()&uy#47*X+!g~5!29o}Y^t9pc=4(B-OH?ABa!$ge4Ulc23H_y2r%#A6q_O*!VF|$X1U_+Or1CEAj{KR z?QN59fQW8A^0J>8Y+3(q1?%5|_#)sdw5;2~9!JbM#HReHWwIS#s9HtB<&^oyBN=RqjI301tn)L=pu7-Qs7B2p z8D#`?!9t)!vIgsZT*hoB9)59B_kZwZaZj4(Jp&;T@Ywt(v`XKEpdK8`Z&Wn&NA5k^ zazLl%B6VlJyoa`CPmj&kj2o$Kq=fQVbMx^>{LJUKoFARrfFo+eD?jo35XGsq zFu3&BWL{bJe4{73#*gJ4nWJH>?{#3<6L3Z5NLRUj5LzB3-|B8ahQ`o6k86O~?rMHC z_q|+F$=-?6i)U%KspJ1?+g-t~=PCNp`Egf;vJlc<*#@n~e@fPdVb=S7;2HHz?%|{Q zNP^ELzX%g{$x%4Py)iRztz@dl`50ZTTgg#b9&7X#j0KNE_Wt;i1`sR=%t~TJmaL9N zT3ZiT5tvxW-5pkP!5`t!TlQJ&%Np;K;ux)2ogXRzvMXRe;*T(5v-!GCGNVOEI+{$=eCE zi;4}+K~$AAIUItXIbC!dMU&;6^U0;2{Bt~SsYq`FJZjuISp^jIMPAPF(o3`zF8JQP zxR&rnZ06lN-?X76cqk!UMMm>}SV-V;ZPFC_-CHcE^^}y^)jL9{DLp+)>Nl@MoXAv2 zf0yb+h1jeR5}!HIV6ekOaN_`^($y3o(+B-XUgt&~tf-eDP+sz#!2en#6d03g-_oxL z6f0RoS3pC$Y$acbaCWX-GMM8&92e(|>77Zzr%*D~UztDv>b6lDtjd<91$4WB~#FhXG-Tq(D_A^`WLbhfz!w8QxBcn6Kl1v;ZHfTTyDzy=R zcC4$2KFBbfzak;Q%d1O!_q#hLN@x;mu^wUNrHE zKb?oynTQ;Qh`eGKfuJwFjd+7QCpaDR87S~miX_#Zn&({F7WMnd5Thr3HjR0A7$(3c zqfHY5uh(*C9!m$FMXwhF9D)Q81EkDbW(hOIOQGt83iOe9DV3G1kR-fz>e4tg(Kc?l zXsUw@YwH>9fB8Ks%Dg4DlEtY}dc2T`uUN?e6A4{PTz%~tie9`ubW~i)gzc7tzbE<` z{|x17Oi21)pxP|as$#`A3qgM?w&dG}aBI7hFe)&PRxetC#wwvoD+wH!G5Po4)d2 ztY`uH*A=ddmj+Qv6Dn+&P*1G-r#w=8wG82~zO1uxLeNZJk$JFN_dyF%Y=k>VNduhgweva=;sKR*LV(S5qf zhzQf2nXOI;owN7*RBxp24Jz35Wp`l+Bt2GKK=n+rDv8bg-7_LMvVw!ifYH2nSVkbv zE-(CCFp!EfZ&u(hv7caV_`>;4exIUWtTgFtk`9Sulhr;=%iAZGtTAEKIXH`5Bkv6Q zaTMT;_=uGMP!`c9U1L0AiP+${fj2L>4VIF0=+VX-J?t+Z5LSoS-V3oi<##wxg>RL! zoJo#(P%WqdwMZRvNF`s^lMc&{hYOj}W0}UYc*JkPsVG|GhEatNWKWVAYlS3>vTcn> zpkReP;>{M5gE>wM1>68JmfVb~NlfZ*^hZe7US%GSRxuA7y>*>O3K`8A>EvUR{gUTL4*aA*= zrZN0Y&y&8EonGW!T;w|-vkt8(ICWhg$acoV+nFZT?YxSzyBpnnh}>n~vjZ<4#sW7F zk2guDz3A(^On{%sLwY()$48t2#1}3@{I#{<3y8byAHap8A$rLLS*PZqzjt8z>wvUd|%i%v~kc zuQ&8Pgm)v0vDM4ECu28AZ`YJ#rJ8N{Zj)Wh;Ttudi{n)-rx zkn;aq)>M$6N0@3kC<;C=iOQz*8?IT8NAL25{gW@&ONdPdtRXkOPV|kmE~U8#ClPK*YyX9}uakF{=q1O^zIPni0WeRdT(;2EFMH+FVrQ zW>Pw6V~{uJE@=KnZoq_STaVmNXT;%$iF*Nc9^t!duBrl*jDeI|PV_kf(ad62b@GYn z|0pb+%YFHt0g=s=Dw}3ZfLYXzIymH{V7+Eq;ldA+H7v(otV{_;+Br<5O5H8UmUUr~ zzKE#oE=#bMe5k9ht~lftOZm?C;oy}6q@`k5@WmEm_NJQI{voIo{GoB^lU2+3-Etm> zP}XQCXN@p~V1tx(bn@FrBfwua0ruf4%r5G`zY8G(0+((OOvLcu1IMm(X#jPrJ#3Yu zq&6cOgJ%7rwW9B&X9=?@aXp0@8nn>5q~igfyoG;HCSiYX^T zg+AH23t%}P^Iz8ogj}UCKJk}7qLn7iTIL<{sZI>p^by!%C>@uzi$L>hY}vZiIt5$j z(lTNKU4NCt@`PG)V4L~@b3O}+e@r<_zG0lKMb9GsTLPxxhVifJKp$2kbcR)2dOyPG zNhU7zi8EaUzHwU*ntCtk;}{Nb=iC=p8(#a2H{-+Nc%u24Fw8%7%%q4Ty(7^dcPFp% zuuB`vTQI!#KoT%F)g!gw7J&(^k>VyRqBH3)1xGl9bRjFtMcuhKSE_KgzrQqO%4ZT6 zDmQ5tnSpte#E~@M!Yk(CmD0Sg8#Y)cksIAmV;~`0{oY zwu4>wa|Cm{WpN`PB>Du>^2|#V*|L(+>Y0-?o60d{$(x{|E804PBB6c*$%e&)MP}yN zT@2G#!fd_FUgASV+SH?MfpnL8-!`s?|1$ZHz}>)#3(V;jErq7eR*Qb{Xq2;n`BW*g z*Xy(C<6BQM30%&06VS3X?nlFf8koQ+)lg}J1=y^x`rPq0WUw!*(5$fo6L?@-Im)sq zbd(0Rh*lZZ6WUUsx--#x3+x6nbQaBu@^B^TtzwP2a0ywO(6Nu$0h~FQ|cY2*%=$PdI z-A!UaR{ff79{@h~`rb~|A)OxfzQlCxDw_yPWO5Ic`9+|(Fk{3SpqUfiPK6pGP>05p zR^4r+%&msLIOI~#DRGGzhKa6dOn(o;Qqf%R(igzMn#6L~dn65>w2@%wE?fw(=|z=<{Jke36Uly@Iw%JOAGz zB=;C2?rV3WX?ZEAA?k)wfeP=9a%WRib}gadU^I)7u|S^!F!@MQDxsL9g93t5cQ%w8 zy|9Fv{w|xxK&dg=p1_6%J+VQDl7^*{raw2K6NaMvUUSVO*6|fdU04dJ&(~i-r^}lA z_{VZ6cyU)#oB7+H^#U zABBh0%uMrNJ{3q`_kKA@x%Y>3@Nsn2G$^qD!S$#hN)pn&(Qxu>90R`Ue{WjlEry9I z3u=JxXg0lFRIl3@gc4D#cu9aq^x8oBT-7|+tYj_{^*!7zK_}DO8R(i-bMZm6T|!Z~ zmexeD;4)|%knePbYHbMGG*;lEHdVUomz%adDziXfgMzO^ijfBRGATyWzw*Z3okwG& zaL5{wH`odZsL3MQn}3&i{ND$TRxy>!;CllrDX=ji<;#M4Dn-Ii_~TBipEJ^3bE(xTW0)_C zZwWCI0dVizN|LPn;lcgiEoe6|Lev{du#+UJuHd!BKS-A6zQ*A2y-VYYQHQDvdS(9i z*>Ue`yx%9PZj`Cq*`v`wH6TxV-}g3%ZH2-bQ;DjJy3zKhAMN9zZJ%Lvs9LL}i|&}k zK1L7#Q(`F3PDT5FqhoMf;xLvD)uw1I9&)}a)s}6EdW}75qIP3$Uo2418A9;S$tw-Y zh8f96cC)Z@M+!RQN%{o-0is)UYkCR$Z`ZS9bO*%@GhrSM6!@W*NJ?{sW=H>gaZkK${~QEW0!JAu+e{ty{vZjTkw(serC! z5cipTG>KGPDp}q0-vmk;YdiB|U5=YNGXc7*pqo69qeM;L!Xa%FC*a?Gel-U&q8d`*Yqn_~yT~Fl1H>Om z)teU~Tn!~}2AUZplSj+9?-)vrk(Sqg*zJ^^4F14OL{SLLWk=de-?om|S9N*I_)TDK z5fwIZ>tDtILTS5~sE#!uKT}b*gT#V_en2G^?YjR2R}L8%++9dYpO*hP-d%wGYW>eX zEYwJ0D)wt_oa3bW9Jr#Efqgc%oz}@*(A%EF<Q*Ht;5bM(zgSta~5bQCVW5mti;)-47+>EvzdwIzn+?pqwImQVn zq0~GQc%1-|01aLa!J1u`0V~`rH;&jN4Scn%l=7a2ryo!fcwD|xo2Uop8ba_WiO1Aye;AdYRPTK^eK@2K~n8$=F8WDJ<$M^8%P2Y|^2c`2wkX;LUgLRDXH zs%WPC$tJq#!=Z08rDz__+wKs+R7Dx(&vMfVjy)p5p3@PEKT=6`YgN#H;S$qJ z{c?MT$p_@YK^(1fno1XBe%`f*nC<;9`Z zP`I3?8iw0;U>M1(fioKRJN{5-twi-92}<|U-N$BF{b4D^)sHG$TtY53^9#S(Zpoul z0E6ie*-|ZnXK(8rcCjbRVLlu=j$DOJVIq*!Mee7|`?RjeeuFEdva3tnc%3coD%Z4w zG~3}!Mf~PE3YFMmnJw;dk^B)vBO(!AD4F@84es$Mj<~sGKr}p%>9zS6xx5nKDZX+_ z;WZSV#lIc51w!)hFd{6R<5?EK@CHuTZSwJV6~`0et-_Iv@DTm7l^SyNZ}<<@bzFl| zxs*1e=`#i?I6bRnUSt1AIMZCbhV~btg{T_bb7`f12yoyRe~Z)t2xEM8cE4d2Em!K3 z-@arjcP^eCqWKk@*_#%y`D=bHX zU7Lvbem(+l=Z`%7FlxC6KY2I*Mt3WxOnr_FkVHuzQqGDk44D9FY#C(@Db{0|qY8!Sx0Z0QNoHiCjvW;Lj39{Y2CAY;D(EgUmy z)a87{lJrmyRVJ}5>DM6!;l=Py8x~nRBCc2;ZK2U>L;KISkYodq|2W75x1F8&5iTn0D#F%Bi)bQy+*ba3mwe(;a)7ZF+xh z2@O$wehTGHxSoh}brk~=vFa>?4ik$0JE?Qy z(NVC9(*;Lg;>xzbC;wmAw9+ocj7LEMJ5^vA+AAzwEdwR`?cxJqMOp9rZ(2%nS2~`4 zxzISv>-pc9Gl^p?;Ym4 zN>3X0^;d=V;Zv@{kN4uZZ`pK&Z#tk9(O&MrxV=_@96D#8_bKvx8Q!M-1jjl^(&c?-E$ei!%7lpn9O_%6o!f*jDqDHvjE?Za?$a^Ds=C5h{}+avy#R zQsF>U)~05AD(W}31OluE|4id>ve1XKJXI?>h#FlR+9Tf%*RAVpEKZmav9b>qfyWtD z()^7eb#0D&c~*ITF{Q=Z2Jf;(U1+7k_`-6XZJJ`$D%FALHcMreB>i*ytmBZTRE0rC z)wS15bsLV{bJ4lPLpcGA*&derl~Ojgb+aO+b}?JrAk)49q8&T!i|=hD2f;1JSNay1TTtB&_ybD60xZOwTysuk_{=_Y!AuM= z)fH~PT5YhBjQf%R%1t1hmb3Ed@u4qe!f>@gID%<#yRCwO2SYk~@grb~7F1g%GUA~; zMY%1LWnxaFMh3?IbbUi(mKrkUY-l55i+S5655ovBR&MR0fe@D3U6-0hM-WTIA% z6B(GD6IBgrhuVsVB9KO02J{PKz{)@WFsM!U;>U$i{9U|NaiF?+sxOJNxil=P5Rxjh*fN>4Im=^G2oRog zbXO_%sPNXS3Q_Nr7C<9u?<5d204;d;=Cz|cB8plFj(u#K3%CXv0%#P5HM0nQQl{cy zDSmiYBR5o}C%K;6SY1Vm&cH6Z7rwd-lHKI}LRi)biLH2iESEedTxX;Rygscy1a4<@ z_59TUA0bm6W7Qp5TUxpzKS0%}nNN3)n<9O8nS3!n zO9rEAVz{7mEWKmQsJ9>4bDWfZn`YXF=l2;T+O&j>v#~4PtsZQfRe6SawrTo}Kddvc zY3;_tXyM~u$nbk{zLXo=$%VYYm)FJ~R&)YILgTU0Tz={V{-2jKRpKA35?mm(l6BE9 z86+Kf@H5&KWimxz8~!fwC93D;r0;21yIjk#Ci;$fYFdwH9k=zoN{fl-^I{4>Y=o$L_MkQc_iwbuT;hWp9f=vqEN#!X20rVP-Kz96n!Rj1;4bG_jQc);a z3Iv?koMhw=rb4mT+eCeC%evo&^JNxGZ*!cAxcoowQ*r#n71g+BJawAD0}o&;&&7vl zZ@38qfcUcv&zA}10D7O^ZM|Rq51`0wNK(A-DaO3CRTU4IN?dxr9q^}6N~!H#p=nx8 zg{JI6#dT0n-vMC$nmW5xjOVCibX5j%_i7PP-7TpJo#}lME?mu7o^&7O<3@I>+(S_` zFoxi!QuHFj@uJt8&aT{${8Zo@W4Pw2i$j6H&3SYPMLEyeaGRj zBj~;)c^+`6k!&Ni$|tl2=ynf~Gz}eEk4qSPs@pcBRTMsL!tW+FFiz{Dwx3JNH)Ijw3?w60BtA^h*-|qu$d@ zz(1o!q;__hE96jXnu;wrGg-XrJG#mu_C<$&9Zf^hr+G(3&l7K_B34%GlT@ruz>P>1 z1fimu{agIjAMpI-iFd}EoS+vwkk>Zi6^6Sz{Wiw)8jqad03e z-sH9skmTjuxbrvZZp#fa^W*x4f>pN^{eJsqAiG}4W)(G^9fgh%VIIFA@P@@XQy($J zqRpU|ij@RX62yXUf~5em5)x(BC*J+|I>STxpP&R>_kPDOwi^NV4_>0{7|)*=LxQ0d zhz)f=o8a@5z<+(Wh;7*OZ?NRyxe+yzg=>JpV5Vs94Q7 zv~|$+uA(FO)+kLE#_N(7ukW}V&!^mEC91v$F2;S)hgt=6x*%mEpT5`CwRa=viML=M z-A%HsxBPY$WZnw`n*KkBA6R$Jz*gvmkx&a28slC4##4}BW> zy{6GT6q=rCIg4EhiK*0uX@x|E=OTQhUR>r4l*ps8vcRcJFo;!47q^heyCld7>YqPl zPegk7stMg4gz&q8ugwB!phTZsUu2cQZxDJ1hkipdlxz(jxkR{2ThRmVNNltK?v|4+ zKC^=wM92i-N2wYL-BH9W^g0D5`bdptMm}5zs-PvQi7QmAd4O4i(-yPI_EZr3zJMn#|0d`*((oS>O2T zM6}WE7&Fz1)wRR}t(*Z+&}CY|gfD^vhIU&IK9y&_dU+WVIDmf$zvK_R+B)g^UhMSL zdOhbb?scp#J%p^;kZ7C)J~cJ``Be20{C_mux>OBNMtelnLWF1e1E-3QpOqZ|Pf{eS z(~7AMjXuG!B;yt|2^AAE0lC22`CBN0(QT7E-*}#}4{IQMOc>K0^~C1mHX2y4s8zke zFbaF4Ox^RBQf$OPI{;T6c%Ev3Mfg0V0)P?eFYiywX4`a8NJ?76zw;7lDn<=F6YHn6 z+Z~9Chk6afV~i%(!|B5zHo^~(#S@IR*$b?7+kCJfpL&3ZCCGgdtX3>o;~NNT;zjO- zbGR2nUvzppcn&oX#hFZzfLDl)^=$5-vb{5z3NcS=x1sz%iLLt0YcoQcL}{?+^VoQ_ zS^@YvB|GkX}q1@vbxV(sUnTVk0QMHabYLMx@T0E!dL=Brm*G#3 ziL&9caLp3@4-SS!q6<9Esl>FNz94ea_4SsHX>DeH@_ms{$Wq$^xhLzNShq1V_*eX4 z?gY|7F87zyle%=58T!XWzd!T)8&!o7#aeE|`hfbR`ZQGd;c-BVT#W`e#o5hAPU*%T zs%P-Lrh~o(40tf^d*29-3PK8A6B%n$;UHKu7F)!TpEVz53vQPWT?I_`u4x z8&3lJ0h5GD5$_;}FiO;Fm z6!Ow6*)TQ%H5DTZffNz`6Mb|0C%Elj=OC?vu;;|`F(Z9O=XDK7^15y6*Gt9Nb986b z1W3r!e;|!pzA0qvN%DrnJ|lFvL~QPctF)_A?U^J|-WRdK>Zom0%}XvIeyuf3V%xLP zbex2{?CmIXSf9duahM+H#t5)+Q_lrr_wcmI43^gd?4Y5xD(HDeYb`HVv-eZSSkKQ2 zHkW^wqxH62vSU4gHY$gx+%61*9%fE?gM?dsQcdMqf4T8Z+awid?kB9;ztDa*iK`Dy zWegUCVmM+>_&;a3#pnFknr?K=C#uQ$#e>33$r})@-S_3t8g3KoC_*J5dz{G!Olu?D zrI%%I+Vh&zvKVHwO{b+a)jL;(fIc)=g7T0CPH7M7Xi+s(f-{DX8*~&JCM$y_ z+aI)jnl`&WILeSa0WqykJ#q^57~{hpejxypwRS{8rWDQ3VuzlC7+5;9#GNf)t)SXh z=s&57qo9pdQQZE2702&pL<`*q9SOp{@FCAJf;fi_J^UcivbT{RS|{E?CM&oprY%i) zlvSMMpR^SrQ4tEVZ4RPh9qQXWMzhBOF{2Qhm(VVK46krYN%jIsp6A#uT4O6|bp-bN zmNy=wSps$oZ|aW(SszHbJ5VAiZcPy*cx<&W)U|t%Zstn-2oH}j#X*u$49qb@`U{VG zGbGZ2>@v;_M1NAbBGlLFu?vY7EdW5I?XEX);YRDK89V9!%NOIeOWhznP>2r3lMXMjtyN7UF|>(4y2@8%_qp=j)`{>r9`6 z;65{Nw02INPu{L8_dl8><=9s$d5QHrziiH|iQc%W`UW;vOGivo7ok2t7lmC)fjcz| zT_GIp^Ap4sL-DZs!zAt(%hgN|;*iOi)5*;4QQJasyJvJ;S%ClW3~7JEyGZA<5d2ya z$t6q&Xn|ydURXuSTcom^Ywq_O=%G-gFdi@smLkY%Zjq&x8nU@NwNT;#$` zejY%9RK2Hv`I3eMgJUUz9!Y;Y+m>?$keI{oDML?!S=&{3@YE<+m7r>r0dI#B+T$q2 zWwO9&a@~)YyCJ89zp?&RG82TSb%Gals{cvI^C(#)gwaiex z;RBDR-sdkK^qH<)zfOLdx!55ZJ2p0FzRyMS|pTt+HnZ?0p zRtO{$w+--U(18^S6r&Kx(}JDh1zaUB;e6ZiH)8}H#>cG90c-u=sBm*G@jZ@^b_Iz~RdqicLU1S=ZN?o990ma8mLQ6i2V7DWbM#6IF zl-{*?b)mu8EN30O|Mb|9cnQEisE42zaBjgE4(&n!IY7q0GBgNBhn$Hv(Dq1IIeHj) zQGf99xdJ|8l7#`XU>d#KcDMFbnEqUS)=B%MFh8ns1Z8Sq+~``&JK|q2$0QYH3E%r1 zTD98~SvSwx>S6N^#6=`OdcJe>cn#y}_{}#>y|8j$RV(IWSjnLD>HHeAmlmL1%qIf7 zoS$K}V>-IV4pxmUu^{S%T#B`=$Ra@5HL+fybfw1W2>NV;#XqF!3%N7`x{w^heBw{m zC@~bL&~~;wXNmrQ=QD6zUv69`&DRJ{=bTgIIDB`!$cQ&dPc0L9@1jVubrT$$4iNKk ze>xfgX~*AIq8q8Mk)-^A-2k{07C~G_$Cl6{CG2scZvmk9L5Z2!G)zrHtrPo%<|A^$ z*M#^D)~t;Kub$wU;-GOUVNH20G+%(8wEo)1m*j>_sMGn+p^LZE(B0S`ha^c-d0q0Pm2;L02dvKu)BwSG=w@&zgn z)n7b-oxhaR50361i8&~{SRbjVcyTLx1acVefnb<-Ty|jW>vgh7!8|r_$YV^_&qJAh zAWrKW$hZ=_E)lF~F*R_2I?myQCNfB7GGm-R5zoS%?rSCyD%ly<87rDXn?UV$eW zuMe8W7opi}A@+1hlDvyzpj`~7D&(s3?amTOe%VmMVy2p6XX4hZL z%|V>MXcVWmScA6Fp5r~4It27o?_NSEPN^|nhT%RA9t#$N_<_?en%v$EvVtKE8BVnW_HJnRwT~EP00{Ql0rWj0c?Z>)I%W$E-`~h#4H+ssP z0;=k?B^-|p=%FtTTHXxxaYeg!?FiXS@Ds)`T*B8Pwh_mE8w9@k`P6K?kE zR(?8T0{3;E7s*1WJ{L@?;03n9NPi5nJn`vpH``gYcAd+ETx*s)(VQz9+~g`OP^ww* zed6=}k>@NHc@qiy`Nzld$i}TyiIKY1S2P~`*ozR@E)YOL>PIL^4@qG&c}S`dP3NM8U*7Ht;4L3kq0&VXrp z*o_|-O2k6xrH!|>t;O&__+T}m-&zDfyx{uPN&s_CNU%$PL7N7rHGyM~DR5se*=)5T z)|8VUad+$*QxmUZwMO&HqeXZg}-|Q-Dw%mN^_+lxl(_@8_+^?H^LilMtQKk z8IS-JejC5cuuRSFahRMXjpHtWe8$z>yAX7q3T_9t_;Jj~eYn!=}2o|jN-b>X!-B}9Fiwf~0 zZMt9sf)%T2Tz<6?WvggOil`9eovrM3z^ZdWU`^M5E!h-a;5$scLrI;!t*Z*_s`O)x zh28JRPNyPEKhnj;k1b#qnw)HnQ|j(ZW+XNiFu|C?{7R4th5G@tsCNBczlNNKD+}x8 z=~T~!^1?G=F#A1zvpeQYYj*&R5ysk7nPvC4#=t&FVg2?I;|Dt~1ao%zZ24H~Ez~#@ z`kDH{V0%+*>Hrg^;N;n5?qs)7>-%hsx+eYvFu^BGXJQv%pDcLhan>i2m3A>%YFYJE zJZ%uia9OX2edzRkT4nfpvHL5&LNNNmGhJ`7id#ab!;oMFQlmQ6SW;)0%-3^JIP`tf zG+lI~AUkc3!C+l(g&T?m?O<6)-1#H}sqJ-)Urdht|%f01OHc@ zWrT>IuN5Bud+MOwC!#~Lw=OpEIV`U_yBVQ>n2Xj2z2 zN=tQ;v?tr$O(b!P;KvGfVym%UnsLsS=g-9(OJ042RqZ_}2cAPMk?)2eAAD^+%5{&} zJm6d&ffG23k|p&aR0n^Z)1!IWhon827yC@z(O$zfuI#&NFu+E4fSnWZ#JZ!vccWB% zfqdwLZ}+3&`9?_bv}=)Rxq{{kL5Nove5;FaxPuA?L^>WHQu&6MS^p78BPViNF_5Y4 zXL;?;YXlqmIv!Hx<_~BKHr2eU!;Q@)Th4St!f8-(pF>Ihk z`=kyG8_k8&GgMF5wvAVO8kZPcf{rSta2Qd=igUGgV_U-8w<|0SbkIf@QSUB%uX+Fp62FDoYx25pfO|o$_!3- zNs@{BFm@u^x{Kg)RG~W&0O}8ynOFX}S8Mee_pS-L5X3dbt5KEcKs)u(+j1VBLf@aU z1Xol~1KD#p(>+(*k9^&_cqCbfBLOE#IV+k%h*gX&w6tAmGuF)#sT`V`v*XR--N+RH zL_`%6lD0>uDiU;)4-U;+Pse%oKNc15 z=nZo(NwgiE8fqcY68%zvdSJeHNXROWG}+q#$3am_k_(isgoqSYi4|3o0=XaH&~?n? z4(@RmIS3_L)g6e-%R;C~a$oEW3=%z)BPyM#FxJfr$N{VPwQ%O$C!K$-;^9@VUuqWi zUo~jQBg&x!*#30O!W5xjEkT1Q%T|Xa2MWuFl_tjU)%BxcXf^L3uboMQzJ;N%{-6BZ zX4=HKt>xBUR_T*C@_$h_y)DIv6N5c46LM$fq*^(PNBOtp=m;<|WvY5iE0>#Ig;iCt zphg_WE7tTLdUG}R7FAxi;KuME4wf{Hq~(=`@TmGqg`fjykj`9Bgj*>r2BE*!urNI) zYgh+u0Tq&=Td=-@R+V)fx^f?fTY?A@jB~|rns%XVOrw$SwC7_4y2)~7n&f3G*@?yRz>rg>iN)t1 ztS`0Ly%nLi)Xl}cYTCiCw*z_d_9;2DmFn~4zt50OXlQ??emz1nu@^JUbo&rC*bYrB zj6JX+lX#%LU(5jv1!e+<5=n{@H>RTn>9*^iSC4F2yf9)48TD^*9}Y`f|0iQR5?uU5 z$MyUYllgjA7-QUl0QRljKpn4BdjSqZhAKqh)&B8))lCTDh7qYlIOfxNFzs{Q#@V7)D*5g58h#v@i zA-E;pD%)DZ72)E5aM$Gtqahje5*vZCYafT`Y*v^{84~7;sZK`Vc0hKM90>snGrx`^ z4crI6>8xCJh^CL$74>?zF&FZJ{Q}e~JFZuCUg`5&EDJoO&BXwaPmx>c{Sj%%jkoLnD+-IWnV+p82#eCeWPaTFIes^vU zKMN}jZ?17kmWxlX^jxAP{y6J)%7rNo(%oL`|m4n3s$Q9*_}U_EIjdp3;Wa#*g81Ds$Rj2T9M~ zDysl}zO!#}qx#(w1%shf?>qpqo4I5$)S;d`0sB!+aOA#lIUJACR4}+9%%~M%T15^B zej*GO;f442i!C3=<5=NDKGW=#-&C(|CbWQ7`hd#KpjQ=RV?K5Ak=Pc4#J5st^^z*^ z*H*E9N~5VZETnn0B&C_2c+*+_@gTK8RLcX!8QU zJcboW^j#*6;ctSHrhfstiH$#`2}ZdH&eHs2Co4B*nziBAP_v`PwM=k+z?Rv0|PH~88r-seskkv#lMOS;i{2DTVRN=yfd^TN8UIG102~m zZ&G$Qz7+fj)>ufesP7U>@oVkD!;se8hBI5ye$-VV`ulZ0IZXwrezUW)u(X%kVPhzl zy@`O{?@*3>HhZIQiVX=xx&bbPZe>B>A!n#zN4;Tj^j3&ac*) zRv{$}qg5ppozA!5zsJ09r_n{pul2emhz zkok8kSBn!()StaGWNa zZFPl!JI5t^|D97@4h|F?0)XX4HGIZ_fsu?HIoxYqf+LV^&#F?;Gs0=Mgm!Sn+1xXH z{EVvrk2IttN@B*jJ=WSP4}Nj?MiC&ZC4+Z}D}auWY24~n?z6bB2f92rG?{)K(rS+mKQ3$5`IE10r+`TLGv7wz%;Hb@#})4KJ5+ z3^i;bYtoSQFZ+`YnRE1jfqx8%8v3RlSn4k;^4NKds(dEE;18Z7)yNP$EN1-3#C`lx zL5wQOcx|c`o2T2hV660>B!#srDJBh;7&lsiDoJ^7#)R69n~aPQ@j{$DD;nF+0H34V zyFxgGF^n5N^W&;t;l~=CqdC_oTZz3)r=7LQ|Lu0e7>OdcIL6KP;Cl5q;D{f4X4!1H zTx$BCi-chKGp~r5^y5z);_^UE9$({@_$=9KkSGoKLX$-v6`#Y4gMC65%`wV82 z(8exSZHRyJ{_z0C`&=d!!0hpogPsCSf2>Bjw!3e;U=tQ@GbkvlH6uJXx+Sl4_FMze z<-LHU77xhp+gFC5CuKhz=n}iy>+*>?tr)@ZiDhfxkc+lexZ;!Gm5G`D(%YOHK4XIf z389d?m!z=qausHdai7`6Y_uI@k{;(r^m!_b=rr&D0P*E05poNsl0RY(L}bZK*?v!bcA-#_~xEnb5L^P+3PJlGfoJFR6*)hS~-F!fq zppE?egJaW3{%}!VIz_{ee?r`vEZ;tRrU_mC9509laB+Z47xmDn03G69wtr^uHHTyX zo#l$*-^*~typpE1Xk5L#Yqc$PvKqNb=8f}@<)mM0-It?Y5u`9Enu$WgVOZ#R=~ZBE zCPMBxKR|6hSi$6RWV_6N!C(K6S?q@4B%F^rqHeee(S>!kQlM#I7T%6rjue7jnM=N) z-|I&_ath$2Fv63xtz}TL+wJH7LL_Igo1(}gCG%T{Cw4DzXv66~+E}c~iDTsPe5CIE zxCdlj;Z6Z?hH+PKk9`^XHM$4x@U_TR5VnW*u3oT<8dkPAL9@)nv}@EmN2)}4%w!X+M0>2wdLk_azvtBq>piv2| zEi0f!>{j-@etkcbHBlwh)|AZLD8HVBW5F(TUU1f#9}Rel@M>&vF4X+FGhw417$5E- zNe?D7DG^8cRYF64H36?jZ$d9EMC{=rp!L_zNb#Zys?p+%pzsq$NaCO>swd>A-m9)F zcfL~Kvh~$4{!E>Bdli^26*F@;4l`+2s)bopD_x|BXPBj@O9g>BU}w{<8%Efe*YYrm zi4Sf58Flq&7*Sit0w|*v`(Ra?;J)z+Fq#R=7zi@Z^2SDij?sv#mq=Wx;WwtD!j|*C zEF}`d(2gF~FUksJ@igO&kK!7Gx4~V8l2AS$Ot7v$4XWFH2EbV`^8Sh}IN?RPz*af@ z=TI)wR>^oWN8o#g=SpQw4?ci+bu}%Me=c{@M-j|aBEQ&H54BBsEn$9u+R2L9LFp(j z(DeE2XoIZ(l8S`tA~>qLBj6$)y#@1D%qd0TE7O?LX0;ESw1wVdf_kE0Z)e0pJpKhk?7yIpH%6>Y+?l)t^pprj&~ zCS5#p(Io}=g9tcXK1BCwsS}`vI?-1spJ-IK znC-fR>2=)|*U)xGHd>y8urA!R9_A6IfB5K#LA@T|{{?>It8Q&l-}-s&fP688NU`Lm z5k@$(wGv6#Q>XwYb#iGqXQ`!v3wuu3C^#Qm@&yfZ2r7!Kv06Q2%~#a;I?{BKez)zw zvX=6GBG#xg?!#J(8(2;dbd@Nv$<_jTR~Yu`H^myR@ALof(?WVzH1z}O+B@!UFyrmg zb5}{6n{1NnSTV8uoBp9~nf4=AH*Fr_-*bTTf_CeGWf5e{Y7lfh)PtEYt{vKL5-F)q!Qq_k=#F<_A_!cw|{v{OrKy{WxJb9@HGvXlU5eGalKE&N57L$;+~S^Xd-?s$@nn+-PR$ z?6P2rnZvt~R;FxJjv%sgx2Hz9NfA-^5e)HBH#)IADiq2bFZh5|qywFCA=#u1*R3e_ zU4C7OU=^%wR6RcZ=5JX~aRweWSl4dO+&N$Fp=n)Q(O-qp5)Zfw0Fqs;XznP&lb zjgtVrN%^9CNlgqz+;SD}=VFh**%I^lx`JoN%as!3o3EXqqhE^+Fcw|=<}e9EdNua| z>o6#wZmGTYhdYOP+}qm%%;+_tJ1VbpsVn>*41%HIJ4e&N*@q{i2mL`-k&3Z!Vu_pS zHxO4VHVKdy2<%H2+B!XXv|lCaAKDO(l)cH$V99rJ1yFDB<^p!>=X8VNsQ6Yc2T<^q zS7GY>>WTE&rcYidJ*-N!=!>0y#tp;ap-}7z6^qISL?H3Tqu{3Fp`X41>20MFqNOpu z>od$Wy0~n)##rXB23|m&SNz4g)qI8KY)i6Ni->j0xsIF&&5B7pt)+1f3nE|Ut0Fnm z+QaHg)WpWyOSnqo#vYqks~S&cFN{GcNay=vz?*|jSt&7gIo%h8RdntPS$8&wwU(R9 z@+khrab*n8MCuWy@GybJ3RG6yOEFg zdC|r5Wus*;Th3>bWw{&6)c-|Z?FfuXkY4P%Lc><5VY6GTTI;I!jQ`&^?2IwGC4a|N zolU@LRSmcYCi%4DVHYf9&MJ7f`*j6oRR>S?URf&-d)G(uUe#al?@i~EQ6KLccwU{U zt}gbvf_s;BEQKm{`6-!&s84FVt(s!HGPDtFi0q_C%rzb!jJKukR@Wal{BJtruZC43 zTUakim$vCCeZd^9E?N360mlm{7@ZIP#T@#$=JBYO_YmX}Y@7+7>O_ib9L+U@st6EmXJ_W}4X5UCGaf$3JRy_mJ{$q@+* zOOJ$8@QYEC3mWZY{zn;(R;^V^YfS-HrS$&Zp1$?dZBt)iW9eaQX0=LC zUdl3DVVfsNiZY;p)e~PG_;+E{Atuok`xxi82s!m8UTMD^|I2P$vO`Tl;TL?DCO04Ubhl)Z9&N_S0x+U)3c@dD;=_vg;-b$W(8KfdGA41d_5+aJ?RdJ0K;ttRmFa5S!#`~&Z^_}ogk1$NdK`TaDSH2Jmr zSasNm@}ZLkY*^DsY{k1X^&&&?S!%4MJNXW0Dc zO~I*i-xXRfFqJaWZr>P+_iU6)yM!}5``S+jcPm*8BnmupG_f3SE)1fq>@K1%ep)9X&yozdarNuawZRi`8Y z_7eMUcQ?3pM=f?o+LGU)@YUs^U4gc1F6od#0|;mm>h)}Ry8iQG3o1vYC2m)Z5vX!O zPck6b0p6QKA>~!m2wim6b0KG?<`je}hS68CYn2fNYCsO5rOx-AC$4P%3+8!d?3)OY-6+nKkNIqH7*y6Hp4b1N#1)Tg3F0zx{fIQ6DDQ!T+nYu zBfs(fUR-OfklE>HW|Az!<7r<omAoKwWw3>?4oZ^a>af zSxLl)iK|>3ZED5?Jnjz9{<9w9UL}fsSIGh!PNh(gkioq0*qrj7+M&;9NM^mUT@8

0M5e}zLiafT^u`|XY&zp`-EC_We-{1XX=M?R+^w+a%E*CE(FOag!05LoGIB- zE8^PA5-UEmvTY=yA-q+nVj0uPK?6{wFrXA4D9shiEj+4^LgMEjB7te^$kD;=Ln_tb zyfbhL9ZWytJU0;L>C2En@UyaW4Bn#jbk#wVcvt76<7$!?x{xFQVO?B?1TQBrP}o>} zP9^UUJpy}Cij2m5?>nUwwIvhaD#~!TWJWB(iFkR~u(a|tNPEE3F{(m;Z|=mC6zC?` z6MVyT&~PUqO=r5F*o-Rci-Q8R@}(#8l7%|Dj-}DBOBP8?5)WA&gd_qJ1|Z5iNXC2T zkCk`c{*H)JyV`zfoeMu>VcYBR2T1IopjBwZ0gEMHo-Lfjx`i`LiVk3WFK=<#vujoC z{Eawp^;JyYo(c?UR!XOO0y&Vb_8FN7^ zq2b=R4v^<_G7S(0fceeC`;Jm~P>8P;V^cpxIU;G79V`TC^D|7G9{xm`)8|fi;*HN% za9%V;OFtellF&UavTk_<@^5+Zl}SR{q)?(sQAcNgCxV|g`cSRQF55GpS zDH%cN=?_EP3B|o?yAl}37A+ZdMqB^N|BnL#6FXn7!^uM{&`@kCIeNG042K|9Jc8s! z6byZqVzI?)|F|n~ytyq=+kvM1-(iq|>TgySIcLp|U6VUfx>bCF4^DE<{HAqZRKrUTxOMOwG&lp?%PyAF)b==5=s16@-Sw+JG~nob;nl^ z6e?uytlk^z9h*<7M&N^$-lsDxB2LZpKFfsRoqh8+ct`dUd25Q8dxRZ`wU>b$MpSqP za7Pu#`4E;UK(g4oj=tFosP&A|VR(~=RFGH;As4wpFJ^lzGK@JEr`2KGeJUAvDPO}&2_^w+U*&=h!a`ZDomycW7$-zN1y>!%6L4le zgU!Zs9sU1vf%`Y(_6MCVC>m2&1K*;md;b~OK+_5-6g9ZR-%5wjbEX}o!&pz``1hIj z1SiO<-qh+vYcx_!uNdDHJBjIfIkVBJ%#;Zh?8)|%>^y}Dkc8Qx(bF}a5I+8^Nek1c zszP4pMfYR61t?SV5H%)YTO?3Oy0SSahYv_6^epk`v~fjZMY~{!e;X7VXM#;(#q$B# zR$rrF6kvN5Ct8P}tG9G!K7MgOFZWwVhqh-$d6tmYUedR`(|59$YcHefi#MX#6!D7o z{cJ3RUG>sLcH6aEIosl%16D8M&s_1$X0E_&qK26dApT`j8I*BCp{o+xyo_$U`D5nl z&TSSx-`PGLxd-MuuW{$Pp(7edM-#+iM*Q_FQiIj2dP;!_#I&MFX9NVVpJkzQt5ry5 zu_lA5>v&dvI81OHn&lG==IZ`zkd4hF97{R9?^;X8@xdRni0$6>A1(Z^ag{Y1PxZ-@ zGT4@FmF)JA$DTIjUs-~dpY2nffmF~dQwA0q=IPRdgZS13$fNb8-D=}kJxqEcUKABf zl6nUqOi>LRA-TK9&Q%tfOI((FRgdN=Q=lL-$ij?ySR81*D_*n)d(0_Mlbg@X--u9A ztkB8inoWb?%DtrN3*Tf)SZJo&AGiBW4hglNT3J3AT~8OB#%Le9Ya{MT*EPS(U=3vpNP_|D0F)XCnkKE zu2IYfj&W_-XfS)4^q|E(p~kSMi+TVi&l+Mukp%CIMsod5w44y^$qep$5~_X}Y)=%- zwB69!CZlWt5B8W)ag~` zvsPjVEiZG9p=q|LKpkMiXt>mklGo$6d;rVgLYVu$OMCH zXRDr)tg}+;_|F*Dv|J(+s?4WJ6*-={JDm|n51(vzNiT|+I8ct^rd$F9)@OkFA21@I z-2Fc(x|R;3{>X_)5|L;6FNfA14E}xg9KY{)mF33NF~BC8DWv&loMe&>!Ol4lDqXNs z4mx2mitoPqQPEp@K%|pfg9Ojm8g6u1qWlTgcS1IAA^_~w4CIJ?KIT+x35O8*NR^EQ z;|t|8XLS}aHDg6swH6JtSKXqv-UDJP!y$b8SPs=7a+H>zeIyV(i^oTB&tBiDiaMS0 zO?M{EI*p3a{3Xp&e@?unG+Z89kUACMi`nM;6r7_#wg=6oSF6KhZ6{d>+5?gFHH+rmmVf;it zjG~lfW)wvEONcRec|B{jc+kV9+yu_%sRZrm|0Kme2m{pny={QI4iJ=#HtrW&jTBaHiAPH5M zVhaoix$#oameYq;tMr>HMtHQ+fpr3`QuO>DqEvwNuj9+*Hc6)ni{ z_u%@lhxrg_Y$G^HOvU=Ybsg(a|ggc0## zoecmmxVWB#13OFgV{xR0vEQSn+tSm@&2jd_-*ul>TL65mW~^zx!=L)7aF~+2Kn6*V zm)xF?wrH?gvY0xA_7{0jLkXozNCQHD%5X-X%nlua^6GE;0M=?ze$nNLmETIZz?aV3>GfKQ%4 zj(**v8C&(c9;1_{r!P2#n*-8%yK2qky1NQi&uT23lqW5GuhNGNEGH2oa}@(FX%NY z&)yj|fP}Y(*YNIfQT%|DxO7^@2RKW9rzhGirrTT|O7J2UJZ{ezmZs-!>p&$`xy>(v z|1$(Zomjw*vwc2m)Np~q0L~~Sb(CjiEBn^7TW3CuAuaFU^DZSQIC8BSYdm)(UvdfC zY*X>-YQ6l$t4i6_OduR_9S`8eI|4}w42X%|Hm5G(_I5JqA7*WDcWT;lj)Y507P^U` zcM*<4t;V%w0LJxh9)HqTtJ+|l_Woyo{;@Dy{d{Z`G-3rM90eHSJq^iZEF8)>BfQuX z&y{S|2PTQ?!78UWx^`1CSY+t%V9-k(c2$N^^PoK#RZ{QDz}+x(MXDIfVMB*{0;k$F zY{seIQ8|%zMhcD_*BYzq*&5J>7>(RX$%1tqy+K4Y9~#J({d?9Vo!jK33?nUWmv)<0 zb$W4Qbok@lPbg-9ue>vTKYbkgWLc*EJRfH#=6-GMnE(&S0G=3ZkV{%9qWj5!KQS!o zmBbordN{b9<>RFv(lLCC4X;zv6)>ROhvY=LRtS-N+k@z5(k&pPgjRePLBst73$wQH zhJUVyMtsv#yc4c8S(0!{oq*i{IsU=VO9jP_J3D2}p^ReQ3f21(A};84eNSav4DU+j z5FtR@8eCFv0u{ISh<@H1tN32-GtvE=yb8SQB6D=zVNfJD?@ zWWX`={^Cyh^wgD3DF6xu zwAZ7%-;?6{Mx)8PuGP3uy_62FM4+sddCex{=SUi{Hy}Pk{;$OxzPOmlL{$b!q0mkA zU-ho+LJGqOvw+@AgwM3|sjvwhV<5EgobW+gG6#qW>cK`bFX!aZ$l6x=P75xcv~!NP!|CyN1eqxQ20~WIUzlElDe`Yt<=icNVORFAb)aW z8O= zQA|t!a>^t+v=t5%{SQ!Wp=Ng{=C}RS7m5IEiTc~pMScm`9#}6m4@W=QN7$$WE1w+} zD42^p(57(#hhZB%MV{Fz|vE47~dyV8!hs*xFx|}c308--cLqKFJ3C9y@ z48)PRD7WH;!&GuT@ZvZ0h%7pvymz@Llg%{X{ z6j@fyNXlB*l%LstfF~X~W|H@d3JI0w;~6v`u31~dvmBsWsM#il3?ZEE7gt8V5B4dr zy2HRHCUEJ3)1DkatWWGNjP;H~#2#+fZi+p)Yx0xxn*>l>2o?BnCOwYoVx6;P8uQ zV&&IRS_WsA4v1`q0nMfwKO1Q*Fc;gHxhEMWxVF}eZ`K>!lumonl9`m>86eQ3y%{Vk za=8?`j)=u@uX@5paFi93u=4%Ju5f=}*pVR_CU<5`427=<=(y6r-@kq}R<-{sXH5v^ z*6U))ighdIaC>qKdu@zC{_>l+b&qiNOO;c=&H5qaS;m39B>a|)1C|m)HR;I$FUCtE zYP-#M`NkB5!9^`rEQ~lPM!W;vVkQJhnqyrQvOP{%rSaYL=ONbi9v(Q)yCITk61 z%$ZEKE3Bf8zSZ2?{gbnO&ZbTBl(Ws9!Eg3Rsbv5t8FNNB$fc>G!K|N)=h_) z)E2vN4fettJ2lknA+@~lU~mC9tk~O8mi9r-LQIaSIaUMV_E1qwSd*ayDiniA%WmR- zUWnnumFdG?kNqx|seJ^|x#vS95c>Ghxox4#R>bYa6AG_priuv;KmaEb7Obx?644Db z#qfby0QX~PCBFx~EZ_Xsu{LAq0%|j3{(zH(`sfyrdF>O5%3zYY?U^8~O0qO=U<(b!`ymn?#7 zqah<*V$SefTUF{zR3C@|$HvAl*p9p6;*?&yjmp!{XrM_OM2e3u=h;1&sPbKCRv ztw5DfBa71|PkhTVS4(z$!=la14-(YeO&bQ*1j3fO^25Mp*ehnnb5S3n@Xoc`)~+hOtWAg_DU=;3-(ttKb9f> zBf=Fh>%j*eOWrCc87lpxKSVPn%y>B?>J(c~?Rn;u76Szb@svlUm+@z!fkE4{9XYI(KE7CsmzT5Y5E9 zUNICVZdqv;N~ zIXPCnoQP?}!!qx7#rKFuTjSaYa#tguPsOEnVVSJx3S(5LDLtN*q%xJItWg>FCk>ZM z4Y1|$+Q2ic;a@C`kqttENmjkrlS zKI${EBl^!g@hN>WNCt?PIR`!6J;uCS6!#!M{JWw`Q1II^!i;?z;X6RXYB8|O)&tgP zGjvZ*>?x?R7PFD=+S$&&w_5z9M-qSak!p|cBlY5(w&Jw&w3tnavB~ObAql*yi4 z;hSI6fsXHCm$9I->yF@kpq8tMkoCGj7~bEDu`60&VuB;DDXIF=)A4E=3r2e;%KBu7UJC6e>}(I-PKbu&73_uHgJpPbJo8WveklZV^BMW8l3 zkpnG0`%ti@7k>M*;h8SM)8?bho^^*uSP)uf^71+}QEUQ!7>+@F7iL)5UKp)h>K|m? z%hd^Ad@hT{$AZ<%$LyWrd-;YkQffXLZOp6Ai{4+_wS&HA+m<-G^gqcAP43Sh+Z5dg z@#5t0Zu=)5p!q95(t12}>T%O*!N;uxW`pHdw^5JjM-<*CoLd0azV^e>aA{TT0KV%`*qvh*SERD?mGX*;iHC&yqqg>-TaKThSpx~w4qDp$NuRoI zFnMolhf#@MQ1~kqju}hXw(Xm!-ZosfHjUU8L}iO!YEriG59%)%;U6nqoZoOrEx@xo zgIl79g0?ic>b+RbYHT!iMvMRKY&@dAYg$!96Nkn z6E}4Se`mzW&t*E~!i6)?6o^J?w_ReNiM)qDQ1M;y$O3c=Ru=F{CQm~o7clHWIJg6`ap4mrcVBS7u86=51Y;K%ggESf^dS>%>m zF~GfiJ)m1$k+1r`cC9@F#@@6k3GnPc8~1^L7*2=h~^dIWi@C1 zNSPn}z;kBbs;&l7z>q{?oWq;2l;gCR%v%hYg8Bko;BK*ONByCJwapo&1gJy>?G~wt zB+m^^C>9#Q@X8)Dn+p*3gtF|4W*V42fzj5vb(r7gN9f>^d|HW@o?n5Ec7iLI{xq&E zJpZjP9O6qJkEurHh{+Fn)Uo$%jT`dE+7yCO^K^UD`nTOXz{4N*TrM1!IK2f<;1nJb%Pws+sRp?RAI{0iy-3t#jQy_*$V_jAe2X`ws~xvoy!paqgbV7EFnh^g zI%w%ty`TB60OeduB{&Vfag?dFe-RF=hNPD)prD|oWPKw|T}jf2`t{yd8Kq3+%_JU*2Ou~#49LcA-)mpNpqRsSlu-I{(uJ9^tuG8+Xz zSL>P?%txS7>MP4aUfngSK5$h*dy@0cJY(WLKeM>^kk6c$n)B4l9cu*?Qk&kQ;I~(z zQ*||I7J`UbxAm3C)o8GJ7Ub^vK5a~mIXS-m@&ylGpxb%bCj~DZZ+?*IMTZIN0eZq4 zn@aarSHM%M(UO+86&0i<|5TMtBZ~UYj{M`_o+eOTUVi=BsrXtv7S8`|#2F6tZ(%66 zhCJk8-$2=uR0X!wZIcWQviMRq#V7O*0Mpx&D;K=c`LjG=)K{ut=t)y~{sKv8xd{O~ zkHF`0FaPV`yH4bsJ*@ms+i<0Q0TN6`?dtJ83*lk1bm3Sp zS!dpRum9EEE-jl0bKOugGF8WkTv7W4cMgf8GQN97q3ls;-LgZU;;qjW(N-u9;>6C7 z8_ywL!!_&lj*pF?dVDVi=3j2tVd`y1AxETF%{yYRHis0}c0{KAB3n(bfvGh(9#Bk` zJ^IV>$Sh(O4d)5+>kZncIAEPZuLbctY_>18(SyQ8$h8&ymxZXO=$t`aPF=;?!UOPd z%cnd(jeSp;1>6bNoGerRDkITP>NXkSbrcgMf%;Hl!ti_=+rj4Z)8gDjB zA-a#Cb+#yn#W^dhc|PBf108F22$d}8i}WW(`7_-Ub&5on1EXOLt5p`eDRS$=oc zV`gTV-Dy?l9Xj7>%EszoB!G)QH#8%ApD!f!#J-+jg>f`kifDFZ+6ycDD z0qovOvNGeuc)It1=irOOb)3r_nUgG;Ox5$nngrpN*B~JgGcB0jjZbUE)7E1{a;GII zkV!~j8+2C(45Nr4SJz7vvm%Cr?%&{r810PzaoP#duAzD-c{wK-9KF3e)Ce&^s4XI^ ztFQ*)-_6XtcRqQ8a;kgYt2k-dfEupkD^@5`F%K?0hHxvOoNSQ$rvA|$b@FqJBF;qIlmLVHzyJNSxfNXUMmOc$g4C$s)2M-@H zNIU}o5ylH$B&6%1w}FSA)G3?QL`N;mEoKmA&aG<1jNX)%R5SlHO)Ow&4Ob>a0wq?q zQ?w;o<;Bxc+G}meU>FWWKLs1Fc7&>-zy|s%lHdh`{aWO(sY5nL5B3}6~>BLgw^Jz+?^+f(Hs>%Ex9!ggyAN7CEjz5qi&yuWMa zkqy`EBYaOkv+?jlfZY}3JXYqr5g_`fezM+8ezFI)>rCG_rt%=3rDtObP_ZO^P$^Wk z!u&)ya2aBWa;D6`_Of-s)iFv%+IiQy^?tvW$B=#CeaG?o4XJt;-M`$3n~(35213z+ zGUl~W=FQJZ!G$q3=W@{PwF7B_ZYEsJSCy<*nDNl(Ca+84&5+jl#OanjM-V1YrqOp7 z(>vxj6=kb2VmqXUiSn%k;;Z`2@rgDT;(W?kV6CDe#V5&E`Zt#G>>7;vfdGs%QlDwy zh0sP%9BytFi_sy$^$iCN`R5!Hu!1e4kDL0R_8N*uadPRKMg2!>Z_}@7@K?q;Svzb! zixnbZRwk@c1{l#P=wakC~W6 zY=IC;EemS{WC77(M(MT@p=|e9dhr-(5|ehTod`W$&dZy3PAM;L_e*;Pe>vSkqHYBpSA)ev$?DriNXmTa;a*cd({AaJ0PYM(`>EB5gP5hz`Lh;(L5%qbli1a z9}&4oS$lhZ<_i7vFvSj+b=EtGUi)e?@gjaymv(+O0wci;V^K+T#XQS((dem9OSTkK zX2}QKf<8#fd||bTkMqZofX?S=B>asS(dD=$!Pp5bxacdq73RoRCj=7gty3jl(I{|f z|9B4Fz(d#XCrGeveHB#CmNPCI-J)JuM7*Npd{7sxeGTafO`PEAb4jVl>nNzTLN@}| zTG_+A#(0aBaD!vWV%nq4RuQNnvx}Wcxi59v8F?w`~<6#;=}q(RimalpAMC z&}_nv8hp?kVFs4og|2W#3drFmy6;X6LI&1Du#vG^-7=eK56}7yK0qS0-Op+{qiF>|QlMxTvKAGX|GABA@VX=1d3j&XX zF;qZQtl=RI|LTH2oBr360&(Y% z7^S=p0t}57j9=BO(6Az)o`3}7l5W23#dkL+x?JGF=zVPdX0TCU@23p*qXRlcf>N~# zv?izo0QO1EOl3*!e4;&f(<^XbdCoG?A8JQG_`nZa95yj4lOj1VJ8BIscIe+m7Rg}6 zpegUDJA8a*j6rfhx`|c{^0i|pNvb^9)VRFo>T&TKI8_E^fYU9+5Dyr1b!Y|m8aFMwkzsNt{H8w&rpq6EYaak`-tmwd zUw#>;P30i9u+HtG4`3`KxSww~0gPS{Ux-l5-DKdO=jZ6B?51BbO~p)|K4HXRzGPhu zfGeeRUG0utl~FTeX)Vq~58zZT|GSPe1)xU5n<(Q+1??<5cd{F>CK@eaX?K^?K3#4J`St zeG*CLlx7?B+d}wl26D<*JwJWke6k_yHV2m<23?xDG80*+Lt}bE;K**d_u;+M4SVh1 z)8Mh+l${zxj}462mDn#^*}*OT`8<89G3NjHwQn{HP%G7dCg{|ddrTRNolpgA92j>(`|n=KSW*rVnO^9dO?*5A5N z@TcxenjVezGY=MPQye6l%{U^qVhzOXo8Qh}t+ndYPil7S3weahr2_Au3fW-QOnmE2MP2hf@7XZfAE$Wva!! z7>ytgfI^nmn;Q4Gb4?2 zqpe+#9vD0yd;O4)V>K47@a?ft+fWV7IT#ZHkPqSdIaV~Fz~(XMrEnbgx^N0>Hf~xE zA{1?K$v47)gW|4jR4FqA!kpuyU00l?WzvoBtu6DEGQq6}h4+=4l`6W(GUJ7q64e<+ z9XyCcLP#&$6x?k$RE$_&t?cHgq3zGBWP8)SS%{{FKvyZUB}i`JG4u^DYNlLHphzaEz)G(?OaKCQKCS%9-Cvp#cJ@XK*HZE6hskCZI{!vg* zAF%00g-WvApI#0NDBRK!y~4pOZ~^s3{!~+~=R0TK$5-j1WJeP;hs8M+)$SpisUez( zU!0!OG+&><@m1hyBlGqU99zu6deFwjFforsJm}a6o(~);NN^_v#d6%pvCF5XK{-c5RFzPd zKp~n5#k~d_@@g}Zh)?AH<_`0&N7NNr8-XlzFqi@Fn#F-=TeA6XiNms)%bR}t+U#e3 z2zZ2nP&k~t@cX)69DP4FELy4Ao6Hcehg>9n*n~)3wFxf)CO`Bh)&S?Sx_Wt%kN4)J; zgVD7^wn%{w8LbX_Dy$zphfS+3Smn^ByB z1O}8uW)T+KC=21juaYTo@r`poWWb<^ilk`_jaioZbmFRTKe{a#Cc7?SOxq`C`DP!f z(~K-(wqoh)9Z2g&z0RP$N7V#GG?J&`w1S^ETQ{qEwjjJy4l&r$_y<6HtUMsB6fqc= zmIxb@UThBSD^X8|OR4s{@<+_>#G6i~2tk8ywe}~8z-#!TG@iaJ`r;uV4(NpX1k36L zsA7(s?|`LQBwdfz%%_)XA`T~b%Vn`D4(DZz1F^E#2r}7bcfCqvfAzAqxun`ydrzrI zkZCw%52eP6Ikz5_vx*N1UOKeZHV_o2rAYADWON-(l0>29yrjOg;O`M`6*=wXXFRA%=ej;=7eu|KSav5?Ba z&u>yDSN8EU&~I00Bq=u5greHe~e(rxjS(4NR5Xg(#`-Xpj)Tb%)cjnFk-il~Rh zrM!tSj)-ANv!Tgt`Y}hVgf)1pTA6$P7QwNqmZUoNydDn36)(=>S_Vsdswf_SP8y=l zr2iykR}!kx@6-a;h!ehHN!SmSX!bh+6BBoTOdA@ZuyvEia7V7XEQPI3KTZV84<8b3 zb}f#_cx~qHQ2;rl?Dm2?Pme%evneg>8g&1(CS$^>KuhVQMDD`cwjnIKwJNJ>gQ7t^ z^EAQb!JErramSye5`rK9hb}ro4)mL;nT0BPh~5DlpVcyIpCJ}eXarl@E|Du?V!8v^;|vaI^I8n@T1?FVAB_#-CD$>aa*z@EOA8PYGIMa5x0Swaf># zQZM+jX=XXi>CUbH$RhhYQvFDm1Hg>$p}YVOwnA_To5Yq+h=;3j&!&_Q60s!okYx`i z?52?BH#iVOIBA9FY)Z!8U3dq0xb!T3*TUT=Lx-D)2u4g|Nt3tZF1Q$N9WtiRXELRV zVB}*E@J<7Y^GD0JDym_)Mh%3z!wz1BPx;-W*xj)F(9sq*!eXGza*c`k;K$usk@7EV z~s3XO#G_IBEZ(v1e zJ2DG$#`T?l0j(1}-EYM8KFC!IN3jUm+fQlnX-$ZGJ$0Q*3Dh^zLnm4luH0^TS&6jZ zGj8U;Z7^bkAtJC4tI1C+Ve~B~F3vQ+B~3A|cQyB@0h8dD_4f#1DbhBY7Y;cIo_kAm z*AlkU0NBuzFZ7P)!7UMQWdBrk7#qE7Ez}Ul8dp$dY769I7`%Z>XjG%$?FQtujj%%e z%ycP*3`8iwz1DCEe3GNZ@$CeXW2ed5jehLgcb^W7g9 zskY@OXvPk085*X*z23>$MQhfeXvqv>0ay5T!4J@p?f*hDuy)J|97Q}a6YquQ`km=; z+fdngzBkdv4NZh6-HM?`iaGA zf622E#BicPysq#jVPcq|;FDHChFif@}<3n@Aj{cSKBG(4; zIkX=P_+rYqKXq<#utZeaXTZ)=8DqiPk|040dj|R($~CL}TZ|k|66|Vxxv_rOPWru^ z<|_Jj#cdTXK3}gDvdoHh)7Q!{k#pf3-1z&!!gomZIuG?*N4)mCL{aAO-SF-j>@?}H zK?^UDgr#6*4v)^Tj6}(@l4ktT9_qt18Q)4FqKTZVNoIXWJMN|1i&!=500=uvtOtHg zZtj^k_CWE^^G1rSkE`NBlZQuA>?Kw)_&kmjJ?IIN%T5-hfy2|0+h>v5cmr*Z5>{BQ z>VeEY-P6`N?Jh(q>FM06?V)ZS`=!#@vxmcI(al6-FYQc0j_&>?*hEMGv>thvow5(% zG#hl+hN{XcVUa|A!WVvf2wMA|aWYYkz$l4?o4(xhWUMV(IPW5hd<5m$F;TEB#-orJ z-T+>xU@{7pSUj0|Wf7qxJDha7b>;b*$RTa{h) ztq1!anc;Cfa`(@Gt5FZ!rVct)gRU^2X$C5Ae@l>l8%zQOvLl2TR{2QsLNJfz6yb`N zXDg$|^B*1Pq=(GCk$dZe>Vq_Jj>^(kOdwA!a9wmnmq?Hia2o)+^ZXZ|FbKHTtGxp) z({ju^u^~pu?r7J(C86+Nq4(4yI5YeSo<}!pA~*gu5O=h_@%eIx_(ktN zYO@5?xtZWcoeby4D^hazpPWC6y`dSAE;?*P7UhnUFv{UeK}V2<#*!c=BU}~YWwj=1 zhe#BOi`Wv$z=Ap-!Y=6y_R*X$zCO3htHo5+>rTzfu1E1EjQ+0erwKsBW+0Si<9h){ z^XwSrS86V0HJVp1C#LqPLtF7*RlxD=UgF{(oMY=*CGsy#d>b8Jc=)(msY6Q;nBF1D z2U-4{2y^Qgk|BM~ZTY{=pe{^)t_b#TkuFIU_!*xg?myAcw#Z02l%N&tz3jln6eu!; zuhaU<4|{Wjo`N%yifil2LM;->KE?-L0W~|ssrJJJ4{GxzPZu8WP80Fmv`e0&+)^o{ zGOWehHVnOgo|RQAR!SHTaP`L}pZIDM(lJ*vB>ZGMLD%6Z0pUX%hy?0fz6h718j7SF zY=+10${3l5x$goebf_z(V3^z)2*~duL)}Om?9XU0+>1UfY+gW4-Vb{Qi`dUJxQ&+g znJ79`&sz1Go7^S{$UnAtY27srlC=9KF5&xtEMHRHNSncskot&p$9FvXNpL#Ok?S~* zk~i-w@}+7BmJ=Si)-|(HV(jF0QMr6N{LPDAO}?hlVUafaFul-9T-~gl^YTSFYfA@C zz^IW37;4p>7hW?3c;y(rmHj2OKfHTLE!6*>Nzv%{WI>gVe+Ml=m2kp$VW^VZ6V`8) zzGyTCnPGeLROk}8EsKD!i4iLn$-gy-$32z)3rskZkwM4qH6ac7 zjp@2IL|lu7)(EPuva$IUBQZVKMLTgY6R-gASRyL)4kmC04!$s2UZK(W{f>hv`e-Il zTSQzdf^PIH8w-2x3bXUy_q2T?lTHRkG97X)FTQwTv81f%f0TSaV2>PNOV8c$Kwu8m zT$B`JgZNdPsxH*RF#T9zuA|o9RH7BbFAfNdxRRroQ zaQjqPJsa5$)YPPWt;Kvd0XD)J#!(b_shH(*QC;Zd-`Wh8 z%8#u`M7FJ%v%jU?UMd0VO)Ip*AA|YNA6DTz9J$IK>5h;_2p#72RaX~Kz1pCiolz17 zy|Bdj!?nT(B_q+b6*Nhm51o2xJS~n?~kUAVDXXa^-!(R#Wke;rv zO-@~M4R!}7Fg12XwVukMdJBoUkY$yS6fI8fjs8yuczR(=6eB-1)mYn)ihqy#?+9B9 z57YJS#H1RmxBe5^p+DGi2HuA>mR!|P>^5Id{SS!%%1dp>6zgQuripipK~X`M8wL#% zOvLwbU=}}K3ogpY80gmTX-YSvZ4LIw$WVU&0l&Q|A(yAKA$Ci9t<0-i&oPAb6k84w z*ASv8k>QM@4h!$DUOviE5&ps-?zp($UKXLLY zZ^Ev7Gr&~wPq$ag$sox{#EGbMwXR57Vntm+u*VlK><81msaf-tPH`G*rQ#OytT79Y zHtN{pQ{tA%Lk9&1=zuTtyNUB($ZgY$q%(|_mzTs`Y*5Lhp3@VpfGsj9fbJ=+b*dYJ zs+smcB#jf21G>8p$b^59S+A*d5@O8R9yi$KsEvHqwJ_jJO0)mC`Ed}9 zU#mQjHTAqqqfg|O0Idnbwo}s~X#sB|a<NiIR)Z zgW{AzSON>gcw8Uaa}shs0?`F@RxE(4(7%XuJN;3Xz%olr1hf_0P8emb4Xl_z&NsBb z94eePp{@G)Ru&p9lw730M`80cZG@*-xF}QW4o=z?iqIqngDx05j2ydY3z+2CrU9sb zzMd3`r9bB7f_%pIj7EVnkNG2zIUd@87UuB;9eXuH0nn3Mbq%Qdps)>|kMy9*GF+ik zMv-4-G+q!VZz2rHeYKG6XhL7fHe-RgFc!4!+Q(=_zZBHK4CFUhvsjUMZB!$FL^$p? z@RJ(ix6z9u?W&p4j#UI{ipwJ1eq9CBUvBB2XC+@r?fXWNr+o9PF39j4e(j#poEaZ6 zJpZS<^^5lJ2_O3go(7JQ?Nl>3-Ktw z3Dgmguavg)E~^83J1Hx_G9079@OMnIwKdw4)y7Z787H9^gjFEU6KrR=ZK7K)_r|{= z_6trub5HV3YGnkUtsJpO*>NvR8JD15uZE|Q*v0A!=cM-lOOXe!H|GRzKElxc4D=St zp-HtQc{{;QCNvNJxhPd2TgxA4-vKU!=DFJFtX9IF&n}BB6dhQa0%IrRB|L`le&pGy zLRJ8-!;HuD*cs#|8gPK#$9~m6^BeSh7`Oazs2+>S1w?86;=>q46u58_Z}^}ce=Nmd z_HGMa`Xx6R`bX!+SPth(&ViO6(~`~KzCiB1Pb|>*lU2x|QgAgL!6#zld|2JRij!AWsJHh4(I5k~6 zi32LM?W0ktAKbbXInuWB@!D=}EJ1H+O$X8_1hS}zII%sz%TDjjXz6rVG%99If$GhN z6!l>CgOoXeYda#Fyi84*_l>Z2Akb>$O!@uAi&ur)_;xZJ{iZ2SoKH8r+`bC~KL@81 z{iziH7)|u!&2A?dWGoZJOx3ltUupb$w}R~$C_uN^3Fv%{(wZ|`0lQF;?Id6|@LK8! zZEQ<=r`J%IJz8jqD>3B+34h+HU!!rCI5gOLWuF1reSy8ZPs6)(0GAy0);B)vqr!$= zeWGAf2XPVYrXjZ-YiTo6&~4&a{u2F>nGOTi0y^xO@9zJ=UN8b1FsQRhRPF+|sq++~ zq72QI#L4_gxQHW_Afp-M4)+w?6Ebo&8o>1hvG2ec3kp$>v)|iOIeDNtK3`rh|S{H20(i29&SAS zTCaHq2F1({evA|Q>vy_uXI^DYZ_Hp`ehNi{vYehx$v?v6GKK#f;8ImuDazb&r1+Q z_=T>vW8RU4V@t!;dze&9m*#6zf!D*$ucARNvaBB;4vPAKM05CXdKBG6wkI}nrfEaum> zWg^*L@Khb|Q3%uAM^Pe=yqg%1{ridd3LKkuPMvi87Fd>Yz!Er_GXb=Rms7N#zQNd_MemDcrUrajYi1XX1=JTi=@eB0rx{^MkggaZ-SBG=VJ(9+F4n zR^Tt20|a=#$#8@V1=(ZB)G}k2M-~Y4k1>_hpgWK6E6xP*lTxi;3e zNr08}yPx^!qi6n}Gp)&{(@8K7_|>jO|I0wmP;VgNJJ~T52H#Uc`!@qXn2NohSv{&~ z0taXWDy&?SYAY~H8sAzasPlDfda65zNBZ*hWL*D!AM%Q=q;r&s-qJ-QMEDhu9pCKs z?Zeo-Rh09LR;1lyi-Y~>QHtPCXQ7)NXC{L*@!v`h-bGd6e-=1DLQqW$rG6F*&m`>Z z7V$^)#HniS7zA|Yzfe2Xp|E5atN>HtIgagH_Z0(zd3|abZ7?r@ov*IHNVvFop(tzZ z`#+B?;yBLkvV0a}npvZ2rtt~-U$*T^$pWC>cs^j+M@^b;+Wk zc!map)(ul$L#|S>xq_CBmyBBmi5+Dz+%HClfw+SpMoeD{RZP8;-q6Kt4A11h<9(cn zAPQHiIE9Kr=#l6=g+<87(d>U_lvH6gHx5>cN zh;k7pr7khBa--vj|CmGF96QWEa!~BpvlR}dqf$)l%4lklOUrtda!X4C<3W&E3GPPp zTvK(3J$3&EnZhSTaM051*DQWO@KCKnRG1qDC&O`{)TEg_W~qNLWAl*7_l(dfK5}PL zANP~+8hR+)wFe-p=pM+hl$77BW3N(MlIi}By3fWRW%F=Zu~kVNecTf;Z2-MGnd2lm z1KfFB#5DcH+4Wr%yRk2VFx96* zEW>y5FpRjDo56G33Dab{q`vuGj|e$Sv2|y8Jw0=doJzh9CVhV2Si(u}v9TqtBySUV zJI?G~fGSTr3HTmxLxB?3yCJYFuWb>{xN~Ad1v)tIEP!{Sc?ru`18(H_pYO$qag%Tm z)SC~ICt$iG@u+99O5x&f1~?b>h=o+XAG18#o_5CaeYM;=n}xwHa_RnMpB1>oVxJ~R z_R>m=2FzhvlV|nnlYp4l!2>#Z|55l-+_rH!W56H^w_aeX{NFx(%p8D+H*T)Uc<39Eq-ZK7T3 z!Wjy$gnnG3@6jzhS(WFk+%LCtzr&h8YXNCQ@E=qZF0BNCLrzRngB+Qf5M#cD1%$-5 zFg2Ov?qdYAUv(pY=HwJL38`1Nl|j>Vc;i==woVEbh{z8?b&4bp^mr3vOBxo;5k>1N zo*&4R(o)rIKxhlzK47a~qOp%RcUjbjOKdIR;LdC9&!f@IcV|lmje};r1_l?a<(rLG zfGgaJP<4(Sy^!aI12Ljyc{xX#x|_T^`>?j^@!iID^c=lS#qwAuT84n*uNF0v6N-erloE^;OFe-vXMwF}9Az^Fu0gL9?Lk>;3~-)zbLvnNZ?PVb*M zjgztjkCF*QbT!`d#Z!`~z)&T_{mBhPI@W$YC0XK79u!|{(ur@i((9muwc2p5AR#lAP@+;4*XG*`eG^M#KK2UNuLY@(v?D_$Ci5m z`lo;+OJBols5)$}oU_J&ik%gkNVA_@)9qZ=WG~wCFkW`Lna~)N?^PPC!`oGwC9QEg zVG4n7yAzQF;=X!GU+?cUGm>EOM7o(O{XU6ieECkOfWV?t<>*dvIaq@_qwa`hHG`ZQvcSxr+~kfR7*`1(UaMZ{S<&JW ze$U^T20EArxN7^seBXcQ_9&MSG?|7&q|0LAw1tXnZYBe;mJzIoeQWTfcG-78U(PWE z<=SU5WdWG``q|40<_NBM`JxHj&$aq3^mBQz7Z1>F`T6~17;;~>p>{a*5T2Alng zHKx1PiO0@*tl{%dd@qMVf_{Uz*VzpYV}GJ!qKVwE0Q^@L$>QPiAK&A(PC>-Y&Q3kgxrJ{YRhBZX||3oQrxvi158 zo-t3&iEPbx%<8=|KCEu4gBS=tPB5KnhK>V63Q9OgiMz?Qtn2#xnM@(no+u4auF;}Z zYNn%h?QT-khkEL(d6t5>4;U7BU1#aEc0US)^vqM=`^vjvW(hlAGeJA#4Hu>zWlt7a zuL#t3ko-l5E7EXkW*a}3`^rP|Ytw)eiEAXtK@Od~ljMj8Cg?ue!Fd<_u&d#3w<9<3 zp>jUE%fB^rY9AX#rW)oWJhx7S>gkV&9Te;kf`+9^RSCDEst|5>1rIkQktq_VW2^uh zneI$P1vG_488{RHj&tExj{t>LL?;O)Xm(a22`HgzGXLqgA4iYuqvBy5Vj>2^8f- z!i^vfH|Krm@E5Sq^?;!C=;o8I%GgAcXb8|R3U(*&eB`n^IR=LUkc#LQ(-$MP!9NM3Gh{8`oI*Uo<0=e!ZoPPY-l4#8w{i0jNHtjNHcDAcrm8vt* z<8MR#&tu94f2+5xJn4V$gDB?G^0*X^LGCW7PyAGi-z{w|KW@`T5Lo3o30C#i@9-Op zW)bMJY)a(H^o0L>AC>;enyr|K}s4bQeXl$uCq~a?N z%3Wg0xjh&AnoCmS970Qr`lFj6Ttu6m7)3eCUZPYHq~n|Q(^0q+wKQ4lD>)gXJi~1D zOQ)PQWrW63!Zw-Mw)IF~FDqmBMiA9DD}y^Hu)Lg)Pbcss3gOzbJeNja*@1T;gV3D_~g zvzpY?vB8a{9HqaJLA&Bu$biLa)UV4ldNMyYzRfl0OESYOl^)`tJ>>QWoo5;kb>_11 z-vVHM9bU*q`-RWaE;cMI{ZNv56e!zzrV_`psl&Rg#(DNaaPP8gr~g(aFE$h{@g+@s;szC~b8MpAZ@8FZRJ5TWYT$Reb!IoPWeX zIthoUOFvdU9d>ky5=Xd>0k`(eHy=9XWG6#!GGVZ$`+~_c-*O+K_-KDr#whq=)lr_r zqB|{ygU=cXMk_Yg2=is|*qPV%4dp74K@^O^hDc)2!x*l)mF1h2@}uD7?HF!oy!lW* znV7v7!4N&YCQ-u^3(cm*u?R3GC4O)UIp>4%wOMH#Cm;)H0j8LjoE+rz5Cs#4b^L6x z>>6m565_a z;5(pJg1Z-0*9r7a^{kjz6T{Yus~OSYBHQHdq{5n&LH35GWfmiR zznuLPM3-w+K(z7z6Y+D1a0L%Y=uxgCu%>DTd$8flUDUlN8OT17_h^kI+is8`Ud#Np zpZ6Q-s$(vYl%ntcO0BKJSQV=j(2{@{S;&P4ZF?KM22c{WEqWea$yoNyi}~5rrs?QD z3^3|RmAML5_LJghHrb?+aIEOa2Di7*`vvzQ4e;xXyOe3Y!8)tGK<(`C*FpR%9-0pD zs)FSekG`;+pokQDFr3Uv&p(es(V>xe*+Vj`CqW$(4W(R7* zr4npc0Z#UjVk%>xlSYru_Bcxa`hz|93C$B%M)b4ns|A>w_w^k8e;_L%?K@dn@%myQ z=Jf-!({aF-rR(a(?A=ER$9#LvS>F+Ew+h(dEtNR>XCi5Aesc z5!-#Brp=)3zfb!)UpU3CnDtTpuQ8Kvh9Hbyj(8$KU_*jkN^@+ zF=JiA^pBRr6KIcKwc3`yF+aFAbZ%n-OZVBGT6tm*UIkGXxzMLZ0xfS#X=u5XfdB<3 zI`VwJ@TGz&2eEt4t$`k+ISQkneE;$isCAZCJqAPg)WR(TIUd&pWO4JYFE*(fl!w>B6&9{_`TrrWCjL`Q&=NVBGo% z9_Qp=fRuLseOif{C-n^r(;+fEI;6(!Iq$_Vb2dOyE=a!CBK<{E# z_gSorIC^an7_z40K)NTdIma$ir0gRx_Hv@uC`i657#C6EtS#KpUd$%hnaqCLakylY zM1JYnYHoyS2wXLh{-NI$Ey&ut2qr^M_=S1e@N568G3P6Mq} zR(iq;B}0eqFMy)<$BhzQB5fuq6wfR^sL2$Z#Eot0OwWe6+lQK?n1m_Pl+gIUgvNr-m#40<=e^+I`c1 zp_C=TENmzOGjvlh$GOja7>0xFa6q zF@_T$Ug>y*^@$AR17l>=b};2A;1NZ^`}`(mY1yk}!qR{3<-^5Bbns_->J8tk4&sF? z4PPiFR3M?W4qwMaF(4foW$Q$`dGUYgcmfTz6arX5<)uj+lerg3reWVc?W4Qa%X|z* zRS&e(Zm;wIbgicBJ*)_(0hN@YfM+cyp|1P+kyq`$|K{_~xZRbup>X4TQf&gq zPjHD%X^SVZz$-M(F>$Nj;4o&^F~X=vr)+z`XkRN-6jh3Ka|XoXU3@pgNrtx3R(w62 z$Dc0nYmX^Ab?v;tXM;6Cn-<~9iX^WXnPCmJc4P)cNxdBF)H;J)ZQenc`YXR#13#ueMPWh}g-TL;_fcglPbWddD>WYpt+H3Exk>L>Hn;C3s@=V{* zyAfe|Ar!5{3n7g5dJA8N2UhtH2NStk;7AO^-=<2R+YsJ04}T0tHcW)1Jb1wW;ZC(t zE}ZSNs1tY3n9?~bDf(-O+TO}c8h-sqAMTMW3u=t@=8IH0KU}{wmvrLjwBGq_FC*8vz`dhvZsG{hikV;F^ty)=vxWAhI>4WAW0rh@{ zP*e)T$dVk*f+V!~D#d7eNdE#M*HBVSp80 z!TUO#U5|;A&=5Yzha`6U&)~@L)o0L{x9B6JUBoyzSa`vJJE?96t2A1BxBTwk)!+(l zt2u9XhLRFVzSz<`TBlnQ{BXd75ELt@B^jn+-UkYUFO$DQGOZ&2vq(W~Ivgf)I(TWt zye_o#JT5MTg*^1$Ym@&N%)t_Nj7rEfzsR6ZAnnj|A5Kv>qWsPoR%^0RxHI?;(WB~< zX@*k0(qBR8SpsBo#KS;5Quz2#i-Rl@eENVG?R_Qb_y>^PCPGF>%Gg+x#MJ>c_;L9o z<{sP(4CsdJO+46B&n2FDcZ%^w=aK9}Bl=3@5*;VQ!%>IdR|)00(wkO`4i*S1#BUWW zT2$Os?LqM;bAG^(HpGA$Xg+t-vF=+{FM-&2OvNkk|2W?C!MN9xU`@f=kK(Qmj55nC zm20yG)+C|g8e{fPjw-O>Zc~&znqqRbt*O*SE(XP1IR`)(qr( z7ycDBxWXPLf0tZyEUb{0Ci_PZ68z>pSVV1^D_C)Vz)C)~-MZ%vrH3osui0vW2kg|0 zV`PBba-&APUx=f%)*8@)-J$>G^YUgv7vi-D1MZdFz@b=IbRy?MT1b-?Kf~nVO1XEy zP?Ei2X^I<;12g}I8?>ykz*1zAKtQ4<(cPC#B(U2A^MP<_i75~Pk8{q2!3-d?pw(dS z90y)yFqg5A1+5;OZcWuk^ggcPa8xeKxa}0m!-=0JcW9~sz^J)VynFF5`8YtE(sBk; zPpywuqy^EkxOtJ7(_)GVsN3$D5(PVcwZLg}g-;LSM?tfIFj4^MO@uViV(mo`=~@I8 zl@Mv$WzJlshZNE`NKx2dP%z9<<(N5S%#1TMURAOQW5m+FjUtm~ZV-LoVbasa z0~-IF!%B%5ry*rArA{Kjd=~Kj?!KtI)9s&0PS+sV)N+} z6$8OrlHQ<1piG010;pD57;XO!%4-3(nSBShS#kV;#YU$#ld2%D*%i@>pc+stpyz4c zg$79!G~EU}OQ~*oSZ#nRZ2qpa;x_73g}+jdKxv-wj6(EpdZVWbk6=Qr1pwt&i{6gB zp3_hYIaD-`b^(u2b-Za175O2l0m_ntTo5asb$%)amA#MbufeL(CCl14*3Q8KmlCjaFXPA zrI_$@n8b|!*}eccPKT3j-;Wbf#n*o4R1{ks6Ae-$scnt`fTNnosTu(!%-M-cfIU3~ z_OQpegVhtxAOypTx805Dwh)wv_xCyAKpeTfA*|frZXt<zh-d*t%M!z~zKHgN|5Gd%j%3hmInN`D ziuDkXI}cKSL%F;#trDyA1o$T-IzZv%wO;-bu43)unwD1SD%}6}iMhLub)FyJt@J|J zjtZ=C_K0KL#LOsi`G*;VMTSkMegO%n4|NeZe_R6evp5!dxzI?Ro0@Kx>s`8I^)AEMR2j-M9@S0u!u<(1K8rt6E|yQRhx8yz$d3__3Y{URtvSqZ z<~|(k!vn|jV*pAc@-)Wm%2pI+jY7(C=!hza3crf=5fjoj!R`4>G3Xtc)Z+a`ve^^x z_8S$_%NH!xOkb?~mL-*J+vaHgcVKg_l4BXW&|GE(Z3Pm!leZGLyvcF}YzF3R&;fA< zcj06lI|Z6#eJU6Y(4OH0ma!AWs~dD5|1l@5te{kmFJ4~JP!NRqSEl1&?^c=VakPaV zWfpZ7mp;jWK(X1+LP$L9G8T%qn)YG@${N;G38S7v76)m%R6u_2JN_FC+RfO%+@9|Q z&jF_<*$xf>txtLet+#;77#`xi3ISc}RQW^7;ukZg5Jw{?#nLTfA3mBfp0lbnc(fpv zfpp37?-cpDEaOEn#wPBkQY=)+8$gJ~KBQ0IH3(YSh5SnA1M?^_?Fd7Jf}Csq!tMpV zg;~0Q&$2qMHO>%k8a&Dz5&U8pjD^J)Y3W4Syz5+_#?&zaq+NU;Y=BJ8JfkmjPkw@> z`SqhJt)OwL-b=ZzexQ}0Rfw*tF0jQ#QFC^aYT!!YRKx!CC`dr*NgE{yZ`K?0 zcg_pCuiJ_w71yz3e^xPLUE1276a42GShCe62VsC*N9EO5U^RuYEQP9tqbL5lvWZ{=)OjZb^7%BLS9w)wFpw+Zg=Cr1k zz#s43Uw40_u)|OT_l`!8@dz{M@Pp@M1I=&!`$M3%sJw~(fgz7Dm$k+c9?^e608vHb ze8e)up*zBWN6G&^7D6+*4a>AifL>UbR8XBayrWyaY8^^SRI*)8L^oYg9Z>P(XAZf; z;d2~2@_Kv5BgBiL4y`@9{kHAqfx>qYxCyD8}z02}0`^1Hul z76{tc)0lcOG;wU-VkUF+EKDHyaVy)_^^iek`-laZ?IbX3JNDG zM?_R|c&G%C%@Xkbug12@yPcChS6SC{3H`FWw$|VX-Gai8B*N;l<}^UBF{dN5-au#j z9irnC8_^ZAt$FQj;$v0AyFe*#+!7-s+2D6LRb@?RWa&p!i7)j zAS{N02&02xK@VUH-1Ikuu<^&Fx=x`l`IV*2w$0zKVQ^sMPQ2CbVR?GvSVkkv0>$SO z(3cs4as5!?pG5=|_!t}!6@W3J z0>VFNG2iZ9y$yT4xqdg>(b-LufBY4-b4QT>Y~%H5(wriZWglgzoU(9E5>EW8tDnU}OY#1dD93 zSSTK&0pBpz9koR;J=-S0DZo{*pt)i816|C#GQ?rP_}N_pJ);>&Py)x9 z;QF>O==nO;Fd%N?9Aq)u2#6m(UER(c`MynZzUJ^o|gdLFjCg6CELFtHa}qY)x9_=^G3gD=#3^)>(qCwuZtj zB{<=W8>uV9yUlW*M%*=~4&&Bea;gC)qZ`-9-rbJOQ8s;N%kDSb2trc+lF5-Hah05z z|AkoK%`(2kg40Qk6GNl-d@zn*z<{NVgiZkz1xCgWs)%0l(R{Nl>!ccQ_YIeuhghAs zgJ32&3K|J_%_rMg5`jB)q>hN}Cv-p4J^k)G%kw)vH#cF%pPOG4y2)(mM$T6>U^os= z)75TwvmuH*<25KFQad40u>I-Q&65XAy|19a39h)4@Q;iUTBi{>DX?iA=PvjJOM11J zpEbzQA2ptbqIU)f&zd%-=W1U#hiuEXY5(GB`I<3YGY{nh-l3&qQ`xorD#gQ=29cp@ zMSnuV6$b|I;(P3v#GVU4Q;P%G@9rHIX*(~95ON&BI#+y4R;gVgULr;(V(O@csOzXh z4ydReV|SdP(^dV4#KowcDw{0}NG}(qdW->$%QaPJ zZr7GYZ(X&6Q7Yu0o42xUb+mWFD4*xwJTUStBD3i*Je4lHx-=!r9?Z<7M!eCo6odPD z+2NeCW%)uZrUjyysvgNg_g7*l*E4459rpiI~M~+uxCzdiFA2M6#dIc$Pe61)MzU(~XtZ>;~e+bnX{}8^(}k>K@ZdlPP%6*)1#? zL)j$iZAxA$S2>t#s`5hl8Lm9Yd;VqS&yF)&IbVez38+v|_mWOYtPot(<${Vn`)sZR zFL%-9Vi6sXG~Ru30wOx5*hzDbt}Ke_ho`;WSx)?1x|tB_xeW zynaK-F`$2iN%Yj1zV)qGfV+ZYrb#nrN{IuLuUppN9c*Ybu*wSfJJ+?WFmx<)`S*Br zrANhr9+puDs(mH`Xn!w4S}=bwdddTdqTiE*w29&BE@Z=a?6XeHiCxj==&ZAk%2oU99F^=R-|{-EH$Z)_mU4S(+jW;oZi3X?P)9>?hqzBBugzyhl;to)h-C_> zJ=0L5KcR$r?QtldC6*ZMRGF3vw7zQ(ZQLS|a5*)U>WtaV9BLSz2%l;Cm) zNBXm=1-7O;c+a0-OLCATn^HG5((1(6^{a5l04ob<7yWI|X0R9`Zac3h6Ojb>Pf!W? zy*Nx~wob?N$l9v8E#Q*D74gdTxK1>7fMg+ce;8dw`0yALBntgJK6y)JS%4H~Vv0dA zv6AL~@9VOc)()YCIQ3u(n#E&5VGVbNJ;5=w1AV6TPFY6<;(&UhSUPgoC#a!*}s-TB98Nx#0l!=%D@VD4+3J8*h zUX{@K!TsLk?BY!%0;m{4@xK4)7rL;m?qVTz@j%{wFsO@(Slou2q&~6XI;^lYe0t84 z-Nu|`j%Uv8Bh@bsD9(TmW!u?iEEze_(+vc0S)f9D5Q zwZ4yd2Svlq=#n3~xYy8Eay+(+ts}v@<^(S1bzo0AhE!G>*YrllCbT-A_e{vYJycXv z8!i~wRZT0}w3H?ybma~N!?-zU-+*0}F zPCZH4E7vpv@j#6_@+W+Ik^9|B%u-bf$NZBPq>+RKb2J{$q_+a)T^L19H$>@yc}Ifz zQNLr&i6q*O_8*oJb`rs6pxhZpmd#^UX}rAUkbJBMJ~-#V)8iPs$WBz2L4d+3qrWWB zv&5QZ4U5>hykvT7>$vBW(4!zty5(EW`UfBamN@j#S(obrNYJ$tHLW3PK*cfC6xmNf8$ZKOS}|UrPW|-K1{Ty;OEjlO zck=_LxljP#eq4#`B5>%{Wl}8aTh!bu->(oR+ebSB zN4Z+{A}c0}thNn=EcWe5FyYDpZOk_&Z1FUT2}K=uT0|UU( z_8J4}_vGOJWh`4Blk5Y1HjS>2hGv!IUWl)&M6tLV1?Z)QzU0r&+@6=pgFj=RNtwG@QDU*hEn?m@fVZqJ z41YY~Wj8IlKfG5(UYN^bD)_bO>lVa_FxT*uhSI!#eYuRjWw;CsRlxz7w3o4Q1j0lU z+b(GVi?jx zn01NZ=+)%ejc#3g6pXSE0dKLMWJbJDN0C}JG8dIiRI^k`iTI*5%>zwr4}B=asG=RI z7MIF-u3)#>L}fY`@51~iC&Ym4_W4xj;!xl79n#_MrxwhiCX@N8riRa!R05_0jm~=K z*P=*=Dw*PS(6ofg$)GW{SIU0E9FZ4fPxxCpfa%HclYI%d2lZiG9B|HJBA9Y+?Hh#9 zsU_vbo{BNG{_V39ffHqx(}CNjZU_Ze&rL>|dXMj#OaMGT;MpEG(AC|uy*H&9m}e2S zM0eEpWp`&76cF-V>LGV`$$OJZZvvWol)K~ff?JsQExwtJxmNV~znF<){D#(di;?0t$_)wg7J5Cr&6_FWj5nm9Jt*S5P&lrZ-wMy9&mx*Cu}7;CVZ#ZPyHf^Taierm=)Zmj)pRY7%{7juJQ()v%iPy?8VQPNl5{2)4O zh3{f~)%M*ulZ+23u-u?j>V~7{;DA{$zLce5CHT7J@#MFz2kV1gyu)d>ScQ7-T{4IK zlZ9tH;s?49T0gE4EKa1+5v>uApd{gFvqbiUr>N#5W47ao5 zBI0(0FQAkv(9w0M!od@R#)1P1T43YGpU37n=K`K;pPKVI>iJuf5iWH z?=z@ODs{)_86bA9np|f|GjIRn3tPWFGuZb*;=(C_6Ux4i+C9;@#25&$iOkvwI73_G zE?7MW^2@P5(TOU!v0HkJzVA!J4drnp2-4KVc}k)V&4GQxML3p6G@Sp=ufnHKNT0_R z4Y1CJu28EG$*EIdbDJf%9!qMI@=sFWng7I+^O`8A57Dy5n7c)!(^Y;_&`|$o6_Cey z`pbnoXLwiRQdiB@2-VgN;;~-b&DNE4uFc|2f(qx)CGOLX?RE$q`nNBE2Wrt>^vb4S z3Qd|9dl{1q-*mrRlSrF)cE@S?nJwR9x-`g*pYZqwYjKTUlxA9y^t#R(7-XRmxRK_) zt_k%ZLJP_@xHv}Hl^(D_D-le68#pibWKBIr?Hz(e#@^kthWA`GxyZRexmPcCA8-W{ z6>$dAmL1#_HwvLrYKIMOyO1p@Z~Hng#KR*%eUc_%1_i|1SncxLK5ecrb%N$EdEspO zFcwxR$tsQ}Ep;8KR-E{32=Bo1DztWi2J-Eml8A<8wwyY^o5n_Q=n|8Z{cdpoS?8WC z^4dnjl;Z4^<`$tZci2cOfZ+UVMhZdkuHT51bLhcmyU;X7zSF>a%9{m~O4hP8^#^0Jf!1maLe0=}Pjv&PF^)R9|zgv)Ty6Dj8MJyMN zs?{a|HNjbM5L($B+62g}QJ4dP8DcI(n22nG!UEcVobbAoO40;mHR4qK(oVE}X#?~* z4xt@n2mP}1*WwcrNBBlSL$CE{YJw>@_}~#cYchr|IC^yW`=H+!{tCdU{JoM77&{->lzBrM!bYQXC&SM<+f&gmatEv{6yZ$IVi!JMu5e z@IEHe84z>6BNH?a6ZpU0|12<^@h|T_Ed=(z0kuka`49Y5sB6z83ey+HK)7`w-$cKP zH5m=4(qfYt6y8;tMu%O4Q>(+kAu!;7@>5mKoP6B`X@7+oCQljuuuvn z_O>2NPT9Y?w5Dw3TfZHi!3%JlWLTxPg8H{jcGyS$YH2Mgn@*X6!<+RsTN1W}vl8ql zmFb@tLqBw%D0@i&dpRl-%CJ#Xg6d5QV}vfT|83)uxKD~W1i|nMFfG<#{a5X$Vy~l# zaW*3Y0K=0s62U(R+HEJ$%4TDO(xSeoHba~Rs3P>cNK3>RHvxmc#N{lotB>_X-6*4$ z0nItXY`9s9idC}n22gWzmlAQE!PZjZR&C(mdN+9&nE_{|z`8gp3s-geqVRUIl zfEG%9wj!PddS?zxv`*9rQ4B6-sBC54JSP8Mr@v;ggiwW`^oZv`rsSd+!D#MrvY+yX zyrd~OV3lI#BH+#Z zMZrb!2dkJ)-6L16AP7_XkXR((LJlA&2ySyU2(B>XvLKsFSdgRQ!X%FZ$f?AP1LLbR zZPH3YQ57Scts^rCsM!boAlhV@WRfzXyC%M3`00oKnky?;Ikjd9l_BnzxNV&JNA z?b_orpeJ!NaAU!~3(*8+EEH@lj+5{}tB+K`tk!4(m};1PUdiJcE8s#KIlRs!>nx8c z%nKW0idK$e94;X_og1CLHHMnW6u$QhtHB_T#^)ZL6|^3V63y z%OK)^PV`0oH_hJA?B)4wTe*uNBJm~BLQ1&1p>;V23KZI1Ign-KOyvLq7#ECSV`rA8 zpY@0a2LYOh6<%jK;Y0~b3hO|)CoN#g@XLS%)5RBk^7c*R3k}sz$MdsR!G_tvB%8fF z?<)k3E+ifc%-aqOT+)+TxKqgJ#=sK`nma7ods#-`=y4K(iK#OUqUSp&x9gtG0X`6E zTF-kzCWB~PthEAu)LBZNofX1^)O=&`m@MNV0=!G(3f_S&ug}F3adoL+MTYivUH4jR zakuAKjAf__qc%G?p40npdn@!X1a*2Isd4QL&A_NlQ-caWAQ2fYBPqtaQ41Ypua_ZX z=a?n$9RM&%2tN_^bV4V40)OLtc1E;t&R7arp9*7@M%N?6V&Mq*3>)}t5CF)33a#1J zTKT_){bSyF)7;UbLf7Hx73GKkhBgLYEn5@baV#amTuNVM6b6xYVzg>~i*e6F#twr; z6D*(-nxf@FSv>a-2l4Ppk313P`!^Lr%9-Igc+?qTPtH#4vwkWi@M;oxQ3-|-b^};9 z2aw`g%f5;OArR-#2wPL*tH(M~1s6D?<^qdnVqV7686Y#ketwS!z0Ej^44cz!_l7vy zwXXh?w>)Dm6uL*3jz-Dmf6YBUV7&7?Sb#muYSGlCri-Ke2*_dL3w6y^oN(WecGRlz zX1~`%4_J10p>1e`QU|ETe3;G2B?>Gv4sDjtUE7nSExXlqL`c9+eaFOR>& zcCGO50EJh_WHNB4d&9ky*0c)M82r{w=U*_VQ7ZJ1z{)P(vHs*gGNi-k*r#@O`!j1^ zxVoijfI17j5-vd%(hd;G-FLP{u1No^q-JnDpkgEC+ma%1H5bYw|0zYuA-3xfB4OPn zeA(K=GLH!xObO6+Gca9WcPPxVwP}c%Tl`i&z1KhEG3rOdNDsXl$#Q8}TnQStz_@cA z&v%H{?eEjo2c2xf5aKP((UqL0#l|&}6=oYDwp7W4Vkno{2$Ie0y-k?~u8xHeSo&Vu z33ErA;=^*8xqejIKd}-X)t!$unRQ?Ic|EKltF3I`B4w`L^yti%T>`DVqvd{gNydz_ zCvW(WqfSNrYMh*UhQ~A8B`gIcmpa?K4Mp%e2t@oqJ^2G`$E7ELVfDPnwYU<@^dI+e z;>z=7SmaIg7FcA@UVK{&Xxzed_lbdV=p+TGO7&@#?E-j{YgTCBh8VC-oERk+*B@P) z9c0e*3I02#9!uaMeF-E#ruHv;ZO>JIX&Wdyk%3o_FXYQdkG`y#s;g9`nKeSTgMvOv zP+gTNqh!M-@!=*Rw%9S=n&_q=5mscV@iWL(yc+p2Ds=9W_zU&g8fSn;v3&`3acSe> zb|6p2=Z0A6G=(x&Dw`7u2cXvqG`_`wP{lKWTy-;-@pZdweQw{X@)xFik@FQbIiCH} zi4Rb zG;$UGVjgt~rkwe>S#O)cpn0m8_49IdRoN8{eTvP2*TnYe8Ku#k1!BTy^C_lqE+Te} zKh)f2D^Gu0h2X3JGcl>!M?+i8)M>k6njao2`OlxcpVwRFhCu7yvHQ&sW;))^lB6Mu(HPmmh@E3Y8<57hu%EghOu4 zvEYHt_xn^Ly=_7CMX3#%DgAB>F@O(`rtx8Nm^TmDr2E`MUHlCpW%>^5MRFVda|2*+2> z^b(Qq`sDuqDO8Fp+fMh_^@wA-Jwtmv(=mq&Xa4-J3Y}*gw#37N?vQ4n?-OZL!@PH; zjX}PnU;`3j6Eb@9+fG_ndz8Qx61IipkF?I9eF^+2g0lh!Ui^I@YT8=eUAI9y%e%Xe zM+qkJ*CuT)*9N-%^jf0-RR{c>jxNHv@!dMBkllks5mv!o{hWV~>E8V%QJ1AXq1>+( z?}L&Ne@>iw@oUD?Ty?Sj3>bI%p%)&`f(%9NH}s~v9wikPS0-Lhpv~UxaNmM2uh~kp zNoNhL`8gtMl?g`8ah|-pXD4b^X%I|4H|>lu{U4OA8^zZ$S@3TJe>zR&559itcjRBP z7x~-ROHJIO2q9t-sOKUF7m$o5vP*?zn5$yiUw&`;GIdhehx@oS)M)BK-(5em1uT;^ z05kVhNOvIR(_QchizniZ#JlgGV2*#3CpwI`&hLdk?0*5mv7*&b+4!Ghr%!L=A>@C) zzcFI6tBHPd9wPQ);}a*<&_I;|$cs?6ozU(hqc^MCDjXOPsG%GGV0{A(@x~X=Xu#mW z54SB>-&`l-=$i{H-yVG}dd`}mnK`g-WISMgLn0fl0RObVEOuZIObx1G-AtjD|> z3yD_Ownc+g1O`>y2Z0YOI--NqN>{(MSH@g)7+nge$)mL_o0EL2Asx!=J-pSkR%6$k zXX@{&;l>+QZ89loFc=rnI^Q8uj=+QRF89XDxSn00V0j^1uO!ubEmiC z`jBDjns71^Dp+a?6vvZAdMnmvcs%)Rk9Q{0l*T^pOto-x?&-q?=u>!gem56pez5%= zn_3hHQ=7$6bOG{k4KZZY2Xvo2KC9>^cyoXNVJInU^?}rG76ZgQcRG*YtbrBQ zOO|;>=Pj`aS#cv=daiqVh?nVUGljxbFX)b6iD@Gbc~7hYq7U17#*=ecPZ@%mQTd&j zI(rz5`R&RbMo(iR{KB@$o@3c24S%GDWX0M-uuD``6;zndIKmUGjw!gF5&3ee%wQU_ zEV-}m9?QDGfJgA{Y(+8z37dxDV#|DZh{3wu)!=G%YDhh!^2ajz$R*DA8T#C66v^2U z9Qc(LdPJNoa`2ZQz~bC^eTR!coVA^3A;iGp=`S|P!(+tPKZ0pbLcfvDXAjEE8imDKm@P~VAZ+jvS3;mq zMAOn+3qSdJh+5ek78?Tg--mp`DIJc02tFF_pm3g0w8gM)!{;>S+MIi_Tam*e9FDx@ zXC*dN^l^?dNNe8#fP4z!vERI)=I#HjJ**@DsiulM)Vj!&Ts?%6$Pp7_Qh@tVe{m^( z-48WRz?=GJlN=>r=JZz;u{X^;_2eha zQx|*0{ym*8XIM|c!`)w1U_VDRk1WDOP0|ENYp53w%THL2&qDy)d~q13v;6lnx)SO)1-R2ke&kxbq!>v+Y!WO;8K%YLHIf!?QS|AHSbL0gJeV;r`qIE z%gpqYC_{&e2`2o#MUypI=l=C%{M%cwrVP-m3z^tvUqcHIsAq9}HZcq>IP;OZyr)BQ zIF+JU9k5Udxw_B4VKvwY2c=ADV?SrCKR>J-^%Z+QzU`q%`t$ZPb*J1=2Is>m3Q3yy zOSrIcUdU$*G`e7Uv^|#=j9wMd{CFAH0?7fM4$SGYz*5AOk^=2RtN6kJ9DoRSom%X3 z;!yhXQgUoviEbk=#4^Vf z{e|jJHlKoyQHA8xQK`p-e-j4Pt|R<$VIp}2L22C0!Q*Fvoj|(^fcf_q`@iJ#=yRcy zOR3}DUx^uNc~*Ob5bqFc9bW;bUiT*^X&J{3+T!0b~2#-Jsbu?*m%;(qRVpxc1kptw)F zk%D?jhfkE*FFp>z!RC1y4-|o7iw!`#m@FxH z{&1uAEq~YP{^5pXCXzL1-RK)7o##2lvXDrwN7Wsw^1URhsCRs>Cm2wXCotsM;>!xO zvH4f3pu^EI${Khs7+zT@C4K4u`Kn`-roYx#x}})J6%BD4n2c5JE@OoRd<-e<$hgqrR>>uk?$>MAhO>^5hOEGY+ zOFALxt)OVz5PZ&cx8SU*QaSglvYz#g!E{)qIVR8uxoHkP0~cX&0G1~xrEML-9sECs z%}^c~*(N~9=;zVl3wemH*08_!;$5No^c7jn;zbn+&e;?I{ckXMORuFf=X|fSh}LMW z_upmE{#LNCCn+;$FKb5!Y~=?OBpWd+jDpvrv>PaH`HZX}K<@^^hmlDyYoiNDV`ysH zWgPPFUT0qto;Ui@g~n)^P<1Co+|NDXFEeaT75=SN$5W_lfg{|Bp&?r1Dm-=X&{wJ& zpVRcUsS>5*XN6F<2<3(3b_R9P$GQ@f<{ti-0dNnY`&2a(sioH~Waxb`RlQEkPDjCh z;@S5Hzk*<_z%AZFzT%X3C_^uvu-duU+|ph8>#la$A(uO{8Sr3Q3b7$*OlTE+&Fm7l=eI| zllOU(7V()%1tcEx@mB+bP_}u$+UjN&SDVNvAX{cJ`~?&JYN#yP5hQ>w z-5V}dq#je?5jLr7^M_AyuY1C_IDRZ4GM zT9k}RLz23Pr*5xfPLNDzxLqD=!nAQ8&qlFA&>&|>mzjJBC_HH$GT8=G;eINu0X zC0c=ZV05$A%X7@$wtAqRIOqC!sDB_0b|GYJY%MolE}oEwml#{U55`_rW&;PWGCQ66 zBQR#dQs0<^{4-w!4G?5m;|7TnO2}Hp&R{plVL-M#8{f0R=qTg6cI=Z1A4L$%D&#n|ozm38O- zcBsmP@b<8ojrBBlVQq3c)zrB-n1BJZ`xbg@<&9XEYeQ0&D2MG!2prL)jQ&#%S1?i0 z^!RvDs_Yp<;fG9B$<|_z)qaCN>L~K~eBy$A^vE1Lxcny=jDQ6_d9-Ls9tu3MEJNng6|glH^`wS~65R&Tx6`$f`r~1X-jjGZJHxBAseV=iia0kCkw;-Qrqdi(0o%6E z9F$zB=x?L!9KI12IHsjxxS5{gbEvAJ&ysrVrgK7_y>wK9!D)LvB`P^6Ey^Ad&r_<7 z&eOEKVfYvh6aUcnl3_FI*# zzkOq19DuRi!L+%It6deW7(Kb@UFsS)Dgxm1e#RTIv204kSM=2CyqbIu<^Awb0xA*t zFu4HQtDc5$40@Lm)n9giMC)#%N!?>F>xYlikVeTFEo z5~WHOe(ff;jWp%OSGceJN)b{!X4a*P*Ih@6eWeDwg%n(kgCpcLAW<%9%s^$=@t_1W zmdd@$)Y=kX7f@7znfDy*M){ct?9Bzhq9Xj^n3lZrdy~_GEmC|uM_S-H%PN6=n}(1Z zGloDf8G3n4RP??mP@UWqPyaH?l|Z9G2?;gE5Wez$KhiT0Xa5s52)`f}+RB zwh&H|^8dM0Pt&-&HYQehb_C^qVK>cVAHn+l)v)HK&!Litf)sxi0_l9<1Ew9$nc_(O zj$bj}gFoiG3xY@S2w2lHj)|8L#anj0grqQffA1;1vSYi#tgm8u+Fr8yGy`v*#q`p7 zF=C27r0RzNeCI@praxK-*DGn#zCMq*I)7aCPz44;OJ`|`VvRWbw~WMgIAP0VBZ5qw zizJFLhZ`qEBQLF;qcH2mE_YR7xE@p;spR~SwZYI^TEgZ>Tr~K@Yzc*yeWlfqYA(z2Mq?@EdlM^)*p~$|q$+(cJcb`aCaiIaoS*|0;GmOq>5J^iI zR69>SrN=GPGU=DIkgMyc@K8e#$t8>+~0YE1nqTiz9-@Mt{MxNu#-7jHlN>zu9M zn6CHBXQd?UIpd0=wnoLWHz9a(rZ3ZGBxY)_FpMLh9m$|PN-aUIe8qw164j6#Z<@>h zuFQSO=q)7%D<~1u3jiEQ#?yR;b-GV3`Do=xE??=q78gV_h3JDvq&fVyizU4s4 zh;f4b_8*SoRboVdgdmA)FrK+)w1pfcT{<;gT8ApNC|$*sz+sV1xz;$Tz_6I*hu>{N zdb9=IkSPFPqk401u2%?_k;_OQ|B?wEr$PcUpqk5+vIrUaiWFY;?f+jH_OA`aP+p5+ z*%Q%1)dcgf|3ZN@wk-VbPd+7;PVgH&pGU_lS16+&W|YXlBFYd~y0|UV0`u!(XSh=t zsRB~0K|gb4!#5AK9$+bPma6H;e66DS9`MRr!ieF6__K0uW40bcwr@08+yH?4Y-X1~zFIkv7VOGq+;U&9*Djk!2bkne5>`IKE=oep>M{;&d2t#** z34YNLt%!6i4K!x{%z&Z;Q^K64u*fjFbpA&%o8zvwv5q~Bmv1tyig)uNVHjtEwK=*v z9xTdGuo|M}Px)uh_0%w&4wdH8B7~7MuHV&!1iO^`!;KfsuTo(yVHkq-Iv&LIO%}l9PYD_QKEm zv?)ph(w$-w6S#7hSeOCSV6jq=YSsPLS<-XN1dS_{;p^(&V~FrrbF1=6aZ}}qMG$OJ z9z&z%z4V}6Gn3Yqnq;c2oF;l&2a(gpn2Zc1A^R|TWGZ1v%uE{ou#ZKx;Syl(K$iDa z_#3vEWH>>8n*5V-%nlFdL-ghl1U{~BI@+nT{Mt||!>$BO$)Uqo zqAu5Sv_W9Pet#Jmb*S@c?jk(}e*mE*@<{gw%q;hP{L}wdtmJzQdc>c}tO%u!5lMg0 zRDm8nS9J7x^nkevBYoa~PjL@z40*%oIRT9bBOWSW)ITSRsqCs}O8QFBUxgrZ6e4Z5 zsN8>NZjWCLxgbmwYDaqq)V%16&)Q^ew&jZp7JV&z+h+}i1cA$y)*&9>K{Kqb!-hLy z?(++1+6H3vKr@v_NRQfTl%Q+cle!n15U}-Wmt5QW`(?y3=eH7DBwd9xko8+I3Vp)n(yFi9_Sj=9&627(+!YG|0yyQm0}&O`Y^P>#oHP05L|(rfnQbLL>C?_ zeL?jW=!;?I%b~fahD=3Y_|=`7&CrJJ?jN5GPGU(H8xmIKVAjBUp-Jq9->M>BATJ>1 z)exr74W@pU>lUM5p;btrG+mfLo$j;4*drbJK{B-q-93>D%2oO??@=w%GeY|{cvCyJ zC;qB{3v&JN(M?A<(i^N)=)3NyVaj4RVAIhC-fN2M>+-bwslD;ynv@IPlZ4IFkzEHS zCd=1m=f|h(*=3~8Xls>mhCrnbmQ9AReEbB%(%IfR_`oWElMpcTB&r=Ba-@smSq%@q zf7n(ogKhALzTqO%l9J3|ZK&Z!lbmV`m%ZB>VJ448Zp}@*|2>QUsYY3~hzQ8-WYAC$ zM;)~b5@a&;0P0#(3K1c*!(mh(MDCj!d=;uF53XYQ=P02 z&AL@U<-m*;Qo^f>;*6Kzw2UrWO{8y~U@50`->aVas^J6LoSW(#3>s$vn<=ewh-(Dg z1&MgGhT@$fpOa3=rJC_3A2oi826#?KvHI+=8c9{mIvPw=W>U(G5c_4aJ()?p7My)y zD%|C$C%KzvhnQ13j};k4lgl+RQUJBdQ95mD5sUY^C-g14fw~E<(w*UucoilKS_!C-PWY|(oYEzU65#GLNSY1_>8lr!^AKkWk#-ZvT$5DU z;}vXR9SLZU#_@|Lpxj~v&4gfF?MJ{5phd?(G zdpjrB%@p_Z-huXE()8S7zIrRs`YBJGWto8Iz35&WvjBu5mqb?>;dTyu#rTQ}Ae7@G zWQic1y-Kj3bke5Tao%v@qEelIPbb<^)+XQpIlBqeQ#p{hSYZuxE&Vf^5_``y10t=QPJ+7|y{|6~=*HMT z3T_nJ=A~kMf6daWFH;mqvWyDVrs!KRYHJ$qpa|n`ZL_%``e$sR@Ga+Pi5mXr7ZfJF zr;oD~_AKI=b$mW*OO6+Ho_UFpKQ5j$VW<5@o=0kB>Qlqv>8xUQFp4)BL|P7}36;eE*eX{FKw7g2z-z890sCS< zl}+eRBhPGbd`r){#5>ovEAS#Z-K)wZxpQq>u={Gx8+LTQ%vr8}Lv}~J5LCq5%yd4N z?3B7lDK$m8AXm1cxs)&r&#P|Ht{YE2eJ*jj1)^Ww@Fu)Z* zpGmDvEW0`6ynV_pF%=)@L~ChuLM) zseu;|RRUytFrqlAy8{Rgp2p7@fW^278Off7nRsPtSJTWs8@3u?~jM>V$HqprI1IL`Y zh_9JR%@zQ(8|#)1pq@mt@$0Kmn8HtKr5J*;n+D<-Nn2T+Wv}~(bK+pwKNm;BYg{sa zTy0oYuA^;~L2NK(^ValapdN2>EZqVKsEzW;5?P;QvGv81Et?cHSL^K4KJe3c<^teI zk{3K(ep#-440o^vxDqcZKr9 z>nw5WZwq%j1Zwi@xvl*s44CQs_|;sXs<)O4qj(@2#>-GK$apXV`p%cQejiim>saJW4@gGsfDvIblQ z4^_;U`ec_cKYJm2=?#8arkKD=yYtmdD1BYj(kl7!J_?Yk)&gu>zZ@vl6|IRPDAmm1 zZOHHU-9>@A{nL+o`G|C3E+@z`ARMmpp9exT(;Lqfs6%mRXqt-iAXU9vh!chX)lpyn zw(V~1%+NVt8Q#visrvmA*jw$ha*Et}iC}#GDgb7}KJokNRZ1IAlF=-8Y@<1pYdQR8 zxqKy~7F(|IH>^{jN8UsNB?)iYM2bRP5>>FTh`5}e=!ubyjvlnGhL6W0nxDxkR;MJ<8g6|EN>R z{$;nz5WCqsfNE)@?4pp1olN^YQ1&bp-?5paMm*@8#t-K%TXuIMAQ!0X2?)J@On9lt z)P`YfdQ#9SzXp5@3>i_lsW}mIs7(LCl-g-aVFRAKB}&S5hkXpLMfD8`-Awvfr}e7& zdIn~OqKV2W)B+adfBrTka;X=i3~Y;{N~w`-9z-M@Q7fpib{A~&E^eGC(Osfs>l}pM zr=_m%=s~j9?AgNu>*PY}H>Eu-xAq~e^SMRHA2{WI?$!Hqamw%3Im}bm3q|rB0GVDb z`#E9Si9_vtJCbFkn;ygo56fr4=0rVr*;HpcGg&Y}EdysNimWW*n13uh(XR#ku#ts=5b8wsY&{gOzc)wDLJZ)$YfSO1t25_1n_>LB!UlH?nZEOMX7~ zI2k18xBQaQjQP9;s>#^W4D&09<yREDK|HfeTOK~()-$oH3}y|s(woAMb?`>PzRJ1~bIzJO^Gsld zCpTVq=_*VpB~Ku&Bu8ms#viK9LMwd^eVX_nrZ@545nahGUUAfaVcezA%IEQx9oLwRV+8%--Oz13SN)H)LaW-Q^Rm!(fiqF9V zYNKt0bU`eKyA-G;P&7v*hF5xNw2lMYnY2@1p>RF1{>p8Xs*s>A4zk+e4HWMaSJX=d zyt7Bx(bx`E8tl3?|GHoT{XyEtpc8RAS+(eV4ooX3VY=_wjFdB?9~6mvhy{Y4N0p=- zNAl5A4RzFm9x@`$ABvD_y2RYtpFtYFnuH+u{2FBvVXMRnzSax)ss{E~-pDlI%<%0Afkn-M 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
p@w)OHsl8va8`Nv}=Ksy>=ZYjq>49%4O_S|Cca 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

yC*N^^!nkK99$&R@8u0t8A!eYhuYYK^F-w3+ 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

utRC>bK{L8O#fE^$@3(l_gkoZ-7gv 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%0D}a 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