Repository: HemulGM/ChatGPT
Branch: main
Commit: 97ad2e8d3d6e
Files: 80
Total size: 1.2 MB
Directory structure:
gitextract_yo52volr/
├── .gitattributes
├── .github/
│ └── FUNDING.yml
├── .gitignore
├── .gitmodules
├── AndroidManifest.template.xml
├── ChatGPT.About.fmx
├── ChatGPT.About.pas
├── ChatGPT.Android.pas
├── ChatGPT.ChatSettings.fmx
├── ChatGPT.ChatSettings.pas
├── ChatGPT.Classes.pas
├── ChatGPT.Code.pas
├── ChatGPT.FrameChat.fmx
├── ChatGPT.FrameChat.pas
├── ChatGPT.FrameCode.fmx
├── ChatGPT.FrameCode.pas
├── ChatGPT.FrameImage.fmx
├── ChatGPT.FrameImage.pas
├── ChatGPT.FrameImagePreview.fmx
├── ChatGPT.FrameImagePreview.pas
├── ChatGPT.FrameMessage.fmx
├── ChatGPT.FrameMessage.pas
├── ChatGPT.FramePlainText.fmx
├── ChatGPT.FramePlainText.pas
├── ChatGPT.FrameSVG.fmx
├── ChatGPT.FrameSVG.pas
├── ChatGPT.FrameUIMessage.fmx
├── ChatGPT.FrameUIMessage.pas
├── ChatGPT.Functions.External.Intf.pas
├── ChatGPT.Functions.External.pas
├── ChatGPT.Functions.pas
├── ChatGPT.ImportExport.fmx
├── ChatGPT.ImportExport.pas
├── ChatGPT.LoadedFunctions.fmx
├── ChatGPT.LoadedFunctions.pas
├── ChatGPT.Main.fmx
├── ChatGPT.Main.pas
├── ChatGPT.Manager.dfm
├── ChatGPT.Manager.pas
├── ChatGPT.Overlay.fmx
├── ChatGPT.Overlay.pas
├── ChatGPT.Settings.fmx
├── ChatGPT.Settings.pas
├── ChatGPT.SoundRecorder.pas
├── ChatGPT.TextEditor.fmx
├── ChatGPT.TextEditor.pas
├── ChatGPT.deployproj
├── ChatGPT.dpr
├── ChatGPT.dproj
├── ChatGPT.res
├── ChatGPTGroup.groupproj
├── ChatGPT_Console.dpr
├── ChatGPT_Console.dproj
├── ChatGPT_Console.res
├── Code/
│ ├── ChatGPT.Code.JSON.pas
│ ├── ChatGPT.Code.MarkDown.pas
│ ├── ChatGPT.Code.Pascal.pas
│ ├── ChatGPT.Code.Python.pas
│ └── ChatGPT.Code.SQL.pas
├── FMX.Media.Win.pas
├── FunctionsLib/
│ ├── func_cmd.pas
│ ├── func_weather.pas
│ ├── gpt_function_cmd.dpr
│ ├── gpt_function_cmd.dproj
│ ├── gpt_function_cmd.res
│ ├── gpt_function_owm.deployproj
│ ├── gpt_function_owm.dpr
│ ├── gpt_function_owm.dproj
│ └── gpt_function_owm.res
├── HGM.FMX.Ani.pas
├── HGM.FMX.Image.pas
├── LICENSE
├── LaunchScreen.TemplateiOS/
│ ├── Assets/
│ │ ├── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ ├── LaunchScreenBackgroundColor.colorset/
│ │ │ └── Contents.json
│ │ └── LaunchScreenImage.imageset/
│ │ └── Contents.json
│ └── LaunchScreen.storyboard
├── README.md
└── Res/
├── chatgptfmx/
│ └── res/
│ └── mipmap-anydpi-v26/
│ └── chatgptfmx.xml
└── preview.psd
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: hemulgm
open_collective: hemulgm
================================================
FILE: .gitignore
================================================
# Uncomment these types if you want even more clean repository. But be careful.
# It can make harm to an existing project source. Read explanations below.
#
# Resource files are binaries containing manifest, project icon and version info.
# They can not be viewed as text or compared by diff-tools. Consider replacing them with .rc files.
#*.res
#
# Type library file (binary). In old Delphi versions it should be stored.
# Since Delphi 2009 it is produced from .ridl file and can safely be ignored.
#*.tlb
#
# Diagram Portfolio file. Used by the diagram editor up to Delphi 7.
# Uncomment this if you are not using diagrams or use newer Delphi version.
#*.ddp
#
# Visual LiveBindings file. Added in Delphi XE2.
# Uncomment this if you are not using LiveBindings Designer.
#*.vlb
#
# Deployment Manager configuration file for your project. Added in Delphi XE2.
# Uncomment this if it is not mobile development and you do not use remote debug feature.
#*.deployproj
#
# C++ object files produced when C/C++ Output file generation is configured.
# Uncomment this if you are not using external objects (zlib library for example).
#*.obj
#
# Delphi compiler-generated binaries (safe to delete)
*.exe
*.dll
*.bpl
*.bpi
*.dcp
*.so
*.apk
*.drc
*.map
*.dres
*.rsm
*.tds
*.dcu
*.lib
*.a
*.o
*.ocx
# Delphi autogenerated files (duplicated info)
*.cfg
*.hpp
*Resource.rc
# Delphi local files (user-specific info)
*.local
*.identcache
*.projdata
*.tvsconfig
*.dsk
# Delphi history and backups
__history/
__recovery/
Win32/
Win64/
Android/
Android64/
*.~*
# Castalia statistics file (since XE7 Castalia is distributed with Delphi)
*.stat
# Boss dependency manager vendor folder https://github.com/HashLoad/boss
modules/
MY_TOKEN.txt
/Linux64/Release/ChatGPT
/FMX.Memo.Style.1.pas
/Linux64/Release/ChatGPT_Linux64.zip
/Linux64/Debug/ChatGPT
/MacOS/ChatGPT_MacOSarm64.zip
/MacOS/ChatGPT_MacOSi64.zip
/iOSDevice64/*
/Keys/*
================================================
FILE: .gitmodules
================================================
[submodule "DelphiOpenAI"]
path = DelphiOpenAI
url = https://github.com/HemulGM/DelphiOpenAI
[submodule "WindowDarkMode"]
path = WindowDarkMode
url = https://github.com/HemulGM/WindowDarkMode
[submodule "OWM_API"]
path = OWM_API
url = https://github.com/HemulGM/OWM_API
[submodule "TProcessDelphi"]
path = TProcessDelphi
url = https://github.com/HemulGM/TProcessDelphi
[submodule "FMXRichMemo"]
path = FMXRichMemo
url = https://github.com/HemulGM/FMXRichMemo
================================================
FILE: AndroidManifest.template.xml
================================================
<%uses-permission%>
<%queries-child-elements%>
<%provider%>
<%application-meta-data%>
<%uses-libraries%>
<%services%>
<%activity%>
<%receivers%>
================================================
FILE: ChatGPT.About.fmx
================================================
inherited FrameAbout: TFrameAbout
Size.Width = 944.000000000000000000
Size.Height = 703.000000000000000000
OnResize = FrameResize
OnResized = FrameResize
inherited RectangleBG: TRectangle
Size.Width = 944.000000000000000000
Size.Height = 703.000000000000000000
OnClick = ButtonOkClick
end
object LayoutClient: TLayout
Align = Center
Padding.Left = 20.000000000000000000
Padding.Top = 20.000000000000000000
Padding.Right = 20.000000000000000000
Padding.Bottom = 20.000000000000000000
Size.Width = 635.000000000000000000
Size.Height = 641.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object RectangleFrame: TRectangle
Align = Contents
Fill.Color = xFF202123
Locked = True
Size.Width = 635.000000000000000000
Size.Height = 641.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
end
object VertScrollBoxContent: TVertScrollBox
Align = Client
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
Size.Width = 595.000000000000000000
Size.Height = 555.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Viewport.Width = 579.000000000000000000
Viewport.Height = 555.000000000000000000
object Label1: TLabel
Align = Top
AutoSize = True
StyledSettings = []
Margins.Top = 10.000000000000000000
Margins.Bottom = 10.000000000000000000
Position.Y = 10.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 27.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 20.000000000000000000
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'About'
TabOrder = 10
end
object Label5: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 57.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 38.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text =
'The ChatGPT client is an amazing open source cross-platform appl' +
'ication that allows you to play with the OpenAI ChatGPT API for ' +
'free!'
TabOrder = 8
TabStop = False
end
object LabelAppearance: TLabel
Align = Top
AutoSize = True
StyledSettings = []
Margins.Top = 30.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 220.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 18.000000000000000000
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'Support'
TabOrder = 2
TabStop = False
end
object LabelVersion: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 780.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 19.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'HemulGM'
TabOrder = 9
TabStop = False
end
object Label34: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 110.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 19.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text = 'Check out the source code on GitHub and give it a '#11088'!'
TabOrder = 4
TabStop = False
end
object Label2: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 259.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 149.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text =
'At ChatGPT, we strive to bring you useful and amazing features e' +
'very time. And just like any other project, your support and mot' +
'ivation will help us move forward!'#13#10#13#10'If you liked our applicati' +
'on, we ask you to give this project a '#11088#65039'. Your approval means a ' +
'lot to us and encourages us to work harder to deliver the best p' +
'ossible experience.'#13#10#13#10'Thank you for being a part of our communi' +
'ty and we look forward to serving you better in the future.'
TabOrder = 7
TabStop = False
end
object Label3: TLabel
Align = Top
AutoSize = True
StyledSettings = []
Margins.Top = 30.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 499.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 18.000000000000000000
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'Privacy Statement'
TabOrder = 1
TabStop = False
end
object Label4: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 538.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 168.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text =
'We value your privacy and are committed to protecting the privac' +
'y of our users. We do not collect or store the text you enter or' +
' receive from the OpenAI server in any form on third party serve' +
'rs. All history is stored only on your computer and nowhere else' +
'. Our source code is available for review to verify this claim.'#13 +
#10#13#10'We prioritize the security of your API key and handle it with' +
' the utmost care. If you use your own API key, your key is store' +
'd solely on your computer and is never shared with any third par' +
'ty. It is used solely for its intended purpose to access the Ope' +
'nAI API and not for any other unauthorized use.'
TabOrder = 3
TabStop = False
end
object Label6: TLabel
Align = Top
AutoSize = True
StyledSettings = []
Margins.Top = 30.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 741.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Segoe UI Emoji'
TextSettings.Font.Size = 18.000000000000000000
TextSettings.Font.StyleExt = {00070000000000000004000000}
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'Autor'
TabOrder = 0
TabStop = False
end
object Layout4: TLayout
Align = Top
Margins.Top = 10.000000000000000000
Position.Y = 144.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
TabOrder = 6
TabStop = False
object ButtonGitHub: TButton
OnTap = ButtonGitHubTap
Align = Left
ImageIndex = 9
Size.Width = 289.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 0
Text = 'Open GitHub page'
TextSettings.HorzAlign = Leading
ParentShowHint = False
ShowHint = True
OnClick = ButtonGitHubClick
end
end
object Layout1: TLayout
Align = Top
Margins.Top = 10.000000000000000000
Position.Y = 423.000000000000000000
Size.Width = 569.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
TabOrder = 5
TabStop = False
object ButtonReport: TButton
OnTap = ButtonReportTap
Align = Left
ImageIndex = 9
Size.Width = 289.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 0
Text = 'Report a problem'
TextSettings.HorzAlign = Leading
ParentShowHint = False
ShowHint = True
OnClick = ButtonReportClick
end
end
end
object Layout2: TLayout
Align = Bottom
Position.X = 20.000000000000000000
Position.Y = 575.000000000000000000
Size.Width = 595.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
object ButtonOk: TButton
Align = Right
Cancel = True
Position.X = 515.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 2
Text = 'OK'
OnClick = ButtonOkClick
end
end
end
end
================================================
FILE: ChatGPT.About.pas
================================================
unit ChatGPT.About;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
ChatGPT.Overlay, FMX.Objects, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo,
FMX.ComboEdit, FMX.Edit, FMX.Controls.Presentation, FMX.Layouts,
ChatGPT.Classes;
{$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)}
{$DEFINE MOBILE}
{$ENDIF}
type
TFrameAbout = class(TFrameOveraly)
LayoutClient: TLayout;
RectangleFrame: TRectangle;
VertScrollBoxContent: TVertScrollBox;
Label1: TLabel;
Label5: TLabel;
LabelAppearance: TLabel;
LabelVersion: TLabel;
Layout2: TLayout;
ButtonOk: TButton;
Label34: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label6: TLabel;
Layout4: TLayout;
ButtonGitHub: TButton;
Layout1: TLayout;
ButtonReport: TButton;
procedure ButtonOkClick(Sender: TObject);
procedure FrameResize(Sender: TObject);
procedure ButtonGitHubClick(Sender: TObject);
procedure ButtonReportClick(Sender: TObject);
procedure ButtonGitHubTap(Sender: TObject; const Point: TPointF);
procedure ButtonReportTap(Sender: TObject; const Point: TPointF);
private
FProcCallback: TProc;
FLayoutClientWidth, FLayoutClientHeight: Single;
protected
procedure SetMode(const Value: TWindowMode); override;
public
constructor Create(AOwner: TComponent); override;
procedure Cancel; override;
class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc);
end;
var
FrameAbout: TFrameAbout;
implementation
uses
System.Math;
{$R *.fmx}
procedure TFrameAbout.ButtonGitHubClick(Sender: TObject);
begin
OpenUrl('https://github.com/HemulGM/ChatGPT');
end;
procedure TFrameAbout.ButtonGitHubTap(Sender: TObject; const Point: TPointF);
begin
ButtonGitHubClick(nil);
end;
procedure TFrameAbout.ButtonOkClick(Sender: TObject);
begin
Cancel;
end;
procedure TFrameAbout.ButtonReportClick(Sender: TObject);
begin
OpenUrl('https://github.com/HemulGM/ChatGPT/issues');
end;
procedure TFrameAbout.ButtonReportTap(Sender: TObject; const Point: TPointF);
begin
ButtonReportClick(nil);
end;
procedure TFrameAbout.Cancel;
begin
if Assigned(FProcCallback) then
FProcCallback(Self, True);
Release;
end;
constructor TFrameAbout.Create(AOwner: TComponent);
begin
inherited;
Name := '';
FLayoutClientWidth := LayoutClient.Width;
FLayoutClientHeight := LayoutClient.Height;
VertScrollBoxContent.AniCalculations.Animation := True;
//VertScrollBoxContent.AniCalculations.Interval := 1;
VertScrollBoxContent.AniCalculations.Averaging := True;
VertScrollBoxContent.ViewportPosition := TPoint.Zero;
{$IFDEF MOBILE}
ButtonReport.OnClick := nil;
ButtonGitHub.OnClick := nil;
{$ENDIF}
end;
class procedure TFrameAbout.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc);
begin
var Frame := TFrameAbout.Create(AParent);
Frame.Parent := AParent;
Frame.FProcCallback := ProcExecuted;
Frame.Align := TAlignLayout.Contents;
Frame.BringToFront;
if Assigned(ProcSet) then
ProcSet(Frame);
Frame.ButtonOk.SetFocus;
end;
procedure TFrameAbout.FrameResize(Sender: TObject);
begin
LayoutClient.Width := Min(FLayoutClientWidth, Width);
LayoutClient.Height := Min(FLayoutClientHeight, Height);
end;
procedure TFrameAbout.SetMode(const Value: TWindowMode);
begin
inherited;
if Mode = TWindowMode.Compact then
begin
LayoutClient.Align := TAlignLayout.Client;
RectangleFrame.Corners := [];
end
else
begin
LayoutClient.Align := TAlignLayout.Center;
RectangleFrame.Corners := AllCorners;
end;
FrameResize(nil);
end;
end.
================================================
FILE: ChatGPT.Android.pas
================================================
unit ChatGPT.Android;
{$IFDEF ANDROID}
interface
uses
System.SysUtils, System.Types, System.IOUtils,
System.Messaging, FMX.Dialogs;
type
TDialog = class
private
FProc: TProc;
FRequestCode: Integer;
procedure ResultCallback(const Sender: TObject; const M: TMessage);
public
constructor Create;
destructor Destroy; override;
procedure Show(const MimeType: string; Proc: TProc);
end;
procedure OpenFileDialog(const MimeType: string; Proc: TProc);
implementation
uses
System.Permissions,Androidapi.Helpers, Androidapi.JNI.Os,
Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
Androidapi.JNI.Webkit, Androidapi.JNI.Net, Androidapi.JNI.App,
Androidapi.JNI.Support, FMX.Platform.Android;
constructor TDialog.Create;
begin
FRequestCode := Random(9999999);
TMessageManager.DefaultManager.SubscribeToMessage(TMessageResultNotification, ResultCallback);
end;
destructor TDialog.Destroy;
begin
TMessageManager.DefaultManager.Unsubscribe(TMessageResultNotification, ResultCallback);
end;
function GetRealPathFromURI(Uri: Jnet_Uri): string;
var
Cursor: JCursor;
ColumnIndex: Integer;
begin
Cursor := TAndroidHelper.Context.getContentResolver.query(Uri, nil, nil, nil, nil);
ColumnIndex := Cursor.getColumnIndexOrThrow(StringToJString('_data'));
Cursor.moveToFirst;
Result := JStringToString(Cursor.getString(ColumnIndex));
Cursor.close;
end;
procedure TDialog.ResultCallback(const Sender: TObject; const M: TMessage);
begin
try
if TMessageResultNotification(M).RequestCode = FRequestCode then
if TMessageResultNotification(M).ResultCode = TJActivity.JavaClass.RESULT_OK then
try
FProc(GetRealPathFromURI(TMessageResultNotification(M).Value.getData));
except
on E: Exception do
ShowMessage(E.Message);
end;
finally
Free;
end;
end;
procedure TDialog.Show(const MimeType: string; Proc: TProc);
begin
FProc := Proc;
var Intent: JIntent := TJIntent.Create;
Intent.setAction(TJIntent.JavaClass.ACTION_PICK);
Intent.setType(StringToJString(MimeType));
//Intent.putExtra(TJIntent.JavaClass.EXTRA_ALLOW_MULTIPLE, False);
MainActivity.startActivityForResult(Intent, FRequestCode);
end;
procedure OpenFileDialog(const MimeType: string; Proc: TProc);
begin
PermissionsService.RequestPermissions([JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE)],
procedure(const APermissions: TClassicStringDynArray; const AGrantResults: TClassicPermissionStatusDynArray)
begin
if (Length(AGrantResults) > 0) and (AGrantResults[0] = TPermissionStatus.Granted) then
TDialog.Create.Show(MimeType, Proc);
end);
end;
{$ELSE}
interface
implementation
{$ENDIF}
end.
================================================
FILE: ChatGPT.ChatSettings.fmx
================================================
inherited FrameChatSettings: TFrameChatSettings
Size.Width = 729.000000000000000000
Size.Height = 719.000000000000000000
OnResize = FrameResize
OnResized = FrameResize
inherited RectangleBG: TRectangle
Size.Width = 729.000000000000000000
Size.Height = 719.000000000000000000
OnClick = RectangleBGClick
end
object LayoutClient: TLayout
Align = Center
Padding.Left = 10.000000000000000000
Padding.Top = 10.000000000000000000
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
Size.Width = 440.000000000000000000
Size.Height = 644.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object RectangleFrame: TRectangle
Align = Contents
Fill.Color = xFF202123
Locked = True
Size.Width = 440.000000000000000000
Size.Height = 644.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
end
object LayoutActs: TLayout
Align = Bottom
Position.X = 10.000000000000000000
Position.Y = 588.000000000000000000
Size.Width = 420.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
TabStop = False
object ButtonCancel: TButton
Align = Right
Cancel = True
Position.X = 340.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 0
Text = 'CANCEL'
ParentShowHint = False
ShowHint = True
OnClick = ButtonCancelClick
end
object ButtonOk: TButton
Align = Right
Position.X = 260.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 1
Text = 'OK'
OnClick = ButtonOkClick
end
end
object VertScrollBox: TVertScrollBox
Align = Client
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
Margins.Right = -10.000000000000000000
Size.Width = 430.000000000000000000
Size.Height = 578.000000000000000000
Size.PlatformDefault = False
TabOrder = 21
Viewport.Width = 414.000000000000000000
Viewport.Height = 578.000000000000000000
object ComboEditModel: TComboEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Top
StyleLookup = 'combo_style'
TabOrder = 3
ItemHeight = 36.000000000000000000
Items.Strings = (
'gpt-3.5-turbo'
'gpt-3.5-turbo-0613'
'gpt-3.5-turbo-16k'
'gpt-4'
'gpt-4-turbo'
'gpt-4-0613'
'gpt-4-32k')
ItemIndex = 0
Text = 'gpt-3.5-turbo'
Position.Y = 134.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 33.000000000000000000
Size.PlatformDefault = False
OnMouseWheel = ComboEditModelMouseWheel
end
object EditMaxTokens: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Top
StyleLookup = 'editstyle_clear'
TabOrder = 4
KeyboardType = DecimalNumberPad
FilterChar = '0123456789'
Position.Y = 382.000000000000000000
Margins.Top = 5.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 33.000000000000000000
Size.PlatformDefault = False
TextPrompt = 'Example: 4096'
object ClearEditButton3: TClearEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
Hint = 'Clear'
Size.Width = 28.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 0
Text = 'buttonstyle_clearmini'
object Path2: TPath
Align = Center
Data.Path = {
0E00000000000000000060413333B33F010000009A9949410000000001000000
0000E0403333B340010000003333B33F0000000001000000000000003333B33F
010000003333B3400000E04001000000000000009A994941010000003333B33F
00006041010000000000E04066660641010000009A9949410000604101000000
000060419A99494101000000666606410000E04001000000000060413333B33F
03000000000060413333B33F}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object EditQueryMaxToken: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Top
StyleLookup = 'editstyle_clear'
TabOrder = 5
KeyboardType = DecimalNumberPad
FilterChar = '0123456789'
Position.Y = 492.000000000000000000
Margins.Top = 5.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 33.000000000000000000
Size.PlatformDefault = False
TextPrompt = 'Example: 1024'
object ClearEditButton4: TClearEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
Hint = 'Clear'
Size.Width = 28.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 0
Text = 'buttonstyle_clearmini'
object Path3: TPath
Align = Center
Data.Path = {
0E00000000000000000060413333B33F010000009A9949410000000001000000
0000E0403333B340010000003333B33F0000000001000000000000003333B33F
010000003333B3400000E04001000000000000009A994941010000003333B33F
00006041010000000000E04066660641010000009A9949410000604101000000
000060419A99494101000000666606410000E04001000000000060413333B33F
03000000000060413333B33F}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object Label1: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 10.000000000000000000
Position.Y = 10.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 25.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 20.000000000000000000
TextSettings.FontColor = xFFE9E9E9
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'Chat Settings'
TabOrder = 21
TabStop = False
end
object Label16: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 465.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text = 'Query max tokens (default: 1024)'
TabOrder = 24
TabStop = False
end
object Label17: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 425.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text = 'Limit of the selected model'
TabOrder = 13
TabStop = False
end
object Label18: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 535.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text = 'Max number of tokens per request'
TabOrder = 10
TabStop = False
end
object Label19: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 177.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'GPT-4 is currently in a limited beta and only accessible to thos' +
'e who have been granted access'
TabOrder = 12
TabStop = False
end
object Label3: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 575.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'Temperature (default: 1.0)'
TabOrder = 14
TabStop = False
end
object Label4: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 627.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'The higher, the more creativity will be in the answers (less acc' +
'urate)'
TabOrder = 11
TabStop = False
end
object Label8: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 112.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text = 'Model (default: gpt-3.5-turbo)'
TabOrder = 26
TabStop = False
end
object Label9: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 355.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text = 'Model max tokens (default: 4096)'
TabOrder = 28
TabStop = False
end
object Layout3: TLayout
Align = Top
Position.Y = 597.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 6
TabStop = False
object TrackBarTemp: TTrackBar
Align = Client
CanParentFocus = True
Frequency = 1.000000000000000000
Max = 20.000000000000000000
Orientation = Horizontal
Size.Width = 370.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Value = 10.000000000000000000
OnTracking = TrackBarTempTracking
end
object LabelTemp: TLabel
Align = Right
StyledSettings = [Style]
Margins.Left = 6.000000000000000000
Position.X = 376.000000000000000000
Size.Width = 28.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xBEFFFFFF
TextSettings.HorzAlign = Trailing
TextSettings.WordWrap = False
Text = '2.0'
TabOrder = 71
TabStop = False
end
end
object Layout1: TLayout
Align = Top
Position.Y = 689.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 7
TabStop = False
object TrackBarPP: TTrackBar
Align = Client
CanParentFocus = True
Frequency = 1.000000000000000000
Max = 20.000000000000000000
Min = -20.000000000000000000
Orientation = Horizontal
Size.Width = 370.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
OnTracking = TrackBarPPTracking
end
object LabelPP: TLabel
Align = Right
StyledSettings = [Style]
Margins.Left = 6.000000000000000000
Position.X = 376.000000000000000000
Size.Width = 28.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xBEFFFFFF
TextSettings.HorzAlign = Trailing
TextSettings.WordWrap = False
Text = '0.0'
TabOrder = 71
TabStop = False
end
end
object Label12: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 667.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'Presence penalty (default: 0.0)'
TabOrder = 23
TabStop = False
end
object Label11: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 719.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'Number between -2.0 and 2.0. Positive values penalize new tokens' +
' based on whether they appear in the text so far, increasing the' +
' model'#39's likelihood to talk about new topics.'
TabOrder = 19
TabStop = False
end
object Label15: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 788.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'Frequency penalty (default: 0.0)'
TabOrder = 20
TabStop = False
end
object Layout5: TLayout
Align = Top
Position.Y = 810.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 8
TabStop = False
object TrackBarFP: TTrackBar
Align = Client
CanParentFocus = True
Frequency = 1.000000000000000000
Max = 20.000000000000000000
Min = -20.000000000000000000
Orientation = Horizontal
Size.Width = 370.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
OnTracking = TrackBarFPTracking
end
object LabelFP: TLabel
Align = Right
StyledSettings = [Style]
Margins.Left = 6.000000000000000000
Position.X = 376.000000000000000000
Size.Width = 28.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xBEFFFFFF
TextSettings.HorzAlign = Trailing
TextSettings.WordWrap = False
Text = '0.0'
TabOrder = 71
TabStop = False
end
end
object Label13: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 840.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'Number between -2.0 and 2.0. Positive values penalize new tokens' +
' based on their existing frequency in the text so far, decreasin' +
'g the model'#39's likelihood to repeat the same line verbatim.'
TabOrder = 16
TabStop = False
end
object Label28: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 961.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 73.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'An alternative to sampling with temperature, called nucleus samp' +
'ling, where the model considers the results of the tokens with t' +
'op_p probability mass. So 0.1 means only the tokens comprising t' +
'he top 10% probability mass are considered.'#13#10'We generally recomm' +
'end altering this or temperature but not both.'
TabOrder = 15
TabStop = False
end
object Layout6: TLayout
Align = Top
Position.Y = 931.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 9
TabStop = False
object TrackBarTopP: TTrackBar
Align = Client
CanParentFocus = True
Frequency = 1.000000000000000000
Max = 10.000000000000000000
Orientation = Horizontal
Size.Width = 370.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Value = 10.000000000000000000
OnTracking = TrackBarTopPTracking
end
object LabelTopP: TLabel
Align = Right
StyledSettings = [Style]
Margins.Left = 6.000000000000000000
Position.X = 376.000000000000000000
Size.Width = 28.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xBEFFFFFF
TextSettings.HorzAlign = Trailing
TextSettings.WordWrap = False
Text = '0.0'
TabOrder = 71
TabStop = False
end
end
object Label30: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 909.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'Top P (default: 1.0)'
TabOrder = 18
TabStop = False
end
object LabelAppearance: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 30.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 75.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 22.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 18.000000000000000000
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'General settings'
TabOrder = 0
TabStop = False
end
object Layout7: TLayout
Align = Top
Padding.Top = 4.000000000000000000
Padding.Bottom = 4.000000000000000000
Margins.Top = 20.000000000000000000
Position.Y = 231.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
TabStop = False
object SwitchUseFunctions: TSwitch
Align = Right
IsChecked = False
Margins.Top = 2.000000000000000000
Margins.Bottom = 2.000000000000000000
Position.X = 359.000000000000000000
Position.Y = 6.000000000000000000
Size.Width = 45.000000000000000000
Size.Height = 18.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
end
object Label34: TLabel
Align = Client
AutoSize = True
StyledSettings = [Style]
Size.Width = 359.000000000000000000
Size.Height = 22.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'Use functions'
TabOrder = 0
TabStop = False
end
end
object Label35: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 301.000000000000000000
Size.Width = 394.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'In an API call, you can describe functions to gpt-3.5-turbo-0613' +
', gpt-3.5-turbo-16k and gpt-4-0613'
TabOrder = 17
TabStop = False
end
object Layout9: TLayout
Align = Top
Padding.Top = 4.000000000000000000
Padding.Bottom = 4.000000000000000000
Position.Y = 261.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
TabStop = False
object SwitchAutoExecFuncs: TSwitch
Align = Right
IsChecked = False
Margins.Top = 2.000000000000000000
Margins.Bottom = 2.000000000000000000
Position.X = 359.000000000000000000
Position.Y = 6.000000000000000000
Size.Width = 45.000000000000000000
Size.Height = 18.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
end
object Label37: TLabel
Align = Client
AutoSize = True
StyledSettings = [Style]
Size.Width = 359.000000000000000000
Size.Height = 22.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
TextSettings.WordWrap = False
Text = 'Auto execution of functions'
TabOrder = 0
TabStop = False
end
end
object Layout2: TLayout
Align = Top
Position.Y = 1039.000000000000000000
Size.Width = 404.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 30
end
end
end
end
================================================
FILE: ChatGPT.ChatSettings.pas
================================================
unit ChatGPT.ChatSettings;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
ChatGPT.Overlay, FMX.Objects, FMX.Edit, FMX.Controls.Presentation, FMX.Layouts,
ChatGPT.Classes, FMX.ComboEdit;
type
TFrameChatSettings = class(TFrameOveraly)
LayoutClient: TLayout;
RectangleFrame: TRectangle;
LayoutActs: TLayout;
ButtonCancel: TButton;
ButtonOk: TButton;
VertScrollBox: TVertScrollBox;
ComboEditModel: TComboEdit;
EditMaxTokens: TEdit;
ClearEditButton3: TClearEditButton;
Path2: TPath;
EditQueryMaxToken: TEdit;
ClearEditButton4: TClearEditButton;
Path3: TPath;
Label1: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
Label19: TLabel;
Label3: TLabel;
Label4: TLabel;
Label8: TLabel;
Label9: TLabel;
Layout3: TLayout;
TrackBarTemp: TTrackBar;
LabelTemp: TLabel;
Layout1: TLayout;
TrackBarPP: TTrackBar;
LabelPP: TLabel;
Label12: TLabel;
Label11: TLabel;
Label15: TLabel;
Layout5: TLayout;
TrackBarFP: TTrackBar;
LabelFP: TLabel;
Label13: TLabel;
Label28: TLabel;
Layout6: TLayout;
TrackBarTopP: TTrackBar;
LabelTopP: TLabel;
Label30: TLabel;
LabelAppearance: TLabel;
Layout7: TLayout;
SwitchUseFunctions: TSwitch;
Label34: TLabel;
Label35: TLabel;
Layout9: TLayout;
SwitchAutoExecFuncs: TSwitch;
Label37: TLabel;
Layout2: TLayout;
procedure TrackBarTempTracking(Sender: TObject);
procedure ButtonCancelClick(Sender: TObject);
procedure ButtonOkClick(Sender: TObject);
procedure FrameResize(Sender: TObject);
procedure RectangleBGClick(Sender: TObject);
procedure TrackBarPPTracking(Sender: TObject);
procedure TrackBarFPTracking(Sender: TObject);
procedure TrackBarTopPTracking(Sender: TObject);
procedure ComboEditModelMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; var Handled: Boolean);
private
FProcCallback: TProc;
FLayoutClientWidth: Single;
FLayoutClientHeight: Single;
protected
procedure SetMode(const Value: TWindowMode); override;
public
constructor Create(AOwner: TComponent); override;
procedure Cancel; override;
class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc);
end;
var
FrameChatSettings: TFrameChatSettings;
implementation
uses
System.Math, FMX.Ani, HGM.FMX.Ani, ChatGPT.Manager;
{$R *.fmx}
{ TFrameChatSettings }
procedure TFrameChatSettings.Cancel;
begin
if Assigned(FProcCallback) then
FProcCallback(Self, False);
Release;
end;
procedure TFrameChatSettings.ComboEditModelMouseWheel(Sender: TObject;
Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
Handled := True;
VertScrollBox.AniCalculations.MouseWheel(0, -WheelDelta);
end;
procedure TFrameChatSettings.ButtonCancelClick(Sender: TObject);
begin
Cancel;
end;
procedure TFrameChatSettings.ButtonOkClick(Sender: TObject);
begin
if Assigned(FProcCallback) then
FProcCallback(Self, True);
Release;
end;
constructor TFrameChatSettings.Create(AOwner: TComponent);
begin
inherited;
FLayoutClientWidth := LayoutClient.Width;
FLayoutClientHeight := LayoutClient.Height;
VertScrollBox.AniCalculations.Animation := True;
//VertScrollBox.AniCalculations.Interval := 1;
VertScrollBox.AniCalculations.Averaging := True;
VertScrollBox.ViewportPosition := TPoint.Zero;
ComboEditModel.Items.Clear;
ComboEditModel.Items.AddStrings(ActualModels);
Name := '';
end;
class procedure TFrameChatSettings.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc);
begin
var Frame := TFrameChatSettings.Create(AParent);
Frame.Parent := AParent;
Frame.FProcCallback := ProcExecuted;
Frame.Align := TAlignLayout.Contents;
Frame.BringToFront;
if Assigned(ProcSet) then
ProcSet(Frame);
Frame.TrackBarTempTracking(nil);
Frame.TrackBarPPTracking(nil);
Frame.TrackBarFPTracking(nil);
Frame.TrackBarTopPTracking(nil);
Frame.ButtonCancel.SetFocus;
end;
procedure TFrameChatSettings.FrameResize(Sender: TObject);
begin
LayoutClient.Width := Min(FLayoutClientWidth, Width);
LayoutClient.Height := Min(FLayoutClientHeight, Height);
end;
procedure TFrameChatSettings.RectangleBGClick(Sender: TObject);
begin
Cancel;
end;
procedure TFrameChatSettings.SetMode(const Value: TWindowMode);
begin
inherited;
if Mode = TWindowMode.Compact then
begin
LayoutClient.Align := TAlignLayout.Client;
RectangleFrame.Corners := [];
end
else
begin
LayoutClient.Align := TAlignLayout.Center;
RectangleFrame.Corners := AllCorners;
end;
FrameResize(nil);
end;
procedure TFrameChatSettings.TrackBarFPTracking(Sender: TObject);
begin
LabelFP.Text := FormatFloat('0.0', TrackBarFP.Value / 10);
end;
procedure TFrameChatSettings.TrackBarPPTracking(Sender: TObject);
begin
LabelPP.Text := FormatFloat('0.0', TrackBarPP.Value / 10);
end;
procedure TFrameChatSettings.TrackBarTempTracking(Sender: TObject);
begin
LabelTemp.Text := FormatFloat('0.0', TrackBarTemp.Value / 10);
end;
procedure TFrameChatSettings.TrackBarTopPTracking(Sender: TObject);
begin
LabelTopP.Text := FormatFloat('0.0', TrackBarTopP.Value / 10);
end;
end.
================================================
FILE: ChatGPT.Classes.pas
================================================
unit ChatGPT.Classes;
interface
uses
System.SysUtils, OpenAI.Chat.Functions;
{$SCOPEDENUMS ON}
type
TWindowMode = (Compact, Full);
TPartType = (Text, Code);
TMessageKind = (User, Assistant, System, Error, Func);
TMessageKindHelper = record helper for TMessageKind
function ToString: string;
class function FromString(const Value: string): TMessageKind; static;
end;
TMessageFuncState = (Wait, Success, Error, Executing);
TPart = record
PartType: TPartType;
Content: string;
Language: string;
end;
TUnderMouse = record
WordStart: Int64;
WordLength: Int64;
WordLine: Int64;
Text: string;
end;
TOnFuncExecute = procedure(Sender: TObject; const FuncName, FuncArgs: string; Callback: TProc) of object;
TOnNeedFuncList = procedure(Sender: TObject; out Items: TArray) of object;
TOnTextUpdated = procedure(Sender: TObject; const MessageId, Text: string) of object;
const
MaxMessageWidth = 850;
procedure OpenUrl(const URL: string);
implementation
uses
{$IFDEF ANDROID}
Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.NET,
{$ENDIF}
{$IF DEFINED(IOS) OR DEFINED(IOS64)}
MacApi.Helpers, iOSApi.Foundation, FMX.Helpers.iOS,
{$ENDIF}
{$IFDEF POSIX}
Posix.Stdlib,
{$ENDIF POSIX}
{$IFDEF MSWINDOWS}
ShellAPI, DarkModeApi.FMX, FMX.Platform.Win,
{$ENDIF}
FMX.Platform;
procedure OpenUrl(const URL: string);
begin
{$IFDEF ANDROID}
TAndroidHelper.Context.startActivity(TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, StrToJURI(URL)));
{$ENDIF}
{$IF DEFINED(IOS) OR DEFINED(IOS64)}
SharedApplication.OpenURL(StrToNSUrl(URL));
{$ENDIF}
{$IFDEF POSIX}
_system(PAnsiChar('open ' + AnsiString(URL)));
{$ENDIF POSIX}
{$IFDEF MSWINDOWS}
ShellExecute(0, 'open', PChar(URL), nil, nil, 1);
{$ENDIF}
end;
{ TMessageKindHelper }
class function TMessageKindHelper.FromString(const Value: string): TMessageKind;
begin
if Value = 'system' then
Exit(TMessageKind.System)
else if Value = 'user' then
Exit(TMessageKind.User)
else if Value = 'assistant' then
Exit(TMessageKind.Assistant)
else if Value = 'error' then
Exit(TMessageKind.Error)
else if Value = 'function' then
Exit(TMessageKind.Func)
else
Result := TMessageKind.User;
end;
function TMessageKindHelper.ToString: string;
begin
case Self of
TMessageKind.System:
Result := 'system';
TMessageKind.User:
Result := 'user';
TMessageKind.Assistant:
Result := 'assistant';
TMessageKind.Error:
Result := 'error';
TMessageKind.Func:
Result := 'function';
end;
end;
end.
================================================
FILE: ChatGPT.Code.pas
================================================
unit ChatGPT.Code;
interface
uses
System.SysUtils, FMX.Graphics, System.UITypes, System.Generics.Collections,
FMX.TextLayout;
type
TKeyWord = class
Word: TArray;
Font: TFont;
Color: TAlphaColor;
constructor Create;
destructor Destroy; override;
end;
TKeyWords = class(TObjectList)
function FindWord(const Value: string; out Key: TKeyWord): Boolean;
end;
TTextAttributedRangeData = record
public
Range: TTextRange;
Attribute: TTextAttribute;
constructor Create(const ARange: TTextRange; const AAttribute: TTextAttribute);
end;
TLineTextAttributedRange = class(TList)
private
FText: string;
public
property Text: string read FText write FText;
end;
TCodeSyntaxClass = class of TCodeSyntax;
TRegisteredSyntax = record
SyntaxClass: TCodeSyntaxClass;
Languages: TArray;
end;
TCachedAttributes = TDictionary>;
TCodeSyntax = class abstract
private
class var
FRegitered: TList;
protected
FCached: TCachedAttributes;
FDefaultFont: TFont;
FDefaultColor: TAlphaColor;
public
constructor Create(DefaultFont: TFont; DefaultColor: TAlphaColor); virtual;
destructor Destroy; override;
function GetAttributesForLine(const Line: string; const Index: Integer): TArray; virtual; abstract;
procedure DropCache; virtual;
class function FindSyntax(const Language: string; DefaultFont: TFont; DefaultColor: TAlphaColor): TCodeSyntax;
class procedure RegisterSyntax(Languages: TArray; CodeSyntaxClass: TCodeSyntaxClass);
end;
implementation
{ TKeyWord }
constructor TKeyWord.Create;
begin
inherited;
Font := TFont.Create;
end;
destructor TKeyWord.Destroy;
begin
Font.Free;
inherited;
end;
{ TKeyWords }
function TKeyWords.FindWord(const Value: string; out Key: TKeyWord): Boolean;
begin
var LowValue := Value.ToLower;
for var KeyWord in Self do
for var Word in KeyWord.Word do
begin
if Word = LowValue then
begin
Key := KeyWord;
Exit(True);
end;
end;
Result := False;
end;
{ TTextAttributedRangeData }
constructor TTextAttributedRangeData.Create(const ARange: TTextRange; const AAttribute: TTextAttribute);
begin
Self.Range := ARange;
Self.Attribute := AAttribute;
end;
{ TCodeSyntax }
constructor TCodeSyntax.Create(DefaultFont: TFont; DefaultColor: TAlphaColor);
begin
inherited Create;
FCached := TCachedAttributes.Create;
FDefaultFont := DefaultFont;
FDefaultColor := DefaultColor;
end;
destructor TCodeSyntax.Destroy;
begin
FCached.Free;
inherited;
end;
procedure TCodeSyntax.DropCache;
begin
FCached.Clear;
end;
class function TCodeSyntax.FindSyntax(const Language: string; DefaultFont: TFont; DefaultColor: TAlphaColor): TCodeSyntax;
begin
if not Assigned(FRegitered) then
Exit(nil);
for var Item in FRegitered do
for var Lang in Item.Languages do
if Lang = Language.ToLower then
Exit(Item.SyntaxClass.Create(DefaultFont, DefaultColor));
Result := nil;
end;
class procedure TCodeSyntax.RegisterSyntax(Languages: TArray; CodeSyntaxClass: TCodeSyntaxClass);
begin
if not Assigned(FRegitered) then
FRegitered := TList.Create;
var Reg: TRegisteredSyntax;
Reg.SyntaxClass := CodeSyntaxClass;
Reg.Languages := Languages;
FRegitered.Add(Reg);
end;
initialization
finalization
TCodeSyntax.FRegitered.Free;
end.
================================================
FILE: ChatGPT.FrameChat.fmx
================================================
object FrameChat: TFrameChat
Align = Contents
Size.Width = 1006.000000000000000000
Size.Height = 786.000000000000000000
Size.PlatformDefault = False
object RectangleBG: TRectangle
Align = Contents
Fill.Color = xFF343541
Locked = True
HitTest = False
Size.Width = 1006.000000000000000000
Size.Height = 786.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
end
object VertScrollBoxChat: TVertScrollBox
Align = Contents
Padding.Bottom = 160.000000000000000000
Size.Width = 1006.000000000000000000
Size.Height = 786.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
OnViewportPositionChange = VertScrollBoxChatViewportPositionChange
Viewport.Width = 990.000000000000000000
Viewport.Height = 786.000000000000000000
object LayoutTyping: TLayout
Align = Top
Padding.Left = 16.000000000000000000
Padding.Top = 16.000000000000000000
Padding.Right = 16.000000000000000000
Padding.Bottom = 16.000000000000000000
Size.Width = 990.000000000000000000
Size.Height = 62.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
OnResize = LayoutTypingResize
OnResized = LayoutTypingResize
object RectangleTypeBG: TRectangle
Align = Contents
Fill.Color = x14FFFFFF
Locked = True
Size.Width = 990.000000000000000000
Size.Height = 62.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
end
object LayoutTypingContent: TLayout
Align = HorzCenter
Locked = True
Position.X = 117.000000000000000000
Position.Y = 16.000000000000000000
Size.Width = 755.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object Layout3: TLayout
Align = Left
Margins.Right = 14.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object RectangleBot: TRectangle
Align = Top
Fill.Color = xFF10A37F
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path3: TPath
Align = Center
Data.Path = {
0F010000000000002D21164232F786410200000057EC1742B762784102000000
928B1842F38E61410200000054F4174272F94A4102000000155D1742F1633441
02000000D792154279921E410200000039B41242C2FA0A41020000004D730E42
75B0DA4002000000EBF3074261C3AB400200000032260042B6F38F4002000000
F2B0F04141486840020000004547DF4109C45940020000006F92CE412E737640
020000006C09C741E48332400200000074C6BD41E17AF83F02000000D567B341
3884AE3F020000003709A941711B493F0200000098CC9D419C87FB3E02000000
47729241E90C003F02000000CC5D81416876FD3E02000000C66D61410282953F
020000004BC8454157041B4002000000D1222A4184476B400200000094931541
0A4BAE400200000034110B41014DEF400200000090A0E9405969F84002000000
5B94BF40607605410200000070CE9A4001CD1241020000000A116C40A3232041
0200000048C42E404F4031410200000024D10140F4FD444102000000D3DA743F
AC8B6241020000007A70FF3EF16382410200000033C1383FE561934102000000
3ACA713FA45FA44102000000FB05EB3FF55BB44102000000E9265140CE08C141
020000004F753440A5CECB41020000001B812A408638D74102000000DCF43340
4783E241020000009D683D4007CEED4102000000740C5A40AEB6F84102000000
D7FA834055410142020000005C03A640E2A90842020000005DFED9405F870E42
020000001C360C415501124202000000F46C2B414A7B1542020000004F404E41
A36316420200000093A96F41C89814420200000099BB7E41C2D7184202000000
F9A088411C3C1C420200000063FF9241E18B1E4202000000015E9D418CDB2042
02000000A09AA841E908224202000000F1F4B341CCFF214202000000AC0BC541
8805224202000000D7B4D54112541F4202000000CE88E3410E4F1A4202000000
FB5CF141094A15420200000012A5FB41D0330E42020000009672004254120642
02000000C4020642CCEE0442020000004D440B426A9E02420200000015DD0F42
6891FE4102000000C375144232E6F741020000008C4A1842A857EF4102000000
CE191B42D578E5410200000019621F4261B2D641020000008E3521424D95C541
02000000CB5020423199B44102000000226C1F42159DA3410200000009DB1B42
9CA29341020000002D21164232F78641030000002D21164232F7864100000000
7FFBB341238A17420200000054F4A541B38C174202000000015E9841DC171542
020000005F988D41B499104202000000AF148E41CF77104202000000CCEE8E41
023C104202000000EE7C8F417D101042010000000534CF412653FB4102000000
6ACDD0414B6AFA41020000006221D2419318F94102000000E70CD3419D80F741
02000000A1F8D341A7E8F541020000004D73D4416519F441020000006F70D441
8F42F241010000006F70D441006F984101000000D35EEF41E7FBA74102000000
DE82EF41ED0DA84102000000FFA1EF418D28A841020000008CB9EF418649A841
02000000E5D0EF417F6AA84102000000A4DFEF41CB90A84102000000C3E4EF41
BBB8A84101000000C3E4EF41781CF34102000000A4DFEF410080014202000000
8A8EE941CC1D094202000000C353DE4185BC0E4202000000FC18D341575B1442
02000000D3DEC341BC851742020000007FFBB341238A1742030000007FFBB341
238A1742000000007A8DCC401B0DF841020000007172B04010E9EB4102000000
4451A64083AFDD4102000000F2EFAF4098DDCF41020000006BD4B1404C26D041
02000000A722B54087A7D04102000000ED81B740C5FED041010000001B2F5B41
64CCF54102000000295C5E41F5B9F6410200000009F961414C37F74102000000
B5A665414C37F74102000000F85369414C37F74102000000D8F06C41F5B9F641
02000000E71D704164CCF5410100000017D9C541E5E1C8410100000017D9C541
B3FBE7410200000057DBC5414024E841020000008FD3C541014DE84102000000
5BC2C541DE71E8410200000027B1C541BC96E841020000002497C541E3B6E841
020000009476C54142CFE84101000000B90D8541B1FF064202000000B98D6E41
66F70A42020000002CD44D41EF090C42020000007E1D2F414AFB094202000000
A5661041A5EC0742020000004469EC40BBE70242020000007A8DCC401B0DF841
030000007A8DCC401B0DF841000000009981894010E95941020000006B7DA540
C89841410200000075B0D1407FFB2E41020000007D2E0341BD52254102000000
7D2E0341BA6B2641020000005A1E0341645D2841020000005A1E0341AEB62941
010000005A1E0341C9769E41020000009E1803416A4DA04102000000AE0D0441
431CA2410200000045E4054105B4A34102000000DCBA0741924BA54102000000
04620A41159DA64102000000FD930D41F085A7410100000012949441006FD441
01000000C74B7341B3FBE34102000000C80773413A12E441020000008CB97241
BE1FE44102000000736872416E23E44102000000591772411E27E44102000000
6DC57141C520E44102000000787A7141CB10E44101000000734BE14079D8BE41
020000008048AA407CE1B641020000002D268240BAC9A941020000008D626340
D26F9A4102000000C07842401E168B410200000070995340F775754102000000
9981894010E95941030000009981894010E9594100000000D7A3FF41DE71A041
010000007FD9B141BF0E674101000000E3C7CC4138F8474102000000E2E9CC41
92CB4741020000000011CD4121B04741020000008C39CD41C1A8474102000000
1962CD4162A1474102000000DB8ACD417DAE47410200000055B0CD4170CE4741
010000006A0D074259178941020000009FFC0B42C1CA8E4102000000BE011042
832F97410200000074A41242584AA14102000000114715422C65AB4102000000
366B1642C1CAB64102000000CCEE1542AF25C24102000000617215429D80CD41
02000000515A13427958D84102000000AFE50F423E68E14102000000F2700C42
0378EA410200000019C40742A45FF14102000000366B02421450F54102000000
366B0242F2C1F44102000000366B024252C9F34102000000366B0242781CF341
01000000366B02420681A94102000000296D024236ABA741020000008A300242
C6DCA5410200000099BB01423945A44102000000A8460142ACADA24102000000
B29D0042C05BA14102000000D7A3FF41DE71A04103000000D7A3FF41DE71A041
00000000D5380D426E3470410200000050FC0C42BE9F6F410200000089920C42
90A06E4102000000A8460C427CF26D410100000004D6D841D656244102000000
7D3FD741857C2241020000004171D54141822141020000006B9AD34141822141
02000000CAC3D14141822141020000005AF5CF41857C224102000000D35ECE41
D656244101000000AF9480413D2C7E4101000000AF948041A1F83F4102000000
6F9280411EA73F4102000000379A804104563F41020000006BAB80414A0C3F41
020000009FBC80418FC23E4102000000A1D6804141823E410200000032F78041
83513E41010000000D60C1410C02E840020000000E3ECB41BC3FD14002000000
C286D6414833C640020000000AE8E1417C27C840020000005249ED41C51BCA40
020000008C4AF84111FCD840020000004ED10042E50AF340020000003C7D0542
DD8C0641020000000523094296A118410200000067550B424CA62D4102000000
C8870D42CEAA424102000000832F0E4283C0594102000000D5380D426E347041
03000000D5380D426E34704100000000DFE063410389AF4101000000D2002E41
1CFC9F4102000000BBB82D4116EA9F4102000000107A2D4176CF9F4102000000
5E4B2D417DAE9F4102000000AC1C2D41848D9F4102000000C5FE2C4138679F41
02000000F1F42C41143F9F4101000000F1F42C41AEB6294102000000A1F82C41
5DED124102000000107A33413A3BF94002000000DDB53F4160C8D24002000000
13F24B418655AC400200000038675D41A0A68D40020000003D0A724122A67440
02000000A156834104FF4D4002000000B7D18E412FA83F4002000000841E9A41
0E4F4B4002000000856BA541EDF55640020000003A12B0414B1F7C4002000000
C3D3B841B0389B40020000007357B84102489C4002000000FA7EB74118269E40
0200000035EFB641E8829F40010000003B706E41DB5C194102000000713D6B41
342E1B4102000000EA95684124D11D410200000077BE66416900214102000000
6DE76441832F24410200000013F263419FCD27410200000066F76341E17A2B41
01000000DFE063410389AF4103000000DFE063410389AF410000000068918041
28FE8F4101000000E336A341FDF677410100000029DCC541E1FA8F4101000000
29DCC541EEFCB74101000000E336A34185FCCB410100000068918041EEFCB741
010000006891804128FE8F41030000006891804128FE8F41}
Fill.Color = claWhite
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object Layout4: TLayout
Align = Client
Locked = True
Size.Width = 711.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
object RectangleIndicate: TRectangle
Align = Left
Fill.Color = xFFE6E6E6
Margins.Top = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.Y = 7.000000000000000000
Size.Width = 10.000000000000000000
Size.Height = 16.000000000000000000
Size.PlatformDefault = False
Stroke.Color = xFFC4C4C4
end
end
end
end
object LayoutWelcome: TLayout
Align = Top
Locked = True
Position.Y = 62.000000000000000000
Size.Width = 990.000000000000000000
Size.Height = 619.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
OnResize = LayoutWelcomeResize
OnResized = LayoutWelcomeResize
object LabelWelcomeTitle: TLabel
Align = Top
AutoSize = True
StyledSettings = [Family]
Margins.Top = 188.000000000000000000
Margins.Bottom = 64.000000000000000000
Position.Y = 188.000000000000000000
Size.Width = 990.000000000000000000
Size.Height = 48.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 36.000000000000000000
TextSettings.Font.StyleExt = {00060000000000000004000000}
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = 'ChatGPT'
TabOrder = 2
end
object FlowLayoutWelcome: TFlowLayout
Align = HorzCenter
Locked = True
Position.X = 183.000000000000000000
Position.Y = 300.000000000000000000
Size.Width = 624.000000000000000000
Size.Height = 319.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
Justify = Left
JustifyLastLine = Left
FlowDirection = LeftToRight
OnResize = FlowLayoutWelcomeResize
OnResized = FlowLayoutWelcomeResize
object LayoutExampleTitle: TLayout
Align = Client
Locked = True
Size.Width = 208.000000000000000000
Size.Height = 319.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object PathExaFull: TPath
Align = MostTop
Data.Path = {
9C00000000000000000080430000104302000000004042430000104302000000
0000104300404243020000000000104300008043020000000000104300E09E43
02000000004042430000B84302000000000080430000B8430200000000E09E43
0000B843020000000000B84300E09E43020000000000B8430000804302000000
0000B843004042430200000000E09E4300001043020000000000804300001043
03000000000080430000104300000000000080430000A84302000000DFCF5343
0000A84302000000000030431018964302000000000030430000804302000000
00003043DFCF534302000000DFCF534300003043020000000000804300003043
020000001018964300003043020000000000A843DFCF5343020000000000A843
00008043020000000000A8431018964302000000101896430000A84302000000
000080430000A84303000000000080430000A84300000000000080430000E042
02000000A06A84430000E04202000000000088437FAAD1420200000000008843
0000C042010000000000884300008042020000000000884302AB5C4202000000
A06A84430000404202000000000080430000404202000000C02A774300004042
020000000000704302AB5C420200000000007043000080420100000000007043
0000C04202000000000070437FAAD14202000000C12A77430000E04202000000
000080430000E04203000000000080430000E04200000000000080430000C843
02000000C02A77430000C84302000000000070436095CB430200000000007043
0000D04301000000000070430000E0430200000000007043A06AE44302000000
C02A77430000E84302000000000080430000E84302000000A06A84430000E843
0200000000008843A06AE44302000000000088430000E0430100000000008843
0000D04302000000000088436095CB4302000000A06A84430000C84302000000
000080430000C84303000000000080430000C843000000001038BE43C12A1A43
010000001088C943C18A03430200000010A8CC438295FA420200000010A8CC43
8255E642020000001088C94382D5D942020000001068C6438255CD4202000000
1058C1438255CD42020000001038BE4382D5D9420100000010E8B243C18A0343
0200000010C8AF43C1CA09430200000010C8AF43C1EA13430200000010E8B243
C12A1A43020000001008B643C16A2043020000001018BB43C16A204302000000
1038BE43C12A1A43030000001038BE43C12A1A4300000000DF8F0343C1EAB243
01000000BEDFD942C13ABE4302000000BE5FCD42A05AC14302000000BE5FCD42
A06AC64302000000BEDFD942A08AC94302000000BE5FE642A0AACC4302000000
BE9FFA42A0AACC4302000000DF8F0343A08AC94301000000DF2F1A43C13ABE43
02000000DF6F20431118BB4302000000DF6F2043A00AB64302000000DF2F1A43
C1EAB2430200000021F01343A0CAAF4302000000DFCF0943F0C7AF4302000000
DF8F0343C1EAB24303000000DF8F0343C1EAB243000000000000E04200008043
020000000000E042C02A7743020000007FAAD14200007043020000000000C042
000070430100000000008042000070430200000002AB5C420000704302000000
00004042C02A77430200000000004042000080430200000000004042A06A8443
0200000002AB5C4200008843020000000000804200008843010000000000C042
00008843020000007FAAD14200008843020000000000E042A06A844302000000
0000E04200008043030000000000E04200008043000000000000E04300007043
010000000000D04300007043020000006095CB4300007043020000000000C843
C02A7743020000000000C84300008043020000000000C843A06A844302000000
6095CB4300008843020000000000D04300008843010000000000E04300008843
02000000A06AE44300008843020000000000E843A06A8443020000000000E843
00008043020000000000E843C02A774302000000A06AE4430000704302000000
0000E04300007043030000000000E04300007043000000007F8A0343C12A1A43
02000000C1CA0943C16A204302000000C0EA1343C16A2043020000007F2A1A43
C12A1A4302000000C16A2043C1EA134302000000C16A2043C1CA094302000000
7F2A1A43C18A0343010000007F8A034382D5D94202000000FE94FA428255CD42
020000008155E6428255CD4202000000FED4D94282D5D94202000000FE54CD42
8255E64202000000FE54CD428295FA4202000000FED4D942C18A034301000000
7F8A0343C12A1A43030000007F8A0343C12A1A4300000000C13ABE43F0E7B243
020000001118BB43F0C7AF4302000000A00AB643F0C7AF4302000000C1EAB243
F0E7B24302000000A0CAAF43F007B6430200000011C8AF43F017BB4302000000
C1EAB243F037BE4301000000C13ABE43F087C94302000000A05AC143F0A7CC43
02000000A06AC643F0A7CC4302000000A08AC943F087C94302000000A0AACC43
F067C64302000000A0AACC43F057C14302000000A08AC943F037BE4301000000
C13ABE43F0E7B24303000000C13ABE43F0E7B243}
Fill.Color = xFFECECF1
Locked = True
Margins.Top = 2.000000000000000000
Margins.Bottom = 4.000000000000000000
Position.Y = 2.000000000000000000
Size.Width = 208.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object ButtonExample3: TButton
Tag = 1
OnTap = ButtonExample3Tap
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 226.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TabOrder = 0
Text = '"How do I make an HTTP request in Javascript?" '#8594
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.WordWrap = True
OnClick = ButtonExample3Click
end
object ButtonExample2: TButton
Tag = 1
OnTap = ButtonExample2Tap
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 147.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TabOrder = 1
Text = '"Got any creative ideas for a 10 year old'#8217's birthday?" '#8594
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.WordWrap = True
OnClick = ButtonExample2Click
end
object ButtonExample1: TButton
Tag = 1
OnTap = ButtonExample1Tap
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 68.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TabOrder = 2
Text = '"Explain quantum computing in simple terms" '#8594
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.WordWrap = True
OnClick = ButtonExample1Click
end
object Layout5: TLayout
Align = Top
Locked = True
Position.Y = 30.000000000000000000
Size.Width = 208.000000000000000000
Size.Height = 31.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
object Label2: TLabel
Align = Center
AutoSize = True
StyledSettings = [Family, Style]
Locked = True
Size.Width = 75.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 18.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'Examples'
TabOrder = 3
object PathExaCompact: TPath
Align = Left
Data.Path = {
9C00000000000000000080430000104302000000004042430000104302000000
0000104300404243020000000000104300008043020000000000104300E09E43
02000000004042430000B84302000000000080430000B8430200000000E09E43
0000B843020000000000B84300E09E43020000000000B8430000804302000000
0000B843004042430200000000E09E4300001043020000000000804300001043
03000000000080430000104300000000000080430000A84302000000DFCF5343
0000A84302000000000030431018964302000000000030430000804302000000
00003043DFCF534302000000DFCF534300003043020000000000804300003043
020000001018964300003043020000000000A843DFCF5343020000000000A843
00008043020000000000A8431018964302000000101896430000A84302000000
000080430000A84303000000000080430000A84300000000000080430000E042
02000000A06A84430000E04202000000000088437FAAD1420200000000008843
0000C042010000000000884300008042020000000000884302AB5C4202000000
A06A84430000404202000000000080430000404202000000C02A774300004042
020000000000704302AB5C420200000000007043000080420100000000007043
0000C04202000000000070437FAAD14202000000C12A77430000E04202000000
000080430000E04203000000000080430000E04200000000000080430000C843
02000000C02A77430000C84302000000000070436095CB430200000000007043
0000D04301000000000070430000E0430200000000007043A06AE44302000000
C02A77430000E84302000000000080430000E84302000000A06A84430000E843
0200000000008843A06AE44302000000000088430000E0430100000000008843
0000D04302000000000088436095CB4302000000A06A84430000C84302000000
000080430000C84303000000000080430000C843000000001038BE43C12A1A43
010000001088C943C18A03430200000010A8CC438295FA420200000010A8CC43
8255E642020000001088C94382D5D942020000001068C6438255CD4202000000
1058C1438255CD42020000001038BE4382D5D9420100000010E8B243C18A0343
0200000010C8AF43C1CA09430200000010C8AF43C1EA13430200000010E8B243
C12A1A43020000001008B643C16A2043020000001018BB43C16A204302000000
1038BE43C12A1A43030000001038BE43C12A1A4300000000DF8F0343C1EAB243
01000000BEDFD942C13ABE4302000000BE5FCD42A05AC14302000000BE5FCD42
A06AC64302000000BEDFD942A08AC94302000000BE5FE642A0AACC4302000000
BE9FFA42A0AACC4302000000DF8F0343A08AC94301000000DF2F1A43C13ABE43
02000000DF6F20431118BB4302000000DF6F2043A00AB64302000000DF2F1A43
C1EAB2430200000021F01343A0CAAF4302000000DFCF0943F0C7AF4302000000
DF8F0343C1EAB24303000000DF8F0343C1EAB243000000000000E04200008043
020000000000E042C02A7743020000007FAAD14200007043020000000000C042
000070430100000000008042000070430200000002AB5C420000704302000000
00004042C02A77430200000000004042000080430200000000004042A06A8443
0200000002AB5C4200008843020000000000804200008843010000000000C042
00008843020000007FAAD14200008843020000000000E042A06A844302000000
0000E04200008043030000000000E04200008043000000000000E04300007043
010000000000D04300007043020000006095CB4300007043020000000000C843
C02A7743020000000000C84300008043020000000000C843A06A844302000000
6095CB4300008843020000000000D04300008843010000000000E04300008843
02000000A06AE44300008843020000000000E843A06A8443020000000000E843
00008043020000000000E843C02A774302000000A06AE4430000704302000000
0000E04300007043030000000000E04300007043000000007F8A0343C12A1A43
02000000C1CA0943C16A204302000000C0EA1343C16A2043020000007F2A1A43
C12A1A4302000000C16A2043C1EA134302000000C16A2043C1CA094302000000
7F2A1A43C18A0343010000007F8A034382D5D94202000000FE94FA428255CD42
020000008155E6428255CD4202000000FED4D94282D5D94202000000FE54CD42
8255E64202000000FE54CD428295FA4202000000FED4D942C18A034301000000
7F8A0343C12A1A43030000007F8A0343C12A1A4300000000C13ABE43F0E7B243
020000001118BB43F0C7AF4302000000A00AB643F0C7AF4302000000C1EAB243
F0E7B24302000000A0CAAF43F007B6430200000011C8AF43F017BB4302000000
C1EAB243F037BE4301000000C13ABE43F087C94302000000A05AC143F0A7CC43
02000000A06AC643F0A7CC4302000000A08AC943F087C94302000000A0AACC43
F067C64302000000A0AACC43F057C14302000000A08AC943F037BE4301000000
C13ABE43F0E7B24303000000C13ABE43F0E7B243}
Fill.Color = xFFECECF1
Locked = True
Margins.Left = -35.000000000000000000
Position.X = -35.000000000000000000
Size.Width = 24.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
end
object LayoutCapabilitiesTitle: TLayout
Align = Client
Locked = True
Size.Width = 208.000000000000000000
Size.Height = 319.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object PathCapFull: TPath
Align = MostTop
Data.Path = {
340000000000000085250B413C4A253D0200000096890E41D32E063E02000000
2E7F1041B0AFB53E02000000F1E30F415A0D153F010000006B7101411500C040
0100000097FF47411500C040020000005F074B411500C04002000000CDCC4D41
A06CC34002000000BB274F4145D8C8400200000041825041E943CE4002000000
B537504183C0D44002000000FE654E419A99D940010000008ECCDC40CDCC6C41
02000000855FD8401AC06F4102000000857CD04007CE70410200000063B4C940
865A6F410200000042ECC2406DE76D41020000001101BF4054526A4102000000
8B37C0404FAF664101000000971CDD40F6FF0F4101000000D6FF1F40F6FF0F41
0200000009E11340F6FF0F41020000004FCC0840B0490E4102000000BF600340
DE930B41020000000CEAFB3F0BDE0841020000000B41FE3FBE9F054102000000
3C66064033330341010000007099014180D64C3E02000000F4CF03410C01803C
0200000074C10741EF264EBD0200000085250B413C4A253D0300000085250B41
3C4A253D00000000D6FF5F400000004101000000ACFFEF400000004102000000
BCB3F4400000004102000000C32AF940D9080141020000000135FC4037D40241
020000003E3FFF408A9F044102000000F1460041DAFE064102000000F7C7FF40
A6500941010000007D91EA401FF448410100000097FF37410000E04001000000
ACFFEF400000E04002000000B24BEB400000E04002000000AAD4E6404EEEDD40
020000006DCAE3409357DA40020000002FC0E040ECC0D640020000008B71DF40
4B02D240020000007637E040B35ECD4001000000F06DF540D72F1C4001000000
D6FF5F400000004103000000D6FF5F4000000041}
Fill.Color = xFFECECF1
Locked = True
Margins.Top = 2.000000000000000000
Margins.Bottom = 4.000000000000000000
Position.Y = 2.000000000000000000
Size.Width = 208.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object Label5: TLabel
Tag = 1
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 68.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
Text = 'Remembers what user said earlier in the conversation'
TabOrder = 3
end
object Label6: TLabel
Tag = 1
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 147.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 66.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
Text = 'Allows user to provide follow-up corrections'
TabOrder = 1
end
object Label9: TLabel
Tag = 1
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 227.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 64.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
Text = 'Trained to decline inappropriate requests'
TabOrder = 0
end
object Layout6: TLayout
Align = Top
Locked = True
Position.Y = 30.000000000000000000
Size.Width = 208.000000000000000000
Size.Height = 31.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object Label1: TLabel
Align = Center
AutoSize = True
StyledSettings = [Family, Style]
Locked = True
Size.Width = 92.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 18.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'Capabilities'
TabOrder = 3
object PathCapCompact: TPath
Align = Left
Data.Path = {
340000000000000085250B413C4A253D0200000096890E41D32E063E02000000
2E7F1041B0AFB53E02000000F1E30F415A0D153F010000006B7101411500C040
0100000097FF47411500C040020000005F074B411500C04002000000CDCC4D41
A06CC34002000000BB274F4145D8C8400200000041825041E943CE4002000000
B537504183C0D44002000000FE654E419A99D940010000008ECCDC40CDCC6C41
02000000855FD8401AC06F4102000000857CD04007CE70410200000063B4C940
865A6F410200000042ECC2406DE76D41020000001101BF4054526A4102000000
8B37C0404FAF664101000000971CDD40F6FF0F4101000000D6FF1F40F6FF0F41
0200000009E11340F6FF0F41020000004FCC0840B0490E4102000000BF600340
DE930B41020000000CEAFB3F0BDE0841020000000B41FE3FBE9F054102000000
3C66064033330341010000007099014180D64C3E02000000F4CF03410C01803C
0200000074C10741EF264EBD0200000085250B413C4A253D0300000085250B41
3C4A253D00000000D6FF5F400000004101000000ACFFEF400000004102000000
BCB3F4400000004102000000C32AF940D9080141020000000135FC4037D40241
020000003E3FFF408A9F044102000000F1460041DAFE064102000000F7C7FF40
A6500941010000007D91EA401FF448410100000097FF37410000E04001000000
ACFFEF400000E04002000000B24BEB400000E04002000000AAD4E6404EEEDD40
020000006DCAE3409357DA40020000002FC0E040ECC0D640020000008B71DF40
4B02D240020000007637E040B35ECD4001000000F06DF540D72F1C4001000000
D6FF5F400000004103000000D6FF5F4000000041}
Fill.Color = xFFECECF1
Locked = True
Margins.Left = -35.000000000000000000
Position.X = -35.000000000000000000
Size.Width = 24.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
end
object LayoutLimitationsTitle: TLayout
Align = Client
Locked = True
Size.Width = 208.000000000000000000
Size.Height = 319.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object PathLimFull: TPath
Align = MostTop
Data.Path = {
4E00000000000000000080410000D04102000000AF536E410000D04102000000
0000604129D6C84102000000000060410000C0410200000000006041D729B741
02000000AF536E410000B04102000000000080410000B0410200000028D68841
0000B0410200000000009041D729B74102000000000090410000C04102000000
0000904129D6C8410200000029D688410000D04102000000000080410000D041
03000000000080410000D04100000000000080410000C0410300000000008041
0000C04100000000000080410000A04102000000D72977410000A04102000000
00007041146B9C41020000000000704100009841010000000000704100003041
0200000000007041D729274102000000D8297741000020410200000000008041
0000204102000000146B8441000020410200000000008841D729274102000000
00008841000030410100000000008841000098410200000000008841146B9C41
02000000146B84410000A04102000000000080410000A0410300000000008041
0000A04100000000713DDE410000F041010000003D0A87400000F04102000000
0D4D45400110F0410200000054C20140FC46EB41020000009E99B93FA570E341
0200000060485F3F54C7DB41020000005C6D593FA13BD241020000008AEBB13F
6766CA410100000052B8524148E16A4002000000527A6041A4D9064002000000
3DE77F4148BEC43F0200000093748C41256719400200000035BF9041724A2C40
020000006D479441348C484002000000D7A3964148E16A400100000048E1F441
6666CA41020000009734F941A03BD24102000000BF05F94153C7DB4102000000
6866F441A470E34102000000B7C7EF41FC46EB41020000005F56E7410210F041
02000000703DDE410000F04103000000713DDE410000F0410000000000008041
00008040020000000DD87841545F7F4002000000EB367241287E874002000000
48E16E41F7289440010000009A9949400000D241020000005AC93B4035DAD441
020000005AC93B40796DD841020000009A994940AE47DB4102000000D2ED5640
C222DE410200000038286F402FECDF4102000000CECC84400000E04101000000
713DDE410000E041020000009E8BE1412FECDF4102000000EB92E441C222DE41
02000000713DE641AE47DB410200000079F7E741796DD8410200000079F7E741
35DAD44102000000703DE6410000D241010000005C8F8841F628944002000000
8AE48641287E874002000000F9938341545F7F40020000000000804100008040
030000000000804100008040}
Fill.Color = xFFECECF1
Locked = True
Margins.Top = 2.000000000000000000
Margins.Bottom = 4.000000000000000000
Position.Y = 2.000000000000000000
Size.Width = 208.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object Label8: TLabel
Tag = 1
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 68.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
Text = 'May occasionally generate incorrect information'
TabOrder = 3
end
object Label7: TLabel
Tag = 1
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 147.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
Text = 'May occasionally produce harmful instructions or biased content'
TabOrder = 1
end
object Label10: TLabel
Tag = 1
Align = Top
StyledSettings = [Family, Style]
Margins.Left = 7.000000000000000000
Margins.Top = 7.000000000000000000
Margins.Right = 7.000000000000000000
Margins.Bottom = 7.000000000000000000
Position.X = 7.000000000000000000
Position.Y = 226.000000000000000000
Size.Width = 194.000000000000000000
Size.Height = 65.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_welcome'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
Text = 'Limited knowledge of world and events after 2021'
TabOrder = 0
end
object Layout7: TLayout
Align = Top
Locked = True
Position.Y = 30.000000000000000000
Size.Width = 208.000000000000000000
Size.Height = 31.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object Label11: TLabel
Align = Center
AutoSize = True
StyledSettings = [Family, Style]
Locked = True
Size.Width = 87.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 18.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'Limitations'
TabOrder = 3
object PathLimCompact: TPath
Align = Left
Data.Path = {
4E00000000000000000080410000D04102000000AF536E410000D04102000000
0000604129D6C84102000000000060410000C0410200000000006041D729B741
02000000AF536E410000B04102000000000080410000B0410200000028D68841
0000B0410200000000009041D729B74102000000000090410000C04102000000
0000904129D6C8410200000029D688410000D04102000000000080410000D041
03000000000080410000D04100000000000080410000C0410300000000008041
0000C04100000000000080410000A04102000000D72977410000A04102000000
00007041146B9C41020000000000704100009841010000000000704100003041
0200000000007041D729274102000000D8297741000020410200000000008041
0000204102000000146B8441000020410200000000008841D729274102000000
00008841000030410100000000008841000098410200000000008841146B9C41
02000000146B84410000A04102000000000080410000A0410300000000008041
0000A04100000000713DDE410000F041010000003D0A87400000F04102000000
0D4D45400110F0410200000054C20140FC46EB41020000009E99B93FA570E341
0200000060485F3F54C7DB41020000005C6D593FA13BD241020000008AEBB13F
6766CA410100000052B8524148E16A4002000000527A6041A4D9064002000000
3DE77F4148BEC43F0200000093748C41256719400200000035BF9041724A2C40
020000006D479441348C484002000000D7A3964148E16A400100000048E1F441
6666CA41020000009734F941A03BD24102000000BF05F94153C7DB4102000000
6866F441A470E34102000000B7C7EF41FC46EB41020000005F56E7410210F041
02000000703DDE410000F04103000000713DDE410000F0410000000000008041
00008040020000000DD87841545F7F4002000000EB367241287E874002000000
48E16E41F7289440010000009A9949400000D241020000005AC93B4035DAD441
020000005AC93B40796DD841020000009A994940AE47DB4102000000D2ED5640
C222DE410200000038286F402FECDF4102000000CECC84400000E04101000000
713DDE410000E041020000009E8BE1412FECDF4102000000EB92E441C222DE41
02000000713DE641AE47DB410200000079F7E741796DD8410200000079F7E741
35DAD44102000000703DE6410000D241010000005C8F8841F628944002000000
8AE48641287E874002000000F9938341545F7F40020000000000804100008040
030000000000804100008040}
Fill.Color = xFFECECF1
Locked = True
Margins.Left = -35.000000000000000000
Position.X = -35.000000000000000000
Size.Width = 24.000000000000000000
Size.Height = 24.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
end
end
end
end
object LayoutSend: TLayout
Align = MostBottom
Padding.Top = 10.000000000000000000
Padding.Bottom = 40.000000000000000000
Margins.Right = 11.000000000000000000
Position.Y = 686.000000000000000000
Size.Width = 995.000000000000000000
Size.Height = 100.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
OnResize = LayoutSendResize
OnResized = LayoutSendResize
object LineBorder: TLine
Align = Contents
Locked = True
HitTest = False
LineType = Top
Size.Width = 995.000000000000000000
Size.Height = 100.000000000000000000
Size.PlatformDefault = False
Stroke.Color = x33FFFFFF
end
object RectangleSendBG: TRectangle
Align = Contents
Fill.Kind = Gradient
Fill.Gradient.Points = <
item
Color = xFF343541
Offset = 0.217391297221183800
end
item
Color = x00353740
Offset = 1.000000000000000000
end>
Fill.Gradient.StartPosition.X = 0.500000000000000000
Fill.Gradient.StartPosition.Y = 1.000000000000000000
Fill.Gradient.StopPosition.X = 0.499999970197677600
Fill.Gradient.StopPosition.Y = 0.000000000000000000
Locked = True
HitTest = False
Size.Width = 995.000000000000000000
Size.Height = 100.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
object Label12: TLabel
Align = Bottom
AutoSize = True
StyledSettings = [Style]
Opacity = 0.699999988079071000
Margins.Bottom = 4.000000000000000000
Position.Y = 82.000000000000000000
Size.Width = 995.000000000000000000
Size.Height = 14.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 11.000000000000000000
TextSettings.FontColor = xAFFFFFFF
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = 'by HemulGM'
TabOrder = 0
end
end
object LayoutQuery: TLayout
Align = HorzCenter
Locked = True
HitTest = True
Padding.Top = 12.000000000000000000
Padding.Right = 16.000000000000000000
Padding.Bottom = 12.000000000000000000
Position.X = 113.000000000000000000
Position.Y = 10.000000000000000000
Size.Width = 768.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object RectangleMemoBG: TRectangle
Align = Contents
Fill.Color = xFF40414F
Locked = True
HitTest = False
Margins.Left = 15.000000000000000000
Size.Width = 753.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
Stroke.Color = x3C000000
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
end
object MemoQuery: TMemo
Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
DataDetectorTypes = []
StyledSettings = [Style]
TextSettings.Font.Size = 16.000000000000000000
TextSettings.FontColor = claWhite
TextSettings.WordWrap = True
OnChange = MemoQueryChange
OnChangeTracking = MemoQueryChange
Align = Top
Margins.Top = 2.000000000000000000
Position.X = 26.000000000000000000
Position.Y = 14.000000000000000000
Size.Width = 618.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'memostyle_clear'
TabOrder = 0
OnEnter = MemoQueryEnter
OnKeyUp = MemoQueryKeyUp
OnKeyDown = MemoQueryKeyDown
OnViewportPositionChange = MemoQueryViewportPositionChange
Viewport.Width = 608.000000000000000000
Viewport.Height = 26.000000000000000000
object LabelSendTip: TLabel
Align = Contents
StyledSettings = [Family, Style]
Opacity = 0.800000011920929000
Margins.Right = -200.000000000000000000
Size.Width = 201.000000000000000000
Size.Height = 21.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 16.000000000000000000
TextSettings.FontColor = xFFACACBE
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = 'Send a message.'
TabOrder = 0
end
end
object LayoutSendControls: TLayout
Align = MostRight
Margins.Left = 4.000000000000000000
Position.X = 648.000000000000000000
Position.Y = 12.000000000000000000
Size.Width = 104.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object LayoutSendCommons: TLayout
Align = Bottom
Size.Width = 104.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object ButtonAudio: TButton
Align = Right
CanFocus = False
Hint =
'Submit an audio recording for recognition. Will be taken into ac' +
'count in the context of communication with GPT (Whisper)'
Position.X = 26.000000000000000000
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 3
ParentShowHint = False
ShowHint = True
OnClick = ButtonAudioClick
object Path8: TPath
Align = Center
Data.Path = {
19000000000000000000A0400000A84101000000000040400000A84101000000
0000404000003041010000000000A04000003041030000000000A0400000A841
00000000000030410000E04001000000000010410000E0400100000000001041
0000C84101000000000030410000C84103000000000030410000E04000000000
000088410000004001000000000070410000004001000000000070410000F041
01000000000088410000F041030000000000884100000040000000000000B841
00003041010000000000A84100003041010000000000A8410000A84101000000
0000B8410000A841030000000000B84100003041000000000000E8410000E040
010000000000D8410000E040010000000000D8410000C841010000000000E841
0000C841030000000000E8410000E040}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Size.Width = 14.000000000000000000
Size.Height = 14.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object ButtonSend: TButton
Align = Right
CanFocus = False
Hint = 'Send prompt'
Position.X = 78.000000000000000000
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 5
Text = 'ButtonSend'
OnClick = ButtonSendClick
object PathSend: TPath
Align = Center
Data.Path = {
2700000000000000D34D2E415A642340020000003A582A41DFCA034002000000
16BB20419307EE3F02000000B8D418412EDA064002000000CDBE1541CA090D40
02000000143E1341AC0C1740020000002DB211415964234001000000B4C80640
8B6C84410200000068EFED3F116088410200000059C503405D2E8D4102000000
876123407D288F4102000000BBB43140DA0D904102000000B3324240FC3E9041
02000000989951402DB28F41010000006666044195438441020000000F450B41
124883410200000004011041002480410200000000001041D122794101000000
00001041000030410200000000001041D729274102000000D829174100002041
0200000000002041000020410200000028D62841000020410200000000003041
D72927410200000000003041000030410100000000003041D122794102000000
1CFF2F4124248041020000002CBB34412C48834102000000DF993B41A0438441
01000000F0CC85412BB08F4102000000500C8A4189E7904102000000397A8E41
75728E410200000097B18F4114338A4102000000A23E90418646884102000000
EE0D9041FE3686410200000019298F41966C84410100000032522E41B0642340
03000000D34D2E415A64234003000000D34D2E415A642340}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
RotationAngle = 90.000000000000000000
Size.Width = 12.800000190734860000
Size.Height = 12.800000190734860000
Size.PlatformDefault = False
Stroke.Kind = None
Visible = False
WrapMode = Fit
end
object PathAudio: TPath
Align = Center
Data.Path = {
4F0000000000000000004041000080410200000039B41C410000804102000000
00000041AE47634102000000000000410000404101000000000000410000C040
020000000000004148E172400200000039B41C41000000400200000000004041
0000004002000000C74B634100000040020000000000804148E1724002000000
000080410000C0400100000000008041000040410200000000008041AE476341
02000000C74B6341000080410200000000004041000080410300000000004041
00008041000000000000404100008040020000001D5A2E410000804002000000
0000204108AC9C4002000000000020410000C040010000000000204100004041
0200000000002041FCA95141020000001D5A2E41000060410200000000004041
0000604102000000E3A55141000060410200000000006041FCA9514102000000
000060410000404101000000000060410000C040020000000000604108AC9C40
02000000E3A55141000080400200000000004041000080400300000000004041
0000804000000000000098410000404101000000000098410000204102000000
00009841EA261741020000008B6C944100001041020000000000904100001041
0200000075938B41000010410200000000008841E92617410200000000008841
000020410100000000008841000040410200000000008841AC1C6C4102000000
AC1C6C41000088410200000000004041000088410200000054E3134100008841
020000000000E040AC1C6C41020000000000E04000004041010000000000E040
00002041020000000000E040EA261741020000002DB2D1400000104102000000
0000C0400000104102000000D34DAE4000001041020000000000A040E9261741
020000000000A04000002041010000000000A04000004041020000000000A040
EC51784102000000B29DF340BC7493410200000000003041295C974101000000
000030410000A04101000000000000410000A04102000000D34DEE400000A041
020000000000E0407593A341020000000000E0400000A841020000000000E040
8B6CAC4102000000D34DEE400000B04102000000000000410000B04101000000
000080410000B041020000008B6C84410000B04102000000000088418B6CAC41
02000000000088410000A84102000000000088417593A341020000008B6C8441
0000A04102000000000080410000A04101000000000050410000A04101000000
00005041295C97410200000093188341BC7493410200000000009841EC517841
020000000000984100004041030000000000984100004041}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 15.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object PathStopRecord: TPath
Align = Center
Data.Path = {
1200000000000000000080410000C04001000000000000410000C04002000000
CDCCDC400000C040020000000000C040CDCCDC40020000000000C04000000041
010000000000C04000008041020000000000C040CDCC884102000000CDCCDC40
0000904102000000000000410000904101000000000080410000904102000000
CDCC8841000090410200000000009041CDCC8841020000000000904100008041
0100000000009041000000410200000000009041CDCCDC4002000000CDCC8841
0000C04002000000000080410000C04003000000000080410000C040}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
RotationAngle = 90.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object ButtonImage: TButton
Align = Right
CanFocus = False
Hint = 'Image generation mode on demand (DALL-E)'
Position.X = 52.000000000000000000
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 4
Text = 'ButtonSend'
OnClick = ButtonImageClick
object RectangleImageMode: TRectangle
Align = Client
Fill.Kind = None
Locked = True
HitTest = False
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
Stroke.Color = xFFACACBE
Stroke.Thickness = 2.000000000000000000
XRadius = 4.000000000000000000
YRadius = 4.000000000000000000
ParentShowHint = False
ShowHint = True
end
object PathImage: TPath
Align = Center
Data.Path = {
44000000000000000000B84300006043020000000040C5430000604302000000
0000D04300804A43020000000000D04300003043020000000000D04300801543
020000000040C54300000043020000000000B843000000430200000000C0AA43
00000043020000000000A04300801543020000000000A0430000304302000000
0000A04300804A430200000000C0AA4300006043020000000000B84300006043
030000000000B84300006043000000000000E243000080420100000000007042
00008042020000009A9931420000804202000000000000426666994202000000
000000429A99B84201000000000000429AD9D143020000000000004267A6D943
020000009A9931420000E04302000000000070420000E043010000000000E243
0000E04302000000CDCCE9430000E043020000000000F04366A6D94302000000
0000F0439AD9D143010000000000F0439A99B842020000000000F04366669942
02000000CDCCE94300008042020000000000E24300008042030000000000E243
00008042000000003373AE439AD982430200000033F3AC439A19814302000000
66A6AA4301807F4302000000CD0CA84301807F43020000000080A54301807F43
0200000033B3A34334F380430200000067A6A1439A99824301000000CD4C9843
00808A43020000009A59964366E68B4302000000CDCC94439AD98C4302000000
CD8C92439AD98C4302000000676690439AD98C430200000033738E43CD0C8C43
02000000CD0C8D43CDCC8A4302000000CD8C8C439A598A430200000067A68B43
008089430200000067E68A4300C088430100000000006043CD4C574302000000
00005C4333B352430200000000005643CDCC4F4302000000CD4C4F43CDCC4F43
020000009A994843CDCC4F4302000000676642439A1953430200000000803E43
9A99574301000000000080429A19B84301000000000080426666D74202000000
00008242CCCCC942020000009A998C420000C0420200000033339A420000C042
010000006766D9430000C042020000009AD9DC430000C0420200000067A6DF43
3333CA42020000009AD9DF430000D842010000000000E0433333B84301000000
3373AE439AD98243030000003373AE439AD98243}
Fill.Color = xFFDDDDE4
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 12.800000190734860000
Size.Height = 12.800000190734860000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object LabelTyping: TLabel
Align = MostLeft
StyledSettings = [Style]
Margins.Left = 4.000000000000000000
Position.X = 4.000000000000000000
Size.Width = 20.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 20.000000000000000000
TextSettings.FontColor = xFFACACBE
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = '...'
TabOrder = 2
end
end
end
object LayoutChatSettings: TLayout
Align = MostLeft
Locked = True
Margins.Left = -15.000000000000000000
Margins.Right = 15.000000000000000000
Position.X = -15.000000000000000000
Position.Y = 12.000000000000000000
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object ButtonSettings: TButton
Align = Bottom
CanFocus = False
Hint = 'Current chat settings'
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 0
Text = 'ButtonTranslate'
OnClick = ButtonSettingsClick
object Path9: TPath
Align = Center
Data.Path = {
FF0000000000000098CCA24152C40E41010000009EDE9F41D8810B4102000000
4B6A9F413F000B4102000000F2309F413EBF0A4102000000A1F89E41DD7B0A41
0200000052C99C41CCDD07410200000013F29A411040044102000000029A9941
EDD8FF40020000006677994105FAFE4002000000D65699414D10FE4002000000
121499415B42FC400200000083D19841E674FA4002000000B8AF98411A8BF940
0200000097909841ADA3F84002000000295C97411AA3EF40020000003FB59641
D49AE5400200000036AB9641D864DB400200000030AA96410B5EDA4002000000
65AA96419851D94002000000A5AC9641B83BD7400100000064BB9641FD9FC940
02000000BDD2964117D9B340020000009EDE964114EDA84002000000A01A9641
B41F9F4002000000C06C9541BE6A964002000000BA499441D4658E4002000000
05C592418D97874002000000B90D914164CC7F400200000077AD8E415FD27440
02000000EEEB89418AE55E4001000000A1F885414FAF4C4002000000933A8141
35D2364002000000AEB67D41ACE22B400200000043AD78416BB7274002000000
EF3874413507244002000000BE9F6F41F432244002000000832F6B415A2F2840
02000000A52C664125AF2C4002000000567D614196E73740020000005C205841
5C554E40010000006F125841696F4E40010000004469524187FE5B4002000000
4D84514164235E400200000062105141F4375F4002000000499D504161376040
020000005F294C414F1E6A400200000027314741F6976F400200000065194241
683F704002000000539641414850704002000000621041414850704002000000
530540414850704002000000E7FB3E4148507040020000003B703E4148507040
0200000029ED3D41683F704002000000F2D238414E976F4002000000DCD73341
F4156A40020000004E622F41B32460400200000035EF2E4120245F4002000000
567D2E41450D5E4002000000F6972D41C9E55B400100000060E5274161374E40
02000000AF771E41369337400200000014BF1941C93C2C400200000054B51441
6BB72740020000004F4010416BB72340020000004FA30B41139B234002000000
A42A07416957274002000000261E0241478F2B4002000000A1BEFA409F933640
0200000037C3E740249C4C400100000097ADE7404FAF4C4001000000AE12D840
A3CC5E400100000071E6D740B4025F4002000000DB16C54099D8744002000000
3FA9BB4043CA7F4002000000BADAB440758E87400200000068D0AE40EE5A8E40
02000000984CAA40A75C964002000000C898A740B70B9F4002000000C68AA440
72DCA8400200000078B4A44085CEB34002000000AE12A540B8AFC94001000000
404DA5408846D740020000001956A5404755D940020000008065A540185BDA40
02000000A661A540355EDB4002000000D23AA5408599E540020000006896A240
09A7EF40020000006EC09D40B4ABF840020000000B469D400490F94002000000
27C29C405474FA4002000000B2BA9B40603CFC400200000014B39A40D504FE40
020000005D339A40C0E7FE4002000000B9AA994009C4FF40020000007C449440
793B04410200000055DE8C40A9DE07410200000016138440D47D0A4102000000
6E3483403AC00A4102000000BA49824015000B41020000009A7C8040D67F0B41
0100000067D569408DB40E410200000047554340090A14410200000072163040
5FB516410200000077152240CD811A4102000000D9B1154016DE1D4102000000
04560C4051DA214102000000959F0640F9312641020000006F2A0040371A2B41
02000000BF2B0040D49A30410200000078450040A69B3B4101000000475A0040
6B9A444102000000AC73004066884F410200000092960040C5FE544102000000
7C0F07406ADE5941020000005CC90C40492E5E4102000000A9131640DD246241
020000006B652240B37B6541020000003F5230405B4269410200000018604340
79E96B410200000057956940C139714101000000314280407F6A744102000000
D23582405AF57441020000003C318340C13975410200000029228440AA827541
02000000EDD88C40FF21784102000000403094408FC27B4102000000B18A9940
DB0A804102000000B81E9A40A846804102000000DAAC9A40B684804102000000
1DC99B400601814102000000C6E19C407F7B81410200000061719D40BBB88141
0200000038F39D402BF6814102000000BEA4A240E62E8441020000000F28A540
E9A6864102000000E353A540FC29894102000000A358A540696F894102000000
A054A540A8B58941020000000A4BA540F8428A4101000000AE12A54088858D41
02000000D0B3A440AA02934102000000728AA440F2C19541020000000A9DA740
E937984102000000F354AA402C659A4102000000F8DFAE4066669C4102000000
BBF2B440021A9E410200000014D0BB405906A041020000006154C5406065A141
02000000AF5AD8400523A441010000002827E8407969A64102000000C91FFB40
4625A941020000009F4D0241AA82AA4102000000CB5607413108AB4102000000
53CB0B41287EAB4102000000ED641041A779AB41020000005CD5144110FAAA41
02000000C9D91941E269AA41020000003B8D1E41A301A9410200000041F12741
C431A641010000006B9A2D410080A44102000000CC7F2E41303BA44102000000
1FF42E41C818A44102000000CF662F41D5F8A34102000000BADA334102BCA241
02000000B7D13841E10BA2410200000079E93D41FDF6A141020000008B6C3E41
F1F4A141020000007CF23E41F1F4A141020000008BFD3F41F1F4A14102000000
6C094141F1F4A14102000000F38E4141F1F4A141020000006F124241FDF6A141
02000000A52C4741150CA24102000000D42B4C41D3BCA2410200000062A15041
E1FAA34102000000BC055141F016A441020000007F6A51413F35A44102000000
091B52414B6AA44101000000F31F5841BB38A64102000000B98D6141500DA941
02000000FE436641FD76AA4102000000D34D6B41C807AB41020000008FC26F41
C887AB4102000000AA607441E78CAB41020000007FD978418115AB4102000000
60E57D418A8EAA41020000005B538141432DA941020000009D1186418B6CA641
010000005F078A412720A4410200000002BC8E41F764A14102000000F6179141
5906A04102000000C7CB9241DA1B9E4102000000704E9441DC689C4102000000
D26F9541A7689A4102000000AC1C9641D33C984102000000D3DE964136CD9541
0200000026D396411E16934102000000CDBB9641F9B18D4101000000A5AC9641
E02D8A410200000065AA964130AA89410200000030AA9641A768894102000000
36AB9641F027894102000000D7B49641FC98864102000000235B97414D158441
02000000979098412CD48141020000004FAF9841099B8141020000007DD09841
7C6181410200000006129941D2EF804102000000F8539941F47D804102000000
2B76994105458041020000005F989941ED0D804102000000DEF19A4127C27B41
02000000C7CB9C414F1E784102000000C5FE9E41FA7E754102000000A8359F41
713D754102000000636E9F41C5FE744102000000D3DE9F414182744101000000
B7E29F41917E74410100000011C7A241BA497141020000002497A74188F46B41
020000003400AA4117486941020000004FC0AB41B37B654102000000CD4CAD41
8A1F624102000000CF77AE4174245E4102000000B22EAF4136CD594102000000
1CFCAF4157EC54410200000078FAAF41EB734F410200000066F7AF41DE934441
01000000BCF4AF41F1633B410200000076F1AF418E75304102000000D2EFAF41
97FF2A4102000000C520AF41F31F2641020000007969AE4114D0214102000000
773EAD418AD91D410200000039B4AB4175821A410200000032F7A941DEBC1641
020000007B94A7418C1514410200000048D0A241CEC70E410100000098CCA241
52C40E410300000098CCA24152C40E41000000005A0100410000404102000000
5A0100417958634102000000B7A81C4100008041020000003B01404100008041
020000001D5A634100008041020000009D00804179586341020000009D008041
00004041020000009D00804133A71C41020000001D5A6341ACFFFF4002000000
3B014041ACFFFF4002000000B7A81C41ACFFFF40020000005A01004133A71C41
020000005A01004100004041030000005A01004100004041}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object LayoutAudioRecording: TLayout
Align = Contents
Margins.Left = 26.000000000000000000
Margins.Top = 12.000000000000000000
Margins.Right = 16.000000000000000000
Margins.Bottom = 12.000000000000000000
Size.Width = 726.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
Visible = False
TabOrder = 3
object AnimatedImageRecording: TSkAnimatedImage
Align = Left
Size.Width = 60.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
Data = {
7B2276223A22352E372E38222C226672223A32392E3937303030313232303730
33312C226970223A302C226F70223A34312E303030303031363639393634322C
2277223A3136302C2268223A36342C226E6D223A22436F6D702031222C226464
64223A302C22617373657473223A5B5D2C226C6179657273223A5B7B22646464
223A302C22696E64223A312C227479223A342C226E6D223A22524543204F7574
6C696E6573222C227372223A312C226B73223A7B226F223A7B2261223A302C22
6B223A3130302C226978223A31317D2C2272223A7B2261223A302C226B223A30
2C226978223A31307D2C2270223A7B2261223A302C226B223A5B3130352E3538
2C33322E3734362C305D2C226978223A322C226C223A327D2C2261223A7B2261
223A302C226B223A5B2D31392E31372C2D362E332C305D2C226978223A312C22
6C223A327D2C2273223A7B2261223A302C226B223A5B3235312C3235312C3130
305D2C226978223A362C226C223A327D7D2C22616F223A302C22736861706573
223A5B7B227479223A226772222C226974223A5B7B22696E64223A302C227479
223A227368222C226978223A312C226B73223A7B2261223A302C226B223A7B22
69223A5B5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B2D302E
3337382C302E3538335D2C5B302C302E3837335D2C5B302E38322C302E363734
5D2C5B312E3531322C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B30
2C305D2C5B302C305D5D2C226F223A5B5B302C305D2C5B302C305D2C5B302C30
5D2C5B302E3736382C2D302E3334365D2C5B302E3337382C2D302E3538335D2C
5B302C2D312E32335D2C5B2D302E38322C2D302E3637345D2C5B302C305D2C5B
302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D5D2C2276
223A5B5B2D32362E30312C305D2C5B2D32332E31382C305D2C5B2D32332E3138
2C2D302E3132335D2C5B2D32352E3934392C2D352E3335335D2C5B2D32342E32
33312C2D362E3734365D2C5B2D32332E3636342C2D382E39335D2C5B2D32342E
3839342C2D31312E3738365D2C5B2D32382E3339322C2D31322E3739375D2C5B
2D33332E3134372C2D31322E3739375D2C5B2D33332E3134372C305D2C5B2D33
302E35312C305D2C5B2D33302E35312C2D342E3638355D2C5B2D32382E34312C
2D342E3638355D5D2C2263223A747275657D2C226978223A327D2C226E6D223A
2252222C226D6E223A224144424520566563746F72205368617065202D204772
6F7570222C226864223A66616C73657D2C7B22696E64223A312C227479223A22
7368222C226978223A322C226B73223A7B2261223A302C226B223A7B2269223A
5B5B302C305D2C5B302C305D2C5B2D302E3334332C2D302E3334365D2C5B302C
2D302E3630335D2C5B302E3336332C2D302E3333375D2C5B302E3636322C305D
2C5B302C305D5D2C226F223A5B5B302C305D2C5B302E3730392C305D2C5B302E
3334332C302E3334365D2C5B302C302E3539325D2C5B2D302E3336332C302E33
33375D2C5B302C305D2C5B302C305D5D2C2276223A5B5B2D33302E35312C2D31
302E3636315D2C5B2D32382E3339322C2D31302E3636315D2C5B2D32362E3831
352C2D31302E3134335D2C5B2D32362E332C2D382E3731395D2C5B2D32362E38
34352C2D372E3332365D2C5B2D32382E3338332C2D362E38325D2C5B2D33302E
35312C2D362E38325D5D2C2263223A747275657D2C226978223A327D2C226E6D
223A2252222C226D6E223A224144424520566563746F72205368617065202D20
47726F7570222C226864223A66616C73657D2C7B227479223A226D6D222C226D
6D223A312C226E6D223A224D657267652050617468732031222C226D6E223A22
4144424520566563746F722046696C746572202D204D65726765222C22686422
3A66616C73657D2C7B227479223A22666C222C2263223A7B2261223A302C226B
223A5B312C302E3239343131373634373035392C302E33363037383433313337
32352C315D2C226978223A347D2C226F223A7B2261223A302C226B223A313030
2C226978223A357D2C2272223A312C22626D223A302C226E6D223A2246696C6C
2031222C226D6E223A224144424520566563746F722047726170686963202D20
46696C6C222C226864223A66616C73657D2C7B227479223A227472222C227022
3A7B2261223A302C226B223A5B302C305D2C226978223A327D2C2261223A7B22
61223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A
302C226B223A5B3130302C3130305D2C226978223A337D2C2272223A7B226122
3A302C226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A
3130302C226978223A377D2C22736B223A7B2261223A302C226B223A302C2269
78223A347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C
226E6D223A225472616E73666F726D227D5D2C226E6D223A2252222C226E7022
3A352C22636978223A322C22626D223A302C226978223A312C226D6E223A2241
44424520566563746F722047726F7570222C226864223A66616C73657D2C7B22
7479223A226772222C226974223A5B7B22696E64223A302C227479223A227368
222C226978223A312C226B73223A7B2261223A302C226B223A7B2269223A5B5B
302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C
305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D
2C5B302C305D5D2C226F223A5B5B302C305D2C5B302C305D2C5B302C305D2C5B
302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C305D2C5B302C
305D2C5B302C305D2C5B302C305D2C5B302C305D5D2C2276223A5B5B2D31332E
3531312C2D372E3631315D2C5B2D31382E3537332C2D372E3631315D2C5B2D31
382E3537332C2D31302E3636315D2C5B2D31322E3634392C2D31302E3636315D
2C5B2D31322E3634392C2D31322E3739375D2C5B2D32312E32312C2D31322E37
39375D2C5B2D32312E32312C305D2C5B2D31322E3633322C305D2C5B2D31322E
3633322C2D322E3131385D2C5B2D31382E3537332C2D322E3131385D2C5B2D31
382E3537332C2D352E3534365D2C5B2D31332E3531312C2D352E3534365D5D2C
2263223A747275657D2C226978223A327D2C226E6D223A2245222C226D6E223A
224144424520566563746F72205368617065202D2047726F7570222C22686422
3A66616C73657D2C7B227479223A22666C222C2263223A7B2261223A302C226B
223A5B312C302E3239343131373634373035392C302E33363037383433313337
32352C315D2C226978223A347D2C226F223A7B2261223A302C226B223A313030
2C226978223A357D2C2272223A312C22626D223A302C226E6D223A2246696C6C
2031222C226D6E223A224144424520566563746F722047726170686963202D20
46696C6C222C226864223A66616C73657D2C7B227479223A227472222C227022
3A7B2261223A302C226B223A5B302C305D2C226978223A327D2C2261223A7B22
61223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A
302C226B223A5B3130302C3130305D2C226978223A337D2C2272223A7B226122
3A302C226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A
3130302C226978223A377D2C22736B223A7B2261223A302C226B223A302C2269
78223A347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C
226E6D223A225472616E73666F726D227D5D2C226E6D223A2245222C226E7022
3A332C22636978223A322C22626D223A302C226978223A322C226D6E223A2241
44424520566563746F722047726F7570222C226864223A66616C73657D2C7B22
7479223A226772222C226974223A5B7B22696E64223A302C227479223A227368
222C226978223A312C226B73223A7B2261223A302C226B223A7B2269223A5B5B
302C305D2C5B302E3430312C2D302E3337325D2C5B302E3831342C305D2C5B30
2E3431392C302E3633395D2C5B302C312E3338335D2C5B302C305D2C5B2D302E
3433372C302E36335D2C5B2D302E3837392C305D2C5B2D302E3339362C2D302E
3337325D2C5B2D302E3036352C2D302E3832365D2C5B302C305D2C5B302E3930
322C302E3739315D2C5B312E3437372C305D2C5B302E3830362C2D302E353031
5D2C5B302E3433342C2D302E3933375D2C5B302C2D312E32335D2C5B302C305D
2C5B2D302E39342C2D312E3130345D2C5B2D312E3634312C305D2C5B2D302E39
31372C302E3739315D2C5B2D302E312C312E3337375D5D2C226F223A5B5B2D30
2E3035392C302E3737395D2C5B2D302E3430312C302E3337325D2C5B2D302E39
30322C305D2C5B2D302E3431392C2D302E3633395D2C5B302C305D2C5B302E30
31322C2D312E3332345D2C5B302E3433362C2D302E36335D2C5B302E3830392C
305D2C5B302E3339362C302E3337325D2C5B302C305D2C5B2D302E3134312C2D
312E34335D2C5B2D302E3930322C2D302E3739315D2C5B2D312E3036362C305D
2C5B2D302E3830362C302E3530315D2C5B2D302E3433342C302E3933385D2C5B
302C305D2C5B302C312E3932385D2C5B302E39342C312E3130355D2C5B312E35
2C305D2C5B302E3931372C2D302E3739315D2C5B302C305D5D2C2276223A5B5B
2D332E3232362C2D342E3236335D2C5B2D332E3931362C2D322E3533365D2C5B
2D352E3733392C2D312E3937385D2C5B2D372E3732312C2D322E3933365D2C5B
2D382E33352C2D352E3936385D2C5B2D382E33352C2D362E3933355D2C5B2D37
2E3637372C2D392E3836365D2C5B2D352E3730342C2D31302E3831315D2C5B2D
332E3839382C2D31302E3235325D2C5B2D332E3230382C2D382E3435355D2C5B
2D302E3537312C2D382E3435355D2C5B2D322E3133362C2D31312E3738365D2C
5B2D352E3730342C2D31322E3937335D2C5B2D382E3531322C2D31322E323231
5D2C5B2D31302E3337312C2D31302E3036335D2C5B2D31312E3032312C2D362E
3831325D2C5B2D31312E3032312C2D362E3032395D2C5B2D392E3631312C2D31
2E3438315D2C5B2D352E3733392C302E3137365D2C5B2D322E3131342C2D312E
3031315D2C5B2D302E3538392C2D342E3236335D5D2C2263223A747275657D2C
226978223A327D2C226E6D223A2243222C226D6E223A22414442452056656374
6F72205368617065202D2047726F7570222C226864223A66616C73657D2C7B22
7479223A22666C222C2263223A7B2261223A302C226B223A5B312C302E323934
3131373634373035392C302E3336303738343331333732352C315D2C22697822
3A347D2C226F223A7B2261223A302C226B223A3130302C226978223A357D2C22
72223A312C22626D223A302C226E6D223A2246696C6C2031222C226D6E223A22
4144424520566563746F722047726170686963202D2046696C6C222C22686422
3A66616C73657D2C7B227479223A227472222C2270223A7B2261223A302C226B
223A5B302C305D2C226978223A327D2C2261223A7B2261223A302C226B223A5B
302C305D2C226978223A317D2C2273223A7B2261223A302C226B223A5B313030
2C3130305D2C226978223A337D2C2272223A7B2261223A302C226B223A302C22
6978223A367D2C226F223A7B2261223A302C226B223A3130302C226978223A37
7D2C22736B223A7B2261223A302C226B223A302C226978223A347D2C22736122
3A7B2261223A302C226B223A302C226978223A357D2C226E6D223A225472616E
73666F726D227D5D2C226E6D223A2243222C226E70223A332C22636978223A32
2C22626D223A302C226978223A332C226D6E223A224144424520566563746F72
2047726F7570222C226864223A66616C73657D5D2C226970223A302C226F7022
3A34312E303030303031363639393634322C227374223A302C22626D223A307D
2C7B22646464223A302C22696E64223A332C227479223A342C226E6D223A2253
68617065204C617965722032222C227372223A312C226B73223A7B226F223A7B
2261223A302C226B223A3130302C226978223A31317D2C2272223A7B2261223A
302C226B223A302C226978223A31307D2C2270223A7B2261223A302C226B223A
5B33312C33322C305D2C226978223A322C226C223A327D2C2261223A7B226122
3A302C226B223A5B302C302C305D2C226978223A312C226C223A327D2C227322
3A7B2261223A312C226B223A5B7B2269223A7B2278223A5B302E3636372C302E
3636372C302E3636375D2C2279223A5B312C312C315D7D2C226F223A7B227822
3A5B302E3333332C302E3333332C302E3333335D2C2279223A5B302C302C305D
7D2C2274223A302C2273223A5B3132372C3132372C3130305D7D2C7B2269223A
7B2278223A5B302E3636372C302E3636372C302E3636375D2C2279223A5B312C
312C315D7D2C226F223A7B2278223A5B302E3333332C302E3333332C302E3333
335D2C2279223A5B302C302C305D7D2C2274223A31302C2273223A5B3134372C
3134372C3130305D7D2C7B2274223A32302E303030303030383134363136372C
2273223A5B3132372C3132372C3130305D7D5D2C226978223A362C226C223A32
7D7D2C22616F223A302C22736861706573223A5B7B227479223A226772222C22
6974223A5B7B2264223A312C227479223A22656C222C2273223A7B2261223A30
2C226B223A5B32362E32352C32362E32355D2C226978223A327D2C2270223A7B
2261223A302C226B223A5B302C305D2C226978223A337D2C226E6D223A22456C
6C6970736520506174682031222C226D6E223A224144424520566563746F7220
5368617065202D20456C6C69707365222C226864223A66616C73657D2C7B2274
79223A22666C222C2263223A7B2261223A302C226B223A5B312C302E32393431
31373634373035392C302E3336303738343331333732352C315D2C226978223A
347D2C226F223A7B2261223A302C226B223A3130302C226978223A357D2C2272
223A312C22626D223A302C226E6D223A2246696C6C2031222C226D6E223A2241
44424520566563746F722047726170686963202D2046696C6C222C226864223A
66616C73657D2C7B227479223A227472222C2270223A7B2261223A302C226B22
3A5B302E3337352C302E3337355D2C226978223A327D2C2261223A7B2261223A
302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A302C22
6B223A5B3130302C3130305D2C226978223A337D2C2272223A7B2261223A302C
226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A313030
2C226978223A377D2C22736B223A7B2261223A302C226B223A302C226978223A
347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C226E6D
223A225472616E73666F726D227D5D2C226E6D223A22456C6C69707365203122
2C226E70223A332C22636978223A322C22626D223A302C226978223A312C226D
6E223A224144424520566563746F722047726F7570222C226864223A66616C73
657D5D2C226970223A302C226F70223A34312E30303030303136363939363432
2C227374223A302C22626D223A307D2C7B22646464223A302C22696E64223A34
2C227479223A342C226E6D223A225368617065204C617965722031222C227372
223A312C226B73223A7B226F223A7B2261223A312C226B223A5B7B2269223A7B
2278223A5B302E3636375D2C2279223A5B315D7D2C226F223A7B2278223A5B30
2E3333335D2C2279223A5B305D7D2C2274223A302C2273223A5B3130305D7D2C
7B2274223A34302E303030303031363239323333342C2273223A5B305D7D5D2C
226978223A31317D2C2272223A7B2261223A302C226B223A302C226978223A31
307D2C2270223A7B2261223A302C226B223A5B33312C33322C305D2C22697822
3A322C226C223A327D2C2261223A7B2261223A302C226B223A5B302C302C305D
2C226978223A312C226C223A327D2C2273223A7B2261223A312C226B223A5B7B
2269223A7B2278223A5B302E3636372C302E3636372C302E3636375D2C227922
3A5B312C312C315D7D2C226F223A7B2278223A5B302E3333332C302E3333332C
302E3333335D2C2279223A5B302C302C305D7D2C2274223A302C2273223A5B31
32372C3132372C3130305D7D2C7B2274223A34302E3030303030313632393233
33342C2273223A5B3235302C3235302C3130305D7D5D2C226978223A362C226C
223A327D7D2C22616F223A302C22736861706573223A5B7B227479223A226772
222C226974223A5B7B2264223A312C227479223A22656C222C2273223A7B2261
223A302C226B223A5B32362E32352C32362E32355D2C226978223A327D2C2270
223A7B2261223A302C226B223A5B302C305D2C226978223A337D2C226E6D223A
22456C6C6970736520506174682031222C226D6E223A22414442452056656374
6F72205368617065202D20456C6C69707365222C226864223A66616C73657D2C
7B227479223A22666C222C2263223A7B2261223A302C226B223A5B312C302E32
39343131373634373035392C302E3336303738343331333732352C315D2C2269
78223A347D2C226F223A7B2261223A302C226B223A3130302C226978223A357D
2C2272223A312C22626D223A302C226E6D223A2246696C6C2031222C226D6E22
3A224144424520566563746F722047726170686963202D2046696C6C222C2268
64223A66616C73657D2C7B227479223A227472222C2270223A7B2261223A302C
226B223A5B302E3337352C302E3337355D2C226978223A327D2C2261223A7B22
61223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261223A
302C226B223A5B3130302C3130305D2C226978223A337D2C2272223A7B226122
3A302C226B223A302C226978223A367D2C226F223A7B2261223A302C226B223A
3130302C226978223A377D2C22736B223A7B2261223A302C226B223A302C2269
78223A347D2C227361223A7B2261223A302C226B223A302C226978223A357D2C
226E6D223A225472616E73666F726D227D5D2C226E6D223A22456C6C69707365
2031222C226E70223A332C22636978223A322C22626D223A302C226978223A31
2C226D6E223A224144424520566563746F722047726F7570222C226864223A66
616C73657D5D2C226970223A302C226F70223A34312E30303030303136363939
3634322C227374223A302C22626D223A307D5D2C226D61726B657273223A5B5D
7D}
end
object LabelRecordingTime: TLabel
Align = Left
AutoSize = True
StyledSettings = [Family, Style]
Margins.Left = 10.000000000000000000
Margins.Right = 10.000000000000000000
Position.X = 70.000000000000000000
Size.Width = 26.000000000000000000
Size.Height = 26.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = '0:00'
TabOrder = 1
end
end
object LayoutAttachments: TLayout
Align = MostTop
Position.X = 26.000000000000000000
Position.Y = 12.000000000000000000
Size.Width = 618.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
Visible = False
TabOrder = 4
end
end
end
object TimerTyping: TTimer
Enabled = False
Interval = 800
OnTimer = TimerTypingTimer
Left = 64
Top = 80
end
object OpenDialogAudio: TOpenDialog
Filter =
'Supported formats|*.m4a; *.mp3; *.webm; *.mp4; *.mpga; *.wav; *.' +
'mpeg'
Left = 64
Top = 202
end
object LayoutButtom: TLayout
Align = Bottom
Locked = True
Position.Y = 636.000000000000000000
Size.Width = 1006.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 5
object FlowLayoutActions: TFlowLayout
Align = Client
ClipChildren = True
HitTest = False
Padding.Left = 40.000000000000000000
Padding.Top = 6.000000000000000000
Padding.Right = 40.000000000000000000
Margins.Left = 20.000000000000000000
Margins.Right = 20.000000000000000000
Size.Width = 966.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
Justify = Center
JustifyLastLine = Center
FlowDirection = LeftToRight
HorizontalGap = 10.000000000000000000
VerticalGap = 10.000000000000000000
object ButtonContinue: TButton
Align = Center
Hint = 'Continue chat. Request an addition or continuation'
Size.Width = 112.000000000000000000
Size.Height = 38.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_continue'
TabOrder = 2
Text = 'Continue'
TextSettings.HorzAlign = Leading
OnClick = ButtonContinueClick
object ShadowEffect2: TShadowEffect
Distance = 0.001000000047497451
Direction = 45.000000000000000000
Softness = 0.600000023841857900
Opacity = 0.600000023841857900
ShadowColor = xFF343541
end
end
object ButtonExportImport: TButton
Align = Center
Hint = 'Import or export chat'
Size.Width = 156.000000000000000000
Size.Height = 38.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_import_export'
TabOrder = 1
Text = 'Import && Export'
OnClick = ButtonExportImportClick
object ShadowEffect3: TShadowEffect
Distance = 0.001000000047497451
Direction = 45.000000000000000000
Softness = 0.600000023841857900
Opacity = 0.600000023841857900
ShadowColor = xFF343541
end
object Rectangle2: TRectangle
Anchors = [akTop, akRight]
Fill.Color = xFFC40000
HitTest = False
Position.X = 127.000000000000000000
Position.Y = -3.000000000000000000
Size.Width = 37.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 4.000000000000000000
YRadius = 4.000000000000000000
object Label3: TLabel
Align = Client
StyledSettings = [Style]
Size.Width = 37.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 9.000000000000000000
TextSettings.FontColor = claWhite
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = 'beta'
TabOrder = 0
end
end
end
object ButtonRetry: TButton
Align = Center
Hint = 'Resend request'
Size.Width = 103.000000000000000000
Size.Height = 38.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_retry'
TabOrder = 0
Text = ' Retry'
TextSettings.HorzAlign = Leading
OnClick = ButtonRetryClick
object ShadowEffect1: TShadowEffect
Distance = 0.001000000047497451
Direction = 45.000000000000000000
Softness = 0.600000023841857900
Opacity = 0.600000023841857900
ShadowColor = xFF343541
end
end
end
object LayoutScrollDown: TLayout
Align = Client
Locked = True
Padding.Top = 10.000000000000000000
Padding.Right = 30.000000000000000000
Padding.Bottom = 10.000000000000000000
Size.Width = 1006.000000000000000000
Size.Height = 50.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object ButtonScrollDown: TButton
Align = Right
Hint = 'Scroll down'
Position.X = 946.000000000000000000
Position.Y = 10.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'button_scrolldown'
TabOrder = 0
Text = 'button_scrolldown'
OnClick = ButtonScrollDownClick
end
end
end
object TimerCheckRecording: TTimer
Enabled = False
OnTimer = TimerCheckRecordingTimer
Left = 64
Top = 144
end
object Rectangle1: TRectangle
Position.X = 20.000000000000000000
Position.Y = 70.000000000000000000
Size.Width = 190.000000000000000000
Size.Height = 97.000000000000000000
Size.PlatformDefault = False
Visible = False
object LabelTest: TLabel
Align = Client
Margins.Left = 4.000000000000000000
Margins.Top = 4.000000000000000000
Margins.Right = 4.000000000000000000
Margins.Bottom = 4.000000000000000000
Size.Width = 182.000000000000000000
Size.Height = 89.000000000000000000
Size.PlatformDefault = False
TextSettings.VertAlign = Leading
TextSettings.Trimming = None
Text = 'LabelTest'
TabOrder = 0
end
end
end
================================================
FILE: ChatGPT.FrameChat.pas
================================================
unit ChatGPT.FrameChat;
interface
{$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)}
{$DEFINE MOBILE}
{$ENDIF}
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Layouts, FMX.Memo.Types, FMX.Controls.Presentation,
FMX.Memo.Style, FMX.ScrollBox, FMX.Memo, OpenAI, OpenAI.Completions,
FMX.Edit.Style, ChatGPT.FrameMessage, ChatGPT.Classes, System.Threading,
FMX.Edit, FMX.ImgList, OpenAI.Chat, System.Generics.Collections, OpenAI.Audio,
OpenAI.Utils.ChatHistory, OpenAI.Images, ChatGPT.ChatSettings, System.JSON,
FMX.Effects, FMX.ListBox, System.Skia, FMX.Skia, ChatGPT.SoundRecorder,
FMX.InertialMovement, System.RTLConsts, OpenAI.Chat.Functions;
type
TButton = class(FMX.StdCtrls.TButton)
public
procedure SetBounds(X, Y, AWidth, AHeight: Single); override;
end;
TLabel = class(FMX.StdCtrls.TLabel)
public
procedure SetBounds(X, Y, AWidth, AHeight: Single); override;
end;
TFixedScrollCalculations = class(TScrollCalculations)
protected
procedure DoChanged; override;
end;
TVertScrollBox = class(FMX.Layouts.TVertScrollBox)
private
FViewPositionY: Single;
procedure SetViewPositionY(const Value: Single);
protected
function CreateAniCalculations: TScrollCalculations; override;
published
property ViewPositionY: Single read FViewPositionY write SetViewPositionY;
end;
TMemo = class(FMX.Memo.TMemo)
private
FViewPos: Single;
procedure SetViewPos(const Value: Single);
public
property ViewPos: Single read FViewPos write SetViewPos;
end;
TFrameChat = class(TFrame)
VertScrollBoxChat: TVertScrollBox;
LayoutSend: TLayout;
RectangleSendBG: TRectangle;
MemoQuery: TMemo;
LayoutQuery: TLayout;
RectangleMemoBG: TRectangle;
LayoutSendControls: TLayout;
LayoutTyping: TLayout;
TimerTyping: TTimer;
LayoutTypingContent: TLayout;
Layout3: TLayout;
RectangleBot: TRectangle;
Path3: TPath;
Layout4: TLayout;
RectangleIndicate: TRectangle;
LabelTyping: TLabel;
LineBorder: TLine;
LayoutWelcome: TLayout;
RectangleBG: TRectangle;
LabelWelcomeTitle: TLabel;
FlowLayoutWelcome: TFlowLayout;
LayoutExampleTitle: TLayout;
PathExaFull: TPath;
ButtonExample3: TButton;
ButtonExample2: TButton;
ButtonExample1: TButton;
LayoutCapabilitiesTitle: TLayout;
PathCapFull: TPath;
Label5: TLabel;
Label6: TLabel;
Label9: TLabel;
LayoutLimitationsTitle: TLayout;
PathLimFull: TPath;
Label8: TLabel;
Label7: TLabel;
Label10: TLabel;
Label12: TLabel;
LayoutSendCommons: TLayout;
ButtonAudio: TButton;
Path8: TPath;
ButtonSend: TButton;
PathSend: TPath;
OpenDialogAudio: TOpenDialog;
ButtonImage: TButton;
PathImage: TPath;
RectangleImageMode: TRectangle;
RectangleTypeBG: TRectangle;
LabelSendTip: TLabel;
Layout5: TLayout;
Label2: TLabel;
PathExaCompact: TPath;
Layout6: TLayout;
Label1: TLabel;
PathCapCompact: TPath;
Layout7: TLayout;
Label11: TLabel;
PathLimCompact: TPath;
LayoutChatSettings: TLayout;
ButtonSettings: TButton;
Path9: TPath;
LayoutButtom: TLayout;
ButtonRetry: TButton;
ShadowEffect1: TShadowEffect;
LayoutScrollDown: TLayout;
ButtonScrollDown: TButton;
PathAudio: TPath;
LayoutAudioRecording: TLayout;
AnimatedImageRecording: TSkAnimatedImage;
PathStopRecord: TPath;
TimerCheckRecording: TTimer;
LabelRecordingTime: TLabel;
ButtonContinue: TButton;
ShadowEffect2: TShadowEffect;
FlowLayoutActions: TFlowLayout;
ButtonExportImport: TButton;
ShadowEffect3: TShadowEffect;
Rectangle1: TRectangle;
LabelTest: TLabel;
Rectangle2: TRectangle;
Label3: TLabel;
LayoutAttachments: TLayout;
procedure LayoutSendResize(Sender: TObject);
procedure MemoQueryChange(Sender: TObject);
procedure ButtonSendClick(Sender: TObject);
procedure TimerTypingTimer(Sender: TObject);
procedure LayoutTypingResize(Sender: TObject);
procedure MemoQueryKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
procedure LayoutWelcomeResize(Sender: TObject);
procedure FlowLayoutWelcomeResize(Sender: TObject);
procedure ButtonExample1Click(Sender: TObject);
procedure ButtonExample2Click(Sender: TObject);
procedure ButtonExample3Click(Sender: TObject);
procedure ButtonAudioClick(Sender: TObject);
procedure ButtonImageClick(Sender: TObject);
procedure ButtonSettingsClick(Sender: TObject);
procedure ButtonRetryClick(Sender: TObject);
procedure ButtonScrollDownClick(Sender: TObject);
procedure VertScrollBoxChatViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
procedure TimerCheckRecordingTimer(Sender: TObject);
procedure ButtonExample1Tap(Sender: TObject; const Point: TPointF);
procedure ButtonExample2Tap(Sender: TObject; const Point: TPointF);
procedure ButtonExample3Tap(Sender: TObject; const Point: TPointF);
procedure MemoQueryKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
procedure MemoQueryEnter(Sender: TObject);
procedure MemoQueryViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
procedure ButtonContinueClick(Sender: TObject);
procedure ButtonExportImportClick(Sender: TObject);
private
FAPI: IOpenAI;
FChatId: string;
FPool: TThreadPool;
FTitle: string;
FMode: TWindowMode;
FIsTyping: Boolean;
FBuffer: TChatHistory;
FIsImageMode: Boolean;
FTemperature: Single;
FLastRequest: TProc;
FMenuItem: TListBoxItem;
FIsFirstMessage: Boolean;
FPresencePenalty: Single;
FModel: string;
FMaxTokens: Integer;
FMaxTokensQuery: Integer;
FFrequencyPenalty: Single;
FTopP: Single;
FAudioRecord: TAudioRecord;
FRecordingStartTime: TDateTime;
FOnNeedFuncList: TOnNeedFuncList;
FUseFunctions: Boolean;
FAutoExecFuncs: Boolean;
FOnTitleChanged: TNotifyEvent;
procedure DoOnUpdateChatItems;
function NewMessage(const Text: string; Role: TMessageKind; UseBuffer: Boolean = True; IsAudio: Boolean = False): TFrameMessage;
function NewMessageImage(Role: TMessageKind; Images: TArray): TFrameMessage;
procedure ClearChat;
procedure SetTyping(const Value: Boolean);
procedure SetAPI(const Value: IOpenAI);
procedure SetChatId(const Value: string);
procedure ShowError(const Text: string);
procedure AppendMessages(Response: TChat); overload;
procedure AppendMessages(Response: TImageGenerations); overload;
procedure ScrollDown(Animate: Boolean = False);
procedure SetTitle(const Value: string);
procedure SetMode(const Value: TWindowMode);
procedure AppendAudio(Response: TAudioTranscriptionObject);
procedure SetIsImageMode(const Value: Boolean);
procedure SendRequestImage;
procedure SendRequestPrompt;
procedure SetTemperature(const Value: Single);
procedure RequestPrompt;
procedure RequestImage(const Prompt: string);
procedure RequestAudio(const AudioFile: string);
procedure SetLastRequest(const Value: TProc);
procedure SetMenuItem(const Value: TListBoxItem);
procedure SetFrequencyPenalty(const Value: Single);
procedure SetMaxTokens(const Value: Integer);
procedure SetMaxTokensQuery(const Value: Integer);
procedure SetModel(const Value: string);
procedure SetPresencePenalty(const Value: Single);
procedure ChatToUp;
procedure SetTopP(const Value: Single);
procedure FOnMessageDelete(Sender: TObject);
procedure StopRecording;
procedure StartRecording;
function GenerateAudioFileName: string;
procedure FOnStartRecord(Sender: TObject);
procedure UpdateSendControls;
procedure SetOnNeedFuncList(const Value: TOnNeedFuncList);
function GetFuncs: TArray;
procedure ProcFunction(Func: TChatFunctionCall);
procedure RequestFunc(FuncResult: string);
function NewMessageFunc(const FuncName, FuncArgs: string): TFrameMessage;
procedure FOnMessageTextUpdated(Sender: TObject; const MessageId, Text: string);
procedure FOnExecuteFunc(Sender: TObject; const FuncName, FuncArgs: string; Callback: TProc);
procedure ExecuteFunc(const FuncName, FuncArgs: string; Callback: TProc);
procedure SetUseFunctions(const Value: Boolean);
procedure SetAutoExecFuncs(const Value: Boolean);
procedure SetOnTitleChanged(const Value: TNotifyEvent);
procedure SendText;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function MakeContentScreenshot: TBitmap;
function SaveAsJson: TJSONObject;
procedure LoadFromJson(JSON: TJSONObject);
property API: IOpenAI read FAPI write SetAPI;
property ChatId: string read FChatId write SetChatId;
property Title: string read FTitle write SetTitle;
property Mode: TWindowMode read FMode write SetMode;
property Temperature: Single read FTemperature write SetTemperature;
property MaxTokens: Integer read FMaxTokens write SetMaxTokens;
property MaxTokensQuery: Integer read FMaxTokensQuery write SetMaxTokensQuery;
property PresencePenalty: Single read FPresencePenalty write SetPresencePenalty;
property FrequencyPenalty: Single read FFrequencyPenalty write SetFrequencyPenalty;
property Model: string read FModel write SetModel;
property TopP: Single read FTopP write SetTopP;
property IsImageMode: Boolean read FIsImageMode write SetIsImageMode;
property LastRequest: TProc read FLastRequest write SetLastRequest;
property MenuItem: TListBoxItem read FMenuItem write SetMenuItem;
property IsFirstMessage: Boolean read FIsFirstMessage write FIsFirstMessage;
property OnNeedFuncList: TOnNeedFuncList read FOnNeedFuncList write SetOnNeedFuncList;
property UseFunctions: Boolean read FUseFunctions write SetUseFunctions;
property AutoExecFuncs: Boolean read FAutoExecFuncs write SetAutoExecFuncs;
property OnTitleChanged: TNotifyEvent read FOnTitleChanged write SetOnTitleChanged;
procedure Init;
end;
const
MAX_TOKENS = 1024;
MODEL_TOKENS_LIMIT = 4096;
ErrorHintTimeout = 'If the error is due to a timeout, you can increase the response timeout in the general program settings.';
implementation
uses
FMX.Ani, System.Math, OpenAI.API, System.IOUtils, ChatGPT.Manager,
ChatGPT.Overlay, FMX.BehaviorManager, HGM.FMX.Ani, System.Net.HttpClient,
{$IFDEF ANDROID}
ChatGPT.Android, FMX.Platform.UI.Android,
{$ENDIF}
System.DateUtils, ChatGPT.ImportExport, FMX.Text;
{$R *.fmx}
function HumanTime(Value: TTime): string;
var
H, M, S, Ms: Word;
begin
DecodeTime(Value, H, M, S, Ms);
Result := '';
if H > 0 then
Result := Result + H.ToString + ' ч. ';
if M > 0 then
Result := Result + M.ToString + ' мин. ';
if S > 0 then
Result := Result + S.ToString + ' сек. ';
if Result.IsEmpty then
Result := Result + '< 1 сек. ';
end;
function SecondsToTime(Value: Double): TTime;
begin
Result := Value / SecsPerDay;
end;
procedure TFrameChat.ShowError(const Text: string);
begin
TThread.Queue(nil,
procedure
begin
var Frame := NewMessage(Text, TMessageKind.Error, False);
Frame.IsError := True;
end);
end;
procedure TFrameChat.AppendMessages(Response: TImageGenerations);
begin
try
var Images: TArray;
SetLength(Images, Length(Response.Data));
for var i := 0 to High(Response.Data) do
Images[i] := Response.Data[i].Url;
NewMessageImage(TMessageKind.Assistant, Images);
finally
Response.Free;
end;
end;
function TFrameChat.NewMessageFunc(const FuncName, FuncArgs: string): TFrameMessage;
begin
ChatToUp;
LayoutWelcome.Visible := False;
Result := TFrameMessage.Create(VertScrollBoxChat);
Result.SetMode(FMode);
Result.Position.Y := VertScrollBoxChat.ContentBounds.Height;
Result.Parent := VertScrollBoxChat;
Result.Align := TAlignLayout.MostTop;
Result.Id := '';
Result.OnDelete := FOnMessageDelete;
Result.OnTextUpdated := FOnMessageTextUpdated;
TFrameMessage(Result).MessageRole := TMessageKind.Func;
TFrameMessage(Result).FuncName := FuncName;
TFrameMessage(Result).FuncArgs := FuncArgs;
TFrameMessage(Result).FuncState := TMessageFuncState.Wait;
TFrameMessage(Result).OnFuncExecute := FOnExecuteFunc;
Result.StartAnimate;
DoOnUpdateChatItems;
if AutoExecFuncs then
TFrameMessage(Result).ExecuteFunc;
end;
function TFrameChat.NewMessageImage(Role: TMessageKind; Images: TArray): TFrameMessage;
begin
ChatToUp;
LayoutWelcome.Visible := False;
Result := TFrameMessage.Create(VertScrollBoxChat);
Result.SetMode(FMode);
Result.Position.Y := VertScrollBoxChat.ContentBounds.Height;
Result.Parent := VertScrollBoxChat;
Result.Align := TAlignLayout.MostTop;
Result.Id := '';
Result.OnDelete := FOnMessageDelete;
Result.OnTextUpdated := FOnMessageTextUpdated;
TFrameMessage(Result).MessageRole := Role;
TFrameMessage(Result).Images := Images;
Result.StartAnimate;
DoOnUpdateChatItems;
end;
procedure TFrameChat.ExecuteFunc(const FuncName, FuncArgs: string; Callback: TProc);
begin
var Funcs := GetFuncs;
for var Item in Funcs do
if Item.Name = FuncName then
begin
TTask.Run(
procedure
begin
var FuncResult := '';
var ErrorText: string;
try
try
FuncResult := Item.Execute(FuncArgs);
except
on E: Exception do
begin
ErrorText := E.Message;
FuncResult := '';
end;
end;
TThread.Queue(nil,
procedure
begin
Callback(not FuncResult.IsEmpty, ErrorText);
if not FuncResult.IsEmpty then
begin
FBuffer.NewFunc(FuncName, FuncResult, TGUID.NewGuid.ToString);
RequestFunc(FuncResult);
end;
end);
finally
//
end;
end);
Exit;
end;
Callback(False, 'Function not found');
end;
procedure TFrameChat.ProcFunction(Func: TChatFunctionCall);
begin
FBuffer.NewAsistantFunc(Func.Name, Func.Arguments, TGUID.NewGuid.ToString);
var Funcs := GetFuncs;
for var Item in Funcs do
if Item.Name = Func.Name then
begin
NewMessageFunc(Func.Name, Func.Arguments);
Exit;
end;
ShowError('Function with name "' + Func.Name + '" not found');
end;
procedure TFrameChat.AppendMessages(Response: TChat);
begin
try
for var Item in Response.Choices do
if Item.FinishReason = TFinishReason.FunctionCall then
ProcFunction(Item.Message.FunctionCall)
else
NewMessage(Item.Message.Content, TMessageKind.Assistant);
finally
Response.Free;
end;
end;
procedure TFrameChat.AppendAudio(Response: TAudioTranscriptionObject);
begin
try
NewMessage(Response.Text, TMessageKind.Assistant, True, True);
finally
Response.Free;
end;
end;
function TFrameChat.SaveAsJson: TJSONObject;
begin
Result := TJSONObject.Create;
try
var JArray := TJSONArray.Create;
Result.AddPair('chat_id', FChatId);
Result.AddPair('temperature', TJSONNumber.Create(FTemperature));
Result.AddPair('title', FTitle);
Result.AddPair('items', JArray);
Result.AddPair('frequency_penalty', TJSONNumber.Create(FrequencyPenalty));
Result.AddPair('presence_penalty', TJSONNumber.Create(PresencePenalty));
Result.AddPair('max_tokens', TJSONNumber.Create(MaxTokens));
Result.AddPair('max_tokens_query', TJSONNumber.Create(MaxTokensQuery));
Result.AddPair('top_p', TJSONNumber.Create(TopP));
Result.AddPair('model', Model);
Result.AddPair('is_image_mode', IsImageMode);
Result.AddPair('draft', MemoQuery.Text);
Result.AddPair('use_functions', UseFunctions);
Result.AddPair('auto_exec_funcs', AutoExecFuncs);
for var Control in VertScrollBoxChat.Content.Controls do
if Control is TFrameMessage then
if not TFrameMessage(Control).IsError then
if not (TFrameMessage(Control).MessageRole in [TMessageKind.Error, TMessageKind.Func]) then
JArray.Add(TFrameMessage(Control).ToJsonObject);
except
//
end;
end;
procedure TFrameChat.FOnExecuteFunc(Sender: TObject; const FuncName, FuncArgs: string; Callback: TProc);
begin
ExecuteFunc(FuncName, FuncArgs, Callback);
end;
procedure TFrameChat.FOnMessageDelete(Sender: TObject);
var
Frame: TFrameMessage absolute Sender;
begin
if not (Sender is TFrameMessage) then
Exit;
FBuffer.DeleteByTag(Frame.Id);
if VertScrollBoxChat.Content.ControlsCount <= 3 then
LayoutWelcome.Visible := True;
end;
procedure TFrameChat.FOnMessageTextUpdated(Sender: TObject; const MessageId, Text: string);
var
Frame: TFrameMessage absolute Sender;
begin
if not (Sender is TFrameMessage) then
Exit;
FBuffer.SetContentByTag(MessageId, Text);
end;
function TFrameChat.GenerateAudioFileName: string;
begin
Result := TPath.Combine(Manager.AudioCacheFolder, 'audio_record' + FormatDateTime('DDMMYYYY_HHNNSS', Now) + '.wav');
end;
procedure TFrameChat.Init;
begin
//Opacity := 0;
//TAnimator.AnimateFloat(Self, 'Opacity', 1);
{$IFNDEF MOBILE}
MemoQuery.SetFocus;
{$ENDIF}
TThread.ForceQueue(nil,
procedure
begin
MemoQuery.PrepareForPaint;
MemoQueryChange(nil);
end);
end;
procedure TFrameChat.LoadFromJson(JSON: TJSONObject);
begin
var ItemCount: Integer := 0;
var LastRoleIsUser: Boolean := False;
if FChatId.IsEmpty then
FChatId := JSON.GetValue('chat_id', TGUID.NewGuid.ToString);
Title := JSON.GetValue('title', FTitle);
FTemperature := JSON.GetValue('temperature', FTemperature);
FrequencyPenalty := JSON.GetValue('frequency_penalty', FrequencyPenalty);
PresencePenalty := JSON.GetValue('presence_penalty', PresencePenalty);
TopP := JSON.GetValue('top_p', TopP);
Model := JSON.GetValue('model', Model);
MaxTokens := JSON.GetValue('max_tokens', MaxTokens);
MaxTokensQuery := JSON.GetValue('max_tokens_query', MaxTokensQuery);
IsImageMode := JSON.GetValue('is_image_mode', IsImageMode);
UseFunctions := JSON.GetValue('use_functions', UseFunctions);
AutoExecFuncs := JSON.GetValue('auto_exec_funcs', AutoExecFuncs);
MemoQuery.Text := JSON.GetValue('draft', MemoQuery.Text);
MemoQuery.SelStart := MemoQuery.Text.Length;
MemoQuery.SelLength := 0;
var JArray: TJSONArray;
if JSON.TryGetValue('items', JArray) then
for var JItem in JArray do
begin
var Item: TChatMessageBuild;
var IsAudio := JItem.GetValue('is_audio', False);
Item.Role := TMessageRole.FromString(JItem.GetValue('role', 'user'));
Item.Content := JItem.GetValue('content', '');
Item.Tag := JItem.GetValue('id', TGUID.NewGuid.ToString);
Item.Name := JItem.GetValue('name', '');
var Func: TFunctionCallBuild;
Func.Name := JItem.GetValue('func_name', '');
Func.Arguments := JItem.GetValue('func_args', '');
Item.FunctionCall := Func;
if not (IsAudio and (Item.Role = TMessageRole.User)) then
FBuffer.Add(Item);
var Frame := TFrameMessage.Create(VertScrollBoxChat);
Frame.Position.Y := VertScrollBoxChat.ContentBounds.Height;
VertScrollBoxChat.AddObject(Frame);
Frame.Align := TAlignLayout.MostTop;
case Item.Role of
TMessageRole.System:
Frame.MessageRole := TMessageKind.System;
TMessageRole.User:
Frame.MessageRole := TMessageKind.User;
TMessageRole.Assistant:
Frame.MessageRole := TMessageKind.Assistant;
TMessageRole.Func:
Frame.MessageRole := TMessageKind.Func;
end;
Frame.OnDelete := FOnMessageDelete;
Frame.OnTextUpdated := FOnMessageTextUpdated;
Frame.Id := Item.Tag;
Frame.Text := Item.Content;
Frame.IsAudio := IsAudio;
Frame.Images := JItem.GetValue>('images', []);
Frame.FuncName := Item.FunctionCall.Name;
Frame.FuncArgs := Item.FunctionCall.Arguments;
Frame.FuncState := TMessageFuncState(JItem.GetValue('func_state', 0));
if not Frame.FuncName.IsEmpty then
Frame.OnFuncExecute := FOnExecuteFunc;
Frame.SetMode(FMode);
Frame.UpdateContentSize;
Inc(ItemCount);
end;
DoOnUpdateChatItems;
if ItemCount > 0 then
begin
LayoutWelcome.Visible := False;
IsFirstMessage := False;
ScrollDown;
if LastRoleIsUser then
LastRequest := RequestPrompt;
end;
end;
procedure TFrameChat.ScrollDown(Animate: Boolean = False);
begin
VertScrollBoxChat.RecalcSize;
if Animate then
TAnimator.AnimateFloat(VertScrollBoxChat, 'ViewPositionY', VertScrollBoxChat.ContentBounds.Height - VertScrollBoxChat.Height, 1, TAnimationType.out, TInterpolationType.Circular)
else
VertScrollBoxChat.ViewportPosition := TPointF.Create(0, VertScrollBoxChat.ContentBounds.Height - VertScrollBoxChat.Height);
end;
function TFrameChat.MakeContentScreenshot: TBitmap;
function GetMaxBitmapRect: TRectF;
var
MaxDimensionSize: Integer;
begin
MaxDimensionSize := TCanvasManager.DefaultCanvas.GetAttribute(TCanvasAttribute.MaxBitmapSize);
Result := TRectF.Create(0, 0, MaxDimensionSize, MaxDimensionSize);
end;
var
SceneScale: Single;
BitmapRect: TRectF;
begin
if Scene <> nil then
SceneScale := Scene.GetSceneScale
else
SceneScale := 1;
// TBitmap has limitation of size. It's a max texture size. If we takes screenshot of control, which exceeds this
// limitation, we get "Bitmap size to big" exception. So we normalize size for avoiding it.
BitmapRect := TRectF.Create(0, 0, VertScrollBoxChat.Content.ScrollBox.ContentBounds.Width * SceneScale, VertScrollBoxChat.Content.ScrollBox.ContentBounds.Height * SceneScale);
BitmapRect := BitmapRect.PlaceInto(GetMaxBitmapRect);
Result := TBitmap.Create(Round(BitmapRect.Width), Round(BitmapRect.Height));
Result.BitmapScale := SceneScale;
Result.Clear(0);
if Result.Canvas.BeginScene then
try
VertScrollBoxChat.Content.PaintTo(Result.Canvas, TRectF.Create(0, 0, Result.Width / SceneScale, Result.Height / SceneScale));
finally
Result.Canvas.EndScene;
end;
end;
procedure TFrameChat.ButtonSettingsClick(Sender: TObject);
begin
TFrameChatSettings.Execute(Self,
procedure(Frame: TFrameChatSettings)
begin
Frame.Mode := FMode;
Frame.TrackBarTemp.Value := Temperature * 10;
Frame.TrackBarPP.Value := PresencePenalty * 10;
Frame.TrackBarFP.Value := FrequencyPenalty * 10;
if MaxTokens <> 0 then
Frame.EditMaxTokens.Text := MaxTokens.ToString
else
Frame.EditMaxTokens.Text := '';
if MaxTokensQuery <> 0 then
Frame.EditQueryMaxToken.Text := MaxTokensQuery.ToString
else
Frame.EditQueryMaxToken.Text := '';
Frame.ComboEditModel.Text := Model;
Frame.TrackBarTopP.Value := TopP * 10;
Frame.SwitchUseFunctions.IsChecked := UseFunctions;
Frame.SwitchAutoExecFuncs.IsChecked := AutoExecFuncs;
end,
procedure(Frame: TFrameChatSettings; Success: Boolean)
begin
MemoQuery.SetFocus;
if not Success then
Exit;
Temperature := Frame.TrackBarTemp.Value / 10;
PresencePenalty := Frame.TrackBarPP.Value / 10;
FrequencyPenalty := Frame.TrackBarFP.Value / 10;
MaxTokens := StrToIntDef(Frame.EditMaxTokens.Text, 0);
MaxTokensQuery := StrToIntDef(Frame.EditQueryMaxToken.Text, 0);
TopP := Frame.TrackBarTopP.Value / 10;
Model := Frame.ComboEditModel.Text;
UseFunctions := Frame.SwitchUseFunctions.IsChecked;
AutoExecFuncs := Frame.SwitchAutoExecFuncs.IsChecked;
end);
end;
procedure TFrameChat.ButtonAudioClick(Sender: TObject);
begin
if FIsTyping then
Exit;
{$IFNDEF ANDROID}
if not OpenDialogAudio.Execute then
Exit;
var AudioFile := OpenDialogAudio.FileName;
//MemoQuery.Text := '';
NewMessage(TPath.GetFileName(AudioFile), TMessageKind.User, False, True);
RequestAudio(AudioFile);
{$ELSE}
try
OpenFileDialog('*/*',
procedure(FilePath: string)
begin
//MemoQuery.Text := '';
NewMessage(TPath.GetFileName(FilePath), TMessageKind.User, False, True);
RequestAudio(FilePath);
end);
except
on E: Exception do
ShowError(E.Message);
end;
{$ENDIF}
end;
procedure TFrameChat.ButtonContinueClick(Sender: TObject);
begin
RequestPrompt;
end;
procedure TFrameChat.RequestAudio(const AudioFile: string);
begin
SetTyping(True);
ScrollDown;
LastRequest := nil;
TTask.Run(
procedure
begin
try
var Audio := API.Audio.CreateTranscription(
procedure(Params: TAudioTranscription)
begin
Params.&File(AudioFile);
Params.Temperature(Temperature / 2);
Params.Language('ru');
end);
TThread.Queue(nil,
procedure
begin
AppendAudio(Audio);
end);
except
on E: OpenAIException do
begin
ShowError(E.Message);
LastRequest :=
procedure
begin
RequestAudio(AudioFile);
end;
end;
on E: Exception do
begin
ShowError(E.Message);
LastRequest :=
procedure
begin
RequestAudio(AudioFile);
end;
end;
end;
TThread.Queue(nil,
procedure
begin
SetTyping(False);
end);
end, FPool);
end;
procedure TFrameChat.ButtonExample1Click(Sender: TObject);
begin
if MemoQuery.Text.IsEmpty then
MemoQuery.Text := 'Explain quantum computing in simple terms';
end;
procedure TFrameChat.ButtonExample1Tap(Sender: TObject; const Point: TPointF);
begin
ButtonExample1Click(Sender);
end;
procedure TFrameChat.ButtonExample2Click(Sender: TObject);
begin
if MemoQuery.Text.IsEmpty then
MemoQuery.Text := 'Got any creative ideas for a 10 year old’s birthday?';
end;
procedure TFrameChat.ButtonExample2Tap(Sender: TObject; const Point: TPointF);
begin
ButtonExample2Click(Sender);
end;
procedure TFrameChat.ButtonExample3Click(Sender: TObject);
begin
if MemoQuery.Text.IsEmpty then
MemoQuery.Text := 'How do I make an HTTP request in Javascript?';
end;
procedure TFrameChat.ButtonExample3Tap(Sender: TObject; const Point: TPointF);
begin
ButtonExample3Click(Sender);
end;
procedure TFrameChat.ButtonExportImportClick(Sender: TObject);
begin
TFrameImportExport.Execute(Self,
procedure(Frame: TFrameImportExport)
begin
Frame.Mode := FMode;
end,
procedure(Frame: TFrameImportExport; Success: Boolean)
begin
MemoQuery.SetFocus;
if not Success then
Exit;
if Frame.RadioButtonExport.IsChecked then
begin
if Frame.EditExport.Text.EndsWith('.json') then
begin
var JSON := SaveAsJson;
if Assigned(JSON) then
try
TFile.WriteAllText(Frame.EditExport.Text, JSON.ToJSON, TEncoding.UTF8);
finally
JSON.Free;
end;
end
else
begin
var Stream := TFile.Create(Frame.EditExport.Text);
try
for var Control in VertScrollBoxChat.Content.Controls do
if Control is TFrameMessage then
if not TFrameMessage(Control).IsError then
begin
var Buff := TEncoding.UTF8.GetBytes(TFrameMessage(Control).MessageRole.ToString + #13#10 + TFrameMessage(Control).Text + #13#10 + #13#10 + #13#10);
Stream.WriteBuffer(Buff, Length(Buff));
end;
finally
Stream.Free;
end;
end;
end
else
begin
var JSON := TJSONObject.ParseJSONValue(TFile.ReadAllText(Frame.EditImport.Text, TEncoding.UTF8));
if Assigned(JSON) then
try
LoadFromJson(JSON as TJSONObject);
finally
JSON.Free;
end;
end;
end);
end;
procedure TFrameChat.ButtonImageClick(Sender: TObject);
begin
IsImageMode := not IsImageMode;
end;
procedure TFrameChat.ButtonRetryClick(Sender: TObject);
begin
if Assigned(FLastRequest) then
FLastRequest;
end;
procedure TFrameChat.SendRequestImage;
begin
if FIsTyping then
Exit;
var Prompt := MemoQuery.Text;
if Prompt.IsEmpty then
Exit;
MemoQuery.Text := '';
NewMessage(Prompt, TMessageKind.User, False);
RequestImage(Prompt);
end;
procedure TFrameChat.RequestImage(const Prompt: string);
begin
SetTyping(True);
ScrollDown;
LastRequest := nil;
TTask.Run(
procedure
begin
try
var Images := API.Image.Create(
procedure(Params: TImageCreateParams)
begin
Params.Prompt(Prompt);
Params.ResponseFormat(TImageResponseFormat.Url);
Params.Quality(TImageQuality.Standard);
//Params.N(4);
Params.Model('dall-e-3');
Params.Size(TImageSize.s1024x1024);
Params.User(FChatId);
end);
TThread.Queue(nil,
procedure
begin
AppendMessages(Images);
end);
except
on E: Exception do
begin
ShowError(E.Message);
LastRequest :=
procedure
begin
RequestImage(Prompt);
end;
end;
end;
TThread.Queue(nil,
procedure
begin
SetTyping(False);
end);
end, FPool);
end;
procedure TFrameChat.SendRequestPrompt;
begin
if FIsTyping then
Exit;
var Prompt := MemoQuery.Text.Trim([' ', #13, #10]);
if Prompt.IsEmpty then
Exit;
MemoQuery.Text := '';
NewMessage(Prompt, TMessageKind.User);
if (not Prompt.StartsWith('/system ')) and (not Prompt.StartsWith('/assistant ')) and (not Prompt.StartsWith('/user ')) then
RequestPrompt;
end;
function TFrameChat.GetFuncs: TArray;
begin
if Assigned(FOnNeedFuncList) and FUseFunctions then
FOnNeedFuncList(Self, Result)
else
Result := [];
end;
function CreateTools(Funcs: TArray): TArray;
begin
for var Item in Funcs do
Result := Result + [TChatToolFunctionParam.Create(Item)];
end;
procedure TFrameChat.RequestFunc(FuncResult: string);
begin
SetTyping(True);
ScrollDown;
LastRequest := nil;
TTask.Run(
procedure
begin
try
var Funcs := GetFuncs;
var Completions := API.Chat.Create(
procedure(Params: TChatParams)
begin
if not Model.IsEmpty then
Params.Model(Model);
if PresencePenalty <> 0 then
Params.PresencePenalty(PresencePenalty);
if FrequencyPenalty <> 0 then
Params.FrequencyPenalty(FrequencyPenalty);
Params.Messages(FBuffer.ToArray);
if FBuffer.MaxTokensForQuery <> 0 then
Params.MaxTokens(FBuffer.MaxTokensForQuery);
Params.Temperature(Temperature);
if Length(Funcs) > 0 then
begin
Params.Tools(CreateTools(Funcs));
Params.ToolChoice(TChatToolChoiceParam.Auto);
end;
Params.User(FChatId);
end);
TThread.Queue(nil,
procedure
begin
AppendMessages(Completions);
end);
except
on E: OpenAIException do
begin
ShowError(E.Message);
LastRequest :=
procedure
begin
RequestFunc(FuncResult);
end;
end;
on E: Exception do
begin
ShowError(E.Message);
LastRequest :=
procedure
begin
RequestFunc(FuncResult);
end;
end;
end;
TThread.Queue(nil,
procedure
begin
SetTyping(False);
end);
end, FPool);
end;
procedure TFrameChat.RequestPrompt;
begin
SetTyping(True);
ScrollDown;
LastRequest := nil;
TTask.Run(
procedure
begin
try
var Funcs := GetFuncs;
var Completions := API.Chat.Create(
procedure(Params: TChatParams)
begin
if not Model.IsEmpty then
Params.Model(Model);
if PresencePenalty <> 0 then
Params.PresencePenalty(PresencePenalty);
if FrequencyPenalty <> 0 then
Params.FrequencyPenalty(FrequencyPenalty);
Params.Messages(FBuffer.ToArray);
if FBuffer.MaxTokensForQuery <> 0 then
Params.MaxTokens(FBuffer.MaxTokensForQuery);
if Temperature <> 1 then
Params.Temperature(Temperature);
if Length(Funcs) > 0 then
begin
Params.Tools(CreateTools(Funcs));
Params.ToolChoice(TChatToolChoiceParam.Auto);
end;
Params.User(FChatId);
end);
TThread.Queue(nil,
procedure
begin
AppendMessages(Completions);
end);
except
on E: OpenAIException do
begin
ShowError(E.Message);
LastRequest := RequestPrompt;
end;
on E: Exception do
begin
if E is ENetHTTPClientException then
E.Message := E.Message + #13#10 + ErrorHintTimeout;
ShowError(E.Message);
LastRequest := RequestPrompt;
end;
end;
TThread.Queue(nil,
procedure
begin
SetTyping(False);
end);
end, FPool);
end;
procedure TFrameChat.ButtonScrollDownClick(Sender: TObject);
begin
ScrollDown(True);
end;
procedure TFrameChat.StopRecording;
begin
LayoutAudioRecording.Visible := False;
MemoQuery.Visible := True;
PathStopRecord.Visible := False;
PathAudio.Visible := True;
TimerCheckRecording.Enabled := False;
end;
procedure TFrameChat.StartRecording;
begin
FAudioRecord.StartRecord(GenerateAudioFileName);
end;
procedure TFrameChat.ButtonSendClick(Sender: TObject);
begin
if FAudioRecord.IsAvailableDevice then
begin
if FAudioRecord.IsMicrophoneRecording then
begin
FAudioRecord.StopRecord;
Exit;
end;
end;
if MemoQuery.Text.IsEmpty and FAudioRecord.IsAvailableDevice then
StartRecording
else
SendText;
end;
procedure TFrameChat.SendText;
begin
if IsImageMode then
SendRequestImage
else
SendRequestPrompt;
end;
procedure TFrameChat.ClearChat;
begin
LayoutTyping.Parent := nil;
LayoutWelcome.Parent := nil;
while VertScrollBoxChat.Content.ControlsCount > 0 do
VertScrollBoxChat.Content.Controls[0].Free;
LayoutTyping.Parent := VertScrollBoxChat;
LayoutWelcome.Parent := VertScrollBoxChat;
DoOnUpdateChatItems;
end;
procedure TFrameChat.FOnStartRecord(Sender: TObject);
begin
FRecordingStartTime := Now;
TimerCheckRecording.Enabled := True;
LabelRecordingTime.Text := '';
LayoutAudioRecording.Visible := True;
MemoQuery.Visible := False;
PathStopRecord.Visible := True;
PathAudio.Visible := False;
end;
constructor TFrameChat.Create(AOwner: TComponent);
begin
inherited;
FIsFirstMessage := True;
LastRequest := nil;
FAudioRecord := TAudioRecord.Create(Self);
FAudioRecord.OnStartRecord := FOnStartRecord;
FBuffer := TChatHistory.Create;
FBuffer.MaxTokensForQuery := MAX_TOKENS;
FBuffer.MaxTokensOfModel := MODEL_TOKENS_LIMIT;
FBuffer.AutoTrim := True;
FPool := TThreadPool.Create;
Temperature := 0.2;
Name := '';
VertScrollBoxChat.AniCalculations.Animation := True;
//VertScrollBoxChat.AniCalculations.Interval := 1;
VertScrollBoxChat.AniCalculations.Averaging := True;
{$IFDEF MOBILE}
VertScrollBoxChat.AniCalculations.BoundsAnimation := True;
{$ENDIF}
MemoQuery.ScrollAnimation := TBehaviorBoolean.True;
PathStopRecord.Visible := False;
PathAudio.Visible := False;
PathSend.Visible := True;
LayoutAudioRecording.Visible := False;
{$IFDEF MOBILE}
ButtonExample1.OnClick := nil;
ButtonExample2.OnClick := nil;
ButtonExample3.OnClick := nil;
//(MemoQuery.Presentation as TStyledMemo).NeedSelectorPoints := True;
ButtonExportImport.Visible := False;
{$ENDIF}
SetTyping(False);
ClearChat;
IsImageMode := False;
MemoQueryChange(nil);
MemoQuery.ApplyStyleLookup;
end;
destructor TFrameChat.Destroy;
begin
FMenuItem := nil;
FPool.Free;
FBuffer.Free;
inherited;
end;
procedure TFrameChat.DoOnUpdateChatItems;
begin
ButtonContinue.Visible := FBuffer.Count > 0;
end;
procedure TFrameChat.FlowLayoutWelcomeResize(Sender: TObject);
begin
var W: Single := 0;
case Mode of
TWindowMode.Compact:
W := FlowLayoutWelcome.Width;
TWindowMode.Full:
W := Trunc(FlowLayoutWelcome.Width / FlowLayoutWelcome.ControlsCount);
end;
for var Control in FlowLayoutWelcome.Controls do
Control.Width := W;
var B: Single := 0;
for var Control in LayoutExampleTitle.Controls do
B := Max(B, Control.Position.Y + Control.Height + Control.Margins.Bottom);
if LayoutExampleTitle.Height <> B then
LayoutExampleTitle.Height := B;
B := 0;
for var Control in LayoutCapabilitiesTitle.Controls do
B := Max(B, Control.Position.Y + Control.Height + Control.Margins.Bottom);
if LayoutCapabilitiesTitle.Height <> B then
LayoutCapabilitiesTitle.Height := B;
B := 0;
for var Control in LayoutLimitationsTitle.Controls do
B := Max(B, Control.Position.Y + Control.Height + Control.Margins.Bottom);
if LayoutLimitationsTitle.Height <> B then
LayoutLimitationsTitle.Height := B;
B := 0;
for var Control in FlowLayoutWelcome.Controls do
B := Max(B, Control.Position.Y + Control.Height);
B := B + FlowLayoutWelcome.Position.Y;
if LayoutWelcome.Height <> B then
LayoutWelcome.Height := B;
end;
procedure TFrameChat.LayoutSendResize(Sender: TObject);
begin
LayoutQuery.Width := Min(768, LayoutSend.Width - 48);
VertScrollBoxChat.Padding.Bottom := LayoutSend.Height + LayoutButtom.Height + 20;
end;
procedure TFrameChat.LayoutTypingResize(Sender: TObject);
begin
LayoutTypingContent.Width := Min(LayoutTyping.Width - (LayoutTyping.Padding.Left + LayoutTyping.Padding.Right), MaxMessageWidth);
end;
procedure TFrameChat.LayoutWelcomeResize(Sender: TObject);
begin
FlowLayoutWelcome.Width := Min(720, LayoutWelcome.Width);
end;
procedure TFrameChat.MemoQueryChange(Sender: TObject);
begin
LabelSendTip.Visible := MemoQuery.Text.IsEmpty;
var H: Single := 0;
if not LabelSendTip.Visible then
H := H + Round(MemoQuery.ContentBounds.Height)
else
H := H + 21;
//LayoutAudioRecording
//LayoutSend.Height := Max(LayoutSend.TagFloat, Min(H, 400));
var MaxMemoH := Min(H, 400 - (LayoutSend.Padding.Top + LayoutSend.Padding.Bottom + LayoutQuery.Padding.Top + LayoutQuery.Padding.Bottom));
MemoQuery.Height := Max(26, MaxMemoH);
H := H + LayoutSend.Padding.Top + LayoutSend.Padding.Bottom + LayoutQuery.Padding.Top + LayoutQuery.Padding.Bottom;
TAnimator.DetachPropertyAnimation(LayoutSend, 'Height');
if LayoutAttachments.Visible then
H := H + LayoutAttachments.Height;
TAnimator.AnimateFloat(LayoutSend, 'Height', Max(LayoutSend.TagFloat, Min(H, 400)), 0.1);
MemoQuery.ShowScrollBars := H > 400;
{$IFDEF MOBILE}
if LabelSendTip.Visible then
begin
LayoutChatSettings.Visible := True;
RectangleMemoBG.Margins.Left := 15;
end
else
begin
LayoutChatSettings.Visible := False;
RectangleMemoBG.Margins.Left := -11;
end;
{$ENDIF}
UpdateSendControls;
end;
procedure TFrameChat.MemoQueryEnter(Sender: TObject);
begin
MemoQuery.PrepareForPaint;
end;
procedure TFrameChat.UpdateSendControls;
begin
PathAudio.Visible := FAudioRecord.IsAvailableDevice and LabelSendTip.Visible;
PathSend.Visible := not PathAudio.Visible;
ButtonAudio.Visible := MemoQuery.Text.IsEmpty;
ButtonAudio.Position.X := 0;
var i := 0;
for var Control in LayoutSendCommons.Controls do
if Control.IsVisible then
Inc(i);
LayoutSendControls.Width := LayoutSendCommons.Height * i;
LayoutSendCommons.RecalcSize;
end;
procedure TFrameChat.MemoQueryKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if Manager.SendByEnter then
begin
if (Key = vkReturn) and not ((ssCtrl in Shift) or (ssShift in Shift)) then
begin
Key := 0;
KeyChar := #0;
SendText;
end;
end
else
begin
if (Key = vkReturn) and (ssCtrl in Shift) then
begin
Key := 0;
KeyChar := #0;
SendText;
end;
end;
MemoQueryChange(Sender);
end;
procedure TFrameChat.MemoQueryKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
MemoQueryChange(Sender);
end;
procedure TFrameChat.MemoQueryViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
begin
MemoQueryChange(Sender);
end;
procedure TFrameChat.VertScrollBoxChatViewportPositionChange(Sender: TObject; const OldViewportPosition, NewViewportPosition: TPointF; const ContentSizeChanged: Boolean);
begin
VertScrollBoxChat.FViewPositionY := NewViewportPosition.Y;
LayoutScrollDown.Visible := NewViewportPosition.Y < VertScrollBoxChat.ContentBounds.Height - VertScrollBoxChat.Height - 100;
end;
procedure TFrameChat.ChatToUp;
begin
if not Assigned(FMenuItem) then
Exit;
FMenuItem.Index := 0;
FMenuItem.IsSelected := True;
end;
function TFrameChat.NewMessage(const Text: string; Role: TMessageKind; UseBuffer: Boolean; IsAudio: Boolean): TFrameMessage;
begin
ChatToUp;
if (Role = TMessageKind.User) and IsFirstMessage then
begin
IsFirstMessage := False;
Title := Text;
end;
var AppendText := Text;
var MessageTag := TGUID.NewGuid.ToString;
if UseBuffer then
begin
if Role = TMessageKind.User then
begin
if AppendText.StartsWith('/system ') then
begin
AppendText := AppendText.Replace('/system ', '', []);
FBuffer.New(TMessageRole.System, AppendText, MessageTag);
Role := TMessageKind.System;
end
else if AppendText.StartsWith('/user ') then
begin
AppendText := AppendText.Replace('/user ', '', []);
FBuffer.New(TMessageRole.User, AppendText, MessageTag);
Role := TMessageKind.User;
end
else if AppendText.StartsWith('/assistant ') then
begin
AppendText := AppendText.Replace('/assistant ', '', []);
FBuffer.New(TMessageRole.Assistant, AppendText, MessageTag);
Role := TMessageKind.Assistant;
end
else
begin
FBuffer.New(TMessageRole.User, AppendText, MessageTag);
end;
end
else
begin
AppendText := AppendText;
FBuffer.New(TMessageRole.Assistant, AppendText, MessageTag);
end;
end;
LayoutWelcome.Visible := False;
Result := TFrameMessage.Create(VertScrollBoxChat);
Result.Position.Y := VertScrollBoxChat.ContentBounds.Height;
Result.Parent := VertScrollBoxChat;
Result.Align := TAlignLayout.MostTop;
Result.Id := MessageTag;
Result.MessageRole := Role;
Result.IsAudio := IsAudio;
Result.Text := AppendText;
Result.OnDelete := FOnMessageDelete;
Result.OnTextUpdated := FOnMessageTextUpdated;
Result.SetMode(FMode);
Result.UpdateContentSize;
Result.StartAnimate;
DoOnUpdateChatItems;
end;
procedure TFrameChat.SetAPI(const Value: IOpenAI);
begin
FAPI := Value;
end;
procedure TFrameChat.SetAutoExecFuncs(const Value: Boolean);
begin
FAutoExecFuncs := Value;
end;
procedure TFrameChat.SetChatId(const Value: string);
begin
FChatId := Value;
end;
procedure TFrameChat.SetFrequencyPenalty(const Value: Single);
begin
FFrequencyPenalty := Value;
end;
procedure TFrameChat.SetIsImageMode(const Value: Boolean);
begin
FIsImageMode := Value;
if FIsImageMode then
begin
PathImage.Fill.Color := $FFDDDDE4;
RectangleImageMode.Visible := True;
end
else
begin
PathImage.Fill.Color := $FFACACBE;
RectangleImageMode.Visible := False;
end;
end;
procedure TFrameChat.SetLastRequest(const Value: TProc);
begin
FLastRequest := Value;
ButtonRetry.Visible := Assigned(FLastRequest);
end;
procedure TFrameChat.SetMaxTokens(const Value: Integer);
begin
FMaxTokens := Value;
FBuffer.MaxTokensOfModel := FMaxTokens;
end;
procedure TFrameChat.SetMaxTokensQuery(const Value: Integer);
begin
FMaxTokensQuery := Value;
FBuffer.MaxTokensForQuery := FMaxTokensQuery;
end;
procedure TFrameChat.SetMenuItem(const Value: TListBoxItem);
begin
FMenuItem := Value;
end;
procedure TFrameChat.SetMode(const Value: TWindowMode);
begin
FMode := Value;
for var Control in Controls do
if Control is TFrameOveraly then
begin
var Frame := Control as TFrameOveraly;
Frame.Mode := FMode;
end;
for var Control in VertScrollBoxChat do
if Control is TFrameMessage then
begin
var Frame := Control as TFrameMessage;
Frame.SetMode(FMode);
end;
case FMode of
TWindowMode.Compact:
begin
{$IFNDEF MOBILE}
LayoutSend.Margins.Right := 11;
{$ELSE}
LayoutSend.Margins.Right := 0;
{$ENDIF}
LabelWelcomeTitle.Margins.Top := 20;
LayoutSend.TagFloat := 100;
LayoutSend.Height := 100;
LayoutButtom.Margins.Bottom := 0;
LineBorder.Visible := True;
PathExaCompact.Visible := True;
PathExaFull.Visible := False;
PathCapCompact.Visible := True;
PathCapFull.Visible := False;
PathLimCompact.Visible := True;
PathLimFull.Visible := False;
LayoutSend.Padding.Rect := TRectF.Create(0, 10, 0, 40);
RectangleSendBG.Fill.Kind := TBrushKind.Solid;
RectangleSendBG.Fill.Color := $FF343541;
ButtonExportImport.Width := ButtonExportImport.Height;
end;
TWindowMode.Full:
begin
{$IFNDEF MOBILE}
LayoutSend.Margins.Right := 11;
{$ELSE}
LayoutSend.Margins.Right := 0;
{$ENDIF}
LabelWelcomeTitle.Margins.Top := 188;
LayoutSend.TagFloat := 170;
LayoutButtom.Margins.Bottom := -70;
LayoutSend.Height := 170;
LineBorder.Visible := False;
PathExaCompact.Visible := False;
PathExaFull.Visible := True;
PathCapCompact.Visible := False;
PathCapFull.Visible := True;
PathLimCompact.Visible := False;
PathLimFull.Visible := True;
LayoutSend.Padding.Rect := TRectF.Create(0, 80, 0, 40);
RectangleSendBG.Fill.Kind := TBrushKind.Gradient;
ButtonExportImport.Width := 165;
end;
end;
FlowLayoutWelcomeResize(nil);
end;
procedure TFrameChat.SetModel(const Value: string);
begin
FModel := Value;
end;
procedure TFrameChat.SetOnNeedFuncList(const Value: TOnNeedFuncList);
begin
FOnNeedFuncList := Value;
end;
procedure TFrameChat.SetOnTitleChanged(const Value: TNotifyEvent);
begin
FOnTitleChanged := Value;
end;
procedure TFrameChat.SetPresencePenalty(const Value: Single);
begin
FPresencePenalty := Value;
end;
procedure TFrameChat.SetTemperature(const Value: Single);
begin
FTemperature := Value;
end;
procedure TFrameChat.SetTitle(const Value: string);
begin
FTitle := Value.Replace(#10, '').Replace(#13, '').Replace('&', '').Substring(0, 50);
if Assigned(FOnTitleChanged) then
FOnTitleChanged(Self);
end;
procedure TFrameChat.SetTopP(const Value: Single);
begin
FTopP := Value;
end;
procedure TFrameChat.SetTyping(const Value: Boolean);
begin
FIsTyping := Value;
ButtonSend.Enabled := not Value;
TimerTyping.Enabled := Value;
LayoutTyping.Visible := Value;
FlowLayoutActions.Enabled := not Value;
if LayoutTyping.Visible then
begin
LayoutTyping.Margins.Top := 40;
LayoutTyping.Opacity := 0;
TAnimator.AnimateFloat(LayoutTyping, 'Margins.Top', 0);
TAnimator.AnimateFloat(LayoutTyping, 'Opacity', 1);
end;
LabelTyping.Visible := Value;
LabelTyping.Position.X := 0;
UpdateSendControls;
end;
procedure TFrameChat.SetUseFunctions(const Value: Boolean);
begin
FUseFunctions := Value;
end;
procedure TFrameChat.TimerCheckRecordingTimer(Sender: TObject);
begin
if FAudioRecord.IsMicrophoneRecording then
begin
LabelRecordingTime.Text := HumanTime(SecondsToTime(SecondsBetween(Now, FRecordingStartTime)));
end
else
begin
StopRecording;
end;
end;
procedure TFrameChat.TimerTypingTimer(Sender: TObject);
begin
RectangleIndicate.Visible := not RectangleIndicate.Visible;
if LabelTyping.Text.Length > 2 then
LabelTyping.Text := '.'
else
LabelTyping.Text := LabelTyping.Text + '.';
end;
{ TButton }
procedure TButton.SetBounds(X, Y, AWidth, AHeight: Single);
begin
inherited;
if Assigned(Canvas) and (Tag = 1) then
begin
var H := TRectF.Create(0, 0, Width - 20, 10000);
Canvas.Font.Size := Font.Size;
Canvas.MeasureText(H, Text, WordWrap, [], TextAlign, VertTextAlign);
if AHeight <> H.Height + 24 then
Height := H.Height + 24;
end;
end;
{ TLabel }
procedure TLabel.SetBounds(X, Y, AWidth, AHeight: Single);
begin
inherited;
if Assigned(Canvas) and (Tag = 1) then
begin
var H := TRectF.Create(0, 0, Width - 20, 10000);
Canvas.Font.Size := Font.Size;
Canvas.MeasureText(H, Text, WordWrap, [], TextAlign, VertTextAlign);
if AHeight <> H.Height + 24 then
Height := H.Height + 24;
end;
end;
{ TVertScrollBox }
function TVertScrollBox.CreateAniCalculations: TScrollCalculations;
begin
Result := TFixedScrollCalculations.Create(Self);
end;
procedure TVertScrollBox.SetViewPositionY(const Value: Single);
begin
FViewPositionY := Value;
ViewportPosition := TPointF.Create(ViewportPosition.X, FViewPositionY);
end;
{ TMemo }
procedure TMemo.SetViewPos(const Value: Single);
begin
FViewPos := Value;
ViewportPosition := TPointF.Create(ViewportPosition.X, Value);
end;
{ TFixedScrollCalculations }
type
TControlHook = class(TControl)
end;
procedure TFixedScrollCalculations.DoChanged;
begin
//inherited .DoChanged;
TControlHook(ScrollBox).FDisableAlign := True;
try
inherited;
finally
TControlHook(ScrollBox).FDisableAlign := False;
end;
end;
end.
================================================
FILE: ChatGPT.FrameCode.fmx
================================================
object FrameCode: TFrameCode
ClipChildren = True
HitTest = False
Margins.Bottom = 5.000000000000000000
Size.Width = 575.000000000000000000
Size.Height = 387.000000000000000000
Size.PlatformDefault = False
OnResize = FrameResize
OnResized = FrameResize
object RectangleHead: TRectangle
Align = Top
ClipChildren = True
Corners = [TopLeft, TopRight]
Fill.Color = xFF353440
Padding.Left = 16.000000000000000000
Padding.Top = 6.000000000000000000
Padding.Right = 16.000000000000000000
Padding.Bottom = 6.000000000000000000
Sides = [Top, Left, Right]
Size.Width = 575.000000000000000000
Size.Height = 32.000000000000000000
Size.PlatformDefault = False
Stroke.Color = xFF1A1922
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
object LabelLanguage: TLabel
Align = Client
StyledSettings = [Style]
Size.Width = 462.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 11.500000000000000000
TextSettings.FontColor = xFFD9D9E3
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = 'language'
TabOrder = 0
end
object LayoutCopyCode: TLayout
Align = Right
Cursor = crHandPoint
HitTest = True
Position.X = 478.000000000000000000
Position.Y = 6.000000000000000000
Size.Width = 81.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
OnClick = LayoutCopyCodeClick
object PathCopy: TPath
Align = Left
Data.Path = {
4E0000000000000000005C410000004002000000ED0D6F410000004002000000
4CA67E41D2353B4002000000B3EA7F4106128340010000000000804100008840
0200000000008041384A854002000000C0EC7F41499D8240020000007AC77F41
D3F67F400100000000008E410000804002000000D8F097410000804002000000
0000A0414B3CA040020000000000A0410000C840010000000000A04100009E41
020000000000A041D8F0A74102000000D8F097410000B0410200000000008E41
0000B041010000000000C8400000B041020000004B3CA0400000B04102000000
00008040D8F0A741020000000000804000009E4101000000000080400000C840
02000000000080404B3CA040020000004B3CA04000008040020000000000C840
00008040010000007C380041D3F67F4002000000061E004102D9814002000000
B30C004117BC834002000000E0040041ECA38540010000000000004100008840
02000000000000419678404002000000261E1041000000400200000000002441
000000400100000000005C41000000400300000000005C410000004000000000
00005C410000D04001000000000024410000D04002000000924B17410000D040
02000000A5200C4162D6C240020000005CB805416FF5AE400100000077100641
A301B040010000000000C8400000B04002000000CBBEBA400000B04002000000
0000B040CBBEBA40020000000000B0400000C840010000000000B04000009E41
020000000000B0404850A14102000000CBBEBA400000A441020000000000C840
0000A4410100000000008E410000A44102000000485091410000A44102000000
000094414850A141020000000000944100009E4101000000000094410000C840
0200000000009441CBBEBA4002000000485091410000B0400200000000008E41
0000B040010000009EEF7941A301B04001000000AE477A416FF5AE4002000000
3BDF734162D6C24002000000A2B468410000D0400200000000005C410000D040
0300000000005C410000D0400000000000005C41000060400100000000002441
0000604002000000655F1D41000060400200000000001841957D754002000000
000018410000884002000000000018413541954002000000655F1D410000A040
02000000000024410000A0400100000000005C410000A0400200000090A06241
0000A04002000000000068413541954002000000000068410000884002000000
00006841957D75400200000090A06241000060400200000000005C4100006040
0300000000005C4100006040}
Fill.Color = xFFD9D9E3
HitTest = False
Size.Width = 11.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object LabelCopy: TLabel
Align = Right
AutoSize = True
StyledSettings = [Style]
Position.X = 26.000000000000000000
Size.Width = 55.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 11.500000000000000000
TextSettings.FontColor = xFFD9D9E3
TextSettings.HorzAlign = Trailing
TextSettings.WordWrap = False
TextSettings.Trimming = None
Text = 'Copy code'
TabOrder = 0
OnResize = LabelCopyResize
OnResized = LabelCopyResize
end
end
end
object RectangleClient: TRectangle
Touch.InteractiveGestures = [LongTap]
Align = Client
Corners = [BottomLeft, BottomRight]
Fill.Color = claBlack
Size.Width = 575.000000000000000000
Size.Height = 355.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
OnMouseDown = RectangleClientMouseDown
OnMouseMove = RectangleClientMouseMove
OnMouseUp = RectangleClientMouseUp
object MemoCode: TMemo
Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
Caret.Color = x00FFFFFF
DataDetectorTypes = []
DisableMouseWheel = True
Lines.Strings = (
'begin'
''
'end.')
ReadOnly = True
StyledSettings = [Style]
TextSettings.Font.Family = 'Consolas'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xFFE8E8E8
Align = Client
CanParentFocus = True
Cursor = crDefault
EnableDragHighlight = False
Margins.Left = 5.000000000000000000
Margins.Top = 5.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Size.Width = 565.000000000000000000
Size.Height = 345.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'memostyle_code'
TabOrder = 0
OnMouseWheel = MemoCodeMouseWheel
OnPresentationNameChoosing = MemoCodePresentationNameChoosing
Viewport.Width = 555.000000000000000000
Viewport.Height = 335.000000000000000000
end
end
end
================================================
FILE: ChatGPT.FrameCode.pas
================================================
unit ChatGPT.FrameCode;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Memo.Types, FMX.Controls.Presentation, FMX.ScrollBox,
FMX.Edit.Style, FMX.Memo, FMX.Layouts, FMX.Memo.Style, ChatGPT.Classes,
FMX.TextLayout, ChatGPT.Code, FMX.Gestures, FMX.RichEdit.Style;
{$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)}
{$DEFINE MOBILE}
{$ENDIF}
type
TMemo = class(FMX.Memo.TMemo)
protected
procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;
end;
TFrameCode = class(TFrame)
RectangleHead: TRectangle;
RectangleClient: TRectangle;
MemoCode: TMemo;
LabelLanguage: TLabel;
LayoutCopyCode: TLayout;
PathCopy: TPath;
LabelCopy: TLabel;
procedure FrameResize(Sender: TObject);
procedure LayoutCopyCodeClick(Sender: TObject);
procedure MemoCodeMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
procedure LabelCopyResize(Sender: TObject);
procedure RectangleClientMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure RectangleClientMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
procedure RectangleClientMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
procedure TimerMouseOverTimer(Sender: TObject);
procedure MemoCodePresentationNameChoosing(Sender: TObject; var PresenterName: string);
private
FOnWheel: TMouseWheelEvent;
FStyledMemo: TRichEditStyled;
FMouseDown: TPointF;
procedure FOnStyleLookup(Sender: TObject);
procedure SetOnWheel(const Value: TMouseWheelEvent);
function IsJson(const Value: string): Boolean;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetContentHeight: Single;
procedure Fill(Data: TPart);
property OnWheel: TMouseWheelEvent read FOnWheel write SetOnWheel;
end;
implementation
uses
System.Math, FMX.Clipboard, System.JSON, FMX.Platform, ChatGPT.FrameUIMessage,
System.Net.URLClient;
{$R *.fmx}
{ TFrameCode }
constructor TFrameCode.Create(AOwner: TComponent);
begin
inherited;
Name := '';
MemoCode.DisableDisappear := True;
FStyledMemo := (MemoCode.Presentation as TRichEditStyled);
{$IFDEF MOBILE}
MemoCode.HitTest := False;
{$ENDIF}
MemoCode.OnApplyStyleLookup := FOnStyleLookup;
end;
destructor TFrameCode.Destroy;
begin
inherited;
end;
function TFrameCode.IsJson(const Value: string): Boolean;
begin
Result := False;
try
var JSON := TJSONObject.ParseJSONValue(Value);
if Assigned(JSON) then
begin
JSON.Free;
Result := True;
end;
except
Result := False;
end;
end;
procedure TFrameCode.Fill(Data: TPart);
begin
if Data.Language.IsEmpty then
if IsJson(Data.Content) then
Data.Language := 'json';
if not Data.Language.IsEmpty then
//FCodeSyntax := TCodeSyntax.FindSyntax(Data.Language, MemoCode.Font, MemoCode.FontColor);
FStyledMemo.SetCodeSyntaxName(Data.Language, MemoCode.Font, MemoCode.FontColor)
else
FStyledMemo.SetCodeSyntaxName('md', MemoCode.Font, MemoCode.FontColor);
MemoCode.Text := Data.Content;
if Data.Language.IsEmpty then
LabelLanguage.Text := ''
else
LabelLanguage.Text := Data.Language;
FrameResize(nil);
end;
procedure TFrameCode.FOnStyleLookup(Sender: TObject);
begin
(MemoCode.Presentation as TRichEditStyled).RoundedSelection := True;
(MemoCode.Presentation as TRichEditStyled).ShowGutter := True;
(MemoCode.Presentation as TRichEditStyled).GutterRightMargin := 4;
(MemoCode.Presentation as TRichEditStyled).UseSelectedTextColor := True;
(MemoCode.Presentation as TRichEditStyled).SelectedTextColor := TAlphaColorRec.White;
FrameResize(nil);
end;
procedure TFrameCode.FrameResize(Sender: TObject);
begin
Height := GetContentHeight;
end;
function TFrameCode.GetContentHeight: Single;
begin
Result := Max(MemoCode.ContentBounds.Height + 20, 30) +
MemoCode.Margins.Top +
MemoCode.Margins.Bottom +
RectangleHead.Height;
end;
procedure TFrameCode.LabelCopyResize(Sender: TObject);
begin
LayoutCopyCode.Width := LabelCopy.Width + PathCopy.Width + 8;
end;
procedure TFrameCode.LayoutCopyCodeClick(Sender: TObject);
begin
var ClipBoard: IFMXClipboardService;
if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, ClipBoard) then
begin
ClipBoard.SetClipboard(MemoCode.Text);
ShowUIMessage('Coppied');
end
else
ShowUIMessage('Clipboard error');
end;
procedure TFrameCode.MemoCodeMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
if (MemoCode.SelLength > 0) and (Root.Captured = IControl(FStyledMemo)) then
begin
Handled := True;
if Assigned(FOnWheel) then
FOnWheel(Sender, Shift, WheelDelta, Handled);
end;
end;
procedure TFrameCode.MemoCodePresentationNameChoosing(Sender: TObject; var PresenterName: string);
begin
PresenterName := 'RichEditStyled';
end;
procedure TFrameCode.RectangleClientMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
FMouseDown := TPointF.Create(X, Y);
Root.Captured := RectangleClient;
end;
procedure TFrameCode.RectangleClientMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single);
begin
if ssLeft in Shift then
begin
MemoCode.ViewportPosition := TPointF.Create(MemoCode.ViewportPosition.X + (FMouseDown.X - X), MemoCode.ViewportPosition.Y);
FMouseDown := TPointF.Create(X, Y);
end;
end;
procedure TFrameCode.RectangleClientMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
begin
Root.Captured := nil;
end;
procedure TFrameCode.SetOnWheel(const Value: TMouseWheelEvent);
begin
FOnWheel := Value;
end;
procedure TFrameCode.TimerMouseOverTimer(Sender: TObject);
begin
end;
{ TMemo }
procedure TMemo.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
inherited;
end;
end.
================================================
FILE: ChatGPT.FrameImage.fmx
================================================
object FrameImage: TFrameImage
Size.Width = 256.000000000000000000
Size.Height = 256.000000000000000000
Size.PlatformDefault = False
object RectangleImage: TRectangle
Align = Client
ClipChildren = True
Cursor = crHandPoint
Fill.Color = xA03F3F3F
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
PopupMenu = PopupMenuCopy
Size.Width = 251.000000000000000000
Size.Height = 251.000000000000000000
Size.PlatformDefault = False
Stroke.Color = xFF545454
XRadius = 4.000000000000000000
YRadius = 4.000000000000000000
OnClick = RectangleImageClick
OnPaint = RectangleImagePaint
object AniIndicator: TAniIndicator
Align = Center
Enabled = True
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
end
object LabelError: TLabel
Align = Client
AutoSize = True
StyledSettings = [Family, Style]
Padding.Left = 5.000000000000000000
Padding.Top = 5.000000000000000000
Padding.Right = 5.000000000000000000
Padding.Bottom = 5.000000000000000000
Opacity = 0.600000023841857900
Size.Width = 251.000000000000000000
Size.Height = 251.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = claWhitesmoke
TextSettings.HorzAlign = Center
Text = 'No longer available'
Visible = False
TabOrder = 0
OnResize = LabelErrorResize
OnResized = LabelErrorResize
end
end
object PopupMenuCopy: TPopupMenu
Left = 64
Top = 56
object MenuItemCopy: TMenuItem
Text = 'Copy image'
OnClick = MenuItemCopyClick
end
end
end
================================================
FILE: ChatGPT.FrameImage.pas
================================================
unit ChatGPT.FrameImage;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Effects, FMX.Filter.Effects, FMX.Menus,
FMX.Controls.Presentation;
type
TFrameImage = class(TFrame)
RectangleImage: TRectangle;
AniIndicator: TAniIndicator;
PopupMenuCopy: TPopupMenu;
MenuItemCopy: TMenuItem;
LabelError: TLabel;
procedure RectangleImageClick(Sender: TObject);
procedure MenuItemCopyClick(Sender: TObject);
procedure RectangleImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
procedure LabelErrorResize(Sender: TObject);
private
FImage: string;
FIsLoaded: Boolean;
procedure SetImage(const Value: string);
public
property Image: string read FImage write SetImage;
constructor Create(AOwner: TComponent); override;
end;
implementation
uses
ChatGPT.FrameImagePreview, FMX.Platform, ChatGPT.FrameUIMessage, HGM.FMX.Image;
{$R *.fmx}
{ TFrameImage }
constructor TFrameImage.Create(AOwner: TComponent);
begin
inherited;
FIsLoaded := False;
Name := '';
RectangleImage.HitTest := False;
end;
procedure TFrameImage.LabelErrorResize(Sender: TObject);
begin
if LabelError.Width < 100 then
LabelError.Font.Size := 12
else
LabelError.Font.Size := 14;
end;
procedure TFrameImage.MenuItemCopyClick(Sender: TObject);
begin
var ClipBoard: IFMXClipboardService;
if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, ClipBoard) then
begin
ClipBoard.SetClipboard(RectangleImage.Fill.Bitmap.Bitmap);
ShowUIMessage('Image coppied');
end
else
ShowUIMessage('ClipBoard error');
end;
procedure TFrameImage.RectangleImageClick(Sender: TObject);
begin
RectangleImage.Visible := False;
TFramePreview.ShowPreview(RectangleImage.Fill.Bitmap.Bitmap, RectangleImage,
procedure
begin
RectangleImage.Visible := True;
end);
end;
procedure TFrameImage.RectangleImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
begin
if not FIsLoaded then
begin
FIsLoaded := True;
RectangleImage.Fill.Bitmap.Bitmap.LoadFromUrlAsync(RectangleImage, FImage, True,
procedure(Success: Boolean)
begin
AniIndicator.Visible := False;
if Success then
begin
RectangleImage.Fill.Kind := TBrushKind.Bitmap;
RectangleImage.Fill.Bitmap.WrapMode := TWrapMode.TileStretch;
RectangleImage.HitTest := True;
end
else
LabelError.Visible := True;
end);
end;
end;
procedure TFrameImage.SetImage(const Value: string);
begin
FImage := Value;
end;
end.
================================================
FILE: ChatGPT.FrameImagePreview.fmx
================================================
object FramePreview: TFramePreview
Padding.Left = 20.000000000000000000
Padding.Top = 20.000000000000000000
Padding.Right = 20.000000000000000000
Padding.Bottom = 20.000000000000000000
Size.Width = 706.000000000000000000
Size.Height = 635.000000000000000000
Size.PlatformDefault = False
OnClick = FrameClick
OnResized = FrameResized
object RectangleBG: TRectangle
Align = Contents
Fill.Color = xB4000000
HitTest = False
Size.Width = 706.000000000000000000
Size.Height = 635.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
end
object SaveDialogJPG: TSaveDialog
DefaultExt = '*.jpg'
Filter = 'JPG|*.jpg'
Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]
Left = 140
Top = 484
end
object Image: TImage
MultiResBitmap = <
item
end>
HitTest = False
Position.X = 96.000000000000000000
Position.Y = 80.000000000000000000
Size.Width = 345.000000000000000000
Size.Height = 249.000000000000000000
Size.PlatformDefault = False
WrapMode = Place
end
object LayoutControls: TLayout
Align = Contents
Size.Width = 706.000000000000000000
Size.Height = 635.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object LayoutControlsContent: TLayout
Align = Bottom
Position.Y = 549.000000000000000000
Size.Width = 706.000000000000000000
Size.Height = 86.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object Rectangle1: TRectangle
Align = Contents
Fill.Kind = Gradient
Fill.Gradient.Points = <
item
Color = claBlack
Offset = 0.000000000000000000
end
item
Color = claNull
Offset = 1.000000000000000000
end>
Fill.Gradient.StartPosition.X = 0.500000000000000000
Fill.Gradient.StartPosition.Y = 1.000000000000000000
Fill.Gradient.StopPosition.X = 0.499999970197677600
Fill.Gradient.StopPosition.Y = 0.000000000000000000
Size.Width = 706.000000000000000000
Size.Height = 86.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
object ButtonDownload: TButton
Align = Right
Hint = 'Save as ...'
ImageIndex = 15
Margins.Top = 20.000000000000000000
Margins.Right = 20.000000000000000000
Margins.Bottom = 20.000000000000000000
Position.X = 640.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 46.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_icon'
TabOrder = 1
OnClick = ButtonDownloadClick
end
object ButtonShare: TButton
Align = Right
Hint = 'Share'
ImageIndex = 14
Margins.Top = 20.000000000000000000
Margins.Right = 20.000000000000000000
Margins.Bottom = 20.000000000000000000
Position.X = 574.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 46.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_icon'
TabOrder = 0
OnClick = ButtonShareClick
end
end
end
end
end
================================================
FILE: ChatGPT.FrameImagePreview.pas
================================================
unit ChatGPT.FrameImagePreview;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Layouts, FMX.Controls.Presentation, FMX.Ani;
type
TFramePreview = class(TFrame)
RectangleBG: TRectangle;
Image: TImage;
LayoutControlsContent: TLayout;
ButtonDownload: TButton;
Rectangle1: TRectangle;
SaveDialogJPG: TSaveDialog;
LayoutControls: TLayout;
ButtonShare: TButton;
procedure FrameClick(Sender: TObject);
procedure ButtonDownloadClick(Sender: TObject);
procedure FrameResized(Sender: TObject);
procedure ButtonShareClick(Sender: TObject);
private
FInitImageBounds: TControl;
FOnClose: TProc;
procedure SetImageBounds(Rect: TControl);
public
class procedure ShowPreview(Bitmap: TBitmap; InitBounds: TControl; OnClose: TProc);
constructor Create(AOwner: TComponent); override;
end;
implementation
uses
HGM.FMX.Ani, System.IOUtils, ChatGPT.FrameUIMessage, ChatGPT.Manager;
{$R *.fmx}
{ TFramePreview }
procedure TFramePreview.ButtonDownloadClick(Sender: TObject);
begin
{$IFNDEF ANDROID OR IOS OR IOS64}
SaveDialogJPG.FileName := TPath.GetRandomFileName + '.jpg';
if SaveDialogJPG.Execute then
begin
Image.Bitmap.SaveToFile(SaveDialogJPG.FileName);
ShowUIMessage('Saved');
end;
{$ELSE}
ShowMessage(TPath.Combine(TPath.GetSharedPicturesPath, TPath.GetRandomFileName + '.jpg'));
Image.Bitmap.SaveToFile(TPath.Combine(TPath.GetSharedPicturesPath, TPath.GetRandomFileName + '.jpg'));
ShowUIMessage('Saved to gallery');
{$ENDIF}
end;
procedure TFramePreview.ButtonShareClick(Sender: TObject);
begin
Manager.ShareBitmap(Image.Bitmap);
end;
constructor TFramePreview.Create(AOwner: TComponent);
begin
inherited;
Name := '';
ButtonShare.Visible := Manager.CanShare;
end;
procedure TFramePreview.FrameClick(Sender: TObject);
begin
var ToRect := FInitImageBounds.AbsoluteRect;
TAnimator.AnimateFloat(RectangleBG, 'Opacity', 0);
TAnimator.AnimateFloat(Image, 'Position.X', ToRect.Left);
TAnimator.AnimateFloat(Image, 'Position.Y', ToRect.Top);
TAnimator.AnimateFloat(Image, 'Width', ToRect.Width);
TAnimator.AnimateFloat(LayoutControlsContent, 'Margins.Bottom', -LayoutControlsContent.Height);
LayoutControlsContent.Opacity := 0;
TAnimator.AnimateFloat(LayoutControlsContent, 'Opacity', 1);
TAnimator.AnimateFloatWithFinish(Image, 'Height', ToRect.Height,
procedure
begin
if Assigned(FOnClose) then
FOnClose;
Release;
end);
end;
procedure TFramePreview.FrameResized(Sender: TObject);
begin
Image.BoundsRect := LayoutControls.BoundsRect;
end;
procedure TFramePreview.SetImageBounds(Rect: TControl);
begin
FInitImageBounds := Rect;
Image.BoundsRect := FInitImageBounds.AbsoluteRect;
TAnimator.AnimateFloat(Image, 'Position.X', LayoutControls.BoundsRect.Left);
TAnimator.AnimateFloat(Image, 'Position.Y', LayoutControls.BoundsRect.Top);
TAnimator.AnimateFloat(Image, 'Width', LayoutControls.BoundsRect.Width);
TAnimator.AnimateFloat(Image, 'Height', LayoutControls.BoundsRect.Height);
end;
class procedure TFramePreview.ShowPreview(Bitmap: TBitmap; InitBounds: TControl; OnClose: TProc);
begin
var Frame := TFramePreview.Create(InitBounds);
Frame.Parent := Application.MainForm;
Frame.Align := TAlignLayout.Contents;
Frame.Image.Bitmap := Bitmap;
Frame.BringToFront;
Frame.SetImageBounds(InitBounds);
Frame.RectangleBG.Opacity := 0.001;
Frame.FOnClose := OnClose;
Frame.LayoutControlsContent.Margins.Bottom := -Frame.LayoutControlsContent.Height;
TAnimator.AnimateFloat(Frame.RectangleBG, 'Opacity', 1);
TAnimator.AnimateFloat(Frame.LayoutControlsContent, 'Margins.Bottom', 0);
end;
end.
================================================
FILE: ChatGPT.FrameMessage.fmx
================================================
object FrameMessage: TFrameMessage
Size.Width = 735.000000000000000000
Size.Height = 521.000000000000000000
Size.PlatformDefault = False
OnResize = FrameResize
OnResized = FrameResize
object LayoutClient: TLayout
Align = Contents
Padding.Left = 16.000000000000000000
Padding.Top = 16.000000000000000000
Padding.Right = 16.000000000000000000
Padding.Bottom = 16.000000000000000000
Size.Width = 735.000000000000000000
Size.Height = 521.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object RectangleBG: TRectangle
Align = Contents
Fill.Color = xFF343541
Locked = True
Sides = [Bottom]
Size.Width = 735.000000000000000000
Size.Height = 521.000000000000000000
Size.PlatformDefault = False
Stroke.Color = xFF282B34
end
object LayoutContent: TLayout
Align = HorzCenter
Position.X = 45.000000000000000000
Position.Y = 16.000000000000000000
Size.Width = 645.000000000000000000
Size.Height = 489.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object LayoutContentText: TLayout
Align = Client
Size.Width = 507.000000000000000000
Size.Height = 459.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object FlowLayoutImages: TFlowLayout
Align = Top
Size.Width = 507.000000000000000000
Size.Height = 107.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
Justify = Left
JustifyLastLine = Left
FlowDirection = LeftToRight
end
object LayoutFunc: TLayout
Align = Top
Position.Y = 107.000000000000000000
Size.Width = 507.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object ButtonExecuteFunc: TButton
Align = Left
Size.Width = 97.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_execute'
TabOrder = 0
Text = 'Execute'
TextSettings.HorzAlign = Leading
OnClick = ButtonExecuteFuncClick
end
object LabelGPTFunc: TLabel
Align = Client
Cursor = crHelp
StyledSettings = [Family, Size, Style]
HitTest = True
Margins.Left = 10.000000000000000000
Size.Width = 370.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TextSettings.FontColor = claWhite
TextSettings.WordWrap = False
Text = 'get_weather_info'
TabOrder = 1
end
object LayoutFuncState: TLayout
Align = Right
Cursor = crHelp
HitTest = True
Position.X = 477.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object PathSuccess: TPath
Align = Center
Data.Path = {
1700000000000000CDCC4C419A99E54101000000343353409A99994102000000
9A99394067669641020000009A993940CDCC90410200000034335340CDCC8C41
010000009A999940CDCC8041020000006766A64034337B4102000000CDCCBC40
34337B4102000000CDCCCC40CDCC8041010000009A9959416666BA4101000000
CDCCEC419899E940020000000000F041CBCCDC40020000009A99F541CBCCDC40
020000009A99F9419899E94001000000CDCC0242CCCC0C410200000067660442
32331341020000006766044266661E4102000000CDCC02426666264101000000
666666419A99E5410200000066665E41CDCCE8410200000033335341CDCCE841
02000000CDCC4C419A99E54103000000CDCC4C419A99E541}
Fill.Color = xFFACACBE
HitTest = False
Size.Width = 16.000000000000000000
Size.Height = 16.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object PathError: TPath
Align = Center
Data.Path = {
3C000000000000000000404100000040020000001B2F8C410000004002000000
0000B041C74BCF40020000000000B04100004041020000000000B0410E2D8C41
020000001B2F8C410000B04102000000000040410000B041020000009643CF40
0000B04102000000000000400E2D8C4102000000000000400000404102000000
00000040C74BCF40020000009643CF4000000040020000000000404100000040
030000000000404100000040000000000000404121B06A4002000000C3F5EC40
21B06A400200000021B06A40C3F5EC400200000021B06A400000404102000000
21B06A408FC2844102000000C3F5EC40FCA9A2410200000000004041FCA9A241
020000008FC28441FCA9A24102000000FCA9A2418FC2844102000000FCA9A241
0000404102000000FCA9A241C3F5EC40020000008FC2844121B06A4002000000
0000404121B06A40030000000000404121B06A4000000000ADFA3F4103096841
020000009FCD48410309684102000000F1F44F41BE306F4102000000F1F44F41
B003784102000000F1F44F41516B8041020000009FCD48412EFF834102000000
ADFA3F412EFF834102000000522737412EFF83410200000000003041516B8041
0200000000003041B00378410200000000003041BE306F410200000052273741
0309684102000000ADFA3F410309684103000000ADFA3F410309684100000000
79E93F410000E04002000000B9FC45418BFDDF4002000000DE024B41DE02E940
0200000042CF4B4178B9F44001000000EEEB4B4116FBF74001000000ADFA4B41
1904444102000000E7FB4B41A9A44A4102000000B29D46415305504102000000
22FD3F418E06504102000000E2E93941C80750410200000054E334411F854B41
02000000F0163441FCA9454101000000ADFA33410309444101000000EEEB3341
EA04F840020000004BEA3341B5C3EA400200000080483941B402E04002000000
79E93F410000E0400300000079E93F410000E040}
Fill.Color = xFFEA4141
HitTest = False
Size.Width = 16.000000000000000000
Size.Height = 16.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
Visible = False
WrapMode = Fit
end
object PathWait: TPath
Align = Center
Data.Path = {
2300000000000000C3F59641B81E41410100000086EB4D41EC51AC4102000000
4EE44A41B0AEAE4102000000129C45412C14B04102000000010040410000B041
020000000D843E41EB1DB0410200000013013D41EB1DB0410200000020853B41
0000B04102000000B97534413BF9AE410200000024B52F4162ACAB4102000000
000030410000A84101000000000030410000704101000000713DDA4000007041
02000000CFE4B640AB007041020000005B3C9A4087AD614102000000053B9A40
3601504102000000903A9A4001F149410200000019AC9D40AB00444102000000
F628A44048E13E41010000007B143241A4701D4002000000E4C535412EC90340
02000000F3613D419238EF3F02000000E17A44410000004002000000468A4B41
2A36084002000000DB4A5041F19C224002000000000050410000404001000000
000050410000104101000000A47089410000104102000000CD46924154FF0F41
02000000EA70994178521E410200000040719941C9FE2F41020000005D719941
FF0E364102000000FB94984155FF3B4102000000C4F59641B81E414103000000
C3F59641B81E4141}
Fill.Color = xFFACACBE
HitTest = False
Size.Width = 16.000000000000000000
Size.Height = 16.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
Visible = False
WrapMode = Fit
end
object AniIndicatorFunc: TAniIndicator
Align = Client
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
end
end
end
end
object LayoutInfo: TLayout
Align = MostLeft
Margins.Right = 14.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 489.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object RectangleUser: TRectangle
Align = Top
Fill.Color = xFF5436DA
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path1: TPath
Align = Center
Data.Path = {
310000000000000000004041000000400200000035D113410000004002000000
0000E0406AA28740020000000000E0400000E040020000000100E040CC2E1C41
0200000036D113410000404102000000010040410000404102000000CA2E6C41
000040410200000000008841CC2E1C4102000000000088410200E04002000000
000088416CA2874002000000CB2E6C4104000040020000000000404104000040
03000000000040410000004000000000000040410000204102000000867D2541
0000204102000000000010417A820A4102000000000010410000E04002000000
000010410CFBAA4002000000877D2541FFFF7F40020000000100404100008040
0200000079825A41FFFF7F4002000000000070410CFBAA400200000000007041
FFFFDF4002000000000070417A820A410200000079825A410000204102000000
FFFF3F4100002041030000000000404100002041000000000000A8410000A841
010000000000A8410000A041020000000000A84172128141020000008EED8E41
0000504102000000000060410000504101000000000020410000504102000000
C849C4400000504102000000000040407212814102000000020040400000A041
01000000020040400000A841010000000100A0400000A841010000000100A040
0000A041020000000100A0409AE88941020000006CA2E7400000704102000000
0100204100007041010000000100604100007041020000006617864100007041
02000000000098419BE8894102000000000098410000A0410100000000009841
0000A841030000000000A8410000A841}
Fill.Color = claWhite
Locked = True
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object RectangleBot: TRectangle
Align = Top
Fill.Color = xFF10A37F
Position.Y = 30.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path2: TPath
Align = Center
Data.Path = {
0F010000000000002D21164232F786410200000057EC1742B762784102000000
928B1842F38E61410200000054F4174272F94A4102000000155D1742F1633441
02000000D792154279921E410200000039B41242C2FA0A41020000004D730E42
75B0DA4002000000EBF3074261C3AB400200000032260042B6F38F4002000000
F2B0F04141486840020000004547DF4109C45940020000006F92CE412E737640
020000006C09C741E48332400200000074C6BD41E17AF83F02000000D567B341
3884AE3F020000003709A941711B493F0200000098CC9D419C87FB3E02000000
47729241E90C003F02000000CC5D81416876FD3E02000000C66D61410282953F
020000004BC8454157041B4002000000D1222A4184476B400200000094931541
0A4BAE400200000034110B41014DEF400200000090A0E9405969F84002000000
5B94BF40607605410200000070CE9A4001CD1241020000000A116C40A3232041
0200000048C42E404F4031410200000024D10140F4FD444102000000D3DA743F
AC8B6241020000007A70FF3EF16382410200000033C1383FE561934102000000
3ACA713FA45FA44102000000FB05EB3FF55BB44102000000E9265140CE08C141
020000004F753440A5CECB41020000001B812A408638D74102000000DCF43340
4783E241020000009D683D4007CEED4102000000740C5A40AEB6F84102000000
D7FA834055410142020000005C03A640E2A90842020000005DFED9405F870E42
020000001C360C415501124202000000F46C2B414A7B1542020000004F404E41
A36316420200000093A96F41C89814420200000099BB7E41C2D7184202000000
F9A088411C3C1C420200000063FF9241E18B1E4202000000015E9D418CDB2042
02000000A09AA841E908224202000000F1F4B341CCFF214202000000AC0BC541
8805224202000000D7B4D54112541F4202000000CE88E3410E4F1A4202000000
FB5CF141094A15420200000012A5FB41D0330E42020000009672004254120642
02000000C4020642CCEE0442020000004D440B426A9E02420200000015DD0F42
6891FE4102000000C375144232E6F741020000008C4A1842A857EF4102000000
CE191B42D578E5410200000019621F4261B2D641020000008E3521424D95C541
02000000CB5020423199B44102000000226C1F42159DA3410200000009DB1B42
9CA29341020000002D21164232F78641030000002D21164232F7864100000000
7FFBB341238A17420200000054F4A541B38C174202000000015E9841DC171542
020000005F988D41B499104202000000AF148E41CF77104202000000CCEE8E41
023C104202000000EE7C8F417D101042010000000534CF412653FB4102000000
6ACDD0414B6AFA41020000006221D2419318F94102000000E70CD3419D80F741
02000000A1F8D341A7E8F541020000004D73D4416519F441020000006F70D441
8F42F241010000006F70D441006F984101000000D35EEF41E7FBA74102000000
DE82EF41ED0DA84102000000FFA1EF418D28A841020000008CB9EF418649A841
02000000E5D0EF417F6AA84102000000A4DFEF41CB90A84102000000C3E4EF41
BBB8A84101000000C3E4EF41781CF34102000000A4DFEF410080014202000000
8A8EE941CC1D094202000000C353DE4185BC0E4202000000FC18D341575B1442
02000000D3DEC341BC851742020000007FFBB341238A1742030000007FFBB341
238A1742000000007A8DCC401B0DF841020000007172B04010E9EB4102000000
4451A64083AFDD4102000000F2EFAF4098DDCF41020000006BD4B1404C26D041
02000000A722B54087A7D04102000000ED81B740C5FED041010000001B2F5B41
64CCF54102000000295C5E41F5B9F6410200000009F961414C37F74102000000
B5A665414C37F74102000000F85369414C37F74102000000D8F06C41F5B9F641
02000000E71D704164CCF5410100000017D9C541E5E1C8410100000017D9C541
B3FBE7410200000057DBC5414024E841020000008FD3C541014DE84102000000
5BC2C541DE71E8410200000027B1C541BC96E841020000002497C541E3B6E841
020000009476C54142CFE84101000000B90D8541B1FF064202000000B98D6E41
66F70A42020000002CD44D41EF090C42020000007E1D2F414AFB094202000000
A5661041A5EC0742020000004469EC40BBE70242020000007A8DCC401B0DF841
030000007A8DCC401B0DF841000000009981894010E95941020000006B7DA540
C89841410200000075B0D1407FFB2E41020000007D2E0341BD52254102000000
7D2E0341BA6B2641020000005A1E0341645D2841020000005A1E0341AEB62941
010000005A1E0341C9769E41020000009E1803416A4DA04102000000AE0D0441
431CA2410200000045E4054105B4A34102000000DCBA0741924BA54102000000
04620A41159DA64102000000FD930D41F085A7410100000012949441006FD441
01000000C74B7341B3FBE34102000000C80773413A12E441020000008CB97241
BE1FE44102000000736872416E23E44102000000591772411E27E44102000000
6DC57141C520E44102000000787A7141CB10E44101000000734BE14079D8BE41
020000008048AA407CE1B641020000002D268240BAC9A941020000008D626340
D26F9A4102000000C07842401E168B410200000070995340F775754102000000
9981894010E95941030000009981894010E9594100000000D7A3FF41DE71A041
010000007FD9B141BF0E674101000000E3C7CC4138F8474102000000E2E9CC41
92CB4741020000000011CD4121B04741020000008C39CD41C1A8474102000000
1962CD4162A1474102000000DB8ACD417DAE47410200000055B0CD4170CE4741
010000006A0D074259178941020000009FFC0B42C1CA8E4102000000BE011042
832F97410200000074A41242584AA14102000000114715422C65AB4102000000
366B1642C1CAB64102000000CCEE1542AF25C24102000000617215429D80CD41
02000000515A13427958D84102000000AFE50F423E68E14102000000F2700C42
0378EA410200000019C40742A45FF14102000000366B02421450F54102000000
366B0242F2C1F44102000000366B024252C9F34102000000366B0242781CF341
01000000366B02420681A94102000000296D024236ABA741020000008A300242
C6DCA5410200000099BB01423945A44102000000A8460142ACADA24102000000
B29D0042C05BA14102000000D7A3FF41DE71A04103000000D7A3FF41DE71A041
00000000D5380D426E3470410200000050FC0C42BE9F6F410200000089920C42
90A06E4102000000A8460C427CF26D410100000004D6D841D656244102000000
7D3FD741857C2241020000004171D54141822141020000006B9AD34141822141
02000000CAC3D14141822141020000005AF5CF41857C224102000000D35ECE41
D656244101000000AF9480413D2C7E4101000000AF948041A1F83F4102000000
6F9280411EA73F4102000000379A804104563F41020000006BAB80414A0C3F41
020000009FBC80418FC23E4102000000A1D6804141823E410200000032F78041
83513E41010000000D60C1410C02E840020000000E3ECB41BC3FD14002000000
C286D6414833C640020000000AE8E1417C27C840020000005249ED41C51BCA40
020000008C4AF84111FCD840020000004ED10042E50AF340020000003C7D0542
DD8C0641020000000523094296A118410200000067550B424CA62D4102000000
C8870D42CEAA424102000000832F0E4283C0594102000000D5380D426E347041
03000000D5380D426E34704100000000DFE063410389AF4101000000D2002E41
1CFC9F4102000000BBB82D4116EA9F4102000000107A2D4176CF9F4102000000
5E4B2D417DAE9F4102000000AC1C2D41848D9F4102000000C5FE2C4138679F41
02000000F1F42C41143F9F4101000000F1F42C41AEB6294102000000A1F82C41
5DED124102000000107A33413A3BF94002000000DDB53F4160C8D24002000000
13F24B418655AC400200000038675D41A0A68D40020000003D0A724122A67440
02000000A156834104FF4D4002000000B7D18E412FA83F4002000000841E9A41
0E4F4B4002000000856BA541EDF55640020000003A12B0414B1F7C4002000000
C3D3B841B0389B40020000007357B84102489C4002000000FA7EB74118269E40
0200000035EFB641E8829F40010000003B706E41DB5C194102000000713D6B41
342E1B4102000000EA95684124D11D410200000077BE66416900214102000000
6DE76441832F24410200000013F263419FCD27410200000066F76341E17A2B41
01000000DFE063410389AF4103000000DFE063410389AF410000000068918041
28FE8F4101000000E336A341FDF677410100000029DCC541E1FA8F4101000000
29DCC541EEFCB74101000000E336A34185FCCB410100000068918041EEFCB741
010000006891804128FE8F41030000006891804128FE8F41}
Fill.Color = claWhite
Locked = True
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object RectangleSystem: TRectangle
Align = Top
Fill.Color = xFFDA6F36
Position.Y = 60.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path7: TPath
Align = Center
Data.Path = {
0001000000000000000060410000A0410200000075828A410000A04102000000
0000A04175828A41020000000000A04100006041020000000000A04116FB2A41
0200000075828A41000000410200000000006041000000410200000016FB2A41
00000041020000000000004116FB2A4102000000000000410000604102000000
0000004175828A410200000016FB2A410000A04102000000000060410000A041
03000000000060410000A0410000000000009041000060410200000000009041
3DAC8141020000003DAC81410000904102000000000060410000904102000000
87A73C410000904102000000000020413DAC8141020000000000204100006041
020000000000204187A73C410200000087A73C41000020410200000000006041
00002041020000003DAC814100002041020000000000904187A73C4102000000
000090410000604103000000000090410000604100000000000000005DFE4F41
01000000000000005DFE6F410200000000000000E5618441020000001618963F
75938E4102000000D4652B405DDC8F41020000008A93334067C4924102000000
F5D63C40DA9B95410200000008204740DF6098410200000061FD0740D9CEA141
02000000F0DC0B403BDFAF41020000000ABF524099BBB84101000000BAA09640
E10BC441020000004243B9406EB4CC410200000011C7EF40645DCD4102000000
71B80A415906C641020000009FAB11411AC0C741020000007DDC1841A245C941
02000000C44220410C93CA410200000095D422414F9ED64102000000B5373741
0000E0410200000022FD4F410000E0410100000022FD6F410000E04102000000
766084410000E041020000009D918E418A9FD6410200000057DB8F411895CA41
020000001D3893416666C94102000000C57E96416C09C841020000003DAC9941
D280C64102000000F30EA341CA54CD41020000007446B0411283CC4102000000
A5BDB841E10BC44101000000ED0DC44199BBB841020000001F85CC416744B041
02000000D656CD41E70CA341020000001283C64130AA9941020000000F0BC841
8B7D964102000000D567C941E9379341020000005396CA41F5DB8F4102000000
27A0D6419D918E41020000000000E041AA608441020000000000E0415DFE6F41
010000000000E0415DFE4F41020000000000E041643B37410200000027A0D641
E8D92241020000005396CA413945204102000000B448C94129DC184102000000
C4C2C741EBA81141020000006608C64187B30A4102000000CC5DCD4190BDEF40
02000000A2B4CC41813EB940020000007E0CC441309E96400100000036BCB841
CBB952400200000076E0AF411EDC0B40020000001AD1A141A1F8074002000000
54639841280F474002000000159D954127C23C400200000067C49241747B3340
0200000023DB8F41494B2B4002000000CB908E418FFC953F02000000D95F8441
000000000200000022FD6F41000000000100000022FD4F410000000002000000
EF383741000000000200000039D62241410E963F020000002D432041295C2B40
0200000082B919412E903440020000008A5913414F233F400200000000290D41
EFFE4A4002000000419FF44034D7074002000000F2CDBA40A96A0A4002000000
76A69640CBB952400100000058CA52401B9E964002000000357B0A40C1C5BA40
02000000C0E707402497F44002000000F90F4B40F2240D410200000012313F40
1F571341020000007C9B3440DAB8194102000000D4652B406744204102000000
1618963F39D6224102000000000000005839374102000000000000005DFE4F41
03000000000000005DFE4F410000000022FD7F41000040400200000022FD7F41
72A71C40020000005BD37841000000400200000022FD6F410000004001000000
22FD4F410000004002000000E9264741000000400200000022FD3F4172A71C40
0200000022FD3F41000040400100000022FD3F41FE7D58400200000022FD3F41
3EED764002000000029A3A4188688840020000005E4B334148A78C4002000000
13F22741533F934002000000A81D1D41CF499C40020000008EF51241AB78A740
02000000344B0C416CCFAE400200000073E803412046AD4002000000410EFD40
7B83A24001000000E128F140309E964002000000BDA9E440F71E8A4002000000
E466D040F71E8A4002000000ABE7C3401B9E96400100000076A6964065DFC340
020000003D278A40895ED040020000003D278A4077A1E4400200000076A69640
9B20F14001000000EB8BA2401006FD4002000000904EAD405AE4034102000000
DCD7AE401B470C41020000001B81A74076F1124102000000B1509C40091B1D41
0200000039459340D8F0274102000000EFAC8C40304C334102000000986E8840
3D9B3A4102000000DFF876405DFE3F4102000000A48858405DFE3F4101000000
000040405DFE3F410200000072A71C405DFE3F4102000000000000408D284741
02000000000000405DFE4F4101000000000000405DFE6F410200000000000040
95D478410200000072A71C405DFE7F4102000000000040405DFE7F4101000000
A48858405DFE7F4102000000DFF876405DFE7F4102000000836E8840F2B08241
02000000EFAC8C40455886410200000083DD9240DAAC8B4102000000A4369B40
74C69041020000009A77A5404D959541020000006E8BAC40CFE6984102000000
10E9AA40CE089D41020000000B46A04090B19F4101000000BAA09640091BA241
0200000096218A40C73AA5410200000096218A405E4BAA4102000000BAA09640
516BAD410100000004E2C34099BBB841020000002861D04057DBBB4102000000
16A4E44057DBBB41020000003A23F14099BBB8410100000081ECF84052C9B641
0200000062E701419710B44102000000A7680A41D7B4B34102000000C4191141
3D9BB541020000008CCA1B41A9A4B84102000000E63F2741E414BB4102000000
5E4B3341CAD4BC4102000000029A3A415AE4BD410200000022FD3F41F920C141
0200000022FD3F41CCEEC4410100000022FD3F410000C8410200000022FD3F41
1C6BCC4102000000E92647410000D0410200000022FD4F410000D04101000000
22FD6F410000D041020000005BD378410000D0410200000022FD7F411C6BCC41
0200000022FD7F410000C8410100000022FD7F416FF0C4410200000022FD7F41
6822C1410200000055B08241C9E5BD4102000000DC57864139D6BC4102000000
8E068C412130BB41020000007C729141F4ECB84102000000FD8796415C20B641
020000002FDD9941C14AB441020000008A0E9E410EADB4410200000048BFA041
CC5DB74101000000151DA24199BBB84102000000D33CA54157DBBB4102000000
9F4DAA4157DBBB41020000005D6DAD4199BBB84101000000A5BDB841516BAD41
0200000064DDBB415E4BAA410200000064DDBB41C73AA54102000000A5BDB841
091BA24101000000D95FB7413CBDA041020000001BAFB4417E0C9E4102000000
CD4CB44123DB9941020000009C22B641F085964102000000CCEEB8410D719141
020000009031BB4125068C4102000000A8D7BC41455886410200000038E7BD41
F2B0824102000000D723C1415DFE7F4102000000DEF1C4415DFE7F4101000000
0000C8415DFE7F41020000001C6BCC415DFE7F41020000000000D04195D47841
020000000000D0415DFE6F41010000000000D0415DFE4F41020000000000D041
8D284741020000001C6BCC415DFE3F41020000000000C8415DFE3F4101000000
DEF1C4415DFE3F4102000000D723C1415DFE3F410200000038E7BD413D9B3A41
02000000A8D7BC41304C334102000000C217BB41143F27410200000052A7B841
C3C71B41020000007E9DB5416C15114102000000E3B6B34150640A4102000000
D712B4410BE30141020000005ECBB641D2E3F8400100000036BCB8419B20F140
02000000F5DBBB4177A1E44002000000F5DBBB41895ED0400200000036BCB841
65DFC34001000000EE6BAD411B9E964002000000304CAA41F71E8A4002000000
643BA541F71E8A4002000000A61BA2411B9E964001000000D0B39F41473DA040
020000000F0B9D414CE0AA4002000000DCE89841BF82AC400200000059979541
EB6EA54002000000E3C790413D2C9B400200000043AD8B4120D2924002000000
DC57864123A18C400200000055B08241206388400200000022FD7F419CE17640
0200000022FD7F418F7058400100000022FD7F41000040400300000022FD7F41
00004040}
Fill.Color = claWhite
Locked = True
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object RectangleError: TRectangle
Align = Top
Fill.Color = xFFDD4848
Position.Y = 90.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path9: TPath
Align = Center
Data.Path = {
2000000000000000DD244E414A0C224002000000A69B48414E62F03F02000000
5A6437414E62F03F0200000023DB31414A0C2240010000008C6C074089419C41
020000006FB1ED3F3827A04102000000AEAE02400AFEA4410200000029DC2140
8510A7410200000091232B4066AEA74102000000B07D3540A700A84102000000
000040400000A841010000000000A8410000A84102000000D168AC415702A841
02000000CCFDAF412671A441020000002200B0415608A04102000000D500B041
ECB79E41020000007AAEAF418A6C9D41020000006210AF4196439C4101000000
DD244E414A0C224003000000DD244E414A0C2240000000000000504100009041
0100000000003041000090410100000000003041000080410100000000005041
0000804101000000000050410000904103000000000050410000904100000000
0000304100006041010000000000304100001041010000000000504100001041
0100000019045041000060410100000000003041000060410300000000003041
00006041}
Fill.Color = claWhite
Locked = True
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object RectangleFunc: TRectangle
Align = Top
Fill.Color = xFF48D8DD
Position.Y = 120.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path10: TPath
Align = Center
Data.Path = {
2300000000000000C3F59641B81E41410100000086EB4D41EC51AC4102000000
4EE44A41B0AEAE4102000000129C45412C14B04102000000010040410000B041
020000000D843E41EB1DB0410200000013013D41EB1DB0410200000020853B41
0000B04102000000B97534413BF9AE410200000024B52F4162ACAB4102000000
000030410000A84101000000000030410000704101000000713DDA4000007041
02000000CFE4B640AB007041020000005B3C9A4087AD614102000000053B9A40
3601504102000000903A9A4001F149410200000019AC9D40AB00444102000000
F628A44048E13E41010000007B143241A4701D4002000000E4C535412EC90340
02000000F3613D419238EF3F02000000E17A44410000004002000000468A4B41
2A36084002000000DB4A5041F19C224002000000000050410000404001000000
000050410000104101000000A47089410000104102000000CD46924154FF0F41
02000000EA70994178521E410200000040719941C9FE2F41020000005D719941
FF0E364102000000FB94984155FF3B4102000000C4F59641B81E414103000000
C3F59641B81E4141}
Fill.Color = claWhite
Locked = True
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object LayoutAudio: TLayout
Align = Left
Margins.Right = 14.000000000000000000
Position.X = 44.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 459.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
object RectangleAudio: TRectangle
Align = Top
Fill.Kind = None
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path3: TPath
Align = Center
Data.Path = {
19000000000000000000A0400000A84101000000000040400000A84101000000
0000404000003041010000000000A04000003041030000000000A0400000A841
00000000000030410000E04001000000000010410000E0400100000000001041
0000C84101000000000030410000C84103000000000030410000E04000000000
000088410000004001000000000070410000004001000000000070410000F041
01000000000088410000F041030000000000884100000040000000000000B841
00003041010000000000A84100003041010000000000A8410000A84101000000
0000B8410000A841030000000000B84100003041000000000000E8410000E040
010000000000D8410000E040010000000000D8410000C841010000000000E841
0000C841030000000000E8410000E040}
Fill.Color = xFFACACBE
Hint = 'Is audio'
HitTest = False
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object LayoutActions: TLayout
Align = MostRight
Margins.Left = 4.000000000000000000
Position.X = 599.000000000000000000
Size.Width = 46.000000000000000000
Size.Height = 489.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object ButtonCopy: TButton
Align = Top
Hint = 'Copy text'
Margins.Right = 16.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini_left'
TabOrder = 0
OnClick = ButtonCopyClick
object PathCopy: TPath
Align = Center
Data.Path = {
8E0000000000000077BE40422546B8420200000077BE4042717DA74202000000
3AB45A42777E9A420200000066E68042777E9A4202000000AF729442777E9A42
02000000D28DBC42440B9A4202000000D28DBC42440B9A4202000000D28DBC42
440B9A420200000026F1BB4263108C420200000026F1BB426991744202000000
26F1BB42190451420200000099D9CB425FBA38420200000007ECDE425FBA3842
020000007CFFF1425FBA3842020000003B3F2843FF543A42020000000CE22C43
FF543A4202000000DD843143FF543A4202000000AE4735434135414202000000
1C7A3A43140351420200000049AC3F43F3D26042020000006C87474385407B42
02000000436B4B43156E8642020000001A4F4F43E83B8F420200000074F35043
BF5F94420200000074F3504354A39B420200000074F350436DE7A24202000000
74F35043CDAC1A430200000018E45043B428234302000000FDD45043DDA42B43
02000000950349437FEA314302000000CAC13F433D0A324302000000FF7F3643
FB293243020000003B9F2243FB293243020000003B9F2243FB29324302000000
3B9F2243FB293243020000008716234361703843020000008716234361504143
020000008716234361304A430200000064FB1A43FF1F51430200000060C51143
B75E5143020000009D8F08436F9D5143020000006CA7934246E1504302000000
24C68142FF1F514302000000B9C95F42B75E514302000000E2A53F42BB544A43
02000000E2A53F42F7B3414302000000E2A53F42331339430200000075BE4042
540EC9420200000075BE40422346B8420300000077BE40422546B84200000000
0AD781427F2AC042010000006E127F429EEF3C430200000004F57E42731F3F43
0200000042FA82423FEB404302000000EE59874299F240430200000086628742
A8F24043020000001B6B8742AFF2404302000000B4738742B0F2404301000000
94A30D43022B414302000000FEC50F439B314143020000004B861143007C3F43
02000000E48C114396593D43020000000E8D1143F04B3D4302000000F08C1143
493E3D43020000008A8C1143A4303D4301000000BB5411434A4C344302000000
E84F114343333343020000002C6810435A53324302000000244F0F432E583243
02000000144D0F433758324302000000044B0F434358324302000000F5480F43
5258324302000000E6460F43615832430200000086D6F24229FC324302000000
3609DF4254A3324302000000633BCB423D4A32430200000026B1BD42BCD42B43
020000009CAFBD423B1F23430200000013AEBD42BA691A430200000025B1BD42
C2F5BB420200000025B1BD42C2F5BB42020000004BB2BD4253C3B94202000000
49EBBB4274FAB74202000000DCB8B9424EF9B7420200000018B5B9424CF9B742
0200000051B1B94250F9B742020000008EADB94258F9B742010000009AEF8942
5423B8420200000003818542442BB8420200000087E8814205BCBB4202000000
06D781427F2AC042030000000AD781427F2AC04200000000926D2B43CD4C7342
0200000013C3294300806D420200000079692843A4F06F420200000079692843
BBC9784201000000796928436DE79E420200000079692843B31DA14202000000
564E294302EBA24202000000B4682A4315EEA24201000000E9463F43CB21A342
02000000227B41436D27A3420200000002EB4143ECD1A04202000000C4404043
85EB9D4201000000916D2B43CC4C734203000000926D2B43CD4C734200000000
DEA4E34221B0764202000000F66DE142E9A5764202000000929EDF4202367A42
02000000A19ADF42D7A37E42010000001E5ADE4275F31F4302000000EA51DE42
129721430200000097F3E0428EEE224302000000D03AE442A8F2224302000000
7F41E442B0F22243020000002C48E442B3F2224302000000DB4EE442B0F22243
01000000A05A3D4312C3224302000000E3773E43BEC12243020000000F603F43
35DD214302000000E4653F4300C020430100000080AA404372A8C44202000000
FFB14043F780C242020000008AD83F43BFB5C04202000000CDC43E43C1A6C042
0200000072BF3E4376A6C0420200000018BA3E4358A6C04202000000BDB43E43
66A6C0420200000062AF3E4374A6C04202000000B5882443E7BBC04202000000
4AEC1F43E7BBC04202000000E04F1B43E7BBC04202000000546318433D4ABC42
02000000546318431EC5B3420200000054631843FF3FAB4202000000CD4C1843
14AE7F4202000000CD4C184314AE7F4202000000B74A18437B3D7B4202000000
1B651743ACA5774202000000F6481643A49B7742010000005AA4E3421FB07642
03000000DEA4E34221B07642}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
object ButtonActions: TButton
Align = Right
Margins.Right = -16.000000000000000000
Position.X = 30.000000000000000000
Size.Width = 16.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini_right'
TabOrder = 0
OnClick = ButtonActionsClick
object Path4: TPath
Align = Center
Data.Path = {
1B00000000000000CDCCC54233B33843010000006766C942CDCC3A4301000000
34B36C4366A6AB4302000000CE4C7143CC4CAE43020000003433784333F3AF43
0200000067E67F4333F3AF4302000000CDCC834333F3AF430200000000408743
0040AE4302000000CD8C894366A6AB43010000000080CD439A193B4301000000
66A6CE4300803843020000000080CF4300003643020000000000D04300003343
020000000000D043CDCC2F43020000000000D0439A19274302000000CD4CCC43
000020430200000033B3C743000020430100000033B3C7430000204301000000
3333E14200002043010000003333E1420000204302000000CDCCCE4200002043
020000000000C0429A192743020000000000C042CDCC2F43020000000000C042
9A193343020000003333C2423333364302000000CDCCC54233B3384303000000
CDCCC54233B33843}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 7.000000000000000000
Size.Height = 7.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
end
object LayoutCompact: TLayout
Align = Bottom
Position.X = 44.000000000000000000
Position.Y = 459.000000000000000000
Size.Width = 551.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
TabOrder = 4
object ButtonCopyCompact: TButton
Align = Right
Hint = 'Copy text/image urls'
Position.X = 491.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 3
OnClick = ButtonCopyClick
object Path5: TPath
Align = Center
Data.Path = {
8E0000000000000077BE40422546B8420200000077BE4042717DA74202000000
3AB45A42777E9A420200000066E68042777E9A4202000000AF729442777E9A42
02000000D28DBC42440B9A4202000000D28DBC42440B9A4202000000D28DBC42
440B9A420200000026F1BB4263108C420200000026F1BB426991744202000000
26F1BB42190451420200000099D9CB425FBA38420200000007ECDE425FBA3842
020000007CFFF1425FBA3842020000003B3F2843FF543A42020000000CE22C43
FF543A4202000000DD843143FF543A4202000000AE4735434135414202000000
1C7A3A43140351420200000049AC3F43F3D26042020000006C87474385407B42
02000000436B4B43156E8642020000001A4F4F43E83B8F420200000074F35043
BF5F94420200000074F3504354A39B420200000074F350436DE7A24202000000
74F35043CDAC1A430200000018E45043B428234302000000FDD45043DDA42B43
02000000950349437FEA314302000000CAC13F433D0A324302000000FF7F3643
FB293243020000003B9F2243FB293243020000003B9F2243FB29324302000000
3B9F2243FB293243020000008716234361703843020000008716234361504143
020000008716234361304A430200000064FB1A43FF1F51430200000060C51143
B75E5143020000009D8F08436F9D5143020000006CA7934246E1504302000000
24C68142FF1F514302000000B9C95F42B75E514302000000E2A53F42BB544A43
02000000E2A53F42F7B3414302000000E2A53F42331339430200000075BE4042
540EC9420200000075BE40422346B8420300000077BE40422546B84200000000
0AD781427F2AC042010000006E127F429EEF3C430200000004F57E42731F3F43
0200000042FA82423FEB404302000000EE59874299F240430200000086628742
A8F24043020000001B6B8742AFF2404302000000B4738742B0F2404301000000
94A30D43022B414302000000FEC50F439B314143020000004B861143007C3F43
02000000E48C114396593D43020000000E8D1143F04B3D4302000000F08C1143
493E3D43020000008A8C1143A4303D4301000000BB5411434A4C344302000000
E84F114343333343020000002C6810435A53324302000000244F0F432E583243
02000000144D0F433758324302000000044B0F434358324302000000F5480F43
5258324302000000E6460F43615832430200000086D6F24229FC324302000000
3609DF4254A3324302000000633BCB423D4A32430200000026B1BD42BCD42B43
020000009CAFBD423B1F23430200000013AEBD42BA691A430200000025B1BD42
C2F5BB420200000025B1BD42C2F5BB42020000004BB2BD4253C3B94202000000
49EBBB4274FAB74202000000DCB8B9424EF9B7420200000018B5B9424CF9B742
0200000051B1B94250F9B742020000008EADB94258F9B742010000009AEF8942
5423B8420200000003818542442BB8420200000087E8814205BCBB4202000000
06D781427F2AC042030000000AD781427F2AC04200000000926D2B43CD4C7342
0200000013C3294300806D420200000079692843A4F06F420200000079692843
BBC9784201000000796928436DE79E420200000079692843B31DA14202000000
564E294302EBA24202000000B4682A4315EEA24201000000E9463F43CB21A342
02000000227B41436D27A3420200000002EB4143ECD1A04202000000C4404043
85EB9D4201000000916D2B43CC4C734203000000926D2B43CD4C734200000000
DEA4E34221B0764202000000F66DE142E9A5764202000000929EDF4202367A42
02000000A19ADF42D7A37E42010000001E5ADE4275F31F4302000000EA51DE42
129721430200000097F3E0428EEE224302000000D03AE442A8F2224302000000
7F41E442B0F22243020000002C48E442B3F2224302000000DB4EE442B0F22243
01000000A05A3D4312C3224302000000E3773E43BEC12243020000000F603F43
35DD214302000000E4653F4300C020430100000080AA404372A8C44202000000
FFB14043F780C242020000008AD83F43BFB5C04202000000CDC43E43C1A6C042
0200000072BF3E4376A6C0420200000018BA3E4358A6C04202000000BDB43E43
66A6C0420200000062AF3E4374A6C04202000000B5882443E7BBC04202000000
4AEC1F43E7BBC04202000000E04F1B43E7BBC04202000000546318433D4ABC42
02000000546318431EC5B3420200000054631843FF3FAB4202000000CD4C1843
14AE7F4202000000CD4C184314AE7F4202000000B74A18437B3D7B4202000000
1B651743ACA5774202000000F6481643A49B7742010000005AA4E3421FB07642
03000000DEA4E34221B07642}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object RectangleAudioCompact: TRectangle
Align = Left
Fill.Kind = None
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 2.000000000000000000
YRadius = 2.000000000000000000
object Path6: TPath
Align = Center
Data.Path = {
19000000000000000000A0400000A84101000000000040400000A84101000000
0000404000003041010000000000A04000003041030000000000A0400000A841
00000000000030410000E04001000000000010410000E0400100000000001041
0000C84101000000000030410000C84103000000000030410000E04000000000
000088410000004001000000000070410000004001000000000070410000F041
01000000000088410000F041030000000000884100000040000000000000B841
00003041010000000000A84100003041010000000000A8410000A84101000000
0000B8410000A841030000000000B84100003041000000000000E8410000E040
010000000000D8410000E040010000000000D8410000C841010000000000E841
0000C841030000000000E8410000E040}
Fill.Color = xFFACACBE
Hint = 'Is audio'
HitTest = False
Size.Width = 20.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object ButtonDeleteCompact: TButton
Align = Right
Hint = 'Delete'
Position.X = 521.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 1
OnClick = ButtonDeleteClick
object Path8: TPath
Align = Center
Data.Path = {
6900000000000000000050410000000001000000000030410000000002000000
867D154100000000020000000000004133ECAB3F020000000000004100004040
01000000000000410000804001000000000000400000804002000000BC4EB93F
00008040020000000000803FAF538E40020000000000803F0000A04002000000
0000803F51ACB14002000000BA4EB93F0000C04002000000FFFFFF3F0000C040
01000000000040400000C04001000000000040400000A0410200000000004040
51ACB14102000000BC4E99400000C041020000000000E0400000C04101000000
000088410000C0410200000051AC99410000C041020000000000A84151ACB141
020000000000A8410000A041010000000000A8410000C040010000000000B041
0000C04002000000146BB4410000C040020000000000B84151ACB14002000000
0000B8410000A040020000000000B841AF538E4002000000146BB44100008040
020000000000B041000080400100000000008041000080400100000000008041
00004040020000000000804133ECAB3F020000007A826A410000000002000000
0000504100000000030000000000504100000000000000000000204100004040
02000000000020415DA71C4002000000D8292741FFFFFF3F0200000000003041
000000400100000000005041000000400200000029D658410000004002000000
000060415EA71C40020000000000604100004040010000000000604100008040
0100000000002041000080400300000000002041000040400000000000009841
0000A041020000000000984129D6A8410200000029D690410000B04102000000
000088410000B041010000000000E0400000B041020000005EA7BC400000B041
020000000000A04029D6A841020000000000A0400000A041010000000000A040
0000C04001000000000098410000C04003000000000098410000A04100000000
000040410000104102000000D7293741000010410200000000003041D7291741
0200000000003041000020410100000000003041000090410200000000003041
146B944102000000D72937410000984102000000000040410000984102000000
28D64841000098410200000000005041146B9441020000000000504100009041
0100000000005041000020410200000000005041D72917410200000029D64841
0000104102000000000040410000104103000000000040410000104100000000
00007041000090410200000000007041146B944102000000D729774100009841
02000000000080410000984102000000146B8441000098410200000000008841
146B944102000000000088410000904101000000000088410000204102000000
00008841D729174102000000146B844100001041020000000000804100001041
02000000D7297741000010410200000000007041D72917410200000000007041
0000204103000000000070410000904100000000000000410000104102000000
AF53EE4000001041020000000000E040D7291741020000000000E04000002041
010000000000E04000009041020000000000E040146B944102000000AF53EE40
000098410200000000000041000098410200000028D608410000984102000000
00001041146B9441020000000000104100009041010000000000104100002041
0200000000001041D72917410200000029D60841000010410200000000000041
00001041030000000000004100001041}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object ButtonEditCompact: TButton
Align = Right
Hint = 'Copy text'
Position.X = 461.000000000000000000
Size.Width = 30.000000000000000000
Size.Height = 30.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 2
OnClick = MenuItemEditClick
object Path11: TPath
Align = Center
Data.Path = {
1500000000000000000000003333634101000000000000000000904101000000
333373400000904101000000CDCC6C41CDCCDC40010000000000304166664640
0100000000000000333363410100000000000000333363410300000000000000
33336341000000009A998D410000804002000000CDCC90416666664002000000
CDCC904100004040020000009A998D416666264001000000666676419A99993E
0200000000007041CDCCCCBD0200000066666641CDCCCCBD0200000000006041
9A99993E0100000033334341666606400100000000008041CDCCBC4001000000
9A998D4100008040010000009A998D4100008040030000009A998D4100008040}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
end
end
object PopupMenuActions: TPopupMenu
Left = 528
Top = 48
object MenuItemDelete: TMenuItem
Text = 'Delete'
OnClick = ButtonDeleteClick
end
object MenuItemEdit: TMenuItem
Text = 'Edit'
OnClick = MenuItemEditClick
end
end
end
================================================
FILE: ChatGPT.FrameMessage.pas
================================================
unit ChatGPT.FrameMessage;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Memo.Types, FMX.Layouts, FMX.Controls.Presentation,
FMX.ScrollBox, FMX.Memo, System.Generics.Collections, FMX.BehaviorManager,
ChatGPT.FrameImage, ChatGPT.Classes, FMX.Menus, OpenAI.Chat, System.JSON;
{$SCOPEDENUMS ON}
type
TFrameMessage = class(TFrame)
RectangleBG: TRectangle;
LayoutInfo: TLayout;
RectangleUser: TRectangle;
Path1: TPath;
RectangleBot: TRectangle;
Path2: TPath;
LayoutContent: TLayout;
LayoutContentText: TLayout;
LayoutAudio: TLayout;
RectangleAudio: TRectangle;
Path3: TPath;
FlowLayoutImages: TFlowLayout;
LayoutClient: TLayout;
LayoutActions: TLayout;
ButtonCopy: TButton;
PathCopy: TPath;
LayoutCompact: TLayout;
ButtonCopyCompact: TButton;
Path5: TPath;
RectangleAudioCompact: TRectangle;
Path6: TPath;
ButtonActions: TButton;
Path4: TPath;
RectangleSystem: TRectangle;
Path7: TPath;
ButtonDeleteCompact: TButton;
Path8: TPath;
PopupMenuActions: TPopupMenu;
MenuItemDelete: TMenuItem;
MenuItemEdit: TMenuItem;
RectangleError: TRectangle;
Path9: TPath;
RectangleFunc: TRectangle;
Path10: TPath;
LayoutFunc: TLayout;
ButtonExecuteFunc: TButton;
LabelGPTFunc: TLabel;
AniIndicatorFunc: TAniIndicator;
LayoutFuncState: TLayout;
PathSuccess: TPath;
PathError: TPath;
PathWait: TPath;
ButtonEditCompact: TButton;
Path11: TPath;
procedure FrameResize(Sender: TObject);
procedure ButtonCopyClick(Sender: TObject);
procedure ButtonDeleteClick(Sender: TObject);
procedure ButtonActionsClick(Sender: TObject);
procedure ButtonExecuteFuncClick(Sender: TObject);
procedure MenuItemEditClick(Sender: TObject);
private
FText: string;
FIsError: Boolean;
FIsAudio: Boolean;
FImages: TArray;
FId: string;
FMode: TWindowMode;
FOnDelete: TNotifyEvent;
FMessageRole: TMessageKind;
FFuncName: string;
FFuncArgs: string;
FOnFuncExecute: TOnFuncExecute;
FFuncState: TMessageFuncState;
FOnTextUpdated: TOnTextUpdated;
procedure SetText(const Value: string);
procedure SetIsError(const Value: Boolean);
procedure ParseText(const Value: string);
procedure SetIsAudio(const Value: Boolean);
procedure BuildContent(Parts: TList);
procedure SetImages(const Value: TArray);
procedure SetId(const Value: string);
procedure FOnTextWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
procedure UpdateMode;
procedure CreateCodePart(Part: TPart);
procedure CreatePartText(Part: TPart);
procedure SetOnDelete(const Value: TNotifyEvent);
procedure UpdateMessageRole;
procedure SetMessageRole(const Value: TMessageKind);
procedure SetFuncArgs(const Value: string);
procedure SetFuncName(const Value: string);
procedure SetOnFuncExecute(const Value: TOnFuncExecute);
procedure AfterExecuteFunc(Result: Boolean; Error: string);
procedure SetFuncState(const Value: TMessageFuncState);
procedure UpdateBufferText(const Id, Text: string);
procedure SetOnTextUpdated(const Value: TOnTextUpdated);
public
procedure UpdateContentSize;
property Id: string read FId write SetId;
property Text: string read FText write SetText;
property Images: TArray read FImages write SetImages;
property IsAudio: Boolean read FIsAudio write SetIsAudio;
property IsError: Boolean read FIsError write SetIsError;
property MessageRole: TMessageKind read FMessageRole write SetMessageRole;
property FuncName: string read FFuncName write SetFuncName;
property FuncArgs: string read FFuncArgs write SetFuncArgs;
property FuncState: TMessageFuncState read FFuncState write SetFuncState;
procedure SetMode(const Value: TWindowMode);
procedure StartAnimate;
procedure ExecuteFunc;
constructor Create(AOwner: TComponent); override;
property OnDelete: TNotifyEvent read FOnDelete write SetOnDelete;
property OnFuncExecute: TOnFuncExecute read FOnFuncExecute write SetOnFuncExecute;
property OnTextUpdated: TOnTextUpdated read FOnTextUpdated write SetOnTextUpdated;
function ToJsonObject: TJSONObject;
end;
const
ColorError = $FFEF4444;
ColorUser = $FFECECF1;
ColorBot = $FFD1D5E3;
BGColorUser = $00FFFFFF;
BGColorBot = $14FFFFFF;
implementation
uses
System.Math, FMX.Platform, FMX.Memo.Style, FMX.Ani, ChatGPT.FrameCode,
ChatGPT.FrameSVG, ChatGPT.FramePlainText, ChatGPT.FrameUIMessage,
ChatGPT.TextEditor, ChatGPT.Manager;
{$R *.fmx}
procedure TFrameMessage.UpdateContentSize;
begin
//Flow
if FlowLayoutImages.Visible then
begin
var ItemW := Min(256, Max(Trunc(FlowLayoutImages.Width / FlowLayoutImages.ControlsCount), 48));
if ItemW = 48 then
ItemW := Trunc(FlowLayoutImages.Width / Trunc(FlowLayoutImages.Width / 48));
var FH: Single := 0;
for var Control in FlowLayoutImages.Controls do
begin
Control.Size.Size := TSizeF.Create(ItemW, ItemW);
FH := Max(Control.Position.Y + Control.Height, FH);
end;
if FlowLayoutImages.Height <> FH then
FlowLayoutImages.Height := FH;
end;
//Frames
var H := LayoutClient.Padding.Top + LayoutClient.Padding.Bottom;
for var Control in LayoutContentText.Controls do
if Control.Visible then
H := H + Control.Height + Control.Margins.Top + Control.Margins.Bottom;
if LayoutCompact.Visible then
H := Ceil(H + LayoutCompact.Height);
H := Max(H, 64);
if Height <> H then
Height := H;
end;
procedure TFrameMessage.UpdateMode;
begin
case FMode of
TWindowMode.Compact:
begin
LayoutCompact.Visible := True;
LayoutActions.Visible := False;
LayoutAudio.Visible := False;
end;
TWindowMode.Full:
begin
LayoutCompact.Visible := False;
LayoutAudio.Visible := FIsAudio;
LayoutActions.Visible := True;
end;
end;
end;
procedure TFrameMessage.AfterExecuteFunc(Result: Boolean; Error: string);
begin
LayoutFuncState.Hint := '';
LayoutFuncState.HitTest := False;
if Result then
FuncState := TMessageFuncState.Success
else
begin
FuncState := TMessageFuncState.Error;
LayoutFuncState.Hint := Error;
LayoutFuncState.HitTest := True;
end;
end;
procedure TFrameMessage.ExecuteFunc;
begin
if Assigned(FOnFuncExecute) then
begin
FuncState := TMessageFuncState.Executing;
FOnFuncExecute(Self, FFuncName, FFuncArgs, AfterExecuteFunc);
end;
end;
procedure TFrameMessage.ButtonExecuteFuncClick(Sender: TObject);
begin
ExecuteFunc;
end;
procedure TFrameMessage.ButtonActionsClick(Sender: TObject);
begin
PopupMenuActions.PopupComponent := ButtonActions;
var Pt := Application.MainForm.ClientToScreen(ButtonActions.AbsoluteRect.TopLeft);
PopupMenuActions.Popup(Pt.X, Pt.Y + ButtonActions.Height);
end;
procedure TFrameMessage.ButtonCopyClick(Sender: TObject);
begin
var ClipBoard: IFMXClipboardService;
if TPlatformServices.Current.SupportsPlatformService(IFMXClipboardService, ClipBoard) then
begin
if not Text.IsEmpty then
ClipBoard.SetClipboard(Text)
else if Length(Images) > 0 then
ClipBoard.SetClipboard(string.Join(','#13#10, Images))
else if not FFuncName.IsEmpty then
ClipBoard.SetClipboard(FFuncName + #13#10 + FFuncArgs);
ShowUIMessage('Coppied');
end
else
ShowUIMessage('Clipboard error');
end;
procedure TFrameMessage.ButtonDeleteClick(Sender: TObject);
begin
if Assigned(FOnDelete) then
FOnDelete(Self);
Release;
end;
constructor TFrameMessage.Create(AOwner: TComponent);
begin
inherited;
Name := '';
LayoutActions.Visible := False;
IsAudio := False;
FlowLayoutImages.Visible := False;
MenuItemEdit.Enabled := False;
ButtonEditCompact.Enabled := False;
LayoutFunc.Visible := False;
end;
procedure TFrameMessage.StartAnimate;
begin
LayoutClient.Margins.Top := 50;
LayoutClient.Opacity := 0;
TAnimator.AnimateFloat(LayoutClient, 'Margins.Top', 0);
TAnimator.AnimateFloat(LayoutClient, 'Opacity', 1);
end;
function TFrameMessage.ToJsonObject: TJSONObject;
begin
Result := TJSONObject.Create;
try
Result.AddPair('id', FId);
Result.AddPair('role', FMessageRole.ToString);
Result.AddPair('content', FText);
if Length(FImages) > 0 then
begin
var JImages := TJSONArray.Create;
for var Img in FImages do
JImages.Add(Img);
Result.AddPair('images', JImages);
end;
Result.AddPair('func_name', FFuncName);
Result.AddPair('func_args', FFuncArgs);
Result.AddPair('func_state', Ord(FFuncState));
except
//
end;
end;
procedure TFrameMessage.FOnTextWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
if ssTouch in Shift then
begin
if ParentControl.ParentControl is TCustomScrollBox then
TCustomScrollBox(ParentControl.ParentControl).ViewportPosition :=
TPointF.Create(TCustomScrollBox(ParentControl.ParentControl).ViewportPosition.X,
TCustomScrollBox(ParentControl.ParentControl).ViewportPosition.Y + WheelDelta);
end
else if ParentControl.ParentControl is TCustomScrollBox then
TCustomScrollBox(ParentControl.ParentControl).AniCalculations.MouseWheel(0, -WheelDelta);
end;
procedure TFrameMessage.FrameResize(Sender: TObject);
begin
LayoutContent.Width := Min(Width - (LayoutClient.Padding.Left + LayoutClient.Padding.Right), MaxMessageWidth);
UpdateContentSize;
end;
procedure TFrameMessage.UpdateBufferText(const Id, Text: string);
begin
if Assigned(FOnTextUpdated) then
FOnTextUpdated(Self, Id, Text);
end;
procedure TFrameMessage.MenuItemEditClick(Sender: TObject);
begin
Manager.OverlayContainer.BringToFront;
TFrameTextEditor.Execute(Manager.OverlayContainer,
procedure(Frame: TFrameTextEditor)
begin
Frame.LabelCaption.Text := 'Message edit';
Frame.MemoText.Text := Text;
end,
procedure(Frame: TFrameTextEditor; Success: Boolean)
begin
if Success then
begin
Text := Frame.MemoText.Text;
UpdateBufferText(Id, Text);
end;
end);
end;
procedure TFrameMessage.SetFuncArgs(const Value: string);
begin
FFuncArgs := Value;
LabelGPTFunc.Hint := 'Arsg: '#13#10 + Value;
end;
procedure TFrameMessage.SetFuncName(const Value: string);
begin
FFuncName := Value;
LayoutFunc.Visible := not FFuncName.IsEmpty;
LabelGPTFunc.Text := Value;
end;
procedure TFrameMessage.SetFuncState(const Value: TMessageFuncState);
begin
FFuncState := Value;
AniIndicatorFunc.Visible := Value = TMessageFuncState.Executing;
AniIndicatorFunc.Enabled := AniIndicatorFunc.Visible;
ButtonExecuteFunc.Enabled := Value in [TMessageFuncState.Error, TMessageFuncState.Wait];
PathSuccess.Visible := Value = TMessageFuncState.Success;
PathError.Visible := Value = TMessageFuncState.Error;
PathWait.Visible := Value = TMessageFuncState.Wait;
end;
procedure TFrameMessage.SetId(const Value: string);
begin
FId := Value;
end;
procedure TFrameMessage.SetImages(const Value: TArray);
begin
FImages := Value;
FlowLayoutImages.BeginUpdate;
try
while FlowLayoutImages.ControlsCount > 0 do
FlowLayoutImages.Controls[0].Free;
for var Item in FImages do
begin
var Frame := TFrameImage.Create(FlowLayoutImages);
Frame.Parent := FlowLayoutImages;
Frame.Image := Item;
end;
finally
FlowLayoutImages.EndUpdate;
end;
FlowLayoutImages.Visible := FlowLayoutImages.ControlsCount > 0;
UpdateContentSize;
end;
procedure TFrameMessage.SetIsAudio(const Value: Boolean);
begin
FIsAudio := Value;
LayoutAudio.Visible := FIsAudio;
RectangleAudioCompact.Visible := FIsAudio;
end;
procedure TFrameMessage.SetIsError(const Value: Boolean);
begin
FIsError := Value;
for var Control in LayoutContentText.Controls do
if Control is TFrameText then
TFrameText(Control).MemoText.FontColor := $FFEF4444;
UpdateMessageRole;
end;
procedure TFrameMessage.SetMessageRole(const Value: TMessageKind);
begin
FMessageRole := Value;
UpdateMessageRole;
end;
procedure TFrameMessage.SetMode(const Value: TWindowMode);
begin
FMode := Value;
UpdateMode;
end;
procedure TFrameMessage.SetOnDelete(const Value: TNotifyEvent);
begin
FOnDelete := Value;
end;
procedure TFrameMessage.SetOnFuncExecute(const Value: TOnFuncExecute);
begin
FOnFuncExecute := Value;
end;
procedure TFrameMessage.SetOnTextUpdated(const Value: TOnTextUpdated);
begin
FOnTextUpdated := Value;
end;
procedure TFrameMessage.ParseText(const Value: string);
function CreatePart(AType: TPartType; AContent: string): TPart;
begin
Result.PartType := AType;
if (AType = TPartType.Code) and (not (AContent.StartsWith(#13) or AContent.StartsWith(' '))) then
begin
var Len := AContent.IndexOfAny([#13, #10, ' ']);
if Len >= 0 then
begin
Result.Language := AContent.Substring(0, Len);
Result.Content := AContent.Remove(0, Len).Trim([#13, #10, ' ']);
end
else
Result.Content := AContent.Trim([#13, #10, ' ']);
end
else
Result.Content := AContent.Trim([#13, #10, ' ']);
end;
var
Parts: TList;
CodePairs: Integer;
IsCodeParse: Boolean;
Buf: string;
begin
try
if Value.IsEmpty then
Exit;
Parts := TList.Create;
try
if Value.StartsWith('{') then
try
var JSON := TJSONObject.ParseJSONValue(Value);
if Assigned(JSON) then
try
var Part: TPart;
Part.PartType := TPartType.Code;
Part.Content := Value;
Part.Language := 'json';
Parts.Add(Part);
Exit;
finally
JSON.Free;
end;
except
//
end;
CodePairs := 0;
Buf := '';
IsCodeParse := False;
for var i := 1 to Value.Length do
begin
if Value[i] = '`' then
begin
Inc(CodePairs);
Buf := Buf + Value[i];
if CodePairs = 3 then
begin
if IsCodeParse then
begin
if not Buf.Trim([' ', '`']).IsEmpty then
Parts.Add(CreatePart(TPartType.Code, Buf.Trim(['`'])));
IsCodeParse := False;
end
else
begin
if not Buf.Trim([' ', '`']).IsEmpty then
Parts.Add(CreatePart(TPartType.Text, Buf.Trim([' ', '`'])));
IsCodeParse := True;
end;
CodePairs := 0;
Buf := '';
end;
end
else
begin
CodePairs := 0;
Buf := Buf + Value[i];
end;
end;
if IsCodeParse then
begin
if not Buf.Trim([' ', '`']).IsEmpty then
Parts.Add(CreatePart(TPartType.Code, Buf.Trim(['`'])));
end
else
begin
if not Buf.Trim([' ']).IsEmpty then
Parts.Add(CreatePart(TPartType.Text, Buf));
end;
finally
BuildContent(Parts);
Parts.Free;
end;
finally
UpdateContentSize;
end;
end;
procedure TFrameMessage.CreateCodePart(Part: TPart);
begin
var Frame := TFrameCode.Create(LayoutContentText);
Frame.Parent := LayoutContentText;
Frame.Fill(Part);
Frame.Align := TAlignLayout.None;
Frame.Position.Y := 10000;
Frame.Align := TAlignLayout.Top;
Frame.OnWheel := FOnTextWheel;
end;
procedure TFrameMessage.UpdateMessageRole;
begin
RectangleUser.Visible := FMessageRole = TMessageKind.User;
RectangleBot.Visible := FMessageRole = TMessageKind.Assistant;
RectangleSystem.Visible := FMessageRole = TMessageKind.System;
RectangleError.Visible := FMessageRole = TMessageKind.Error;
RectangleFunc.Visible := FMessageRole = TMessageKind.Func;
if FMessageRole = TMessageKind.Assistant then
RectangleBG.Fill.Color := BGColorBot
else
RectangleBG.Fill.Color := BGColorUser;
end;
procedure TFrameMessage.CreatePartText(Part: TPart);
begin
var Frame := TFrameText.Create(LayoutContentText);
Frame.Parent := LayoutContentText;
Frame.Fill(Part);
Frame.Align := TAlignLayout.None;
Frame.Position.Y := 10000;
Frame.Align := TAlignLayout.Top;
Frame.OnWheel := FOnTextWheel;
if IsError then
Frame.MemoText.FontColor := ColorError
else if FMessageRole = TMessageKind.Assistant then
Frame.MemoText.FontColor := ColorBot
else
Frame.MemoText.FontColor := ColorUser;
end;
procedure TFrameMessage.BuildContent(Parts: TList);
begin
LayoutContentText.BeginUpdate;
try
FlowLayoutImages.Parent := nil;
LayoutFunc.Parent := nil;
while LayoutContentText.ControlsCount > 0 do
LayoutContentText.Controls[0].Free;
FlowLayoutImages.Parent := LayoutContentText;
LayoutFunc.Parent := LayoutContentText;
for var Part in Parts do
begin
//SVG check
var PosS := Part.Content.IndexOf('');
if PosE >= 0 then
begin
var SvgText := Part.Content.Substring(PosS, PosE - PosS + 6);
if not SvgText.IsEmpty then
try
var Frame := TFrameSVG.Create(LayoutContentText, SvgText);
Frame.Parent := LayoutContentText;
Frame.Align := TAlignLayout.None;
Frame.Position.Y := 10000;
Frame.Align := TAlignLayout.Top;
except
// not insert
end;
end;
end;
// Code
if Part.PartType = TPartType.Code then
begin
CreateCodePart(Part);
Continue;
end;
// Text
if Part.PartType = TPartType.Text then
begin
CreatePartText(Part);
Continue;
end;
end;
finally
LayoutContentText.EndUpdate;
end;
end;
procedure TFrameMessage.SetText(const Value: string);
begin
FText := Value.Trim([' ', #13, #10]);
MenuItemEdit.Enabled := not FText.IsEmpty;
ButtonEditCompact.Enabled := not FText.IsEmpty;
UpdateMode;
ParseText(FText);
end;
end.
================================================
FILE: ChatGPT.FramePlainText.fmx
================================================
object FrameText: TFrameText
Size.Width = 575.000000000000000000
Size.Height = 387.000000000000000000
Size.PlatformDefault = False
OnResize = FrameResize
OnResized = FrameResize
object MemoText: TMemo
Touch.InteractiveGestures = [Pan, LongTap, DoubleTap]
Caret.Color = x00FFFFFF
DataDetectorTypes = []
DisableMouseWheel = True
Lines.Strings = (
'begin'
''
'end.')
ReadOnly = True
ShowScrollBars = False
StyledSettings = [Style]
TextSettings.Font.Family = 'Segoe UI, Roboto'
TextSettings.Font.Size = 16.000000000000000000
TextSettings.FontColor = xFFECECF1
TextSettings.WordWrap = True
Align = Client
CanParentFocus = True
Cursor = crDefault
DisableFocusEffect = True
EnableDragHighlight = False
Size.Width = 575.000000000000000000
Size.Height = 387.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'memostyle_clear'
TabOrder = 0
OnApplyStyleLookup = MemoTextApplyStyleLookup
OnMouseWheel = MemoTextMouseWheel
OnPresentationNameChoosing = MemoTextPresentationNameChoosing
Viewport.Width = 565.000000000000000000
Viewport.Height = 387.000000000000000000
end
end
================================================
FILE: ChatGPT.FramePlainText.pas
================================================
unit ChatGPT.FramePlainText;
interface
{$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)}
{$DEFINE MOBILE}
{$ENDIF}
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Objects, FMX.Memo.Types, FMX.Controls.Presentation, FMX.ScrollBox,
FMX.Memo, FMX.Layouts, FMX.Memo.Style, ChatGPT.Classes, FMX.TextLayout,
ChatGPT.Code, FMX.RichEdit.Style;
type
TFrameText = class(TFrame)
MemoText: TMemo;
procedure FrameResize(Sender: TObject);
procedure MemoTextMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
procedure MemoTextPresentationNameChoosing(Sender: TObject; var PresenterName: string);
procedure MemoTextApplyStyleLookup(Sender: TObject);
private
FOnWheel: TMouseWheelEvent;
FStyledMemo: TRichEditStyled;
procedure SetOnWheel(const Value: TMouseWheelEvent);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetContentHeight: Single;
procedure Fill(Data: TPart);
property OnWheel: TMouseWheelEvent read FOnWheel write SetOnWheel;
end;
implementation
uses
System.Math, System.Net.URLClient;
{$R *.fmx}
{ TFrameText }
constructor TFrameText.Create(AOwner: TComponent);
begin
inherited;
Name := '';
MemoText.DisableDisappear := True;
{$IFDEF MOBILE}
MemoText.HitTest := False;
{$ENDIF}
MemoText.TextSettings.VertAlign := TTextAlign.Center;
MemoText.TextSettings.WordWrap := True;
end;
destructor TFrameText.Destroy;
begin
inherited;
end;
procedure TFrameText.Fill(Data: TPart);
begin
FStyledMemo := (MemoText.Presentation as TRichEditStyled);
MemoText.ApplyStyleLookup;
MemoText.Text := Data.Content;
FrameResize(nil);
end;
procedure TFrameText.FrameResize(Sender: TObject);
begin
var H := GetContentHeight;
if H <> Height then
Height := H;
end;
function TFrameText.GetContentHeight: Single;
begin
if Assigned(FStyledMemo) then
FStyledMemo.RecalcSize;
var ContentH := MemoText.ContentBounds.Height;
if (ContentH + 5) < 30 then
MemoText.Margins.Top := 25 - ContentH
else
MemoText.Margins.Top := 0;
Result := Max(ContentH + 5, 30) +
MemoText.Margins.Top +
MemoText.Margins.Bottom;
end;
procedure TFrameText.MemoTextApplyStyleLookup(Sender: TObject);
begin
FStyledMemo.SetCodeSyntaxName('md', MemoText.Font, MemoText.FontColor);
FStyledMemo.SelectedTextColor := TAlphaColorRec.White;
FStyledMemo.RoundedSelection := True;
FStyledMemo.UseSelectedTextColor := True;
FrameResize(nil);
end;
procedure TFrameText.MemoTextMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
begin
if (MemoText.SelLength > 0) and (Root.Captured = IControl(FStyledMemo)) then
begin
Handled := True;
if Assigned(FOnWheel) then
FOnWheel(Sender, Shift, WheelDelta, Handled);
end;
end;
procedure TFrameText.MemoTextPresentationNameChoosing(Sender: TObject; var PresenterName: string);
begin
PresenterName := 'RichEditStyled';
end;
procedure TFrameText.SetOnWheel(const Value: TMouseWheelEvent);
begin
FOnWheel := Value;
end;
end.
================================================
FILE: ChatGPT.FrameSVG.fmx
================================================
object FrameSVG: TFrameSVG
Size.Width = 654.000000000000000000
Size.Height = 150.000000000000000000
Size.PlatformDefault = False
object SvgImage: TSkSvg
Align = Left
Size.Width = 150.000000000000000000
Size.Height = 150.000000000000000000
Size.PlatformDefault = False
end
end
================================================
FILE: ChatGPT.FrameSVG.pas
================================================
unit ChatGPT.FrameSVG;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
System.Skia, FMX.Skia;
type
TFrameSVG = class(TFrame)
SvgImage: TSkSvg;
private
{ Private declarations }
public
constructor Create(AOwner: TComponent; SvgData: string); reintroduce;
end;
implementation
{$R *.fmx}
{ TFrameSVG }
constructor TFrameSVG.Create(AOwner: TComponent; SvgData: string);
begin
inherited Create(AOwner);
Name := '';
SvgImage.Svg.Source := SvgData;
end;
end.
================================================
FILE: ChatGPT.FrameUIMessage.fmx
================================================
object FrameUIMessage: TFrameUIMessage
Align = Contents
HitTest = False
Size.Width = 754.000000000000000000
Size.Height = 460.000000000000000000
Size.PlatformDefault = False
object LayoutContent: TLayout
Align = Bottom
Position.Y = 376.000000000000000000
Size.Width = 754.000000000000000000
Size.Height = 84.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object RectangleBG: TRectangle
Align = Center
Fill.Color = xA0000000
Size.Width = 101.000000000000000000
Size.Height = 34.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
object LabelText: TLabel
Align = Center
AutoSize = True
StyledSettings = [Family, Style]
Size.Width = 57.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Size = 15.000000000000000000
TextSettings.FontColor = claWhite
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'Coppied'
TabOrder = 0
OnResize = LabelTextResize
OnResized = LabelTextResize
end
end
end
object TimerClose: TTimer
Interval = 3000
OnTimer = TimerCloseTimer
Left = 280
Top = 176
end
end
================================================
FILE: ChatGPT.FrameUIMessage.pas
================================================
unit ChatGPT.FrameUIMessage;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Layouts, FMX.Objects, FMX.Controls.Presentation;
type
TFrameUIMessage = class(TFrame)
LayoutContent: TLayout;
RectangleBG: TRectangle;
LabelText: TLabel;
TimerClose: TTimer;
procedure LabelTextResize(Sender: TObject);
procedure TimerCloseTimer(Sender: TObject);
private
{ Private declarations }
public
constructor Create(AOwner: TComponent); override;
end;
procedure ShowUIMessage(const Text: string);
implementation
{$R *.fmx}
procedure ShowUIMessage(const Text: string);
begin
with TFrameUIMessage.Create(Application) do
begin
LabelText.Text := Text;
Align := TAlignLayout.Client;
Parent := Application.MainForm;
BringToFront;
end;
end;
constructor TFrameUIMessage.Create(AOwner: TComponent);
begin
inherited;
Name := '';
end;
procedure TFrameUIMessage.LabelTextResize(Sender: TObject);
begin
RectangleBG.Width := LabelText.Width + 20;
end;
procedure TFrameUIMessage.TimerCloseTimer(Sender: TObject);
begin
Release;
end;
end.
================================================
FILE: ChatGPT.Functions.External.Intf.pas
================================================
unit ChatGPT.Functions.external.Intf;
interface
type
IChatFunctionExternal = interface
['{B2DACD74-B773-44C2-838D-43BF99CB5405}']
function GetDescription: WideString; //Example: 'Get the current weather in a given location'
function GetName: WideString; //Example: 'get_current_weather'
function GetParameters: WideString; //JSON Scheme
function Execute(const Args: WideString): WideString; //Args - json with params, result - json with info
end;
implementation
end.
================================================
FILE: ChatGPT.Functions.External.pas
================================================
unit ChatGPT.Functions.external;
interface
uses
System.Classes, OpenAI.Chat.Functions, ChatGPT.Functions.external.Intf;
type
TChatFunctionExternal = class(TChatFunction, IChatFunction)
private
FFuncRef: IChatFunctionExternal;
protected
function GetDescription: string; override;
function GetName: string; override;
function GetParameters: string; override;
public
constructor Create(const Func: IChatFunctionExternal); reintroduce;
destructor Destroy; override;
function Execute(const Args: string): string; override;
end;
implementation
{ TChatFunctionExternal }
constructor TChatFunctionExternal.Create(const Func: IChatFunctionExternal);
begin
inherited Create;
FFuncRef := Func;
end;
destructor TChatFunctionExternal.Destroy;
begin
FFuncRef := nil;
inherited;
end;
function TChatFunctionExternal.Execute(const Args: string): string;
begin
Result := FFuncRef.Execute(Args);
end;
function TChatFunctionExternal.GetDescription: string;
begin
Result := FFuncRef.GetDescription;
end;
function TChatFunctionExternal.GetName: string;
begin
Result := FFuncRef.GetName;
end;
function TChatFunctionExternal.GetParameters: string;
begin
Result := FFuncRef.GetParameters;
end;
end.
================================================
FILE: ChatGPT.Functions.pas
================================================
unit ChatGPT.Functions;
interface
uses
{$IFDEF MSWINDOWS}
Winapi.Windows,
{$ENDIF}
System.SysUtils, System.Generics.Collections, OpenAI.Chat.Functions,
ChatGPT.Functions.external, ChatGPT.Functions.external.Intf;
const
LibExtMask = {$IFDEF MSWINDOWS} '*.dll'; {$ENDIF}
{$IFDEF LINUX} '*.so'; {$ENDIF}
{$IF DEFINED(MACOS) OR
DEFINED(IOS) OR
DEFINED(IOS64)} '*.o'; {$ENDIF}
{$IFDEF ANDROID} '*.so'; {$ENDIF}
type
TGPTFunctionsFunc = function: TArray;
function LoadExternalFunctions: TArray;
var
FLoadedLibs: TList;
implementation
uses
System.IOUtils;
function LoadExternalFunctions: TArray;
begin
if TDirectory.Exists('funcs') then
begin
for var Lib in TDirectory.GetFiles('funcs', LibExtMask) do
try
var LibHandle := LoadLibrary(PChar(Lib));
try
var Func: TGPTFunctionsFunc := GetProcAddress(LibHandle, 'gptfunctions');
if @Func <> nil then
begin
for var Item in Func() do
begin
SetLength(Result, Length(Result) + 1);
Result[Length(Result) - 1] := TChatFunctionExternal.Create(Item);
end;
FLoadedLibs.Add(LibHandle);
end;
except
FreeLibrary(LibHandle);
end;
except
//
end;
end;
end;
initialization
FLoadedLibs := TList.Create;
finalization
for var Lib in FLoadedLibs do
FreeLibrary(Lib);
FLoadedLibs.Free;
end.
================================================
FILE: ChatGPT.ImportExport.fmx
================================================
inherited FrameImportExport: TFrameImportExport
Size.Width = 772.000000000000000000
Size.Height = 703.000000000000000000
OnResize = FrameResize
OnResized = FrameResize
inherited RectangleBG: TRectangle
Size.Width = 772.000000000000000000
Size.Height = 703.000000000000000000
OnClick = RectangleBGClick
end
object LayoutClient: TLayout
Align = Center
Padding.Left = 10.000000000000000000
Padding.Top = 10.000000000000000000
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
Size.Width = 440.000000000000000000
Size.Height = 589.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object RectangleFrame: TRectangle
Align = Contents
Fill.Color = xFF202123
Locked = True
Size.Width = 440.000000000000000000
Size.Height = 589.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
end
object LayoutActions: TLayout
Align = Bottom
Position.X = 10.000000000000000000
Position.Y = 533.000000000000000000
Size.Width = 420.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object ButtonOk: TButton
Align = Right
Position.X = 260.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 0
Text = 'OK'
TextSettings.Trimming = None
OnClick = ButtonOkClick
end
object ButtonCancel: TButton
Align = Right
Cancel = True
Position.X = 340.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 1
Text = 'CANCEL'
TextSettings.Trimming = None
OnClick = ButtonCancelClick
end
end
object LabelCaption: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Position.X = 10.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 420.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 16.000000000000000000
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'Import && Export'
TabOrder = 44
end
object VertScrollBox: TVertScrollBox
Align = Client
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
Margins.Right = -10.000000000000000000
Size.Width = 430.000000000000000000
Size.Height = 493.000000000000000000
Size.PlatformDefault = False
TabOrder = 21
Viewport.Width = 430.000000000000000000
Viewport.Height = 493.000000000000000000
object Layout1: TLayout
Align = Top
Margins.Left = 10.000000000000000000
Margins.Top = 20.000000000000000000
Margins.Right = 10.000000000000000000
Margins.Bottom = 20.000000000000000000
Position.X = 10.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 400.000000000000000000
Size.Height = 456.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object RadioButtonImport: TRadioButton
Align = Top
StyledSettings = [Family, Style, FontColor]
Margins.Top = 10.000000000000000000
Position.Y = 163.000000000000000000
Size.Width = 400.000000000000000000
Size.Height = 19.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'radiobuttonstyle_md'
TabOrder = 2
Text = 'Import'
TextSettings.Font.Size = 14.000000000000000000
OnChange = RadioButtonExportChange
end
object RadioButtonExport: TRadioButton
Align = Top
StyledSettings = [Family, Style, FontColor]
IsChecked = True
Margins.Top = 10.000000000000000000
Position.Y = 10.000000000000000000
Size.Width = 400.000000000000000000
Size.Height = 19.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'radiobuttonstyle_md'
TabOrder = 0
Text = 'Export'
TextSettings.Font.Size = 14.000000000000000000
OnChange = RadioButtonExportChange
end
object LayoutExport: TLayout
Align = Top
Margins.Left = 10.000000000000000000
Margins.Right = 10.000000000000000000
Position.X = 10.000000000000000000
Position.Y = 29.000000000000000000
Size.Width = 380.000000000000000000
Size.Height = 124.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object Label17: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 90.000000000000000000
Size.Width = 370.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text = '*.txt, *.json'
TabOrder = 8
TabStop = False
end
object EditExport: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Top
StyleLookup = 'editstyle_clear'
TabOrder = 0
Position.Y = 47.000000000000000000
Margins.Top = 5.000000000000000000
Size.Width = 380.000000000000000000
Size.Height = 33.000000000000000000
Size.PlatformDefault = False
object ClearEditButtonExport: TClearEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
Hint = 'Clear'
Position.X = 28.000000000000000000
Size.Width = 28.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 1
Text = 'buttonstyle_clearmini'
object Path2: TPath
Align = Center
Data.Path = {
0E00000000000000000060413333B33F010000009A9949410000000001000000
0000E0403333B340010000003333B33F0000000001000000000000003333B33F
010000003333B3400000E04001000000000000009A994941010000003333B33F
00006041010000000000E04066660641010000009A9949410000604101000000
000060419A99494101000000666606410000E04001000000000060413333B33F
03000000000060413333B33F}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object EditButtonExportFile: TEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
Size.Width = 28.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'editbuttonstyle'
TabOrder = 0
Text = 'editbuttonstyle'
OnClick = EditButtonExportFileClick
object Path1: TPath
Align = Center
Data.Path = {
2F0000000000000066260F446626874301000000CC4CEE436626E74302000000
9A99EB439A99EC4302000000CD0CE6430000F04302000000CD8CDF430000F043
01000000000080420000F043020000003433E5410000F0430200000000000000
85ABE14302000000000000000000D04301000000000000000000C04202000000
00000000D7A37242020000003333E54100000042020000000000804200000042
0100000000803543000000420200000052784643000000420200000000C05643
CFF71A42020000008FC2624300004B420100000033F389430000C04201000000
0000D0430000C04202000000CDACE1430000C042020000000000F043EC51F942
020000000000F04300002043010000000000F04300004043010000000000D843
00004043010000000000D84300002043020000000000D8430E2D174302000000
3769D44300001043020000000000D04300001043010000000000804300001043
01000000CDCC40434861A94202000000CDCC3D43EC51A34202000000CDCC3943
0000A04202000000008035430000A04201000000000080420000A04202000000
52B85C420000A0420200000000004042295CAE4202000000000040420000C042
01000000000040420000C04301000000EC51EE4233B37143020000003333F942
CDCC66430200000033B307430000604302000000CDCC13430000604301000000
000008440000604302000000CDEC0D440000604302000000CDCC114400007943
0200000066260F44662687430300000066260F4466268743}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object Label9: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 380.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text = 'File name'
TabOrder = 30
TabStop = False
end
end
object LayoutImport: TLayout
Align = Top
Margins.Left = 10.000000000000000000
Margins.Right = 10.000000000000000000
Position.X = 10.000000000000000000
Position.Y = 182.000000000000000000
Size.Width = 380.000000000000000000
Size.Height = 147.000000000000000000
Size.PlatformDefault = False
TabOrder = 3
object Label1: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 90.000000000000000000
Size.Width = 370.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text = '*.json'
TabOrder = 8
TabStop = False
end
object EditImport: TEdit
Touch.InteractiveGestures = [LongTap, DoubleTap]
Align = Top
StyleLookup = 'editstyle_clear'
TabOrder = 0
Position.Y = 47.000000000000000000
Margins.Top = 5.000000000000000000
Size.Width = 380.000000000000000000
Size.Height = 33.000000000000000000
Size.PlatformDefault = False
object ClearEditButtonImport: TClearEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
Hint = 'Clear'
Position.X = 28.000000000000000000
Size.Width = 28.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_clearmini'
TabOrder = 1
Text = 'buttonstyle_clearmini'
object Path3: TPath
Align = Center
Data.Path = {
0E00000000000000000060413333B33F010000009A9949410000000001000000
0000E0403333B340010000003333B33F0000000001000000000000003333B33F
010000003333B3400000E04001000000000000009A994941010000003333B33F
00006041010000000000E04066660641010000009A9949410000604101000000
000060419A99494101000000666606410000E04001000000000060413333B33F
03000000000060413333B33F}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
object EditButtonImportFile: TEditButton
Touch.InteractiveGestures = [LongTap]
CanFocus = False
Cursor = crArrow
TextSettings.Trimming = None
Size.Width = 28.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'editbuttonstyle'
TabOrder = 0
Text = 'editbuttonstyle'
OnClick = EditButtonImportFileClick
object Path4: TPath
Align = Center
Data.Path = {
2F0000000000000066260F446626874301000000CC4CEE436626E74302000000
9A99EB439A99EC4302000000CD0CE6430000F04302000000CD8CDF430000F043
01000000000080420000F043020000003433E5410000F0430200000000000000
85ABE14302000000000000000000D04301000000000000000000C04202000000
00000000D7A37242020000003333E54100000042020000000000804200000042
0100000000803543000000420200000052784643000000420200000000C05643
CFF71A42020000008FC2624300004B420100000033F389430000C04201000000
0000D0430000C04202000000CDACE1430000C042020000000000F043EC51F942
020000000000F04300002043010000000000F04300004043010000000000D843
00004043010000000000D84300002043020000000000D8430E2D174302000000
3769D44300001043020000000000D04300001043010000000000804300001043
01000000CDCC40434861A94202000000CDCC3D43EC51A34202000000CDCC3943
0000A04202000000008035430000A04201000000000080420000A04202000000
52B85C420000A0420200000000004042295CAE4202000000000040420000C042
01000000000040420000C04301000000EC51EE4233B37143020000003333F942
CDCC66430200000033B307430000604302000000CDCC13430000604301000000
000008440000604302000000CDEC0D440000604302000000CDCC114400007943
0200000066260F44662687430300000066260F4466268743}
Fill.Color = xFFACACBE
Locked = True
HitTest = False
Margins.Left = 2.000000000000000000
Size.Width = 13.000000000000000000
Size.Height = 13.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
WrapMode = Fit
end
end
end
object Label2: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 20.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 380.000000000000000000
Size.Height = 17.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.FontColor = xB4FFFFFF
Text = 'File name'
TabOrder = 29
TabStop = False
end
object Label3: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 10.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 5.000000000000000000
Position.Y = 120.000000000000000000
Size.Width = 370.000000000000000000
Size.Height = 15.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'The current chat data will not be deleted, but will be supplemen' +
'ted'
TabOrder = 10
TabStop = False
end
end
end
end
end
object SaveDialogExport: TSaveDialog
DefaultExt = '.json'
Filter = 'JSON|*.json|Text|*.txt'
Left = 664
Top = 176
end
object OpenDialogImport: TOpenDialog
DefaultExt = '.json'
Filter = 'JSON|*.json'
Left = 664
Top = 328
end
end
================================================
FILE: ChatGPT.ImportExport.pas
================================================
unit ChatGPT.ImportExport;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
ChatGPT.Overlay, FMX.Objects, FMX.Memo.Types, FMX.ScrollBox, FMX.Memo,
FMX.Controls.Presentation, FMX.Layouts, ChatGPT.Classes, FMX.Edit;
type
TFrameImportExport = class(TFrameOveraly)
LayoutClient: TLayout;
RectangleFrame: TRectangle;
LayoutActions: TLayout;
ButtonOk: TButton;
LabelCaption: TLabel;
ButtonCancel: TButton;
RadioButtonImport: TRadioButton;
RadioButtonExport: TRadioButton;
Layout1: TLayout;
VertScrollBox: TVertScrollBox;
LayoutExport: TLayout;
Label17: TLabel;
EditExport: TEdit;
ClearEditButtonExport: TClearEditButton;
Path2: TPath;
Label9: TLabel;
EditButtonExportFile: TEditButton;
Path1: TPath;
LayoutImport: TLayout;
Label1: TLabel;
EditImport: TEdit;
ClearEditButtonImport: TClearEditButton;
Path3: TPath;
EditButtonImportFile: TEditButton;
Path4: TPath;
Label2: TLabel;
SaveDialogExport: TSaveDialog;
OpenDialogImport: TOpenDialog;
Label3: TLabel;
procedure FrameResize(Sender: TObject);
procedure ButtonCancelClick(Sender: TObject);
procedure ButtonOkClick(Sender: TObject);
procedure RadioButtonExportChange(Sender: TObject);
procedure EditButtonExportFileClick(Sender: TObject);
procedure EditButtonImportFileClick(Sender: TObject);
procedure RectangleBGClick(Sender: TObject);
private
FLayoutClientWidth, FLayoutClientHeight: Single;
FProcCallback: TProc;
protected
procedure SetMode(const Value: TWindowMode); override;
public
constructor Create(AOwner: TComponent); override;
procedure Cancel; override;
class procedure Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc);
end;
var
FrameImportExport: TFrameImportExport;
implementation
uses
System.Math;
{$R *.fmx}
{ TFrameImportExport }
procedure TFrameImportExport.ButtonCancelClick(Sender: TObject);
begin
Cancel;
end;
procedure TFrameImportExport.ButtonOkClick(Sender: TObject);
begin
if Assigned(FProcCallback) then
FProcCallback(Self, True);
Release;
end;
procedure TFrameImportExport.Cancel;
begin
if Assigned(FProcCallback) then
FProcCallback(Self, False);
Release;
end;
constructor TFrameImportExport.Create(AOwner: TComponent);
begin
inherited;
Name := '';
FLayoutClientWidth := LayoutClient.Width;
FLayoutClientHeight := LayoutClient.Height;
RadioButtonExportChange(nil);
end;
procedure TFrameImportExport.EditButtonExportFileClick(Sender: TObject);
begin
if SaveDialogExport.Execute then
begin
EditExport.Text := SaveDialogExport.FileName;
RadioButtonExport.IsChecked := True;
end;
end;
procedure TFrameImportExport.EditButtonImportFileClick(Sender: TObject);
begin
if OpenDialogImport.Execute then
begin
EditImport.Text := OpenDialogImport.FileName;
RadioButtonImport.IsChecked := True;
end;
end;
class procedure TFrameImportExport.Execute(AParent: TControl; ProcSet: TProc; ProcExecuted: TProc);
begin
var Frame := TFrameImportExport.Create(AParent);
Frame.Parent := AParent;
Frame.FProcCallback := ProcExecuted;
Frame.Align := TAlignLayout.Contents;
Frame.BringToFront;
if Assigned(ProcSet) then
ProcSet(Frame);
Frame.ButtonCancel.SetFocus;
end;
procedure TFrameImportExport.FrameResize(Sender: TObject);
begin
LayoutClient.Width := Min(FLayoutClientWidth, Width);
LayoutClient.Height := Min(FLayoutClientHeight, Height);
end;
procedure TFrameImportExport.RadioButtonExportChange(Sender: TObject);
begin
LayoutExport.Enabled := RadioButtonExport.IsChecked;
LayoutImport.Enabled := RadioButtonImport.IsChecked;
end;
procedure TFrameImportExport.RectangleBGClick(Sender: TObject);
begin
Cancel;
end;
procedure TFrameImportExport.SetMode(const Value: TWindowMode);
begin
inherited;
if Mode = TWindowMode.Compact then
begin
LayoutClient.Align := TAlignLayout.Client;
RectangleFrame.Corners := [];
end
else
begin
LayoutClient.Align := TAlignLayout.Center;
RectangleFrame.Corners := AllCorners;
end;
FrameResize(nil);
end;
end.
================================================
FILE: ChatGPT.LoadedFunctions.fmx
================================================
inherited FrameLoadedFunctions: TFrameLoadedFunctions
Size.Width = 1035.000000000000000000
Size.Height = 811.000000000000000000
OnResize = FrameResize
OnResized = FrameResize
inherited RectangleBG: TRectangle
Size.Width = 1035.000000000000000000
Size.Height = 811.000000000000000000
OnClick = RectangleBGClick
end
object LayoutClient: TLayout
Align = Center
Padding.Left = 10.000000000000000000
Padding.Top = 10.000000000000000000
Padding.Right = 10.000000000000000000
Padding.Bottom = 10.000000000000000000
Size.Width = 440.000000000000000000
Size.Height = 566.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object RectangleFrame: TRectangle
Align = Contents
Fill.Color = xFF202123
Locked = True
Size.Width = 440.000000000000000000
Size.Height = 566.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
end
object Layout2: TLayout
Align = Bottom
Position.X = 10.000000000000000000
Position.Y = 510.000000000000000000
Size.Width = 420.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object ButtonOk: TButton
Align = Right
Cancel = True
Position.X = 340.000000000000000000
Size.Width = 80.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 2
Text = 'OK'
TextSettings.Trimming = None
OnClick = ButtonOkClick
end
end
object Label1: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Top = 10.000000000000000000
Position.X = 10.000000000000000000
Position.Y = 20.000000000000000000
Size.Width = 420.000000000000000000
Size.Height = 20.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.Font.Size = 16.000000000000000000
TextSettings.FontColor = xFFE9E9E9
TextSettings.WordWrap = False
Text = 'Loaded functions'
TabOrder = 41
end
object Label20: TLabel
Align = Top
AutoSize = True
StyledSettings = [Style]
Margins.Left = 5.000000000000000000
Margins.Top = 5.000000000000000000
Margins.Right = 5.000000000000000000
Margins.Bottom = 5.000000000000000000
Position.X = 15.000000000000000000
Position.Y = 45.000000000000000000
Size.Width = 410.000000000000000000
Size.Height = 29.000000000000000000
Size.PlatformDefault = False
TextSettings.Font.Family = 'Roboto'
TextSettings.FontColor = x78FFFFFF
Text =
'To load third-party functions, you must place the dynamic librar' +
'y in the "funcs" folder next to the program'#39's executable file'
TabOrder = 5
TabStop = False
end
object Rectangle1: TRectangle
Align = Client
Fill.Color = x78000000
Margins.Left = 6.000000000000000000
Margins.Top = 6.000000000000000000
Margins.Right = 6.000000000000000000
Margins.Bottom = 6.000000000000000000
Size.Width = 408.000000000000000000
Size.Height = 419.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
XRadius = 6.000000000000000000
YRadius = 6.000000000000000000
object ListBoxItems: TListBox
Align = Client
Margins.Left = 4.000000000000000000
Margins.Top = 4.000000000000000000
Margins.Right = 4.000000000000000000
Margins.Bottom = 4.000000000000000000
Size.Width = 400.000000000000000000
Size.Height = 411.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'transparentlistboxstyle'
TabOrder = 0
DisableFocusEffect = True
ItemHeight = 50.000000000000000000
DefaultItemStyles.ItemStyle = 'listboxitemstyle_func'
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
Viewport.Width = 400.000000000000000000
Viewport.Height = 411.000000000000000000
end
end
object LabelEmpty: TLabel
Align = Center
AutoSize = True
StyledSettings = [Family, Size, Style]
Size.Width = 66.000000000000000000
Size.Height = 16.000000000000000000
Size.PlatformDefault = False
TextSettings.FontColor = xFF6C6C6C
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'List is empty'
TabOrder = 3
end
end
end
================================================
FILE: ChatGPT.LoadedFunctions.pas
================================================
unit ChatGPT.LoadedFunctions;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
ChatGPT.Overlay, FMX.Objects, FMX.Controls.Presentation, FMX.Layouts,
FMX.ListBox;
type
TFrameLoadedFunctions = class(TFrameOveraly)
LayoutClient: TLayout;
RectangleFrame: TRectangle;
Layout2: TLayout;
ButtonOk: TButton;
ListBoxItems: TListBox;
LabelEmpty: TLabel;
Label1: TLabel;
Label20: TLabel;
Rectangle1: TRectangle;
procedure FrameResize(Sender: TObject);
procedure ButtonOkClick(Sender: TObject);
procedure RectangleBGClick(Sender: TObject);
private
FLayoutClientWidth, FLayoutClientHeight: Single;
public
constructor Create(AOwner: TComponent); override;
procedure Cancel; override;
class procedure Execute(AParent: TControl);
end;
var
FrameLoadedFunctions: TFrameLoadedFunctions;
implementation
uses
System.Math, ChatGPT.Manager;
{$R *.fmx}
procedure TFrameLoadedFunctions.ButtonOkClick(Sender: TObject);
begin
Cancel;
end;
procedure TFrameLoadedFunctions.Cancel;
begin
Release;
end;
constructor TFrameLoadedFunctions.Create(AOwner: TComponent);
begin
inherited;
Name := '';
FLayoutClientWidth := LayoutClient.Width;
FLayoutClientHeight := LayoutClient.Height;
for var Item in Manager.GPTFuncList do
begin
var ListItem := TListBoxItem.Create(ListBoxItems);
ListItem.Text := Item.GetDescription;
ListItem.ItemData.Detail := Item.GetName;
ListBoxItems.AddObject(ListItem);
end;
LabelEmpty.Visible := ListBoxItems.Count <= 0;
end;
class procedure TFrameLoadedFunctions.Execute(AParent: TControl);
begin
var Frame := TFrameLoadedFunctions.Create(AParent);
Frame.Parent := AParent;
Frame.Align := TAlignLayout.Contents;
Frame.BringToFront;
end;
procedure TFrameLoadedFunctions.FrameResize(Sender: TObject);
begin
LayoutClient.Width := Min(FLayoutClientWidth, Width);
LayoutClient.Height := Min(FLayoutClientHeight, Height);
end;
procedure TFrameLoadedFunctions.RectangleBGClick(Sender: TObject);
begin
Cancel;
end;
end.
================================================
FILE: ChatGPT.Main.fmx
================================================
object FormMain: TFormMain
Left = 0
Top = 0
Caption = 'ChatGPT'
ClientHeight = 686
ClientWidth = 1053
Fill.Color = xFF202123
Fill.Kind = Solid
Quality = HighQuality
SystemStatusBar.BackgroundColor = xFF202123
StyleBook = StyleBook
Constraints.MinHeight = 400.000000000000000000
Constraints.MinWidth = 400.000000000000000000
FormFactor.Width = 320
FormFactor.Height = 480
FormFactor.Orientations = [Portrait, Landscape, InvertedPortrait, InvertedLandscape]
FormFactor.Devices = [Desktop, iPhone, iPad]
ShowFullScreenIcon = True
OnCreate = FormCreate
OnCloseQuery = FormCloseQuery
OnResize = FormResize
OnConstrainedResize = FormConstrainedResize
OnVirtualKeyboardShown = FormVirtualKeyboardShown
OnVirtualKeyboardHidden = FormVirtualKeyboardHidden
Touch.GestureManager = GestureManager
OnGesture = FormGesture
OnSaveState = FormSaveState
DesignerMasterStyle = 0
object LayoutChats: TLayout
Align = Client
Size.Width = 783.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object Rectangle1: TRectangle
Align = Contents
Fill.Color = xFF343541
Locked = True
Size.Width = 783.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
end
object LayoutHead: TLayout
Align = Top
Size.Width = 783.000000000000000000
Size.Height = 43.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object Line2: TLine
Align = Contents
LineType = Bottom
Size.Width = 783.000000000000000000
Size.Height = 43.000000000000000000
Size.PlatformDefault = False
Stroke.Color = xFF50505D
end
object ButtonMenu: TButton
Align = Left
Cursor = crHandPoint
Images = Manager.SVGIconImageList
ImageIndex = 2
Size.Width = 43.000000000000000000
Size.Height = 43.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_primary'
TabOrder = 1
OnClick = ButtonMenuClick
end
object ButtonNewChatCompact: TButton
Align = Right
Cursor = crHandPoint
Images = Manager.SVGIconImageList
ImageIndex = 0
Position.X = 740.000000000000000000
Size.Width = 43.000000000000000000
Size.Height = 43.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_primary'
TabOrder = 0
OnClick = ButtonNewChatCompactClick
end
object LabelChatName: TLabel
Align = Client
StyledSettings = [Family, Style]
Size.Width = 697.000000000000000000
Size.Height = 43.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'LabelChatNameStyle1'
TextSettings.Font.Size = 16.000000000000000000
TextSettings.FontColor = xFFD9D9E3
TextSettings.HorzAlign = Center
TextSettings.WordWrap = False
Text = 'Select chat'
TabOrder = 2
end
end
object LayoutChatsBox: TLayout
Align = Client
Size.Width = 783.000000000000000000
Size.Height = 643.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
end
end
object StyleBook: TStyleBook
Styles = <
item
ResourcesBin = {
464D585F5354594C4520322E35010613627574746F6E7374796C655F6E657763
686174034D0506106C697374626F786974656D7374796C6503511506166C6973
74626F786974656D7374796C655F6D6F64656C039B0B06156C697374626F7869
74656D7374796C655F6368617403691306106D656D6F7374796C655F6E6F726D
616C03E907060F65646974627574746F6E7374796C65034B0306126C69737462
6F787374796C655F636C65617203EE050613627574746F6E7374796C655F7072
696D617279032A02060F656469747374796C655F636C65617203D40406157363
726F6C6C626172626F74746F6D627574746F6E03700206147363726F6C6C6261
7268747261636B7374796C6503260106137363726F6C6C6261726C6566746275
74746F6E037A0206147363726F6C6C6261727269676874627574746F6E036F02
060E7363726F6C6C6261727374796C6503D90206127363726F6C6C626172746F
70627574746F6E03790206147363726F6C6C62617276747261636B7374796C65
0343010619736D616C6C7363726F6C6C62617268747261636B7374796C6503AD
010613736D616C6C7363726F6C6C6261727374796C650349020619736D616C6C
7363726F6C6C62617276747261636B7374796C6503AD01060A7468756D627374
796C65031502060A747261636B7374796C65030C02060E7363726F6C6C626F78
7374796C6503CF070610627574746F6E7374796C655F6D656E75033405061362
7574746F6E7374796C655F636F6E6669726D033703060E6D656D6F7374796C65
5F636F6465039C060611627574746F6E7374796C655F636C656172024E060D74
7261636B6261727374796C65030D07060D7468756D626261727374796C650337
010613627574746F6E7374796C655F77656C636F6D650313040613627574746F
6E7374796C655F6578656375746503C206060B636F6D626F5F7374796C6503E9
06060D64726F70646F776E70616E656C03AD00060C706F706F7665727374796C
65033E02060C6C697374626F787374796C65031E07060D6D656E756974656D73
74796C6503C70E06146D656E756974656D7374796C655F627574746F6E03DA09
060D6D656E75766965777374796C65038D0206126D656E75736570617261746F
727374796C6503920006176C65667473656C656374696F6E706F696E74737479
6C6503C5010618726967687473656C656374696F6E706F696E747374796C6503
9B010611627574746F6E5F7363726F6C6C646F776E038F04060B737769746368
7374796C65033E01061A627574746F6E7374796C655F636C6561726D696E695F
6C656674035B03061B627574746F6E7374796C655F636C6561726D696E695F72
69676874035E03060F6D656D6F7374796C655F636C6561720399050610627574
746F6E7374796C655F69636F6E033C030617627574746F6E7374796C655F6D65
6E75627574746F6E7303BB020611627574746F6E7374796C655F726574727903
24090611616E69696E64696361746F727374796C6503870B06156C697374626F
786974656D7374796C655F66756E6303AC1706177472616E73706172656E746C
697374626F787374796C65033D070614627574746F6E7374796C655F636F6E74
696E7565030607060B627574746F6E7374796C6503C0040619627574746F6E73
74796C655F696D706F72745F6578706F727403B0060613726164696F62757474
6F6E7374796C655F6D64036C050615627574746F6E7374796C655F636C656172
6D696E69035103060F6261636B67726F756E647374796C6503AF000054504630
07544C61796F757400095374796C654E616D650613627574746F6E7374796C65
5F6E65776368617405416C69676E070643656E7465720C50616464696E672E4C
6566740500000000000000C002400B50616464696E672E546F70050000000000
0000C002400D50616464696E672E52696768740500000000000000C002400E50
616464696E672E426F74746F6D0500000000000000C002400A53697A652E5769
6474680500000000000000F406400B53697A652E486569676874050000000000
0000B804401453697A652E506C6174666F726D44656661756C74080756697369
626C6508085461624F726465720214000A5452656374616E676C650009537479
6C654E616D65060F52656374616E676C65315374796C6505416C69676E070843
6F6E74656E74730A46696C6C2E436F6C6F720709783030464646464646074869
7454657374080A53697A652E57696474680500000000000000F406400B53697A
652E4865696768740500000000000000B804401453697A652E506C6174666F72
6D44656661756C74080C5374726F6B652E436F6C6F7207097833334646464646
4607585261646975730500000000000000C00140075952616469757305000000
00000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E
616D650614436F6C6F72416E696D6174696F6E315374796C6508447572617469
6F6E050000000000CDCCCCFD3F0C50726F70657274794E616D65060A46696C6C
2E436F6C6F720A537461727456616C756507097830304646464646460953746F
7056616C756507097831394646464646460754726967676572061049734D6F75
73654F7665723D747275650E54726967676572496E7665727365061149734D6F
7573654F7665723D66616C73650000000654476C79706800095374796C654E61
6D65060A676C7970687374796C650B4D617267696E732E546F70050000000000
000080FFBF0D4D617267696E732E52696768740500000000000000C002400E4D
617267696E732E426F74746F6D050000000000000080FFBF05416C69676E0704
4C6566740A506F736974696F6E2E580500000000000000C002400A506F736974
696F6E2E590500000000000000B002400A53697A652E57696474680500000000
000000C003400B53697A652E4865696768740500000000000000C00340145369
7A652E506C6174666F726D44656661756C74080A496D616765496E6465780200
000E5446696C6C52474245666665637400095374796C654E616D65061346696C
6C524742456666656374315374796C6505436F6C6F7207097846464439443945
330000001654427574746F6E5374796C65546578744F626A6563740009537479
6C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B65
64090A53697A652E57696474680500000000000000DC06400B53697A652E4865
696768740500000000000000B003401453697A652E506C6174666F726D446566
61756C7408165465787453657474696E67732E466F6E742E53697A6505000000
00000000E00240165465787453657474696E67732E466F6E74436F6C6F720708
636C615768697465155465787453657474696E67732E5472696D6D696E670709
436861726163746572155465787453657474696E67732E576F72645772617008
165465787453657474696E67732E486F727A416C69676E07074C656164696E67
0D536861646F7756697369626C650808486F74436F6C6F720708636C61576869
74650C466F6375736564436F6C6F720708636C6157686974650B4E6F726D616C
436F6C6F720708636C6157686974650C50726573736564436F6C6F720708636C
6157686974650000005450463007544C61796F757400095374796C654E616D65
06106C697374626F786974656D7374796C6505416C69676E070643656E746572
0A53697A652E57696474680500000000000000BB07400B53697A652E48656967
687405000000000000009004401453697A652E506C6174666F726D4465666175
6C74080756697369626C6508085461624F7264657202190B4669786564486569
676874021E000A5452656374616E676C6500095374796C654E616D65060F6261
636B67726F756E645F6F76657205416C69676E0708436F6E74656E74730A4669
6C6C2E436F6C6F7207097830303437383646460748697454657374080A53697A
652E57696474680500000000000000BB07400B53697A652E4865696768740500
0000000000009004401453697A652E506C6174666F726D44656661756C74080C
5374726F6B652E436F6C6F720709783030343738364646000F54436F6C6F7241
6E696D6174696F6E00095374796C654E616D6506046F76657208447572617469
6F6E05000000000000000000000C50726F70657274794E616D65060A46696C6C
2E436F6C6F720A537461727456616C756507097830303639364136440953746F
7056616C756507097842343639364136440754726967676572060F497353656C
65637465643D747275650E54726967676572496E76657273650610497353656C
65637465643D66616C73650000000654476C79706800095374796C654E616D65
060A676C7970687374796C650C4D617267696E732E4C65667405000000000000
008000400B4D617267696E732E546F70050000000000000080FF3F0D4D617267
696E732E526967687405000000000000008000400E4D617267696E732E426F74
746F6D050000000000000080FF3F05416C69676E07044C6566740A506F736974
696F6E2E5805000000000000008000400A506F736974696F6E2E590500000000
00000080FF3F0A53697A652E576964746805000000000000008003400B53697A
652E48656967687405000000000000008804401453697A652E506C6174666F72
6D44656661756C7408000016544163746976655374796C65546578744F626A65
637400095374796C654E616D6506047465787405416C69676E0706436C69656E
740C4D617267696E732E4C6566740500000000000000C000400B4D617267696E
732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500
000000000000C000400E4D617267696E732E426F74746F6D0500000000000000
80FF3F0A53697A652E57696474680500000000000000B807400B53697A652E48
656967687405000000000000008804401453697A652E506C6174666F726D4465
6661756C7408165465787453657474696E67732E466F6E742E53697A65050000
0000000000800340165465787453657474696E67732E466F6E74436F6C6F7207
09783936464646464646155465787453657474696E67732E576F726457726170
08165465787453657474696E67732E486F727A416C69676E07074C656164696E
670D536861646F7756697369626C65080D416374697665547269676765720708
53656C65637465640B416374697665436F6C6F720708636C6157686974650000
0954436865636B426F7800095374796C654E616D650605636865636B05416C69
676E07044C6566740843616E466F637573081244697361626C65466F63757345
6666656374090C4D617267696E732E4C65667405000000000000008001400A50
6F736974696F6E2E5805000000000000008001400A53697A652E576964746805
00000000000000A003400B53697A652E48656967687405000000000000009004
401453697A652E506C6174666F726D44656661756C74080756697369626C6508
000007544C61796F757400095374796C654E616D65060D6163636573736F7279
6D6F726505416C69676E07094D6F737452696768740A53697A652E5769647468
0500000000000000B003400B53697A652E4865696768740500000000000000B0
04401453697A652E506C6174666F726D44656661756C74080756697369626C65
080012544163746976655374796C654F626A6563740005416C69676E07064365
6E7465720C536F757263654C6F6F6B7570061A57696E646F7773203130204D6F
6465726E7374796C652E706E670A53697A652E57696474680500000000000000
C002400B53697A652E48656967687405000000000000008003401453697A652E
506C6174666F726D44656661756C740808577261704D6F6465070643656E7465
720D41637469766554726967676572070853656C65637465640A416374697665
4C696E6B0E010F536F75726365526563742E4C65667405000000000000008B06
400E536F75726365526563742E546F700500000000000000D4054010536F7572
6365526563742E5269676874050000000000000097064011536F757263655265
63742E426F74746F6D0500000000000000F405400001055363616C6505000000
00000000C0FF3F0F536F75726365526563742E4C6566740500000000000000D0
06400E536F75726365526563742E546F7005000000000000009F064010536F75
726365526563742E52696768740500000000000000E2064011536F7572636552
6563742E426F74746F6D0500000000000000B706400001055363616C65050000
00000000008000400F536F75726365526563742E4C6566740500000000000000
8B07400E536F75726365526563742E546F700500000000000000D4064010536F
75726365526563742E5269676874050000000000000097074011536F75726365
526563742E426F74746F6D0500000000000000F406400001055363616C650500
000000000000C000400F536F75726365526563742E4C65667405000000000000
80D007400E536F75726365526563742E546F7005000000000000009F07401053
6F75726365526563742E52696768740500000000000080E2074011536F757263
65526563742E426F74746F6D0500000000000000B7074000000A536F75726365
4C696E6B0E010F536F75726365526563742E4C65667405000000000000008B06
400E536F75726365526563742E546F700500000000000000D4054010536F7572
6365526563742E5269676874050000000000000097064011536F757263655265
63742E426F74746F6D0500000000000000F405400001055363616C6505000000
00000000C0FF3F0F536F75726365526563742E4C6566740500000000000000D0
06400E536F75726365526563742E546F7005000000000000009F064010536F75
726365526563742E52696768740500000000000000E2064011536F7572636552
6563742E426F74746F6D0500000000000000B706400001055363616C65050000
00000000008000400F536F75726365526563742E4C6566740500000000000000
8B07400E536F75726365526563742E546F700500000000000000D4064010536F
75726365526563742E5269676874050000000000000097074011536F75726365
526563742E426F74746F6D0500000000000000F406400001055363616C650500
000000000000C000400F536F75726365526563742E4C65667405000000000000
80D007400E536F75726365526563742E546F7005000000000000009F07401053
6F75726365526563742E52696768740500000000000080E2074011536F757263
65526563742E426F74746F6D0500000000000000B70740000013546F75636841
6E696D6174696F6E2E4C696E6B0E0000000007544C61796F757400095374796C
654E616D6506126163636573736F7279636865636B6D61726B05416C69676E07
094D6F737452696768740A53697A652E57696474680500000000000000B00340
0B53697A652E4865696768740500000000000000B004401453697A652E506C61
74666F726D44656661756C74080756697369626C650800125441637469766553
74796C654F626A6563740005416C69676E070643656E7465720C536F75726365
4C6F6F6B7570061A57696E646F7773203130204D6F6465726E7374796C652E70
6E670A53697A652E576964746805000000000000009003400B53697A652E4865
6967687405000000000000009003401453697A652E506C6174666F726D446566
61756C740808577261704D6F6465070643656E7465720D416374697665547269
67676572070853656C65637465640A4163746976654C696E6B0E010F536F7572
6365526563742E4C65667405000000000000009B06400E536F75726365526563
742E546F700500000000000000D2054010536F75726365526563742E52696768
740500000000000000AD064011536F75726365526563742E426F74746F6D0500
000000000000F605400001055363616C650500000000000000C0FF3F0F536F75
726365526563742E4C6566740500000000000000E806400E536F757263655265
63742E546F7005000000000000009D064010536F75726365526563742E526967
6874050000000000008081074011536F75726365526563742E426F74746F6D05
00000000000000B806400001055363616C6505000000000000008000400F536F
75726365526563742E4C65667405000000000000009B07400E536F7572636552
6563742E546F700500000000000000D2064010536F75726365526563742E5269
6768740500000000000000AD074011536F75726365526563742E426F74746F6D
0500000000000000F606400001055363616C650500000000000000C000400F53
6F75726365526563742E4C6566740500000000000080E807400E536F75726365
526563742E546F7005000000000000809D074010536F75726365526563742E52
6967687405000000000000C081084011536F75726365526563742E426F74746F
6D0500000000000080B8074000000A536F757263654C696E6B0E010F536F7572
6365526563742E4C65667405000000000000009B06400E536F75726365526563
742E546F700500000000000000D2054010536F75726365526563742E52696768
740500000000000000AD064011536F75726365526563742E426F74746F6D0500
000000000000F605400001055363616C650500000000000000C0FF3F0F536F75
726365526563742E4C6566740500000000000000E806400E536F757263655265
63742E546F7005000000000000009D064010536F75726365526563742E526967
6874050000000000008081074011536F75726365526563742E426F74746F6D05
00000000000000B806400001055363616C6505000000000000008000400F536F
75726365526563742E4C65667405000000000000009B07400E536F7572636552
6563742E546F700500000000000000D2064010536F75726365526563742E5269
6768740500000000000000AD074011536F75726365526563742E426F74746F6D
0500000000000000F606400001055363616C650500000000000000C000400F53
6F75726365526563742E4C6566740500000000000080E807400E536F75726365
526563742E546F7005000000000000809D074010536F75726365526563742E52
6967687405000000000000C081084011536F75726365526563742E426F74746F
6D0500000000000080B80740000013546F756368416E696D6174696F6E2E4C69
6E6B0E0000000007544C61796F757400095374796C654E616D65060F61636365
73736F727964657461696C05416C69676E07094D6F737452696768740A53697A
652E57696474680500000000000000B003400B53697A652E4865696768740500
000000000000B004401453697A652E506C6174666F726D44656661756C740807
56697369626C65080012544163746976655374796C654F626A6563740005416C
69676E070643656E7465720C536F757263654C6F6F6B7570061A57696E646F77
73203130204D6F6465726E7374796C652E706E670A53697A652E576964746805
000000000000008003400B53697A652E48656967687405000000000000008003
401453697A652E506C6174666F726D44656661756C740808577261704D6F6465
070643656E7465720D41637469766554726967676572070853656C6563746564
0A4163746976654C696E6B0E010F536F75726365526563742E4C656674050000
00000000808707400E536F75726365526563742E546F700500000000000000D4
054010536F75726365526563742E526967687405000000000000808F07401153
6F75726365526563742E426F74746F6D0500000000000000F405400001055363
616C650500000000000000C0FF3F0F536F75726365526563742E4C6566740500
000000000000CB07400E536F75726365526563742E546F700500000000000000
9F064010536F75726365526563742E52696768740500000000000000D7074011
536F75726365526563742E426F74746F6D0500000000000000B7064000010553
63616C6505000000000000008000400F536F75726365526563742E4C65667405
000000000000808708400E536F75726365526563742E546F7005000000000000
00D4064010536F75726365526563742E526967687405000000000000808F0840
11536F75726365526563742E426F74746F6D0500000000000000F40640000105
5363616C650500000000000000C000400F536F75726365526563742E4C656674
0500000000000040CB08400E536F75726365526563742E546F70050000000000
00009F074010536F75726365526563742E52696768740500000000000040D708
4011536F75726365526563742E426F74746F6D0500000000000000B707400000
0A536F757263654C696E6B0E010F536F75726365526563742E4C656674050000
00000000808707400E536F75726365526563742E546F700500000000000000D4
054010536F75726365526563742E526967687405000000000000808F07401153
6F75726365526563742E426F74746F6D0500000000000000F405400001055363
616C650500000000000000C0FF3F0F536F75726365526563742E4C6566740500
000000000000CB07400E536F75726365526563742E546F700500000000000000
9F064010536F75726365526563742E52696768740500000000000000D7074011
536F75726365526563742E426F74746F6D0500000000000000B7064000010553
63616C6505000000000000008000400F536F75726365526563742E4C65667405
000000000000808708400E536F75726365526563742E546F7005000000000000
00D4064010536F75726365526563742E526967687405000000000000808F0840
11536F75726365526563742E426F74746F6D0500000000000000F40640000105
5363616C650500000000000000C000400F536F75726365526563742E4C656674
0500000000000040CB08400E536F75726365526563742E546F70050000000000
00009F074010536F75726365526563742E52696768740500000000000040D708
4011536F75726365526563742E426F74746F6D0500000000000000B707400000
13546F756368416E696D6174696F6E2E4C696E6B0E0000000000545046300754
4C61796F757400095374796C654E616D6506166C697374626F786974656D7374
796C655F6D6F64656C05416C69676E070643656E7465720A53697A652E576964
74680500000000000000BB07400B53697A652E48656967687405000000000000
009004401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508085461624F72646572021A0B4669786564486569676874021E000A5452
656374616E676C6500095374796C654E616D65060F6261636B67726F756E645F
6F76657205416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207
097830303437383646460748697454657374080A53697A652E57696474680500
000000000000BB07400B53697A652E4865696768740500000000000000900440
1453697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F
6C6F720709783030343738364646000F54436F6C6F72416E696D6174696F6E00
095374796C654E616D6506046F766572084475726174696F6E05000000000000
000000000C50726F70657274794E616D65060A46696C6C2E436F6C6F720A5374
61727456616C756507097830303639364136440953746F7056616C7565070978
42343639364136440754726967676572060F497353656C65637465643D747275
650E54726967676572496E76657273650610497353656C65637465643D66616C
73650000000654476C79706800095374796C654E616D65060A676C7970687374
796C650C4D617267696E732E4C65667405000000000000008000400B4D617267
696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874
05000000000000008000400E4D617267696E732E426F74746F6D050000000000
000080FF3F05416C69676E07044C6566740A506F736974696F6E2E5805000000
000000008000400A506F736974696F6E2E59050000000000000080FF3F0A5369
7A652E576964746805000000000000008003400B53697A652E48656967687405
000000000000008804401453697A652E506C6174666F726D44656661756C7408
000016544163746976655374796C65546578744F626A65637400095374796C65
4E616D6506047465787405416C69676E0706436C69656E740C4D617267696E73
2E4C6566740500000000000000C000400B4D617267696E732E546F7005000000
0000000080FF3F0D4D617267696E732E52696768740500000000000000C00040
0E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A652E
57696474680500000000000000B006400B53697A652E48656967687405000000
000000008804401453697A652E506C6174666F726D44656661756C7408045465
7874060454657874165465787453657474696E67732E466F6E742E53697A6505
00000000000000800340165465787453657474696E67732E466F6E74436F6C6F
720709783936464646464646155465787453657474696E67732E5472696D6D69
6E670709436861726163746572155465787453657474696E67732E576F726457
72617008165465787453657474696E67732E486F727A416C69676E07074C6561
64696E670D536861646F7756697369626C65080D416374697665547269676765
72070853656C65637465640B416374697665436F6C6F720708636C6157686974
6500000954436865636B426F7800095374796C654E616D650605636865636B05
416C69676E07044C6566740843616E466F637573081244697361626C65466F63
7573456666656374090C4D617267696E732E4C65667405000000000000008001
400A506F736974696F6E2E5805000000000000008001400A53697A652E576964
74680500000000000000A003400B53697A652E48656967687405000000000000
009004401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508000016544163746976655374796C65546578744F626A65637400095374
796C654E616D650607636F6E7465787405416C69676E07055269676874074F70
61636974790500000000003333B3FE3F0C4D617267696E732E4C656674050000
0000000000C000400B4D617267696E732E546F70050000000000000080FF3F0D
4D617267696E732E52696768740500000000000000C000400E4D617267696E73
2E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E58050000
0000000000B906400A506F736974696F6E2E59050000000000000080FF3F0A53
697A652E576964746805000000000000008205400B53697A652E486569676874
05000000000000008804401453697A652E506C6174666F726D44656661756C74
0804546578740606313238303030165465787453657474696E67732E466F6E74
2E53697A650500000000000000800340165465787453657474696E67732E466F
6E74436F6C6F720709783936464646464646155465787453657474696E67732E
5472696D6D696E670709436861726163746572155465787453657474696E6773
2E576F72645772617008165465787453657474696E67732E486F727A416C6967
6E0708547261696C696E670D536861646F7756697369626C65080D4163746976
6554726967676572070853656C65637465640B416374697665436F6C6F720708
636C615768697465000016544163746976655374796C65546578744F626A6563
7400095374796C654E616D650606746F6B656E7305416C69676E070552696768
74074F7061636974790500000000003333B3FE3F0C4D617267696E732E4C6566
740500000000000000C000400B4D617267696E732E546F700500000000000000
80FF3F0D4D617267696E732E52696768740500000000000000C000400E4D6172
67696E732E426F74746F6D050000000000000080FF3F0A506F736974696F6E2E
5805000000000000008007400A506F736974696F6E2E59050000000000000080
FF3F0A53697A652E57696474680500000000000000A004400B53697A652E4865
6967687405000000000000008804401453697A652E506C6174666F726D446566
61756C74080454657874060434303936165465787453657474696E67732E466F
6E742E53697A650500000000000000800340165465787453657474696E67732E
466F6E74436F6C6F720709783936464646464646155465787453657474696E67
732E5472696D6D696E670709436861726163746572155465787453657474696E
67732E576F72645772617008165465787453657474696E67732E486F727A416C
69676E0708547261696C696E670D536861646F7756697369626C65080D416374
69766554726967676572070853656C65637465640B416374697665436F6C6F72
0708636C615768697465000016544163746976655374796C65546578744F626A
65637400095374796C654E616D650608646174616461746505416C69676E0705
5269676874074F7061636974790500000000003333B3FE3F0C4D617267696E73
2E4C6566740500000000000000C000400B4D617267696E732E546F7005000000
0000000080FF3F0D4D617267696E732E52696768740500000000000000C00040
0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F736974
696F6E2E5805000000000000009707400A506F736974696F6E2E590500000000
00000080FF3F0A53697A652E576964746805000000000000008A05400B53697A
652E48656967687405000000000000008804401453697A652E506C6174666F72
6D44656661756C74080454657874060853657020323032331654657874536574
74696E67732E466F6E742E53697A650500000000000000800340165465787453
657474696E67732E466F6E74436F6C6F72070978393646464646464615546578
7453657474696E67732E5472696D6D696E670709436861726163746572155465
787453657474696E67732E576F72645772617008165465787453657474696E67
732E486F727A416C69676E0708547261696C696E670D536861646F7756697369
626C65080D41637469766554726967676572070853656C65637465640B416374
697665436F6C6F720708636C6157686974650000005450463007544C61796F75
7400095374796C654E616D6506156C697374626F786974656D7374796C655F63
68617405416C69676E070643656E7465720C436C69704368696C6472656E090C
50616464696E672E4C6566740500000000000000C002400B50616464696E672E
546F700500000000000000C002400D50616464696E672E526967687405000000
00000000C002400E50616464696E672E426F74746F6D0500000000000000C002
400A53697A652E57696474680500000000000000C406400B53697A652E486569
6768740500000000000000AC04401453697A652E506C6174666F726D44656661
756C74080756697369626C6508085461624F726465720204000A545265637461
6E676C6500095374796C654E616D650602626705416C69676E0708436F6E7465
6E74730A46696C6C2E436F6C6F72070978303032413242333207486974546573
74080A53697A652E57696474680500000000000000C406400B53697A652E4865
696768740500000000000000AC04401453697A652E506C6174666F726D446566
61756C74080B5374726F6B652E4B696E6407044E6F6E65075852616469757305
00000000000000C0014007595261646975730500000000000000C00140000F54
436F6C6F72416E696D6174696F6E00095374796C654E616D6506046F76657208
4475726174696F6E0500000000006F1283F53F0C50726F70657274794E616D65
060A46696C6C2E436F6C6F720A537461727456616C7565070978303032413242
33320953746F7056616C75650709784646324132423332075472696767657206
2149734D6F7573654F7665723D747275653B497353656C65637465643D66616C
73650E54726967676572496E7665727365062249734D6F7573654F7665723D66
616C73653B497353656C65637465643D66616C736500000F54436F6C6F72416E
696D6174696F6E00095374796C654E616D65060873656C656374656408447572
6174696F6E0500000000006F1283F53F0C50726F70657274794E616D65060A46
696C6C2E436F6C6F720A537461727456616C7565070978464632413242333209
53746F7056616C756507097846463334333534310754726967676572060F4973
53656C65637465643D747275650E54726967676572496E766572736506224973
4D6F7573654F7665723D66616C73653B497353656C65637465643D66616C7365
0000000654476C79706800095374796C654E616D65060A676C7970687374796C
650B4D617267696E732E546F7005000000000000008000400D4D617267696E73
2E52696768740500000000000000C002400E4D617267696E732E426F74746F6D
050000000000000080004005416C69676E07044C6566740A506F736974696F6E
2E580500000000000000C002400A506F736974696F6E2E590500000000000000
E002400A53697A652E576964746805000000000000008003400B53697A652E48
65696768740500000000000000F002401453697A652E506C6174666F726D4465
6661756C74080A496D616765496E6465780201000E5446696C6C524742456666
65637400095374796C654E616D65061346696C6C524742456666656374315374
796C6505436F6C6F7207097846464439443945330000001654427574746F6E53
74796C65546578744F626A65637400095374796C654E616D6506047465787405
416C69676E0706436C69656E74064C6F636B6564090A53697A652E5769647468
0500000000000000B906400B53697A652E486569676874050000000000000098
03401453697A652E506C6174666F726D44656661756C74081654657874536574
74696E67732E466F6E742E53697A650500000000000000E00240165465787453
657474696E67732E466F6E74436F6C6F720708636C6157686974651554657874
53657474696E67732E5472696D6D696E67070943686172616374657215546578
7453657474696E67732E576F72645772617008165465787453657474696E6773
2E486F727A416C69676E07074C656164696E670D536861646F7756697369626C
650808486F74436F6C6F720708636C6157686974650C466F6375736564436F6C
6F720708636C6157686974650B4E6F726D616C436F6C6F720708636C61576869
74650C50726573736564436F6C6F720708636C615768697465000007544C6179
6F757400095374796C654E616D6506086F7665725F6C617905416C69676E0705
52696768740D4D617267696E732E52696768740500000000000000D404C00A50
6F736974696F6E2E580500000000000000C506400A506F736974696F6E2E5905
00000000000000C002400A53697A652E57696474680500000000000000A00440
0B53697A652E48656967687405000000000000009803401453697A652E506C61
74666F726D44656661756C7408085461624F726465720200000F54466C6F6174
416E696D6174696F6E00095374796C654E616D650609656469745F6F76657208
4475726174696F6E0500000000006F1283F53F07496E7665727365090C50726F
70657274794E616D65060D4D617267696E732E52696768740A53746172745661
6C75650500000000000000D404C00953746F7056616C75650500000000000000
0000000754726967676572060F497353656C65637465643D747275650E547269
67676572496E76657273650610497353656C65637465643D66616C7365000007
54427574746F6E00095374796C654E616D65060664656C65746505416C69676E
0705526967687406437572736F72070B637248616E64506F696E740C50616464
696E672E4C656674050000000000000080FF3F0B50616464696E672E546F7005
0000000000000080FF3F0D50616464696E672E52696768740500000000000000
80FF3F0E50616464696E672E426F74746F6D050000000000000080FF3F0C4D61
7267696E732E4C65667405000000000000008002400B4D617267696E732E546F
7005000000000000008000400E4D617267696E732E426F74746F6D0500000000
0000008000400A506F736974696F6E2E580500000000000000C003400A506F73
6974696F6E2E5905000000000000008000400A53697A652E5769647468050000
00000000008003400B53697A652E4865696768740500000000000000F0024014
53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75
700611627574746F6E7374796C655F636C656172085461624F72646572020100
05545061746800095374796C654E616D65060A50617468315374796C6505416C
69676E0706436C69656E7409446174612E506174680AF0040000690000000000
0000000050410000000001000000000030410000000002000000867D15410000
0000020000000000004133ECAB3F020000000000004100004040010000000000
00410000804001000000000000400000804002000000BC4EB93F000080400200
00000000803FAF538E40020000000000803F0000A040020000000000803F51AC
B14002000000BA4EB93F0000C04002000000FFFFFF3F0000C040010000000000
40400000C04001000000000040400000A041020000000000404051ACB1410200
0000BC4E99400000C041020000000000E0400000C04101000000000088410000
C0410200000051AC99410000C041020000000000A84151ACB141020000000000
A8410000A041010000000000A8410000C040010000000000B0410000C0400200
0000146BB4410000C040020000000000B84151ACB140020000000000B8410000
A040020000000000B841AF538E4002000000146BB44100008040020000000000
B041000080400100000000008041000080400100000000008041000040400200
00000000804133ECAB3F020000007A826A410000000002000000000050410000
0000030000000000504100000000000000000000204100004040020000000000
20415DA71C4002000000D8292741FFFFFF3F0200000000003041000000400100
000000005041000000400200000029D658410000004002000000000060415EA7
1C40020000000000604100004040010000000000604100008040010000000000
20410000804003000000000020410000404000000000000098410000A0410200
00000000984129D6A8410200000029D690410000B04102000000000088410000
B041010000000000E0400000B041020000005EA7BC400000B041020000000000
A04029D6A841020000000000A0400000A041010000000000A0400000C0400100
0000000098410000C04003000000000098410000A04100000000000040410000
104102000000D7293741000010410200000000003041D7291741020000000000
3041000020410100000000003041000090410200000000003041146B94410200
0000D7293741000098410200000000004041000098410200000028D648410000
98410200000000005041146B9441020000000000504100009041010000000000
5041000020410200000000005041D72917410200000029D64841000010410200
0000000040410000104103000000000040410000104100000000000070410000
90410200000000007041146B944102000000D729774100009841020000000000
80410000984102000000146B8441000098410200000000008841146B94410200
000000008841000090410100000000008841000020410200000000008841D729
174102000000146B84410000104102000000000080410000104102000000D729
7741000010410200000000007041D72917410200000000007041000020410300
0000000070410000904100000000000000410000104102000000AF53EE400000
1041020000000000E040D7291741020000000000E04000002041010000000000
E04000009041020000000000E040146B944102000000AF53EE40000098410200
000000000041000098410200000028D60841000098410200000000001041146B
9441020000000000104100009041010000000000104100002041020000000000
1041D72917410200000029D60841000010410200000000000041000010410300
000000000041000010410A46696C6C2E436F6C6F720709784646443944394533
064C6F636B6564090748697454657374080A53697A652E576964746805000000
00000000E002400B53697A652E4865696768740500000000000000D002401453
697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
07044E6F6E6508577261704D6F64650703466974000F54436F6C6F72416E696D
6174696F6E00095374796C654E616D650614436F6C6F72416E696D6174696F6E
315374796C65084475726174696F6E0500000000006F1283F53F07496E766572
7365090C50726F70657274794E616D65060A46696C6C2E436F6C6F720A537461
727456616C756507097846464439443945330953746F7056616C75650708636C
6157686974650754726967676572061049734D6F7573654F7665723D74727565
0E54726967676572496E7665727365061149734D6F7573654F7665723D66616C
7365000000000754427574746F6E00095374796C654E616D6506046564697405
416C69676E0705526967687406437572736F72070B637248616E64506F696E74
0C50616464696E672E4C656674050000000000000080FF3F0B50616464696E67
2E546F70050000000000000080FF3F0D50616464696E672E5269676874050000
000000000080FF3F0E50616464696E672E426F74746F6D050000000000000080
FF3F0C4D617267696E732E4C65667405000000000000008002400B4D61726769
6E732E546F7005000000000000008000400E4D617267696E732E426F74746F6D
05000000000000008000400A506F736974696F6E2E5905000000000000008000
400A53697A652E576964746805000000000000008003400B53697A652E486569
6768740500000000000000F002401453697A652E506C6174666F726D44656661
756C74080B5374796C654C6F6F6B75700611627574746F6E7374796C655F636C
656172085461624F7264657202020005545061746800095374796C654E616D65
060A50617468315374796C6505416C69676E0706436C69656E7409446174612E
506174680AAC0000000E00000000000000000040410000A041010000000000A8
410000A041000000000000844100006040020000002CA18A4178FF2A40020000
00EF5F9541A1062B400200000000009C4100106040020000003D9FA2415E898A
40020000004B9FA241E07DB540020000001F009C4183FFCF40010000000000E0
400000984101000000000040400000A041010000000000804000008041010000
0000008441000060400300000000008441000060400946696C6C2E4B696E6407
044E6F6E65064C6F636B6564090748697454657374080A53697A652E57696474
680500000000000000E002400B53697A652E4865696768740500000000000000
D002401453697A652E506C6174666F726D44656661756C74080C5374726F6B65
2E436F6C6F72070978464644394439453308577261704D6F6465070346697400
0F54436F6C6F72416E696D6174696F6E00095374796C654E616D650614436F6C
6F72416E696D6174696F6E315374796C6507456E61626C656409084475726174
696F6E0500000000006F1283F53F07496E7665727365090C50726F7065727479
4E616D65060C5374726F6B652E436F6C6F720A537461727456616C7565070978
46464439443945330953746F7056616C75650708636C61576869746507547269
67676572061049734D6F7573654F7665723D747275650E54726967676572496E
7665727365061149734D6F7573654F7665723D66616C73650000000000005450
463007544C61796F757400095374796C654E616D6506106D656D6F7374796C65
5F6E6F726D616C05416C69676E070643656E7465720C50616464696E672E4C65
667405000000000000008001400B50616464696E672E546F7005000000000000
008001400D50616464696E672E526967687405000000000000008001400E5061
6464696E672E426F74746F6D05000000000000008001400A53697A652E576964
74680500000000000000F406400B53697A652E48656967687405000000000000
009908401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508085461624F726465720222000A5452656374616E676C6500095374796C
654E616D650602626705416C69676E0708436F6E74656E74730A46696C6C2E43
6F6C6F7207097833434646464646460748697454657374080A53697A652E5769
6474680500000000000000F406400B53697A652E486569676874050000000000
00009908401453697A652E506C6174666F726D44656661756C74080C5374726F
6B652E436F6C6F72070978354146464646464607585261646975730500000000
000000C0004007595261646975730500000000000000C00040000F54436F6C6F
72416E696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D
6174696F6E315374796C65084475726174696F6E050000000000CDCCCCFC3F0C
50726F70657274794E616D65060C5374726F6B652E436F6C6F720A5374617274
56616C756507097835414646464646460953746F7056616C7565070978433846
46464646460754726967676572060E4973466F63757365643D747275650E5472
6967676572496E7665727365060F4973466F63757365643D66616C7365000000
0C5442727573684F626A65637400095374796C654E616D65060A666F72656772
6F756E6400000C5442727573684F626A65637400095374796C654E616D650609
73656C656374696F6E0B42727573682E436F6C6F720709783746324139364646
00000B54466F6E744F626A65637400095374796C654E616D650604666F6E7409
466F6E742E53697A650500000000000000E00240000007544C61796F75740009
5374796C654E616D650607636F6E74656E7405416C69676E0706436C69656E74
0C4D617267696E732E4C65667405000000000000008001400B4D617267696E73
2E546F7005000000000000008001400D4D617267696E732E5269676874050000
00000000008001400E4D617267696E732E426F74746F6D050000000000000080
01400A53697A652E57696474680500000000000000DC06400B53697A652E4865
6967687405000000000000009308401453697A652E506C6174666F726D446566
61756C7408085461624F72646572020000000A545363726F6C6C426172000953
74796C654E616D65060A767363726F6C6C62617205416C69676E070552696768
7406437572736F72070763724172726F770B536D616C6C4368616E6765050000
00000000000000000B4F7269656E746174696F6E0708566572746963616C0A50
6F736974696F6E2E580500000000000000E806400A506F736974696F6E2E5905
000000000000008001400A53697A652E57696474680500000000000000800240
0B53697A652E48656967687405000000000000009508401453697A652E506C61
74666F726D44656661756C7408085461624F72646572020100000A545363726F
6C6C42617200095374796C654E616D65060A687363726F6C6C62617205416C69
676E0706426F74746F6D06437572736F72070763724172726F770B536D616C6C
4368616E676505000000000000000000000B4F7269656E746174696F6E070A48
6F72697A6F6E74616C0A506F736974696F6E2E5805000000000000008001400A
506F736974696F6E2E5905000000000000009608400A53697A652E5769647468
0500000000000000EC06400B53697A652E486569676874050000000000000080
02401453697A652E506C6174666F726D44656661756C7408085461624F726465
720202000007544C61796F75740005416C69676E0706436C69656E740A53697A
652E57696474680500000000000000E406400B53697A652E4865696768740500
0000000000009508401453697A652E506C6174666F726D44656661756C740808
5461624F726465720203000F54536D616C6C5363726F6C6C4261720009537479
6C654E616D65060F76736D616C6C7363726F6C6C62617205416C69676E070552
6967687406437572736F72070763724172726F770B536D616C6C4368616E6765
05000000000000000000000B4F7269656E746174696F6E070856657274696361
6C0C4D617267696E732E4C65667405000000000000008000400A53697A652E57
6964746805000000000000008002400B53697A652E4865696768740500000000
0000008002401453697A652E506C6174666F726D44656661756C740807566973
69626C650800000F54536D616C6C5363726F6C6C42617200095374796C654E61
6D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F
6D06437572736F72070763724172726F770B536D616C6C4368616E6765050000
00000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C
0B4D617267696E732E546F7005000000000000008000400A53697A652E576964
746805000000000000009606400B53697A652E48656967687405000000000000
008002401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508000000005450463007544C61796F757400095374796C654E616D65060F
65646974627574746F6E7374796C6505416C69676E070643656E7465720A5369
7A652E576964746805000000000000008004400B53697A652E48656967687405
000000000000008004401453697A652E506C6174666F726D44656661756C7408
0756697369626C6508085461624F726465720209000A5452656374616E676C65
00095374796C654E616D65060F52656374616E676C65315374796C6505416C69
676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978303032303231
32330748697454657374080A53697A652E576964746805000000000000008004
400B53697A652E48656967687405000000000000008004401453697A652E506C
6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
07585261646975730500000000000000C0014007595261646975730500000000
000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E61
6D650614436F6C6F72416E696D6174696F6E315374796C65084475726174696F
6E0500000000006F1283F53F0C50726F70657274794E616D65060A46696C6C2E
436F6C6F720A537461727456616C756507097830303230323132330953746F70
56616C756507097846463230323132330754726967676572061049734D6F7573
654F7665723D747275650E54726967676572496E7665727365061149734D6F75
73654F7665723D66616C73650000000654476C79706800095374796C654E616D
65060A676C7970687374796C650C4D617267696E732E4C656674050000000000
00008000400B4D617267696E732E546F7005000000000000008000400D4D6172
67696E732E526967687405000000000000008000400E4D617267696E732E426F
74746F6D050000000000000080004005416C69676E070643656E7465720A5369
7A652E57696474680500000000000000C003400B53697A652E48656967687405
00000000000000C003401453697A652E506C6174666F726D44656661756C7408
0A496D616765496E6465780202000E5446696C6C524742456666656374000953
74796C654E616D65061346696C6C524742456666656374315374796C6505436F
6C6F720709784646443944394533000000005450463007544C61796F75740009
5374796C654E616D6506126C697374626F787374796C655F636C65617205416C
69676E070643656E7465720A53697A652E57696474680500000000000000F406
400B53697A652E48656967687405000000000000009908401453697A652E506C
6174666F726D44656661756C74080756697369626C6508085461624F72646572
0220000C5442727573684F626A65637400095374796C654E616D650618416C74
65726E6174696E67526F774261636B67726F756E640B42727573682E436F6C6F
720709784646454545454545000007544C61796F757400095374796C654E616D
650607636F6E74656E7405416C69676E0706436C69656E740C436C6970436869
6C6472656E090A53697A652E57696474680500000000000000EC06400B53697A
652E48656967687405000000000000009708401453697A652E506C6174666F72
6D44656661756C7408085461624F72646572020000000A545363726F6C6C4261
7200095374796C654E616D65060A767363726F6C6C62617205416C69676E0705
52696768740B536D616C6C4368616E676505000000000000000000000B4F7269
656E746174696F6E0708566572746963616C0A506F736974696F6E2E58050000
0000000000EC06400A53697A652E576964746805000000000000008002400B53
697A652E48656967687405000000000000009708401453697A652E506C617466
6F726D44656661756C7408085461624F72646572020100000A545363726F6C6C
42617200095374796C654E616D65060A687363726F6C6C62617205416C69676E
0706426F74746F6D0B536D616C6C4368616E676505000000000000000000000B
4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E
2E5905000000000000009708400A53697A652E57696474680500000000000000
F406400B53697A652E48656967687405000000000000008002401453697A652E
506C6174666F726D44656661756C7408085461624F726465720202000007544C
61796F75740005416C69676E0706436C69656E740A53697A652E576964746805
00000000000000EC06400B53697A652E48656967687405000000000000009708
401453697A652E506C6174666F726D44656661756C7408085461624F72646572
0203000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F
76736D616C6C7363726F6C6C62617205416C69676E070552696768740B536D61
6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07
08566572746963616C0C4D617267696E732E4C65667405000000000000008000
400A53697A652E576964746805000000000000008002400B53697A652E486569
67687405000000000000008002401453697A652E506C6174666F726D44656661
756C74080756697369626C650800000F54536D616C6C5363726F6C6C42617200
095374796C654E616D65060F68736D616C6C7363726F6C6C62617205416C6967
6E0706426F74746F6D0B536D616C6C4368616E67650500000000000000000000
0B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E73
2E546F7005000000000000008000400A53697A652E5769647468050000000000
00009606400B53697A652E48656967687405000000000000008002401453697A
652E506C6174666F726D44656661756C74080756697369626C65080000000754
4C61796F757400095374796C654E616D65060668656164657205416C69676E07
03546F700A53697A652E57696474680500000000000000C804400B53697A652E
4865696768740500000000000000C804401453697A652E506C6174666F726D44
656661756C74080756697369626C6508085461624F726465720204000007544C
61796F757400095374796C654E616D650606666F6F74657205416C69676E0706
426F74746F6D0A53697A652E57696474680500000000000000C804400B53697A
652E4865696768740500000000000000C804401453697A652E506C6174666F72
6D44656661756C74080756697369626C6508085461624F726465720205000000
5450463007544C61796F757400095374796C654E616D650613627574746F6E73
74796C655F7072696D61727905416C69676E070643656E746572074F70616369
7479050000000000CDCCCCFE3F0A53697A652E57696474680500000000000000
A004400B53697A652E4865696768740500000000000000A004401453697A652E
506C6174666F726D44656661756C74080756697369626C6508085461624F7264
6572020A000654476C79706800095374796C654E616D65060A676C7970687374
796C6505416C69676E070643656E7465720A53697A652E576964746805000000
00000000C003400B53697A652E4865696768740500000000000000C003401453
697A652E506C6174666F726D44656661756C74080A496D616765496E64657802
00000E5446696C6C52474245666665637400095374796C654E616D6506134669
6C6C524742456666656374315374796C6505436F6C6F72070978464644394439
45330000000F54466C6F6174416E696D6174696F6E00095374796C654E616D65
0614466C6F6174416E696D6174696F6E315374796C65084475726174696F6E05
0000000000CDCCCCFC3F0C50726F70657274794E616D6506074F706163697479
0A537461727456616C7565050000000000CDCCCCFE3F0953746F7056616C7565
050000000000000080FF3F0754726967676572061049734D6F7573654F766572
3D747275650E54726967676572496E7665727365061149734D6F7573654F7665
723D66616C73650000005450463007544C61796F757400095374796C654E616D
65060F656469747374796C655F636C65617205416C69676E070643656E746572
0A53697A652E57696474680500000000000000D606400B53697A652E48656967
687405000000000000008C04401453697A652E506C6174666F726D4465666175
6C74080756697369626C6508085461624F726465720224000A5452656374616E
676C6500095374796C654E616D650602626705416C69676E0708436F6E74656E
74730A46696C6C2E436F6C6F7207097833434646464646460748697454657374
080A53697A652E57696474680500000000000000D606400B53697A652E486569
67687405000000000000008C04401453697A652E506C6174666F726D44656661
756C74080C5374726F6B652E436F6C6F72070978354146464646464607585261
646975730500000000000000C0004007595261646975730500000000000000C0
0040000F54436F6C6F72416E696D6174696F6E00095374796C654E616D650614
436F6C6F72416E696D6174696F6E315374796C65084475726174696F6E050000
000000CDCCCCFC3F0C50726F70657274794E616D65060C5374726F6B652E436F
6C6F720A537461727456616C756507097835414646464646460953746F705661
6C756507097843384646464646460754726967676572060E4973466F63757365
643D747275650E54726967676572496E7665727365060F4973466F6375736564
3D66616C73650000000C5442727573684F626A65637400095374796C654E616D
65060A666F726567726F756E6400000C5442727573684F626A65637400095374
796C654E616D65060973656C656374696F6E0B42727573682E436F6C6F720709
78374632413936464600000B54466F6E744F626A65637400095374796C654E61
6D650604666F6E7409466F6E742E53697A650500000000000000E00240000007
544C61796F757400095374796C654E616D650607636F6E74656E7405416C6967
6E0706436C69656E740C4D617267696E732E4C6566740500000000000000C000
400B4D617267696E732E546F700500000000000000C000400D4D617267696E73
2E52696768740500000000000000C000400E4D617267696E732E426F74746F6D
0500000000000000C000400A53697A652E57696474680500000000000000CE06
400B53697A652E4865696768740500000000000000E803401453697A652E506C
6174666F726D44656661756C7408085461624F726465720200000007544C6179
6F757400095374796C654E616D650607627574746F6E7305416C69676E070552
69676874064C6F636B6564090B4D617267696E732E546F700500000000000000
8000400D4D617267696E732E526967687405000000000000008000400E4D6172
67696E732E426F74746F6D05000000000000008000400A506F736974696F6E2E
580500000000000000D406400A506F736974696F6E2E59050000000000000080
00400A53697A652E576964746805000000000000000000000B53697A652E4865
696768740500000000000000F803401453697A652E506C6174666F726D446566
61756C7408085461624F726465720201000006544C6162656C00095374796C65
4E616D65060670726F6D7074064C6F636B656409074F70616369747905000000
0000000080FE3F0756697369626C6508085461624F7264657202030000005450
463007544C61796F757400095374796C654E616D6506157363726F6C6C626172
626F74746F6D627574746F6E05416C69676E070643656E7465720A53697A652E
576964746805000000000000008803400B53697A652E48656967687405000000
000000008803401453697A652E506C6174666F726D44656661756C7408075669
7369626C6508085461624F72646572021F000554506174680005416C69676E07
0643656E74657209446174612E506174680A3400000004000000000000000000
000000000000010000000000803F00000000010000000000003F0000803F0300
000000000000000000000A46696C6C2E436F6C6F720707636C6147726179064C
6F636B6564090748697454657374080A53697A652E5769647468050000000000
00008002400B53697A652E4865696768740500000000000000E001401453697A
652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704
4E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
0000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F
6C6F720A537461727456616C75650707636C61477261790953746F7056616C75
6507097846464343434343430754726967676572061049734D6F7573654F7665
723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469
6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C
2E436F6C6F720A537461727456616C756507097846464343434343430953746F
7056616C75650707636C61477261790754726967676572061149734D6F757365
4F7665723D66616C7365000000005450463007544C61796F757400095374796C
654E616D6506147363726F6C6C62617268747261636B7374796C6505416C6967
6E070643656E7465720A53697A652E576964746805000000000000009803400B
53697A652E4865696768740500000000000100FC04401453697A652E506C6174
666F726D44656661756C74080756697369626C6508085461624F72646572021E
0006545468756D6200095374796C654E616D6506057468756D62064C6F636B65
64090A506F736974696F6E2E580500000000000000A001400A506F736974696F
6E2E590500000000000000A001400A53697A652E576964746805000000000000
00A002400B53697A652E4865696768740500000000000000B804401453697A65
2E506C6174666F726D44656661756C74080000005450463007544C61796F7574
00095374796C654E616D6506137363726F6C6C6261726C656674627574746F6E
05416C69676E070643656E7465720A53697A652E576964746805000000000000
00A803400B53697A652E4865696768740500000000000000A803401453697A65
2E506C6174666F726D44656661756C74080756697369626C6508085461624F72
6465720221000554506174680005416C69676E070643656E7465720944617461
2E506174680A4000000005000000000000000000803F00000000010000000000
803F0000803F01000000000000000000003F010000000000803F000000000300
000000000000000000000A46696C6C2E436F6C6F720707636C6147726179064C
6F636B6564090748697454657374080A53697A652E5769647468050000000000
0000E001400B53697A652E48656967687405000000000000008002401453697A
652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704
4E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E05
0000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E436F
6C6F720A537461727456616C75650707636C61477261790953746F7056616C75
6507097846464343434343430754726967676572061049734D6F7573654F7665
723D7472756500000F54436F6C6F72416E696D6174696F6E0008447572617469
6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C
2E436F6C6F720A537461727456616C756507097846464343434343430953746F
7056616C75650707636C61477261790754726967676572061149734D6F757365
4F7665723D66616C7365000000005450463007544C61796F757400095374796C
654E616D6506147363726F6C6C6261727269676874627574746F6E05416C6967
6E070643656E7465720A53697A652E57696474680500000000000000B003400B
53697A652E4865696768740500000000000000A003401453697A652E506C6174
666F726D44656661756C74080756697369626C6508085461624F726465720223
000554506174680005416C69676E070643656E74657209446174612E50617468
0A34000000040000000000000000000000000000000100000000000000000080
3F010000000000803F0000003F0300000000000000000000000A46696C6C2E43
6F6C6F720707636C6147726179064C6F636B6564090748697454657374080A53
697A652E57696474680500000000000000E001400B53697A652E486569676874
05000000000000008002401453697A652E506C6174666F726D44656661756C74
080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D61
74696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F706572
74794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565070763
6C61477261790953746F7056616C756507097846464343434343430754726967
676572061049734D6F7573654F7665723D7472756500000F54436F6C6F72416E
696D6174696F6E00084475726174696F6E050000000000CDCCCCFB3F0C50726F
70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565
07097846464343434343430953746F7056616C75650707636C61477261790754
726967676572061149734D6F7573654F7665723D66616C736500000000545046
3007544C61796F757400095374796C654E616D65060E7363726F6C6C62617273
74796C6505416C69676E070643656E7465720A53697A652E5769647468050000
00000000009008400B53697A652E486569676874050000000000008085074014
53697A652E506C6174666F726D44656661756C74080756697369626C65080854
61624F726465720227000A54526F756E645265637400095374796C654E616D65
060A6261636B67726F756E6405416C69676E0708436F6E74656E74730A46696C
6C2E436F6C6F7207097831453333333333330A53697A652E5769647468050000
00000000009008400B53697A652E486569676874050000000000008085074014
53697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E
6407044E6F6E6500000654547261636B00095374796C654E616D650606687472
61636B05416C69676E0706436C69656E74064C6F636B656409034D6178050000
000000000080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E74616C
0A53697A652E576964746805000000000000009008400B53697A652E48656967
687405000000000000808507401453697A652E506C6174666F726D4465666175
6C74080B5374796C654C6F6F6B757006147363726F6C6C62617268747261636B
7374796C650C56696577706F727453697A65050000000000CDCCCCFB3F000006
54547261636B00095374796C654E616D65060676747261636B05416C69676E07
06436C69656E74064C6F636B656409034D6178050000000000000080FF3F0B4F
7269656E746174696F6E070A486F72697A6F6E74616C0A53697A652E57696474
6805000000000000009008400B53697A652E4865696768740500000000000080
8507401453697A652E506C6174666F726D44656661756C74080B5374796C654C
6F6F6B757006147363726F6C6C62617276747261636B7374796C650C56696577
706F727453697A65050000000000CDCCCCFB3F0000005450463007544C61796F
757400095374796C654E616D6506127363726F6C6C626172746F70627574746F
6E05416C69676E070643656E7465720A53697A652E5769647468050000000000
00008003400B53697A652E48656967687405000000000000009803401453697A
652E506C6174666F726D44656661756C74080756697369626C6508085461624F
726465720226000554506174680005416C69676E070643656E74657209446174
612E506174680A400000000500000000000000000000000000803F0100000000
00803F0000803F010000000000003F0000000001000000000000000000803F03
00000000000000000000000A46696C6C2E436F6C6F720707636C614772617906
4C6F636B6564090748697454657374080A53697A652E57696474680500000000
0000008002400B53697A652E4865696768740500000000000000E00140145369
7A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407
044E6F6E65000F54436F6C6F72416E696D6174696F6E00084475726174696F6E
050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C6C2E43
6F6C6F720A537461727456616C75650707636C61477261790953746F7056616C
756507097846464343434343430754726967676572061049734D6F7573654F76
65723D7472756500000F54436F6C6F72416E696D6174696F6E00084475726174
696F6E050000000000CDCCCCFB3F0C50726F70657274794E616D65060A46696C
6C2E436F6C6F720A537461727456616C75650709784646434343434343095374
6F7056616C75650707636C61477261790754726967676572061149734D6F7573
654F7665723D66616C7365000000005450463007544C61796F75740009537479
6C654E616D6506147363726F6C6C62617276747261636B7374796C6505416C69
676E070643656E7465720A53697A652E57696474680500000000000000F60540
0B53697A652E48656967687405000000000000009003401453697A652E506C61
74666F726D44656661756C74080756697369626C6508085461624F7264657202
170006545468756D6200095374796C654E616D6506057468756D620643757273
6F72070B637248616E64506F696E74064C6F636B6564090A506F736974696F6E
2E5805000000000000008001400A506F736974696F6E2E590500000000000000
8001400A53697A652E57696474680500000000000000BC04400B53697A652E48
656967687405000000000000009002401453697A652E506C6174666F726D4465
6661756C74080756697369626C6508000000545046300A54526F756E64526563
7400095374796C654E616D650619736D616C6C7363726F6C6C62617268747261
636B7374796C6505416C69676E070643656E7465720A46696C6C2E436F6C6F72
07097831453333333333330A53697A652E57696474680500000000000040A408
400B53697A652E48656967687405000000000000009003401453697A652E506C
6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
0756697369626C65080006545468756D6200095374796C654E616D6506057468
756D62064C6F636B6564090C4D617267696E732E4C6566740500000000000000
80FF3F0B4D617267696E732E546F70050000000000000080FF3F0D4D61726769
6E732E5269676874050000000000000080FF3F0E4D617267696E732E426F7474
6F6D050000000000000080FF3F0A506F736974696F6E2E580500000000000000
C000400A506F736974696F6E2E590500000000000000C002C00A53697A652E57
696474680500000000000000A002400B53697A652E4865696768740500000000
000000B804401453697A652E506C6174666F726D44656661756C740800000054
50463007544C61796F757400095374796C654E616D650613736D616C6C736372
6F6C6C6261727374796C6505416C69676E070643656E7465720A53697A652E57
696474680500000000000000FA05400B53697A652E4865696768740500000000
000040B408401453697A652E506C6174666F726D44656661756C740807566973
69626C6508085461624F72646572021D000654547261636B00095374796C654E
616D65060668747261636B05416C69676E0706436C69656E74064C6F636B6564
09034D6178050000000000000080FF3F0B4F7269656E746174696F6E070A486F
72697A6F6E74616C0A53697A652E57696474680500000000000000FA05400B53
697A652E4865696768740500000000000040B408401453697A652E506C617466
6F726D44656661756C74080B5374796C654C6F6F6B75700619736D616C6C7363
726F6C6C62617268747261636B7374796C650C56696577706F727453697A6505
0000000000CDCCCCFB3F00000654547261636B00095374796C654E616D650606
76747261636B05416C69676E0706436C69656E74064C6F636B656409034D6178
050000000000000080FF3F0B4F7269656E746174696F6E070A486F72697A6F6E
74616C0A53697A652E57696474680500000000000000FA05400B53697A652E48
65696768740500000000000040B408401453697A652E506C6174666F726D4465
6661756C74080B5374796C654C6F6F6B75700619736D616C6C7363726F6C6C62
617276747261636B7374796C650C56696577706F727453697A65050000000000
CDCCCCFB3F000000545046300A54526F756E645265637400095374796C654E61
6D650619736D616C6C7363726F6C6C62617276747261636B7374796C6505416C
69676E070643656E7465720A46696C6C2E436F6C6F7207097831453333333333
330A53697A652E57696474680500000000000000A003400B53697A652E486569
6768740500000000000000FC07401453697A652E506C6174666F726D44656661
756C74080B5374726F6B652E4B696E6407044E6F6E650756697369626C650800
06545468756D6200095374796C654E616D6506057468756D62064C6F636B6564
090C4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E
732E546F70050000000000000080FF3F0D4D617267696E732E52696768740500
00000000000080FF3F0E4D617267696E732E426F74746F6D0500000000000000
80FF3F0A506F736974696F6E2E5805000000000000009002C00A506F73697469
6F6E2E590500000000000000C002400A53697A652E5769647468050000000000
0000BC04400B53697A652E48656967687405000000000000009002401453697A
652E506C6174666F726D44656661756C74080000005450463007544C61796F75
7400095374796C654E616D65060A7468756D627374796C6505416C69676E0706
43656E74657206437572736F72070B637248616E64506F696E740A53697A652E
576964746805000000000000009003400B53697A652E48656967687405000000
000000008803401453697A652E506C6174666F726D44656661756C7408075669
7369626C6508085461624F72646572021C000A54526F756E6452656374000953
74796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E74
656E74730A46696C6C2E436F6C6F720709784646353635383639064C6F636B65
64090748697454657374080A53697A652E576964746805000000000000009003
400B53697A652E48656967687405000000000000008803401453697A652E506C
6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
000F54436F6C6F72416E696D6174696F6E00095374796C654E616D650614436F
6C6F72416E696D6174696F6E315374796C65084475726174696F6E0500000000
000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A
537461727456616C756507097846463536353836390953746F7056616C756507
097846464143414342450754726967676572061049734D6F7573654F7665723D
747275650E54726967676572496E7665727365061149734D6F7573654F766572
3D66616C7365000000005450463007544C61796F757400095374796C654E616D
65060A747261636B7374796C6505416C69676E070643656E7465720A53697A65
2E576964746805000000000000009D06400B53697A652E486569676874050000
00000000009003401453697A652E506C6174666F726D44656661756C74080756
697369626C6508085461624F72646572021B000A5452656374616E676C650009
5374796C654E616D65060A6261636B67726F756E6405416C69676E0708436F6E
74656E74730A46696C6C2E436F6C6F720709784646353035303530064C6F636B
6564090748697454657374080A53697A652E576964746805000000000000009D
06400B53697A652E48656967687405000000000000009003401453697A652E50
6C6174666F726D44656661756C74080C5374726F6B652E436F6C6F7207097846
4633303330333007585261646975730500000000000000800140075952616469
75730500000000000000800140000006545468756D6200095374796C654E616D
6506057468756D6206437572736F72070B637248616E64506F696E74064C6F63
6B6564090A506F736974696F6E2E580500000000000000C000400A506F736974
696F6E2E59050000000000000080FF3F0A53697A652E57696474680500000000
000000C404400B53697A652E4865696768740500000000000000F00240145369
7A652E506C6174666F726D44656661756C74080000005450463007544C61796F
757400095374796C654E616D65060E7363726F6C6C626F787374796C6505416C
69676E070643656E7465720A53697A652E57696474680500000000000000CD07
400B53697A652E4865696768740500000000000000BE07401453697A652E506C
6174666F726D44656661756C74080756697369626C6508085461624F72646572
02310007544C61796F757400095374796C654E616D65060A6261636B67726F75
6E6405416C69676E0708436F6E74656E7473064C6F636B6564090A53697A652E
57696474680500000000000000CD07400B53697A652E48656967687405000000
00000000BE07401453697A652E506C6174666F726D44656661756C7408000754
4C61796F757400095374796C654E616D650607636F6E74656E7405416C69676E
0708436F6E74656E74730D4D617267696E732E52696768740500000000000000
C002400A53697A652E57696474680500000000000000C707400B53697A652E48
65696768740500000000000000BE07401453697A652E506C6174666F726D4465
6661756C7408000007544C61796F75740005416C69676E0706436C69656E740A
53697A652E57696474680500000000000000C607400B53697A652E4865696768
740500000000000000B707401453697A652E506C6174666F726D44656661756C
7408000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F
76736D616C6C7363726F6C6C62617205416C69676E070552696768740B536D61
6C6C4368616E676505000000000000000000000B4F7269656E746174696F6E07
08566572746963616C0C4D617267696E732E4C65667405000000000000008000
400A53697A652E576964746805000000000000008002400B53697A652E486569
67687405000000000000008002401453697A652E506C6174666F726D44656661
756C74080B5374796C654C6F6F6B757006227363726F6C6C626F787374796C65
536D616C6C5363726F6C6C4261725374796C65310756697369626C650800000F
54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D61
6C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C43
68616E676505000000000000000000000B4F7269656E746174696F6E070A486F
72697A6F6E74616C0B4D617267696E732E546F7005000000000000008000400A
53697A652E576964746805000000000000009606400B53697A652E4865696768
7405000000000000008002401453697A652E506C6174666F726D44656661756C
74080756697369626C650800000007544C61796F75740005416C69676E070843
6F6E74656E74730A53697A652E57696474680500000000000000CD07400B5369
7A652E4865696768740500000000000000BE07401453697A652E506C6174666F
726D44656661756C74080007544C61796F75740005416C69676E0706426F7474
6F6D0A506F736974696F6E2E590500000000000000A507400A53697A652E5769
6474680500000000000000CD07400B53697A652E486569676874050000000000
0000C804401453697A652E506C6174666F726D44656661756C74080009545369
7A654772697000095374796C654E616D65060873697A656772697005416C6967
6E07055269676874064C6F636B6564090A506F736974696F6E2E580500000000
000000C307400A53697A652E57696474680500000000000000A003400B53697A
652E4865696768740500000000000000C804401453697A652E506C6174666F72
6D44656661756C74080B5374796C654C6F6F6B7570061C7363726F6C6C626F78
7374796C6553697A65477269705374796C6531000000000A545363726F6C6C42
617200095374796C654E616D65060A767363726F6C6C62617205416C69676E07
0552696768740B536D616C6C4368616E676505000000000000000000000B4F72
69656E746174696F6E0708566572746963616C0C4D617267696E732E4C656674
0500000000000000C000400B4D617267696E732E546F700500000000000000C0
00400D4D617267696E732E52696768740500000000000000C000400E4D617267
696E732E426F74746F6D0500000000000000C000400A506F736974696F6E2E58
0500000000000080C707400A506F736974696F6E2E590500000000000000C000
400A53697A652E576964746805000000000000008002400B53697A652E486569
6768740500000000000000B407401453697A652E506C6174666F726D44656661
756C74080B5374796C654C6F6F6B7570061D7363726F6C6C626F787374796C65
5363726F6C6C4261725374796C653100000A545363726F6C6C42617200095374
796C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F
6D0B536D616C6C4368616E676505000000000000000000000B4F7269656E7461
74696F6E070A486F72697A6F6E74616C0C4D617267696E732E4C656674050000
0000000000C000400B4D617267696E732E546F700500000000000000C000400D
4D617267696E732E52696768740500000000000000C000400E4D617267696E73
2E426F74746F6D0500000000000000C000400A506F736974696F6E2E58050000
0000000000C000400A506F736974696F6E2E590500000000000080B807400A53
697A652E57696474680500000000000000CA07400B53697A652E486569676874
05000000000000008002401453697A652E506C6174666F726D44656661756C74
08000000005450463007544C61796F757400095374796C654E616D6506106275
74746F6E7374796C655F6D656E7505416C69676E070643656E7465720C506164
64696E672E4C6566740500000000000000C002400B50616464696E672E546F70
0500000000000000C002400D50616464696E672E526967687405000000000000
00C002400E50616464696E672E426F74746F6D0500000000000000C002400A53
697A652E57696474680500000000000000F406400B53697A652E486569676874
0500000000000000B004401453697A652E506C6174666F726D44656661756C74
080756697369626C6508085461624F726465720203000A5452656374616E676C
6500095374796C654E616D65060F52656374616E676C65315374796C6505416C
69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709783030324132
4233320748697454657374080A53697A652E57696474680500000000000000F4
06400B53697A652E4865696768740500000000000000B004401453697A652E50
6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
6507585261646975730500000000000000C00140075952616469757305000000
00000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E
616D6506046F766572084475726174696F6E0500000000006F1283F53F0C5072
6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75
6507097830303241324233320953746F7056616C756507097846463241324233
320754726967676572061049734D6F7573654F7665723D747275650E54726967
676572496E7665727365061149734D6F7573654F7665723D66616C7365000000
0654476C79706800095374796C654E616D65060A676C7970687374796C650B4D
617267696E732E546F7005000000000000008000400D4D617267696E732E5269
6768740500000000000000C002400E4D617267696E732E426F74746F6D050000
000000000080004005416C69676E07044C6566740A506F736974696F6E2E5805
00000000000000C002400A506F736974696F6E2E590500000000000000E00240
0A53697A652E576964746805000000000000008003400B53697A652E48656967
687405000000000000008003401453697A652E506C6174666F726D4465666175
6C74080A496D616765496E6465780201000E5446696C6C524742456666656374
00095374796C654E616D65061346696C6C524742456666656374315374796C65
05436F6C6F7207097846464439443945330000001654427574746F6E5374796C
65546578744F626A65637400095374796C654E616D6506047465787405416C69
676E0706436C69656E74064C6F636B6564090A53697A652E5769647468050000
0000000000DC06400B53697A652E4865696768740500000000000000A0034014
53697A652E506C6174666F726D44656661756C7408165465787453657474696E
67732E466F6E742E53697A650500000000000000E00240165465787453657474
696E67732E466F6E74436F6C6F720708636C6157686974651554657874536574
74696E67732E5472696D6D696E67070943686172616374657215546578745365
7474696E67732E576F72645772617008165465787453657474696E67732E486F
727A416C69676E07074C656164696E670D536861646F7756697369626C650808
486F74436F6C6F720708636C6157686974650C466F6375736564436F6C6F7207
08636C6157686974650B4E6F726D616C436F6C6F720708636C6157686974650C
50726573736564436F6C6F720708636C6157686974650000005450463007544C
61796F757400095374796C654E616D650613627574746F6E7374796C655F636F
6E6669726D05416C69676E070643656E7465720A53697A652E57696474680500
0000000000008004400B53697A652E4865696768740500000000000000800440
1453697A652E506C6174666F726D44656661756C74080756697369626C650808
5461624F726465720205000A5452656374616E676C6500095374796C654E616D
65060F52656374616E676C65315374796C6505416C69676E0708436F6E74656E
74730A46696C6C2E436F6C6F7207097830304646464646460748697454657374
080A53697A652E576964746805000000000000008004400B53697A652E486569
67687405000000000000008004401453697A652E506C6174666F726D44656661
756C74080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500
000000000000C0014007595261646975730500000000000000C00140000F5443
6F6C6F72416E696D6174696F6E00095374796C654E616D650614436F6C6F7241
6E696D6174696F6E315374796C65084475726174696F6E0500000000006F1283
F53F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172
7456616C756507097830304646464646460953746F7056616C75650709783134
4646464646460754726967676572061049734D6F7573654F7665723D74727565
0E54726967676572496E7665727365061149734D6F7573654F7665723D66616C
73650000000654476C79706800095374796C654E616D65060A676C7970687374
796C650B4D617267696E732E546F7005000000000000008000400D4D61726769
6E732E526967687405000000000000008000400E4D617267696E732E426F7474
6F6D050000000000000080004005416C69676E070643656E7465720A53697A65
2E57696474680500000000000000C003400B53697A652E486569676874050000
0000000000C003401453697A652E506C6174666F726D44656661756C74080A49
6D616765496E6465780202000E5446696C6C5247424566666563740009537479
6C654E616D65061346696C6C524742456666656374315374796C6505436F6C6F
720709784646443944394533000000005450463007544C61796F757400095374
796C654E616D65060E6D656D6F7374796C655F636F646505416C69676E070643
656E7465720A53697A652E57696474680500000000000000C806400B53697A65
2E4865696768740500000000000000C806401453697A652E506C6174666F726D
44656661756C74080756697369626C6508085461624F726465720230000A5452
656374616E676C6500095374796C654E616D65060F52656374616E676C653153
74796C6505416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207
097833323030303030300748697454657374080A53697A652E57696474680500
000000000000C806400B53697A652E4865696768740500000000000000C80640
1453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B69
6E6407044E6F6E6507585261646975730500000000000000C001400759526164
6975730500000000000000C0014000000C5442727573684F626A656374000953
74796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F72
0708636C61426C61636B00000C5442727573684F626A65637400095374796C65
4E616D65060973656C656374696F6E0B42727573682E436F6C6F720709783634
34453445353300000B54466F6E744F626A65637400095374796C654E616D6506
04666F6E74000007544C61796F757400095374796C654E616D650607636F6E74
656E7405416C69676E0706436C69656E740C4D617267696E732E4C6566740500
000000000000A001400B4D617267696E732E546F700500000000000000A00140
0D4D617267696E732E52696768740500000000000000A001400E4D617267696E
732E426F74746F6D0500000000000000A001400A53697A652E57696474680500
000000000000B606400B53697A652E4865696768740500000000000000B60640
1453697A652E506C6174666F726D44656661756C7408085461624F7264657202
0000000A545363726F6C6C42617200095374796C654E616D65060A767363726F
6C6C62617205416C69676E0705526967687406437572736F7207076372417272
6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74
6174696F6E0708566572746963616C0A506F736974696F6E2E58050000000000
0000C006400A53697A652E576964746805000000000000008002400B53697A65
2E4865696768740500000000000000C006401453697A652E506C6174666F726D
44656661756C7408085461624F72646572020100000A545363726F6C6C426172
00095374796C654E616D65060A687363726F6C6C62617205416C69676E070642
6F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E67
6505000000000000000000000B4F7269656E746174696F6E070A486F72697A6F
6E74616C0A506F736974696F6E2E590500000000000000C006400A53697A652E
57696474680500000000000000C806400B53697A652E48656967687405000000
000000008002401453697A652E506C6174666F726D44656661756C7408085461
624F726465720202000007544C61796F75740005416C69676E0706436C69656E
740A53697A652E57696474680500000000000000C006400B53697A652E486569
6768740500000000000000C006401453697A652E506C6174666F726D44656661
756C7408085461624F726465720203000F54536D616C6C5363726F6C6C426172
00095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69
676E0705526967687406437572736F72070763724172726F770B536D616C6C43
68616E676505000000000000000000000B4F7269656E746174696F6E07085665
72746963616C0C4D617267696E732E4C65667405000000000000008000400A53
697A652E576964746805000000000000008002400B53697A652E486569676874
05000000000000008002401453697A652E506C6174666F726D44656661756C74
080756697369626C650800000F54536D616C6C5363726F6C6C42617200095374
796C654E616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706
426F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E
676505000000000000000000000B4F7269656E746174696F6E070A486F72697A
6F6E74616C0B4D617267696E732E546F7005000000000000008000400A53697A
652E576964746805000000000000009606400B53697A652E4865696768740500
0000000000008002401453697A652E506C6174666F726D44656661756C740807
56697369626C6508000000005450463007544C61796F757400095374796C654E
616D650611627574746F6E7374796C655F636C65617205416C69676E07064365
6E7465720756697369626C6508085461624F7264657202330000545046300754
4C61796F757400095374796C654E616D65060D747261636B6261727374796C65
05416C69676E070643656E7465720C50616464696E672E4C6566740500000000
0000008001400D50616464696E672E526967687405000000000000008001400A
53697A652E576964746805000000000000809507400B53697A652E4865696768
7405000000000000009803401453697A652E506C6174666F726D44656661756C
74080756697369626C6508085461624F7264657202350B466978656448656967
68740213000A54526F756E645265637400095374796C654E616D650606687472
61636B05416C69676E070A5665727443656E746572074869745465737408074F
7061636974790500000000009A9999FE3F0A506F736974696F6E2E5805000000
000000008001400A506F736974696F6E2E5905000000000000008001400A5369
7A652E576964746805000000000000809107400B53697A652E48656967687405
00000000000000B002401453697A652E506C6174666F726D44656661756C7408
0C5374726F6B652E436F6C6F720709784646443644364436000009545374796C
6554616700035461670214095374796C654E616D6506095468756D6253697A65
00000C545374796C654F626A65637400095374796C654E616D65060676747261
636B05416C69676E070A486F727A43656E746572074361704D6F646507045469
6C65064C6F636B6564090C536F757263654C6F6F6B7570061B57696E646F7773
203130204465736B746F707374796C652E706E670A506F736974696F6E2E5805
000000000000009006400A53697A652E57696474680500000000000000B00240
0B53697A652E48656967687405000000000000009803401453697A652E506C61
74666F726D44656661756C74080A536F757263654C696E6B0E010D436170496E
736574732E546F70050000000000000080014010436170496E736574732E426F
74746F6D05000000000000008001400F536F75726365526563742E4C65667405
000000000000808F07400E536F75726365526563742E546F7005000000000000
00B1064010536F75726365526563742E52696768740500000000000000950740
11536F75726365526563742E426F74746F6D0500000000000000ED064000010D
436170496E736574732E546F700500000000000000C0014010436170496E7365
74732E426F74746F6D0500000000000000C00140055363616C65050000000000
0000C0FF3F0F536F75726365526563742E4C6566740500000000000000D70740
0E536F75726365526563742E546F70050000000000008084074010536F757263
65526563742E52696768740500000000000000DF074011536F75726365526563
742E426F74746F6D0500000000000000B2074000010D436170496E736574732E
546F70050000000000000080024010436170496E736574732E426F74746F6D05
00000000000000800240055363616C6505000000000000008000400F536F7572
6365526563742E4C65667405000000000000808F08400E536F75726365526563
742E546F700500000000000000B1074010536F75726365526563742E52696768
74050000000000000095084011536F75726365526563742E426F74746F6D0500
000000000000ED07400000000A5452656374616E676C6500095374796C654E61
6D65060A6261636B67726F756E6405416C69676E0708436F6E74656E74730946
696C6C2E4B696E6407044E6F6E65064C6F636B6564090748697454657374080C
4D617267696E732E4C656674050000000000000080FF3F0B4D617267696E732E
546F7005000000000000008000400D4D617267696E732E526967687405000000
0000000080FF3F0E4D617267696E732E426F74746F6D05000000000000008000
400A53697A652E576964746805000000000000009002400B53697A652E486569
6768740500000000000000F002401453697A652E506C6174666F726D44656661
756C74080B5374726F6B652E4B696E6407044E6F6E6500000006545468756D62
00095374796C654E616D650606767468756D62064C6F636B6564090C4D617267
696E732E4C65667405000000000000008000C00B4D617267696E732E546F7005
000000000000008000C00D4D617267696E732E52696768740500000000000000
8000C00E4D617267696E732E426F74746F6D05000000000000008000C00B5374
796C654C6F6F6B7570060D7468756D626261727374796C65000006545468756D
6200095374796C654E616D650606687468756D62064C6F636B6564090C4D6172
67696E732E4C65667405000000000000008000C00B4D617267696E732E546F70
05000000000000008000C00D4D617267696E732E526967687405000000000000
008000C00E4D617267696E732E426F74746F6D05000000000000008000C00B53
74796C654C6F6F6B7570060D7468756D626261727374796C65085461624F7264
657202010000005450463007544C61796F757400095374796C654E616D65060D
7468756D626261727374796C6505416C69676E070643656E7465720A53697A65
2E57696474680500000000000000A003400B53697A652E486569676874050000
0000000000A003401453697A652E506C6174666F726D44656661756C74080756
697369626C6508085461624F726465720237000754436972636C650009537479
6C654E616D65060C436972636C65315374796C6505416C69676E0706436C6965
6E740A46696C6C2E436F6C6F720708636C615768697465074869745465737408
0A53697A652E57696474680500000000000000A003400B53697A652E48656967
68740500000000000000A003401453697A652E506C6174666F726D4465666175
6C74080C5374726F6B652E436F6C6F7207097846464444444444440000005450
463007544C61796F757400095374796C654E616D650613627574746F6E737479
6C655F77656C636F6D6505416C69676E070643656E7465720C50616464696E67
2E4C6566740500000000000000A002400B50616464696E672E546F7005000000
00000000A002400D50616464696E672E52696768740500000000000000A00240
0E50616464696E672E426F74746F6D0500000000000000A002400A53697A652E
57696474680500000000000000F406400B53697A652E48656967687405000000
00000000B804401453697A652E506C6174666F726D44656661756C7408075669
7369626C6508085461624F726465720213000A5452656374616E676C65000953
74796C654E616D65060F52656374616E676C65315374796C6505416C69676E07
08436F6E74656E74730A46696C6C2E436F6C6F72070978464633453346344207
48697454657374080A53697A652E57696474680500000000000000F406400B53
697A652E4865696768740500000000000000B804401453697A652E506C617466
6F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65075852
61646975730500000000000000C0014007595261646975730500000000000000
C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E616D6506
14436F6C6F72416E696D6174696F6E315374796C65084475726174696F6E0500
000000000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E436F6C
6F720A537461727456616C756507097846463345334634420953746F7056616C
756507097846463230323132330754726967676572061049734D6F7573654F76
65723D747275650E54726967676572496E7665727365061149734D6F7573654F
7665723D66616C73650000001654427574746F6E5374796C65546578744F626A
65637400095374796C654E616D6506047465787405416C69676E0706436C6965
6E74064C6F636B6564090A53697A652E57696474680500000000000000E00640
0B53697A652E4865696768740500000000000000D003401453697A652E506C61
74666F726D44656661756C7408165465787453657474696E67732E466F6E742E
53697A650500000000000000E00240165465787453657474696E67732E466F6E
74436F6C6F720708636C615768697465155465787453657474696E67732E5472
696D6D696E670709436861726163746572155465787453657474696E67732E57
6F72645772617008165465787453657474696E67732E486F727A416C69676E07
074C656164696E670D536861646F7756697369626C650808486F74436F6C6F72
0708636C6157686974650C466F6375736564436F6C6F720708636C6157686974
650B4E6F726D616C436F6C6F720708636C6157686974650C5072657373656443
6F6C6F720708636C6157686974650000005450463007544C61796F7574000953
74796C654E616D650613627574746F6E7374796C655F6578656375746505416C
69676E070643656E7465720C50616464696E672E4C6566740500000000000000
C002400B50616464696E672E546F7005000000000000008002400D5061646469
6E672E52696768740500000000000000C002400E50616464696E672E426F7474
6F6D05000000000000008002400A53697A652E57696474680500000000000000
F406400B53697A652E48656967687405000000000000009804401453697A652E
506C6174666F726D44656661756C74080756697369626C6508085461624F7264
6572020F000A5452656374616E676C6500095374796C654E616D65060F526563
74616E676C65315374796C6505416C69676E0708436F6E74656E74730A46696C
6C2E436F6C6F7207097846463334333534310748697454657374080A53697A65
2E57696474680500000000000000F406400B53697A652E486569676874050000
00000000009804401453697A652E506C6174666F726D44656661756C74080C53
74726F6B652E436F6C6F72070978464635363538363907585261646975730500
000000000000C0014007595261646975730500000000000000C00140000F5443
6F6C6F72416E696D6174696F6E00095374796C654E616D650614436F6C6F7241
6E696D6174696F6E315374796C65084475726174696F6E0500000000000AD7A3
F83F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172
7456616C756507097846463334333534310953746F7056616C75650709784646
3431343034450754726967676572061049734D6F7573654F7665723D74727565
0E54726967676572496E7665727365061149734D6F7573654F7665723D66616C
73650000001654427574746F6E5374796C65546578744F626A65637400095374
796C654E616D6506047465787405416C69676E0706436C69656E74064C6F636B
6564090A53697A652E57696474680500000000000000CA06400B53697A652E48
65696768740500000000000000B003401453697A652E506C6174666F726D4465
6661756C7408165465787453657474696E67732E466F6E742E53697A65050000
0000000000E00240165465787453657474696E67732E466F6E74436F6C6F7207
08636C615768697465155465787453657474696E67732E5472696D6D696E6707
09436861726163746572155465787453657474696E67732E576F726457726170
08165465787453657474696E67732E486F727A416C69676E07074C656164696E
670D536861646F7756697369626C650808486F74436F6C6F720708636C615768
6974650C466F6375736564436F6C6F720708636C6157686974650B4E6F726D61
6C436F6C6F720708636C6157686974650C50726573736564436F6C6F72070863
6C615768697465000005545061746800095374796C654E616D65060A50617468
315374796C6505416C69676E07044C65667409446174612E506174680AA80100
002300000000000000C3F59641B81E41410100000086EB4D41EC51AC41020000
004EE44A41B0AEAE4102000000129C45412C14B04102000000010040410000B0
41020000000D843E41EB1DB0410200000013013D41EB1DB0410200000020853B
410000B04102000000B97534413BF9AE410200000024B52F4162ACAB41020000
00000030410000A84101000000000030410000704101000000713DDA40000070
4102000000CFE4B640AB007041020000005B3C9A4087AD614102000000053B9A
403601504102000000903A9A4001F149410200000019AC9D40AB004441020000
00F628A44048E13E41010000007B143241A4701D4002000000E4C535412EC903
4002000000F3613D419238EF3F02000000E17A44410000004002000000468A4B
412A36084002000000DB4A5041F19C2240020000000000504100004040010000
00000050410000104101000000A47089410000104102000000CD46924154FF0F
4102000000EA70994178521E410200000040719941C9FE2F41020000005D7199
41FF0E364102000000FB94984155FF3B4102000000C4F59641B81E4141030000
00C3F59641B81E41410A46696C6C2E436F6C6F72070978464644394439453307
48697454657374080D4D617267696E732E52696768740500000000000000C001
400A506F736974696F6E2E580500000000000000C002400A506F736974696F6E
2E5905000000000000008002400A53697A652E57696474680500000000000000
C002400B53697A652E4865696768740500000000000000B003401453697A652E
506C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F
6E6508577261704D6F646507034669740000005450463007544C61796F757400
095374796C654E616D65060B636F6D626F5F7374796C6505416C69676E070643
656E7465720A53697A652E57696474680500000000000000FA06400B53697A65
2E48656967687405000000000000008404401453697A652E506C6174666F726D
44656661756C74080756697369626C6508085461624F726465720239000A5452
656374616E676C6500095374796C654E616D650602626705416C69676E070843
6F6E74656E74730A46696C6C2E436F6C6F720709783343464646464646074869
7454657374080A53697A652E57696474680500000000000000FA06400B53697A
652E48656967687405000000000000008404401453697A652E506C6174666F72
6D44656661756C74080C5374726F6B652E436F6C6F7207097835414646464646
4607585261646975730500000000000000C00040075952616469757305000000
00000000C00040000F54436F6C6F72416E696D6174696F6E00095374796C654E
616D650614436F6C6F72416E696D6174696F6E315374796C6508447572617469
6F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060C5374726F
6B652E436F6C6F720A537461727456616C756507097835414646464646460953
746F7056616C756507097843384646464646460754726967676572060E497346
6F63757365643D747275650E54726967676572496E7665727365060F4973466F
63757365643D66616C736500000A5452656374616E676C6500095374796C654E
616D6506056172726F7705416C69676E0708466974526967687407436F726E65
72730B08546F7052696768740B426F74746F6D5269676874000A46696C6C2E43
6F6C6F7207097833434646464646460748697454657374080C4D617267696E73
2E4C656674050000000000000080FF3F0B4D617267696E732E546F7005000000
0000000080FF3F0D4D617267696E732E5269676874050000000000000080FF3F
0E4D617267696E732E426F74746F6D050000000000000080FF3F0A506F736974
696F6E2E58050000000000B0F8D906400A506F736974696F6E2E590500000000
00000080FF3F0A53697A652E5769647468050000000000803AF803400B53697A
652E4865696768740500000000000000F803401453697A652E506C6174666F72
6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164
6975730500000000000000C0004007595261646975730500000000000000C000
40000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65061443
6F6C6F72416E696D6174696F6E315374796C65084475726174696F6E05000000
0000CDCCCCFC3F07496E7665727365090C50726F70657274794E616D65060A46
696C6C2E436F6C6F720A537461727456616C7565070978334346464646464609
53746F7056616C75650709783738464646464646075472696767657206104973
4D6F7573654F7665723D747275650E54726967676572496E7665727365061149
734D6F7573654F7665723D66616C7365000005545061746800095374796C654E
616D65060A50617468315374796C6505416C69676E070643656E746572094461
74612E506174680A580000000700000000000000AE476D41295C834101000000
0000C04152B8CC410100000014AE0442295C8341010000000000104200009A41
010000000000C0410000FA41010000000000404100009A4103000000AE476D41
295C83410A46696C6C2E436F6C6F720709784646443944394533074869745465
7374080A53697A652E57696474680500000000000000C002400B53697A652E48
65696768740500000000000000F803401453697A652E506C6174666F726D4465
6661756C74080B5374726F6B652E4B696E6407044E6F6E6508577261704D6F64
6507034669740000000007544C61796F757400095374796C654E616D65060763
6F6E74656E7405416C69676E0708436F6E74656E7473064C6F636B6564090C4D
617267696E732E4C6566740500000000000000C000400B4D617267696E732E54
6F700500000000000000C000400D4D617267696E732E52696768740500000000
000000B803400E4D617267696E732E426F74746F6D0500000000000000C00040
0A53697A652E57696474680500000000000000E006400B53697A652E48656967
68740500000000000000D803401453697A652E506C6174666F726D4465666175
6C740800000B54466F6E744F626A65637400095374796C654E616D650604666F
6E7409466F6E742E53697A650500000000000000E0024000000C544272757368
4F626A65637400095374796C654E616D65060A666F726567726F756E6400000C
5442727573684F626A65637400095374796C654E616D65060973656C65637469
6F6E0B42727573682E436F6C6F72070978374632413936464600000054504630
0A5452656374616E676C6500095374796C654E616D65060D64726F70646F776E
70616E656C05416C69676E070643656E7465720A46696C6C2E436F6C6F720709
7846463334333534310A53697A652E57696474680500000000000000B807400B
53697A652E4865696768740500000000000080BD07401453697A652E506C6174
666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650756
697369626C650800005450463007544C61796F757400095374796C654E616D65
060C706F706F7665727374796C6505416C69676E070643656E7465720A53697A
652E576964746805000000000000809D07400B53697A652E4865696768740500
0000000000808507401453697A652E506C6174666F726D44656661756C740807
56697369626C6508085461624F726465720210000A5452656374616E676C6500
095374796C654E616D650602626705416C69676E0706436C69656E740A46696C
6C2E436F6C6F7207097846463334333534310A53697A652E5769647468050000
00000000809D07400B53697A652E486569676874050000000000008085074014
53697A652E506C6174666F726D44656661756C74080C5374726F6B652E436F6C
6F72070978464636363637373007585261646975730500000000000000A00140
07595261646975730500000000000000A00140000D54536861646F7745666665
6374000844697374616E63650500000000006F1283F53F09446972656374696F
6E0500000000000000B4044008536F66746E657373050000000000CECCCCFC3F
074F706163697479050000000000CDCCCCFD3F0B536861646F77436F6C6F7207
08636C61426C61636B000007544C61796F757400095374796C654E616D650607
636F6E74656E7405416C69676E0706436C69656E740A53697A652E5769647468
05000000000000809D07400B53697A652E486569676874050000000000008085
07401453697A652E506C6174666F726D44656661756C7408085461624F726465
720200000000005450463007544C61796F757400095374796C654E616D65060C
6C697374626F787374796C6505416C69676E070643656E7465720A53697A652E
57696474680500000000000000E907400B53697A652E48656967687405000000
00000040D607401453697A652E506C6174666F726D44656661756C7408075669
7369626C6508085461624F726465720216000C5442727573684F626A65637400
095374796C654E616D650618416C7465726E6174696E67526F774261636B6772
6F756E640B42727573682E436F6C6F72070978464645424542454200000A5452
656374616E676C6500095374796C654E616D65060A6261636B67726F756E6405
416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978464633
34333534310748697454657374080A53697A652E576964746805000000000000
00E907400B53697A652E4865696768740500000000000040D607401453697A65
2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
78464639413941413007585261646975730500000000000000C0004007595261
646975730500000000000000C000400007544C61796F757400095374796C654E
616D650607636F6E74656E7405416C69676E0706436C69656E740C436C697043
68696C6472656E090C4D617267696E732E4C6566740500000000000000800040
0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E
526967687405000000000000008000400E4D617267696E732E426F74746F6D05
000000000000008000400A53697A652E57696474680500000000000000E30740
0B53697A652E4865696768740500000000000040D007401453697A652E506C61
74666F726D44656661756C7408085461624F72646572020000000A545363726F
6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C69
676E070552696768740B536D616C6C4368616E67650500000000000000000000
0B4F7269656E746174696F6E0708566572746963616C0A506F736974696F6E2E
580500000000000000E507400A53697A652E5769647468050000000000000080
02400B53697A652E4865696768740500000000000040D207401453697A652E50
6C6174666F726D44656661756C7408085461624F72646572020100000A545363
726F6C6C42617200095374796C654E616D65060A687363726F6C6C6261720541
6C69676E0706426F74746F6D0B536D616C6C4368616E67650500000000000000
0000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F7369
74696F6E2E590500000000000040D207400A53697A652E576964746805000000
00000000E907400B53697A652E48656967687405000000000000008002401453
697A652E506C6174666F726D44656661756C7408085461624F72646572020200
0007544C61796F75740005416C69676E0706436C69656E740A53697A652E5769
6474680500000000000000E507400B53697A652E486569676874050000000000
0040D207401453697A652E506C6174666F726D44656661756C7408085461624F
726465720203000F54536D616C6C5363726F6C6C42617200095374796C654E61
6D65060F76736D616C6C7363726F6C6C62617205416C69676E07055269676874
0B536D616C6C4368616E676505000000000000000000000B4F7269656E746174
696F6E0708566572746963616C0C4D617267696E732E4C656674050000000000
00008000400A53697A652E576964746805000000000000008002400B53697A65
2E48656967687405000000000000008002401453697A652E506C6174666F726D
44656661756C74080756697369626C650800000F54536D616C6C5363726F6C6C
42617200095374796C654E616D65060F68736D616C6C7363726F6C6C62617205
416C69676E0706426F74746F6D0B536D616C6C4368616E676505000000000000
000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D6172
67696E732E546F7005000000000000008000400A53697A652E57696474680500
0000000000009606400B53697A652E4865696768740500000000000000800240
1453697A652E506C6174666F726D44656661756C74080756697369626C650800
000007544C61796F757400095374796C654E616D65060668656164657205416C
69676E0703546F700A53697A652E57696474680500000000000000C804400B53
697A652E4865696768740500000000000000C804401453697A652E506C617466
6F726D44656661756C74080756697369626C6508085461624F72646572020400
0007544C61796F757400095374796C654E616D650606666F6F74657205416C69
676E0706426F74746F6D0A53697A652E57696474680500000000000000C80440
0B53697A652E4865696768740500000000000000C804401453697A652E506C61
74666F726D44656661756C74080756697369626C6508085461624F7264657202
05000000005450463007544C61796F75740003546167021E095374796C654E61
6D65060D6D656E756974656D7374796C6505416C69676E070643656E7465720A
53697A652E576964746805000000000000809007400B53697A652E4865696768
740500000000000000CC04401453697A652E506C6174666F726D44656661756C
74080756697369626C6508085461624F726465720215000A5452656374616E67
6C6500095374796C654E616D65060A6261636B67726F756E6405416C69676E07
08436F6E74656E74730A46696C6C2E436F6C6F72070978464634343435353007
4869745465737408074F70616369747905000000000000000000000A53697A65
2E576964746805000000000000809007400B53697A652E486569676874050000
0000000000CC04401453697A652E506C6174666F726D44656661756C74080B53
74726F6B652E4B696E6407044E6F6E6507585261646975730500000000000000
80014007595261646975730500000000000000800140000F54466C6F6174416E
696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F
70657274794E616D6506074F7061636974790A537461727456616C7565050000
00000000000000000953746F7056616C7565050000000000000080FF3F075472
6967676572061049734D6F7573654F7665723D747275650E5472696767657249
6E7665727365061149734D6F7573654F7665723D66616C736500000007544C61
796F757400095374796C654E616D650605676C79706805416C69676E07044C65
66740A53697A652E57696474680500000000000000C803400B53697A652E4865
696768740500000000000000CC04401453697A652E506C6174666F726D446566
61756C74080007544C61796F757400095374796C654E616D650609636865636B
6D61726B05416C69676E0708436F6E74656E7473074F70616369747905000000
00006F1283F53F0A53697A652E57696474680500000000000000C803400B5369
7A652E4865696768740500000000000000CC04401453697A652E506C6174666F
726D44656661756C74080005545061746800095374796C654E616D65060E6368
65636B6D61726B7374796C6505416C69676E070643656E74657209446174612E
506174680A58000000070000000000000056D9524391AE2C4301000000927666
4365021643010000009F3983432B7C3C43010000009E9AA64382D2B442010000
006F1CB04375A4D1420100000026DF8243263F67430300000056D9524391AE2C
430A46696C6C2E436F6C6F720708636C61426C61636B0748697454657374080A
53697A652E57696474680500000000000000B002400B53697A652E4865696768
740500000000000000B002401453697A652E506C6174666F726D44656661756C
74080B5374726F6B652E4B696E6407044E6F6E65000F54436F6C6F72416E696D
6174696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F7065
7274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708
636C61426C61636B0953746F7056616C75650708636C61426C61636B07547269
67676572060F497353656C65637465643D747275650E54726967676572496E76
657273650610497353656C65637465643D66616C736500000F54436F6C6F7241
6E696D6174696F6E00084475726174696F6E05000000000018B7D1F23F0C5072
6F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C75
650708636C61426C61636B0953746F7056616C75650708636C61426C61636B07
54726967676572062149734D6F7573654F7665723D747275653B497353656C65
637465643D66616C73650E54726967676572496E7665727365062249734D6F75
73654F7665723D66616C73653B497353656C65637465643D66616C7365000000
0F54466C6F6174416E696D6174696F6E00084475726174696F6E050000000000
CDCCCCFB3F0C50726F70657274794E616D6506074F7061636974790A53746172
7456616C756505000000000000000000000953746F7056616C75650500000000
00000080FF3F0754726967676572060E4973436865636B65643D747275650E54
726967676572496E7665727365060F4973436865636B65643D66616C73650000
000654496D61676500095374796C654E616D6506066269746D61700E4D756C74
695265734269746D61700E01000005416C69676E070A486F727A43656E746572
0C4D617267696E732E4C65667405000000000000008000400B4D617267696E73
2E546F7005000000000000008000400D4D617267696E732E5269676874050000
00000000008000400E4D617267696E732E426F74746F6D050000000000000080
00400A506F736974696F6E2E5805000000000000008000400A506F736974696F
6E2E5905000000000000008000400A53697A652E576964746805000000000000
00A803400B53697A652E4865696768740500000000000000BC04401453697A65
2E506C6174666F726D44656661756C740800000654476C79706800095374796C
654E616D65060A676C7970687374796C650C4D617267696E732E4C6566740500
00000000000080FF3F0B4D617267696E732E546F700500000000000000800040
0D4D617267696E732E52696768740500000000000000C000400E4D617267696E
732E426F74746F6D050000000000000080FF3F05416C69676E070A486F727A43
656E7465720A53697A652E576964746805000000000000008003400B53697A65
2E48656967687405000000000000008003401453697A652E506C6174666F726D
44656661756C740800000005545465787400095374796C654E616D6506047465
787405416C69676E07044C656674064C6F636B6564090748697454657374080C
4D617267696E732E4C65667405000000000000008002400D4D617267696E732E
526967687405000000000000008002400A506F736974696F6E2E580500000000
0000008404400A53697A652E57696474680500000000000000C804400B53697A
652E4865696768740500000000000000CC04401453697A652E506C6174666F72
6D44656661756C7408165465787453657474696E67732E466F6E742E53697A65
0500000000000000800340165465787453657474696E67732E466F6E74436F6C
6F720709783936464646464646165465787453657474696E67732E486F727A41
6C69676E07074C656164696E67000F54436F6C6F72416E696D6174696F6E0009
5374796C654E616D650608616E696D5F73656C084475726174696F6E05000000
000018B7D1F23F0C50726F70657274794E616D650605436F6C6F720A53746172
7456616C756507097839364646464646460953746F7056616C75650709783936
4646464646460754726967676572060F497353656C65637465643D747275650E
54726967676572496E76657273650610497353656C65637465643D66616C7365
00000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65060961
6E696D5F6F766572084475726174696F6E05000000000018B7D1F23F0C50726F
70657274794E616D650605436F6C6F720A537461727456616C75650709783936
4646464646460953746F7056616C75650708636C615768697465075472696767
6572062149734D6F7573654F7665723D747275653B497353656C65637465643D
66616C73650E54726967676572496E7665727365062249734D6F7573654F7665
723D66616C73653B497353656C65637465643D66616C73650000000554546578
7400095374796C654E616D65060873686F727463757405416C69676E07055269
676874064C6F636B656409074869745465737408074F70616369747905000000
00003333B3FE3F0C4D617267696E732E4C6566740500000000000000C002400D
4D617267696E732E52696768740500000000000000C001400A506F736974696F
6E2E580500000000000000D506400A53697A652E576964746805000000000000
00C804400B53697A652E4865696768740500000000000000CC04401453697A65
2E506C6174666F726D44656661756C7408165465787453657474696E67732E46
6F6E74436F6C6F720708636C615768697465165465787453657474696E67732E
486F727A416C69676E07074C656164696E67000007544C61796F757400095374
796C654E616D6506077375626D61726B05416C69676E070552696768740A506F
736974696F6E2E5805000000000000808607400A53697A652E57696474680500
000000000000A003400B53697A652E4865696768740500000000000000CC0440
1453697A652E506C6174666F726D44656661756C740800055450617468000541
6C69676E070643656E74657209446174612E506174680A340000000400000000
000000000000000000000001000000000000000000803F010000000000803F00
00003F0300000000000000000000000A46696C6C2E436F6C6F72070978464645
4445444544064C6F636B6564090748697454657374080A53697A652E57696474
680500000000000000E001400B53697A652E4865696768740500000000000000
8002401453697A652E506C6174666F726D44656661756C74080B5374726F6B65
2E4B696E6407044E6F6E65000F54436F6C6F72416E696D6174696F6E00084475
726174696F6E05000000000018B7D1F23F0C50726F70657274794E616D65060A
46696C6C2E436F6C6F720A537461727456616C75650708636C61426C61636B09
53746F7056616C75650708636C61426C61636B0754726967676572062149734D
6F7573654F7665723D747275653B497353656C65637465643D66616C73650E54
726967676572496E7665727365062249734D6F7573654F7665723D66616C7365
3B497353656C65637465643D66616C736500000F54436F6C6F72416E696D6174
696F6E00084475726174696F6E05000000000018B7D1F23F0C50726F70657274
794E616D65060A46696C6C2E436F6C6F720A537461727456616C75650708636C
61426C61636B0953746F7056616C75650708636C61426C61636B075472696767
6572060F497353656C65637465643D747275650E54726967676572496E766572
73650610497353656C65637465643D66616C73650000000009545374796C6554
616700095374796C654E616D65060668656967687408546167466C6F61740500
000000000000F003400000005450463007544C61796F757400095374796C654E
616D6506146D656E756974656D7374796C655F627574746F6E05416C69676E07
0643656E7465720A53697A652E576964746805000000000000809007400B5369
7A652E4865696768740500000000000000CC04401453697A652E506C6174666F
726D44656661756C74080756697369626C6508085461624F726465720211000A
5452656374616E676C6500095374796C654E616D65060A6261636B67726F756E
6405416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F7207097846
46343434353530074869745465737408074F7061636974790500000000000000
0000000A53697A652E576964746805000000000000809007400B53697A652E48
65696768740500000000000000CC04401453697A652E506C6174666F726D4465
6661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164697573
050000000000000080014007595261646975730500000000000000800140000F
54466C6F6174416E696D6174696F6E00084475726174696F6E05000000000018
B7D1F23F0C50726F70657274794E616D6506074F7061636974790A5374617274
56616C756505000000000000000000000953746F7056616C7565050000000000
000080FF3F0754726967676572061049734D6F7573654F7665723D747275650E
54726967676572496E7665727365061149734D6F7573654F7665723D66616C73
6500000007544C61796F757400095374796C654E616D650605676C7970680541
6C69676E07044C6566740A53697A652E57696474680500000000000000C80340
0B53697A652E4865696768740500000000000000CC04401453697A652E506C61
74666F726D44656661756C74080007544C61796F757400095374796C654E616D
650609636865636B6D61726B05416C69676E0708436F6E74656E7473074F7061
636974790500000000006F1283F53F0A53697A652E5769647468050000000000
0000C803400B53697A652E4865696768740500000000000000CC04401453697A
652E506C6174666F726D44656661756C74080005545061746800095374796C65
4E616D65060E636865636B6D61726B7374796C6505416C69676E070643656E74
657209446174612E506174680A58000000070000000000000056D9524391AE2C
43010000009276664365021643010000009F3983432B7C3C43010000009E9AA6
4382D2B442010000006F1CB04375A4D1420100000026DF8243263F6743030000
0056D9524391AE2C430A46696C6C2E436F6C6F720708636C61426C61636B0748
697454657374080A53697A652E57696474680500000000000000B002400B5369
7A652E4865696768740500000000000000B002401453697A652E506C6174666F
726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65000F5443
6F6C6F72416E696D6174696F6E00084475726174696F6E05000000000018B7D1
F23F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172
7456616C75650708636C61426C61636B0953746F7056616C75650708636C6142
6C61636B0754726967676572060F497353656C65637465643D747275650E5472
6967676572496E76657273650610497353656C65637465643D66616C73650000
0F54436F6C6F72416E696D6174696F6E00084475726174696F6E050000000000
18B7D1F23F0C50726F70657274794E616D65060A46696C6C2E436F6C6F720A53
7461727456616C75650708636C61426C61636B0953746F7056616C7565070863
6C61426C61636B0754726967676572062149734D6F7573654F7665723D747275
653B497353656C65637465643D66616C73650E54726967676572496E76657273
65062249734D6F7573654F7665723D66616C73653B497353656C65637465643D
66616C73650000000F54466C6F6174416E696D6174696F6E0008447572617469
6F6E050000000000CDCCCCFB3F0C50726F70657274794E616D6506074F706163
6974790A537461727456616C756505000000000000000000000953746F705661
6C7565050000000000000080FF3F0754726967676572060E4973436865636B65
643D747275650E54726967676572496E7665727365060F4973436865636B6564
3D66616C73650000000654496D61676500095374796C654E616D650606626974
6D61700E4D756C74695265734269746D61700E01000005416C69676E070A486F
727A43656E7465720C4D617267696E732E4C6566740500000000000000800040
0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E
526967687405000000000000008000400E4D617267696E732E426F74746F6D05
000000000000008000400A506F736974696F6E2E580500000000000000800040
0A506F736974696F6E2E5905000000000000008000400A53697A652E57696474
680500000000000000A803400B53697A652E4865696768740500000000000000
BC04401453697A652E506C6174666F726D44656661756C740800000654476C79
706800095374796C654E616D65060A676C7970687374796C650C4D617267696E
732E4C656674050000000000000080FF3F0B4D617267696E732E546F70050000
00000000008000400D4D617267696E732E52696768740500000000000000C000
400E4D617267696E732E426F74746F6D050000000000000080FF3F05416C6967
6E070A486F727A43656E7465720A53697A652E57696474680500000000000000
8003400B53697A652E48656967687405000000000000008003401453697A652E
506C6174666F726D44656661756C74080000001654427574746F6E5374796C65
546578744F626A65637400095374796C654E616D6506047465787405416C6967
6E0706436C69656E74064C6F636B6564090C4D617267696E732E4C6566740500
00000000000080FF3F0B4D617267696E732E546F700500000000000000800040
0D4D617267696E732E5269676874050000000000000080FF3F0E4D617267696E
732E426F74746F6D05000000000000008000400A53697A652E57696474680500
0000000000008307400B53697A652E4865696768740500000000000000BC0440
1453697A652E506C6174666F726D44656661756C740818546578745365747469
6E67732E466F6E742E46616D696C790606526F626F746F165465787453657474
696E67732E466F6E742E53697A65050000000000000080034016546578745365
7474696E67732E466F6E74436F6C6F7207097839364646464646461654657874
53657474696E67732E486F727A416C69676E07074C656164696E670D53686164
6F7756697369626C650808486F74436F6C6F720708636C6157686974650C466F
6375736564436F6C6F7207097839364646464646460B4E6F726D616C436F6C6F
7207097839364646464646460C50726573736564436F6C6F720708636C615768
6974650000005450463007544C61796F757400095374796C654E616D65060D6D
656E75766965777374796C6505416C69676E070643656E7465720A53697A652E
57696474680500000000000000E406400B53697A652E48656967687405000000
00000000A907401453697A652E506C6174666F726D44656661756C7408085461
624F726465720212000A5452656374616E676C6500095374796C654E616D6506
02626705416C69676E0706436C69656E740A46696C6C2E436F6C6F7207097846
463334333534310A53697A652E57696474680500000000000000E406400B5369
7A652E4865696768740500000000000000A907401453697A652E506C6174666F
726D44656661756C74080C5374726F6B652E436F6C6F72070978464634423434
353407585261646975730500000000000000A001400759526164697573050000
0000000000A00140000D54536861646F77456666656374000844697374616E63
650500000000006F1283F53F09446972656374696F6E0500000000000000B404
4008536F66746E657373050000000000CECCCCFC3F074F706163697479050000
000000CDCCCCFD3F0B536861646F77436F6C6F720708636C61426C61636B0000
0007544C61796F757400095374796C654E616D650607636F6E74656E7405416C
69676E0706436C69656E740C4D617267696E732E4C6566740500000000000000
C001400B4D617267696E732E546F700500000000000000C001400D4D61726769
6E732E52696768740500000000000000C001400E4D617267696E732E426F7474
6F6D0500000000000000C001400A53697A652E57696474680500000000000000
D806400B53697A652E4865696768740500000000000000A307401453697A652E
506C6174666F726D44656661756C74080000005450463007544C61796F757400
095374796C654E616D6506126D656E75736570617261746F727374796C650541
6C69676E070643656E7465720A53697A652E57696474680500000000000000C8
05400B53697A652E48656967687405000000000000008002401453697A652E50
6C6174666F726D44656661756C74080756697369626C6508085461624F726465
72023B00005450463007544C61796F757400095374796C654E616D6506176C65
667473656C656374696F6E706F696E747374796C6505416C69676E070643656E
7465720A53697A652E57696474680500000000000000C003400B53697A652E48
65696768740500000000000000C004401453697A652E506C6174666F726D4465
6661756C74080756697369626C6508085461624F7264657202400A4669786564
576964746802180B46697865644865696768740230000A5452656374616E676C
6500095374796C654E616D65060A6261636B67726F756E6407436F726E657273
0B07546F704C6566740A426F74746F6D4C6566740B426F74746F6D5269676874
000A46696C6C2E436F6C6F720709784646414341434245074869745465737408
0A506F736974696F6E2E580500000000000000A803C00A506F736974696F6E2E
5905000000000000008404400A53697A652E57696474680500000000000000A0
03400B53697A652E4865696768740500000000000000A003401453697A652E50
6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
6507585261646975730500000000000000A00240075952616469757305000000
00000000A002400000005450463007544C61796F757400095374796C654E616D
650618726967687473656C656374696F6E706F696E747374796C6505416C6967
6E070643656E7465720A53697A652E57696474680500000000000000C003400B
53697A652E4865696768740500000000000000C004401453697A652E506C6174
666F726D44656661756C74080756697369626C6508085461624F726465720244
0A4669786564576964746802180B46697865644865696768740230000A545265
6374616E676C6500095374796C654E616D65060A6261636B67726F756E640743
6F726E6572730B08546F7052696768740A426F74746F6D4C6566740B426F7474
6F6D5269676874000A46696C6C2E436F6C6F7207097846464143414342450748
697454657374080A53697A652E57696474680500000000000000A003400B5369
7A652E4865696768740500000000000000A003401453697A652E506C6174666F
726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6507585261
646975730500000000000000A0024007595261646975730500000000000000A0
02400000005450463007544C61796F757400095374796C654E616D6506116275
74746F6E5F7363726F6C6C646F776E05416C69676E070643656E7465720A5369
7A652E57696474680500000000000000F003400B53697A652E48656967687405
00000000000000F003401453697A652E506C6174666F726D44656661756C7408
0756697369626C6508085461624F72646572024A000754436972636C65000953
74796C654E616D650602626705416C69676E0706436C69656E740A46696C6C2E
436F6C6F7207097833324646464646460748697454657374080A53697A652E57
696474680500000000000000F003400B53697A652E4865696768740500000000
000000F003401453697A652E506C6174666F726D44656661756C74080C537472
6F6B652E436F6C6F720709783145464646464646000554506174680009537479
6C654E616D65060A50617468315374796C6505416C69676E070643656E746572
09446174612E506174680AD801000027000000000000001E6ACF42E790C94502
000000F631D042C58DC94502000000F631D042B488C945020000001E6ACF4294
85C9450200000045A2CE427382C94502000000BC5ECD427382C9450200000066
97CC429485C9450100000038B7BF4225B9C945020000003716BF42AABBC94502
00000026FFBD42E1B9C9450200000026FFBD4251B6C9450100000026FFBD42DF
3FC9450200000026FFBD42733BC94502000000421EBD420038C945020000001F
04BC420038C945010000001402BC420038C94502000000F1E7BA420038C94502
000000EB00BA42733BC94502000000EB00BA42DF3FC94501000000EB00BA4251
B6C94502000000EB00BA42E1B9C9450200000084F1B842AABBC9450200000083
50B84225B9C945010000009F66AB425585C94502000000499FAA423382C94502
000000C65CA9423382C94502000000ED94A8425585C945010000007095A84255
85C945020000001ACEA7427488C945020000001ACEA742868DC94502000000F3
95A842A790C94501000000FB34B9424FD3C94501000000FB34B9424FD3C94502
0000002AC4BA4290D9C94502000000BF4BBD4290D9C94502000000EDDABE424F
D3C94502000000ED36BF42DCD1C94502000000A1C6CF42748FC945020000001E
6ACF42E790C9450A46696C6C2E436F6C6F720709784141464646464646074869
7454657374080A53697A652E576964746805000000000000008003400B53697A
652E48656967687405000000000000008003401453697A652E506C6174666F72
6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650857726170
4D6F6465070346697400000F54436F6C6F72416E696D6174696F6E0009537479
6C654E616D650614436F6C6F72416E696D6174696F6E315374796C6508447572
6174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060A46
696C6C2E436F6C6F720A537461727456616C7565070978333246464646464609
53746F7056616C75650709783530464646464646075472696767657206104973
4D6F7573654F7665723D747275650E54726967676572496E7665727365061149
734D6F7573654F7665723D66616C736500000000545046300D54537769746368
4F626A65637400095374796C654E616D65060B7377697463687374796C650541
6C69676E070643656E7465720A53697A652E5769647468050000000000004094
08400B53697A652E48656967687405000000000000808207401453697A652E50
6C6174666F726D44656661756C7408085461624F72646572023F12547261636B
696E675468756D625363616C65050000000000000080FF3F0756697369626C65
080A46696C6C2E436F6C6F7207097846463133313331330B5374726F6B652E4B
696E6407044E6F6E650B5468756D622E436F6C6F720709784646373437343734
0D5468756D624F6E2E436F6C6F7207097846464143414342450C5468756D624F
6E2E4B696E640705536F6C6964105468756D625374726F6B652E4B696E640704
4E6F6E6505536861706507044F76616C00005450463007544C61796F75740009
5374796C654E616D65061A627574746F6E7374796C655F636C6561726D696E69
5F6C65667405416C69676E070643656E7465720A53697A652E57696474680500
0000000000008004400B53697A652E4865696768740500000000000000800440
1453697A652E506C6174666F726D44656661756C74080756697369626C650808
5461624F726465720207000A5452656374616E676C6500095374796C654E616D
65060F52656374616E676C65315374796C6505416C69676E0708436F6E74656E
747307436F726E6572730B07546F704C6566740A426F74746F6D4C656674000A
46696C6C2E436F6C6F7207097846463230323132330748697454657374080A53
697A652E576964746805000000000000008004400B53697A652E486569676874
05000000000000008004401453697A652E506C6174666F726D44656661756C74
080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500000000
000000C0014007595261646975730500000000000000C00140000F54436F6C6F
72416E696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D
6174696F6E315374796C65084475726174696F6E0500000000006F1283F53F0C
50726F70657274794E616D65060A46696C6C2E436F6C6F720A53746172745661
6C756507097846463230323132330953746F7056616C75650709784646353235
3435380754726967676572061049734D6F7573654F7665723D747275650E5472
6967676572496E7665727365061149734D6F7573654F7665723D66616C736500
00000654476C79706800095374796C654E616D65060A676C7970687374796C65
0B4D617267696E732E546F7005000000000000008000400D4D617267696E732E
526967687405000000000000008000400E4D617267696E732E426F74746F6D05
0000000000000080004005416C69676E070643656E7465720A53697A652E5769
6474680500000000000000C003400B53697A652E486569676874050000000000
0000C003401453697A652E506C6174666F726D44656661756C74080A496D6167
65496E6465780202000E5446696C6C52474245666665637400095374796C654E
616D65061346696C6C524742456666656374315374796C6505436F6C6F720709
784646443944394533000000005450463007544C61796F757400095374796C65
4E616D65061B627574746F6E7374796C655F636C6561726D696E695F72696768
7405416C69676E070643656E7465720A53697A652E5769647468050000000000
00008004400B53697A652E48656967687405000000000000008004401453697A
652E506C6174666F726D44656661756C74080756697369626C6508085461624F
726465720206000654476C79706800095374796C654E616D65060A676C797068
7374796C650B4D617267696E732E546F7005000000000000008000400D4D6172
67696E732E526967687405000000000000008000400E4D617267696E732E426F
74746F6D050000000000000080004005416C69676E070643656E7465720A5369
7A652E57696474680500000000000000C003400B53697A652E48656967687405
00000000000000C003401453697A652E506C6174666F726D44656661756C7408
0A496D616765496E6465780202000E5446696C6C524742456666656374000953
74796C654E616D65061346696C6C524742456666656374315374796C6505436F
6C6F7207097846464439443945330000000A5452656374616E676C6500095374
796C654E616D65060F52656374616E676C65315374796C6505416C69676E0708
436F6E74656E747307436F726E6572730B08546F7052696768740B426F74746F
6D5269676874000A46696C6C2E436F6C6F720709784646323032313233074869
7454657374080A53697A652E576964746805000000000000008004400B53697A
652E48656967687405000000000000008004401453697A652E506C6174666F72
6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164
6975730500000000000000C0014007595261646975730500000000000000C001
40000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65061443
6F6C6F72416E696D6174696F6E315374796C65084475726174696F6E05000000
00006F1283F53F0C50726F70657274794E616D65060A46696C6C2E436F6C6F72
0A537461727456616C756507097846463230323132330953746F7056616C7565
07097846463532353435380754726967676572061049734D6F7573654F766572
3D747275650E54726967676572496E7665727365061149734D6F7573654F7665
723D66616C7365000000005450463007544C61796F757400095374796C654E61
6D65060F6D656D6F7374796C655F636C65617205416C69676E070643656E7465
720A53697A652E57696474680500000000000000F406400B53697A652E486569
67687405000000000000009908401453697A652E506C6174666F726D44656661
756C74080756697369626C6508085461624F72646572022D000C544272757368
4F626A65637400095374796C654E616D65060A666F726567726F756E640B4272
7573682E436F6C6F720708636C61426C61636B00000C5442727573684F626A65
637400095374796C654E616D65060973656C656374696F6E0B42727573682E43
6F6C6F72070978363431463230323700000B54466F6E744F626A656374000953
74796C654E616D650604666F6E74000007544C61796F757400095374796C654E
616D650607636F6E74656E7405416C69676E0706436C69656E740C4D61726769
6E732E4C6566740500000000000000A001400D4D617267696E732E5269676874
0500000000000000A001400A53697A652E57696474680500000000000000E206
400B53697A652E48656967687405000000000000009708401453697A652E506C
6174666F726D44656661756C7408085461624F72646572020000000A54536372
6F6C6C42617200095374796C654E616D65060A767363726F6C6C62617205416C
69676E0705526967687406437572736F72070763724172726F770B536D616C6C
4368616E676505000000000000000000000B4F7269656E746174696F6E070856
6572746963616C0A506F736974696F6E2E580500000000000000EC06400A5369
7A652E576964746805000000000000008002400B53697A652E48656967687405
000000000000009708401453697A652E506C6174666F726D44656661756C7408
085461624F72646572020100000A545363726F6C6C42617200095374796C654E
616D65060A687363726F6C6C62617205416C69676E0706426F74746F6D064375
72736F72070763724172726F770B536D616C6C4368616E676505000000000000
000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F73
6974696F6E2E5905000000000000009708400A53697A652E5769647468050000
0000000000F406400B53697A652E486569676874050000000000000080024014
53697A652E506C6174666F726D44656661756C7408085461624F726465720202
000007544C61796F75740005416C69676E0706436C69656E740A53697A652E57
696474680500000000000000EC06400B53697A652E4865696768740500000000
0000009708401453697A652E506C6174666F726D44656661756C740808546162
4F726465720203000F54536D616C6C5363726F6C6C42617200095374796C654E
616D65060F76736D616C6C7363726F6C6C62617205416C69676E070552696768
7406437572736F72070763724172726F770B536D616C6C4368616E6765050000
00000000000000000B4F7269656E746174696F6E0708566572746963616C0C4D
617267696E732E4C65667405000000000000008000400A53697A652E57696474
6805000000000000008002400B53697A652E4865696768740500000000000000
8002401453697A652E506C6174666F726D44656661756C74080756697369626C
650800000F54536D616C6C5363726F6C6C42617200095374796C654E616D6506
0F68736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0643
7572736F72070763724172726F770B536D616C6C4368616E6765050000000000
00000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D61
7267696E732E546F7005000000000000008000400A53697A652E576964746805
000000000000009606400B53697A652E48656967687405000000000000008002
401453697A652E506C6174666F726D44656661756C74080756697369626C6508
000000005450463007544C61796F757400095374796C654E616D650610627574
746F6E7374796C655F69636F6E05416C69676E070643656E7465720C50616464
696E672E4C65667405000000000000008001400B50616464696E672E546F7005
000000000000008001400D50616464696E672E52696768740500000000000000
8001400E50616464696E672E426F74746F6D05000000000000008001400A5369
7A652E57696474680500000000000000B804400B53697A652E48656967687405
00000000000000B804401453697A652E506C6174666F726D44656661756C7408
0756697369626C6508085461624F726465720201000A5452656374616E676C65
00095374796C654E616D65060F52656374616E676C65315374796C6505416C69
676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978303032413242
33320748697454657374080A53697A652E57696474680500000000000000B804
400B53697A652E4865696768740500000000000000B804401453697A652E506C
6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
07585261646975730500000000000000C0014007595261646975730500000000
000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E61
6D6506046F766572084475726174696F6E0500000000006F1283F53F0C50726F
70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565
07097830303241324233320953746F7056616C75650709784646324132423332
0754726967676572061049734D6F7573654F7665723D747275650E5472696767
6572496E7665727365061149734D6F7573654F7665723D66616C736500000006
54476C79706800095374796C654E616D65060A676C7970687374796C6505416C
69676E070643656E7465720A53697A652E57696474680500000000000000A003
400B53697A652E4865696768740500000000000000A003401453697A652E506C
6174666F726D44656661756C74080A496D616765496E646578020E000E544669
6C6C52474245666665637400095374796C654E616D65061346696C6C52474245
6666656374315374796C6505436F6C6F72070978464644394439453300000000
5450463007544C61796F757400095374796C654E616D650617627574746F6E73
74796C655F6D656E75627574746F6E7305416C69676E070643656E7465720A53
697A652E57696474680500000000000000F406400B53697A652E486569676874
0500000000000000B004401453697A652E506C6174666F726D44656661756C74
080756697369626C6508085461624F726465720202000A5452656374616E676C
6500095374796C654E616D65060F52656374616E676C65315374796C6505416C
69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709783030464646
4646460748697454657374080A53697A652E57696474680500000000000000F4
06400B53697A652E4865696768740500000000000000B004401453697A652E50
6C6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E
65000F54436F6C6F72416E696D6174696F6E00095374796C654E616D6506046F
766572084475726174696F6E0500000000006F1283F53F0C50726F7065727479
4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709783030
4646464646460953746F7056616C756507097831454646464646460754726967
676572061049734D6F7573654F7665723D747275650E54726967676572496E76
65727365061149734D6F7573654F7665723D66616C73650000000654476C7970
6800095374796C654E616D65060A676C7970687374796C6505416C69676E0706
43656E7465720A53697A652E576964746805000000000000008003400B53697A
652E48656967687405000000000000008003401453697A652E506C6174666F72
6D44656661756C74080A496D616765496E6465780210000E5446696C6C524742
45666665637400095374796C654E616D65061346696C6C524742456666656374
315374796C6505436F6C6F720709784646443944394533000000005450463007
544C61796F757400095374796C654E616D650611627574746F6E7374796C655F
726574727905416C69676E070643656E7465720C50616464696E672E4C656674
0500000000000000C002400B50616464696E672E546F70050000000000000080
02400D50616464696E672E52696768740500000000000000C002400E50616464
696E672E426F74746F6D05000000000000008002400A53697A652E5769647468
0500000000000000F406400B53697A652E486569676874050000000000000098
04401453697A652E506C6174666F726D44656661756C74080756697369626C65
08085461624F72646572020E000A5452656374616E676C6500095374796C654E
616D65060F52656374616E676C65315374796C6505416C69676E0708436F6E74
656E74730A46696C6C2E436F6C6F720709784646333433353431074869745465
7374080A53697A652E57696474680500000000000000F406400B53697A652E48
656967687405000000000000009804401453697A652E506C6174666F726D4465
6661756C74080C5374726F6B652E436F6C6F7207097846463536353836390758
5261646975730500000000000000C00140075952616469757305000000000000
00C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E616D65
0614436F6C6F72416E696D6174696F6E315374796C65084475726174696F6E05
00000000000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E436F
6C6F720A537461727456616C756507097846463334333534310953746F705661
6C756507097846463431343034450754726967676572061049734D6F7573654F
7665723D747275650E54726967676572496E7665727365061149734D6F757365
4F7665723D66616C73650000001654427574746F6E5374796C65546578744F62
6A65637400095374796C654E616D6506047465787405416C69676E0706436C69
656E74064C6F636B6564090A53697A652E57696474680500000000000000CA06
400B53697A652E4865696768740500000000000000B003401453697A652E506C
6174666F726D44656661756C7408165465787453657474696E67732E466F6E74
2E53697A650500000000000000E00240165465787453657474696E67732E466F
6E74436F6C6F720708636C615768697465155465787453657474696E67732E54
72696D6D696E670709436861726163746572155465787453657474696E67732E
576F72645772617008165465787453657474696E67732E486F727A416C69676E
07074C656164696E670D536861646F7756697369626C650808486F74436F6C6F
720708636C6157686974650C466F6375736564436F6C6F720708636C61576869
74650B4E6F726D616C436F6C6F720708636C6157686974650C50726573736564
436F6C6F720708636C615768697465000005545061746800095374796C654E61
6D65060A50617468315374796C6505416C69676E07044C65667409446174612E
506174680A0C04000056000000000000007E466F415A8BFF40010000003A2371
414DDBFF4002000000EBE27941282C01410200000038F87F41EB450941020000
00F5B97E419205124102000000EEEB7A41D6C52C4102000000B1BF6E419CA245
4102000000B6F35B41E10B59410200000052274941BC746C41020000002DB230
41BA6B79410200000070141641E4147E410200000091EDF640075F8141020000
00971CC0405DDC7E4102000000DA8F8F40F4FD724102000000917E71407F6A6D
410200000084BB4740A83566410200000053052340C1A85D41010000009582DA
3FCE196B4102000000B9DF893F492E75410200000000008027A60A6E41020000
000000802786C95F410100000000008027EBFF1F410100000096267F40EBFF1F
41020000008C159C40EBFF1F4102000000925CAA40CD3B314102000000DB3396
4048503B41010000003D9B7D40470347410200000074298C40F0164D41020000
00BC3F9B40FB3A52410200000008ACAB40AB3E564102000000A015D04046255F
41020000004D32F940560E624102000000678F1041C58F5E4102000000888524
41CB105B410200000098DD3641A85751410200000094F64441B4C84241020000
00F90F5341C13934410200000027315C41AF94214102000000780B5F4123840D
4102000000234A604187C4044102000000F16368414A5EFD40020000003A2371
414DDBFF40010000007E466F415A8BFF40030000007E466F415A8BFF40000000
001D383841321F503F020000007AA5434155C1943F02000000371A4E41D786CE
3F02000000F54A5741098A094001000000B8AF644152EDA73F0200000033C46E
41FF942E3F02000000000080419066903F0200000000008041F4370140010000
00000080411500C04001000000D34D40411500C04002000000B30C32411500C0
400200000010E92A4127889D40020000008BFD3441855F8940010000007AA540
414B1F64400200000088F43941CFBD4B40020000002C653241B81E3740020000
00302A2A41D10527400200000030F517413C6B034002000000DA660341008CEF
3F0200000033E1DE4094C1054002000000B2F4B640FDBC134002000000BB4492
408CA13A400200000007256C4005DD7440020000006EC033402A8C9740020000
00B83B0F400AD7BC4002000000F6D10340BAF7E44002000000E2AFFD3FF376F6
4002000000C6E1BC3FDB50014102000000A3C96D3F5A12004102000000569FC3
3EB1A7FD4002000000FE3FF33A2A74ED4002000000FB0CA33DDCF4DB40020000
00F180A23E0074A64002000000CD018A3FE275694002000000A53110404ED11B
400200000063625B4075599C3F02000000D09B9E40098BD23E020000001FD7D3
408596F53D02000000378904414A7F2FBE02000000B4F11F41A3DA913D020000
001D383841321F503F030000001D383841321F503F0A46696C6C2E436F6C6F72
07097846464439443945330748697454657374080D4D617267696E732E526967
68740500000000000000C001400A506F736974696F6E2E580500000000000000
C002400A506F736974696F6E2E5905000000000000008002400A53697A652E57
696474680500000000000000C002400B53697A652E4865696768740500000000
000000B003401453697A652E506C6174666F726D44656661756C74080B537472
6F6B652E4B696E6407044E6F6E6508577261704D6F6465070346697400000054
50463007544C61796F757400095374796C654E616D650611616E69696E646963
61746F727374796C6505416C69676E070643656E7465720756697369626C6508
085461624F726465720259001054536B416E696D61746564496D616765000953
74796C654E616D650604616E696D05416C69676E070643656E74657207536361
6C652E58050000000000CDCCCCFF3F075363616C652E59050000000000CDCCCC
FF3F12416E696D6174696F6E2E50726F67726573730500A8C64B378941A0FC3F
04446174610A580A00007B226E6D223A226C6F6164696E675F36222C22646464
223A302C2268223A3530302C2277223A3530302C226D657461223A7B2267223A
22406C6F7474696566696C65732F746F6F6C6B69742D6A7320302E32362E3122
7D2C226C6179657273223A5B7B227479223A342C226E6D223A22536861706520
4C617965722032222C227372223A312C227374223A302C226F70223A3330302C
226970223A302C226864223A66616C73652C22646464223A302C22626D223A30
2C226861734D61736B223A66616C73652C22616F223A302C226B73223A7B2261
223A7B2261223A302C226B223A5B302C302C305D2C226978223A317D2C227322
3A7B2261223A302C226B223A5B35302C35302C3130305D2C226978223A367D2C
22736B223A7B2261223A302C226B223A307D2C2270223A7B2261223A302C226B
223A5B3235302C3235302C305D2C226978223A327D2C2272223A7B2261223A31
2C226B223A5B7B226F223A7B2278223A302E3136372C2279223A302E3136377D
2C2269223A7B2278223A302E3833332C2279223A302E3833337D2C2273223A5B
305D2C2274223A307D2C7B2273223A5B3336305D2C2274223A36307D5D2C2269
78223A31307D2C227361223A7B2261223A302C226B223A307D2C226F223A7B22
61223A302C226B223A3130302C226978223A31317D7D2C226566223A5B5D2C22
736861706573223A5B7B227479223A226772222C22626D223A302C226864223A
66616C73652C226D6E223A224144424520566563746F722047726F7570222C22
6E6D223A22456C6C697073652031222C226978223A312C22636978223A322C22
6E70223A332C226974223A5B7B227479223A22656C222C22626D223A302C2268
64223A66616C73652C226D6E223A224144424520566563746F72205368617065
202D20456C6C69707365222C226E6D223A22456C6C6970736520506174682031
222C2264223A312C2270223A7B2261223A302C226B223A5B302C305D2C226978
223A337D2C2273223A7B2261223A302C226B223A5B3330302C3330305D2C2269
78223A327D7D2C7B227479223A227374222C22626D223A302C226864223A6661
6C73652C226D6E223A224144424520566563746F722047726170686963202D20
5374726F6B65222C226E6D223A225374726F6B652031222C226C63223A322C22
6C6A223A312C226D6C223A342C226F223A7B2261223A302C226B223A3130302C
226978223A347D2C2277223A7B2261223A302C226B223A35302C226978223A35
7D2C2263223A7B2261223A302C226B223A5B302E363632372C302E363734352C
302E363934315D2C226978223A337D7D2C7B227479223A227472222C2261223A
7B2261223A302C226B223A5B302C305D2C226978223A317D2C2273223A7B2261
223A302C226B223A5B3130302C3130305D2C226978223A337D2C22736B223A7B
2261223A302C226B223A302C226978223A347D2C2270223A7B2261223A302C22
6B223A5B302C305D2C226978223A327D2C2272223A7B2261223A302C226B223A
302C226978223A367D2C227361223A7B2261223A302C226B223A302C22697822
3A357D2C226F223A7B2261223A302C226B223A3130302C226978223A377D7D5D
7D2C7B227479223A22746D222C22626D223A302C226864223A66616C73652C22
6D6E223A224144424520566563746F722046696C746572202D205472696D222C
226E6D223A225472696D2050617468732031222C226978223A322C2265223A7B
2261223A312C226B223A5B7B226F223A7B2278223A302E3333332C2279223A30
7D2C2269223A7B2278223A302E3636372C2279223A317D2C2273223A5B315D2C
2274223A307D2C7B2273223A5B3130305D2C2274223A35307D5D2C226978223A
327D2C226F223A7B2261223A312C226B223A5B7B226F223A7B2278223A302E31
36372C2279223A302E3136377D2C2269223A7B2278223A302E3833332C227922
3A302E3833337D2C2273223A5B305D2C2274223A307D2C7B2273223A5B335D2C
2274223A36307D5D2C226978223A337D2C2273223A7B2261223A312C226B223A
5B7B226F223A7B2278223A302E3333332C2279223A307D2C2269223A7B227822
3A302E3636372C2279223A317D2C2273223A5B305D2C2274223A31307D2C7B22
73223A5B39395D2C2274223A36307D5D2C226978223A317D2C226D223A317D5D
2C22696E64223A317D2C7B227479223A342C226E6D223A225368617065204C61
7965722031222C227372223A312C227374223A302C226F70223A3330302C2269
70223A302C226864223A66616C73652C22646464223A302C22626D223A302C22
6861734D61736B223A66616C73652C22616F223A302C226B73223A7B2261223A
7B2261223A302C226B223A5B302C302C305D2C226978223A317D2C2273223A7B
2261223A302C226B223A5B35302C35302C3130305D2C226978223A367D2C2273
6B223A7B2261223A302C226B223A307D2C2270223A7B2261223A302C226B223A
5B3235302C3235302C305D2C226978223A327D2C2272223A7B2261223A302C22
6B223A302C226978223A31307D2C227361223A7B2261223A302C226B223A307D
2C226F223A7B2261223A302C226B223A33302C226978223A31317D7D2C226566
223A5B5D2C22736861706573223A5B7B227479223A226772222C22626D223A30
2C226864223A66616C73652C226D6E223A224144424520566563746F72204772
6F7570222C226E6D223A22456C6C697073652031222C226978223A312C226369
78223A322C226E70223A332C226974223A5B7B227479223A22656C222C22626D
223A302C226864223A66616C73652C226D6E223A224144424520566563746F72
205368617065202D20456C6C69707365222C226E6D223A22456C6C6970736520
506174682031222C2264223A312C2270223A7B2261223A302C226B223A5B302C
305D2C226978223A337D2C2273223A7B2261223A302C226B223A5B3330302C33
30305D2C226978223A327D7D2C7B227479223A227374222C22626D223A302C22
6864223A66616C73652C226D6E223A224144424520566563746F722047726170
686963202D205374726F6B65222C226E6D223A225374726F6B652031222C226C
63223A312C226C6A223A312C226D6C223A342C226F223A7B2261223A302C226B
223A3130302C226978223A347D2C2277223A7B2261223A302C226B223A35302C
226978223A357D2C2263223A7B2261223A302C226B223A5B302E393235352C30
2E393235352C302E393235355D2C226978223A337D7D2C7B227479223A227472
222C2261223A7B2261223A302C226B223A5B302C305D2C226978223A317D2C22
73223A7B2261223A302C226B223A5B3130302C3130305D2C226978223A337D2C
22736B223A7B2261223A302C226B223A302C226978223A347D2C2270223A7B22
61223A302C226B223A5B302C305D2C226978223A327D2C2272223A7B2261223A
302C226B223A302C226978223A367D2C227361223A7B2261223A302C226B223A
302C226978223A357D2C226F223A7B2261223A302C226B223A3130302C226978
223A377D7D5D7D5D2C22696E64223A327D5D2C2276223A22352E382E31222C22
6672223A33302C226F70223A36302C226970223A302C22617373657473223A5B
5D7D00000F54466C6F6174416E696D6174696F6E00095374796C654E616D6506
03616E69084475726174696F6E050000000000CDCCCCFC3F0A53746172745661
6C756505000000000000000000000953746F7056616C75650500000000000000
0000000000005450463007544C61796F757400095374796C654E616D6506156C
697374626F786974656D7374796C655F66756E6305416C69676E070643656E74
65720C50616464696E672E4C65667405000000000000008001400B5061646469
6E672E546F7005000000000000008001400D50616464696E672E526967687405
000000000000008001400E50616464696E672E426F74746F6D05000000000000
008001400A53697A652E57696474680500000000000000C007400B53697A652E
4865696768740500000000000000C804401453697A652E506C6174666F726D44
656661756C74080756697369626C6508085461624F7264657202180B46697865
64486569676874021E000A5452656374616E676C6500095374796C654E616D65
060F6261636B67726F756E645F6F76657205416C69676E0708436F6E74656E74
730A46696C6C2E436F6C6F720709783030343738364646074869745465737408
0A53697A652E57696474680500000000000000C007400B53697A652E48656967
68740500000000000000C804401453697A652E506C6174666F726D4465666175
6C74080C5374726F6B652E436F6C6F7207097830303437383646460758526164
6975730500000000000000C0014007595261646975730500000000000000C001
40000F54436F6C6F72416E696D6174696F6E00095374796C654E616D6506046F
766572084475726174696F6E05000000000000000000000C50726F7065727479
4E616D65060A46696C6C2E436F6C6F720A537461727456616C75650709783030
3639364136440953746F7056616C756507097842343639364136440754726967
676572060F497353656C65637465643D747275650E54726967676572496E7665
7273650610497353656C65637465643D66616C73650000000654476C79706800
095374796C654E616D65060A676C7970687374796C650C4D617267696E732E4C
65667405000000000000008000400B4D617267696E732E546F70050000000000
000080FF3F0D4D617267696E732E526967687405000000000000008000400E4D
617267696E732E426F74746F6D050000000000000080FF3F05416C69676E0704
4C6566740A506F736974696F6E2E5805000000000000008000400A506F736974
696F6E2E59050000000000000080FF3F0A53697A652E57696474680500000000
0000008003400B53697A652E4865696768740500000000000000880440145369
7A652E506C6174666F726D44656661756C740800001654416374697665537479
6C65546578744F626A65637400095374796C654E616D65060664657461696C05
416C69676E0706426F74746F6D0C4D617267696E732E4C656674050000000000
0000C001400B4D617267696E732E546F70050000000000000080FF3F0D4D6172
67696E732E52696768740500000000000000C001400E4D617267696E732E426F
74746F6D050000000000000080FF3F0A506F736974696F6E2E58050000000000
0000A002400A506F736974696F6E2E590500000000000000B003400A53697A65
2E57696474680500000000000000B607400B53697A652E486569676874050000
0000000000B803401453697A652E506C6174666F726D44656661756C74080454
657874060454657874165465787453657474696E67732E466F6E742E53697A65
0500000000000000E00240165465787453657474696E67732E466F6E74436F6C
6F720709783634464646464646155465787453657474696E67732E576F726457
72617008165465787453657474696E67732E486F727A416C69676E07074C6561
64696E670D536861646F7756697369626C65080D416374697665547269676765
72070853656C65637465640B416374697665436F6C6F720708636C6157686974
6500000954436865636B426F7800095374796C654E616D650605636865636B05
416C69676E07044C6566740843616E466F637573081244697361626C65466F63
7573456666656374090C4D617267696E732E4C65667405000000000000008001
400A506F736974696F6E2E5805000000000000008001400A53697A652E576964
74680500000000000000A003400B53697A652E48656967687405000000000000
009004401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508000007544C61796F757400095374796C654E616D65060D616363657373
6F72796D6F726505416C69676E07094D6F737452696768740A53697A652E5769
6474680500000000000000B003400B53697A652E486569676874050000000000
0000B004401453697A652E506C6174666F726D44656661756C74080756697369
626C65080012544163746976655374796C654F626A6563740005416C69676E07
0643656E7465720C536F757263654C6F6F6B7570061A57696E646F7773203130
204D6F6465726E7374796C652E706E670A53697A652E57696474680500000000
000000C002400B53697A652E4865696768740500000000000000800340145369
7A652E506C6174666F726D44656661756C740808577261704D6F646507064365
6E7465720D41637469766554726967676572070853656C65637465640A416374
6976654C696E6B0E010F536F75726365526563742E4C65667405000000000000
008B06400E536F75726365526563742E546F700500000000000000D405401053
6F75726365526563742E5269676874050000000000000097064011536F757263
65526563742E426F74746F6D0500000000000000F405400001055363616C6505
00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000
0000D006400E536F75726365526563742E546F7005000000000000009F064010
536F75726365526563742E52696768740500000000000000E2064011536F7572
6365526563742E426F74746F6D0500000000000000B706400001055363616C65
05000000000000008000400F536F75726365526563742E4C6566740500000000
0000008B07400E536F75726365526563742E546F700500000000000000D40640
10536F75726365526563742E5269676874050000000000000097074011536F75
726365526563742E426F74746F6D0500000000000000F406400001055363616C
650500000000000000C000400F536F75726365526563742E4C65667405000000
00000080D007400E536F75726365526563742E546F7005000000000000009F07
4010536F75726365526563742E52696768740500000000000080E2074011536F
75726365526563742E426F74746F6D0500000000000000B7074000000A536F75
7263654C696E6B0E010F536F75726365526563742E4C65667405000000000000
008B06400E536F75726365526563742E546F700500000000000000D405401053
6F75726365526563742E5269676874050000000000000097064011536F757263
65526563742E426F74746F6D0500000000000000F405400001055363616C6505
00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000
0000D006400E536F75726365526563742E546F7005000000000000009F064010
536F75726365526563742E52696768740500000000000000E2064011536F7572
6365526563742E426F74746F6D0500000000000000B706400001055363616C65
05000000000000008000400F536F75726365526563742E4C6566740500000000
0000008B07400E536F75726365526563742E546F700500000000000000D40640
10536F75726365526563742E5269676874050000000000000097074011536F75
726365526563742E426F74746F6D0500000000000000F406400001055363616C
650500000000000000C000400F536F75726365526563742E4C65667405000000
00000080D007400E536F75726365526563742E546F7005000000000000009F07
4010536F75726365526563742E52696768740500000000000080E2074011536F
75726365526563742E426F74746F6D0500000000000000B70740000013546F75
6368416E696D6174696F6E2E4C696E6B0E0000000007544C61796F7574000953
74796C654E616D6506126163636573736F7279636865636B6D61726B05416C69
676E07094D6F737452696768740A53697A652E57696474680500000000000000
B003400B53697A652E4865696768740500000000000000B004401453697A652E
506C6174666F726D44656661756C74080756697369626C650800125441637469
76655374796C654F626A6563740005416C69676E070643656E7465720C536F75
7263654C6F6F6B7570061A57696E646F7773203130204D6F6465726E7374796C
652E706E670A53697A652E576964746805000000000000009003400B53697A65
2E48656967687405000000000000009003401453697A652E506C6174666F726D
44656661756C740808577261704D6F6465070643656E7465720D416374697665
54726967676572070853656C65637465640A4163746976654C696E6B0E010F53
6F75726365526563742E4C65667405000000000000009B06400E536F75726365
526563742E546F700500000000000000D2054010536F75726365526563742E52
696768740500000000000000AD064011536F75726365526563742E426F74746F
6D0500000000000000F605400001055363616C650500000000000000C0FF3F0F
536F75726365526563742E4C6566740500000000000000E806400E536F757263
65526563742E546F7005000000000000009D064010536F75726365526563742E
5269676874050000000000008081074011536F75726365526563742E426F7474
6F6D0500000000000000B806400001055363616C650500000000000000800040
0F536F75726365526563742E4C65667405000000000000009B07400E536F7572
6365526563742E546F700500000000000000D2064010536F7572636552656374
2E52696768740500000000000000AD074011536F75726365526563742E426F74
746F6D0500000000000000F606400001055363616C650500000000000000C000
400F536F75726365526563742E4C6566740500000000000080E807400E536F75
726365526563742E546F7005000000000000809D074010536F75726365526563
742E526967687405000000000000C081084011536F75726365526563742E426F
74746F6D0500000000000080B8074000000A536F757263654C696E6B0E010F53
6F75726365526563742E4C65667405000000000000009B06400E536F75726365
526563742E546F700500000000000000D2054010536F75726365526563742E52
696768740500000000000000AD064011536F75726365526563742E426F74746F
6D0500000000000000F605400001055363616C650500000000000000C0FF3F0F
536F75726365526563742E4C6566740500000000000000E806400E536F757263
65526563742E546F7005000000000000009D064010536F75726365526563742E
5269676874050000000000008081074011536F75726365526563742E426F7474
6F6D0500000000000000B806400001055363616C650500000000000000800040
0F536F75726365526563742E4C65667405000000000000009B07400E536F7572
6365526563742E546F700500000000000000D2064010536F7572636552656374
2E52696768740500000000000000AD074011536F75726365526563742E426F74
746F6D0500000000000000F606400001055363616C650500000000000000C000
400F536F75726365526563742E4C6566740500000000000080E807400E536F75
726365526563742E546F7005000000000000809D074010536F75726365526563
742E526967687405000000000000C081084011536F75726365526563742E426F
74746F6D0500000000000080B80740000013546F756368416E696D6174696F6E
2E4C696E6B0E0000000007544C61796F757400095374796C654E616D65060F61
63636573736F727964657461696C05416C69676E07094D6F737452696768740A
53697A652E57696474680500000000000000B003400B53697A652E4865696768
740500000000000000B004401453697A652E506C6174666F726D44656661756C
74080756697369626C65080012544163746976655374796C654F626A65637400
05416C69676E070643656E7465720C536F757263654C6F6F6B7570061A57696E
646F7773203130204D6F6465726E7374796C652E706E670A53697A652E576964
746805000000000000008003400B53697A652E48656967687405000000000000
008003401453697A652E506C6174666F726D44656661756C740808577261704D
6F6465070643656E7465720D41637469766554726967676572070853656C6563
7465640A4163746976654C696E6B0E010F536F75726365526563742E4C656674
05000000000000808707400E536F75726365526563742E546F70050000000000
0000D4054010536F75726365526563742E526967687405000000000000808F07
4011536F75726365526563742E426F74746F6D0500000000000000F405400001
055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566
740500000000000000CB07400E536F75726365526563742E546F700500000000
0000009F064010536F75726365526563742E52696768740500000000000000D7
074011536F75726365526563742E426F74746F6D0500000000000000B7064000
01055363616C6505000000000000008000400F536F75726365526563742E4C65
667405000000000000808708400E536F75726365526563742E546F7005000000
00000000D4064010536F75726365526563742E52696768740500000000000080
8F084011536F75726365526563742E426F74746F6D0500000000000000F40640
0001055363616C650500000000000000C000400F536F75726365526563742E4C
6566740500000000000040CB08400E536F75726365526563742E546F70050000
00000000009F074010536F75726365526563742E526967687405000000000000
40D7084011536F75726365526563742E426F74746F6D0500000000000000B707
4000000A536F757263654C696E6B0E010F536F75726365526563742E4C656674
05000000000000808707400E536F75726365526563742E546F70050000000000
0000D4054010536F75726365526563742E526967687405000000000000808F07
4011536F75726365526563742E426F74746F6D0500000000000000F405400001
055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566
740500000000000000CB07400E536F75726365526563742E546F700500000000
0000009F064010536F75726365526563742E52696768740500000000000000D7
074011536F75726365526563742E426F74746F6D0500000000000000B7064000
01055363616C6505000000000000008000400F536F75726365526563742E4C65
667405000000000000808708400E536F75726365526563742E546F7005000000
00000000D4064010536F75726365526563742E52696768740500000000000080
8F084011536F75726365526563742E426F74746F6D0500000000000000F40640
0001055363616C650500000000000000C000400F536F75726365526563742E4C
6566740500000000000040CB08400E536F75726365526563742E546F70050000
00000000009F074010536F75726365526563742E526967687405000000000000
40D7084011536F75726365526563742E426F74746F6D0500000000000000B707
40000013546F756368416E696D6174696F6E2E4C696E6B0E0000000016544163
746976655374796C65546578744F626A65637400095374796C654E616D650604
7465787405416C69676E0706436C69656E740C4D617267696E732E4C65667405
00000000000000C000400B4D617267696E732E546F70050000000000000080FF
3F0D4D617267696E732E52696768740500000000000000C000400E4D61726769
6E732E426F74746F6D050000000000000080FF3F0A53697A652E576964746805
00000000000000B907400B53697A652E4865696768740500000000000000F002
401453697A652E506C6174666F726D44656661756C7408165465787453657474
696E67732E466F6E742E53697A65050000000000000090034016546578745365
7474696E67732E466F6E74436F6C6F7207097839364646464646461554657874
53657474696E67732E576F72645772617008165465787453657474696E67732E
486F727A416C69676E07074C656164696E670D536861646F7756697369626C65
080D41637469766554726967676572070853656C65637465640B416374697665
436F6C6F720708636C6157686974650000005450463007544C61796F75740009
5374796C654E616D6506177472616E73706172656E746C697374626F78737479
6C6505416C69676E070643656E7465720C436C69704368696C6472656E090A53
697A652E576964746805000000000000208E07400B53697A652E486569676874
0500000000000080D206401453697A652E506C6174666F726D44656661756C74
080756697369626C6508085461624F726465720249000C5442727573684F626A
65637400095374796C654E616D650618416C7465726E6174696E67526F774261
636B67726F756E640B42727573682E436F6C6F72070978464646334633463300
0007544C61796F757400095374796C654E616D65060A6261636B67726F756E64
05416C69676E0708436F6E74656E74730A53697A652E57696474680500000000
0000208E07400B53697A652E4865696768740500000000000080D20640145369
7A652E506C6174666F726D44656661756C7408085461624F7264657202000007
544C61796F757400095374796C654E616D650607636F6E74656E7405416C6967
6E0706436C69656E740C436C69704368696C6472656E090A53697A652E576964
746805000000000000208A07400B53697A652E48656967687405000000000000
80CA06401453697A652E506C6174666F726D44656661756C7408085461624F72
646572020000000A545363726F6C6C42617200095374796C654E616D65060A76
7363726F6C6C62617205416C69676E070552696768740B536D616C6C4368616E
676505000000000000000000000B4F7269656E746174696F6E07085665727469
63616C0A506F736974696F6E2E5805000000000000208A07400A53697A652E57
6964746805000000000000008002400B53697A652E4865696768740500000000
000080CA06401453697A652E506C6174666F726D44656661756C740808546162
4F72646572020100000A545363726F6C6C42617200095374796C654E616D6506
0A687363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C43
68616E676505000000000000000000000B4F7269656E746174696F6E070A486F
72697A6F6E74616C0A506F736974696F6E2E590500000000000080CA06400A53
697A652E576964746805000000000000208E07400B53697A652E486569676874
05000000000000008002401453697A652E506C6174666F726D44656661756C74
08085461624F726465720202000007544C61796F75740005416C69676E070643
6C69656E740A53697A652E576964746805000000000000208A07400B53697A65
2E4865696768740500000000000080CA06401453697A652E506C6174666F726D
44656661756C7408085461624F726465720203000F54536D616C6C5363726F6C
6C42617200095374796C654E616D65060F76736D616C6C7363726F6C6C626172
05416C69676E070552696768740B536D616C6C4368616E676505000000000000
000000000B4F7269656E746174696F6E0708566572746963616C0C4D61726769
6E732E4C65667405000000000000008000400A53697A652E5769647468050000
00000000008002400B53697A652E486569676874050000000000000080024014
53697A652E506C6174666F726D44656661756C74080756697369626C65080000
0F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D
616C6C7363726F6C6C62617205416C69676E0706426F74746F6D0B536D616C6C
4368616E676505000000000000000000000B4F7269656E746174696F6E070A48
6F72697A6F6E74616C0B4D617267696E732E546F700500000000000000800040
0A53697A652E576964746805000000000000009606400B53697A652E48656967
687405000000000000008002401453697A652E506C6174666F726D4465666175
6C74080756697369626C650800000007544C61796F757400095374796C654E61
6D65060668656164657205416C69676E0703546F700A53697A652E5769647468
0500000000000000C804400B53697A652E4865696768740500000000000000C8
04401453697A652E506C6174666F726D44656661756C74080756697369626C65
08085461624F726465720204000007544C61796F757400095374796C654E616D
650606666F6F74657205416C69676E0706426F74746F6D0A53697A652E576964
74680500000000000000C804400B53697A652E48656967687405000000000000
00C804401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508085461624F72646572020500000A5452656374616E676C650009537479
6C654E616D65060973656C656374696F6E0946696C6C2E4B696E6407044E6F6E
650748697454657374080A53697A652E57696474680500000000000000C80440
0B53697A652E4865696768740500000000000000C804401453697A652E506C61
74666F726D44656661756C74080C5374726F6B652E436F6C6F72070978333246
464646464607585261646975730500000000000000C001400759526164697573
0500000000000000C00140000000005450463007544C61796F75740009537479
6C654E616D650614627574746F6E7374796C655F636F6E74696E756505416C69
676E070643656E7465720C50616464696E672E4C6566740500000000000000C0
02400B50616464696E672E546F7005000000000000008002400D50616464696E
672E52696768740500000000000000C002400E50616464696E672E426F74746F
6D05000000000000008002400A53697A652E57696474680500000000000000F4
06400B53697A652E48656967687405000000000000009804401453697A652E50
6C6174666F726D44656661756C74080756697369626C6508085461624F726465
72020B000A5452656374616E676C6500095374796C654E616D65060F52656374
616E676C65315374796C6505416C69676E0708436F6E74656E74730A46696C6C
2E436F6C6F7207097846463130413337460748697454657374080A53697A652E
57696474680500000000000000F406400B53697A652E48656967687405000000
000000009804401453697A652E506C6174666F726D44656661756C74080B5374
726F6B652E4B696E6407044E6F6E6507585261646975730500000000000000C0
014007595261646975730500000000000000C00140000F54436F6C6F72416E69
6D6174696F6E00095374796C654E616D650614436F6C6F72416E696D6174696F
6E315374796C65084475726174696F6E0500000000000AD7A3F83F0C50726F70
657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C756507
097846463130413337460953746F7056616C7565070978464630384241384507
54726967676572061049734D6F7573654F7665723D747275650E547269676765
72496E7665727365061149734D6F7573654F7665723D66616C73650000001654
427574746F6E5374796C65546578744F626A65637400095374796C654E616D65
06047465787405416C69676E0706436C69656E74064C6F636B6564090A53697A
652E57696474680500000000000000CA06400B53697A652E4865696768740500
000000000000B003401453697A652E506C6174666F726D44656661756C740816
5465787453657474696E67732E466F6E742E53697A650500000000000000E002
40165465787453657474696E67732E466F6E74436F6C6F720708636C61576869
7465155465787453657474696E67732E5472696D6D696E670709436861726163
746572155465787453657474696E67732E576F72645772617008165465787453
657474696E67732E486F727A416C69676E07074C656164696E670D536861646F
7756697369626C650808486F74436F6C6F720708636C6157686974650C466F63
75736564436F6C6F720708636C6157686974650B4E6F726D616C436F6C6F7207
08636C6157686974650C50726573736564436F6C6F720708636C615768697465
000005545061746800095374796C654E616D65060A50617468315374796C6505
416C69676E07044C65667409446174612E506174680AD8010000270000000000
0000D34D2E415A642340020000003A582A41DFCA03400200000016BB20419307
EE3F02000000B8D418412EDA064002000000CDBE1541CA090D4002000000143E
1341AC0C1740020000002DB211415964234001000000B4C806408B6C84410200
000068EFED3F116088410200000059C503405D2E8D4102000000876123407D28
8F4102000000BBB43140DA0D904102000000B3324240FC3E9041020000009899
51402DB28F41010000006666044195438441020000000F450B41124883410200
000004011041002480410200000000001041D122794101000000000010410000
30410200000000001041D729274102000000D829174100002041020000000000
2041000020410200000028D62841000020410200000000003041D72927410200
000000003041000030410100000000003041D1227941020000001CFF2F412424
8041020000002CBB34412C48834102000000DF993B41A043844101000000F0CC
85412BB08F4102000000500C8A4189E7904102000000397A8E4175728E410200
000097B18F4114338A4102000000A23E90418646884102000000EE0D9041FE36
86410200000019298F41966C84410100000032522E41B064234003000000D34D
2E415A64234003000000D34D2E415A6423400A46696C6C2E436F6C6F72070978
46464439443945330748697454657374080D4D617267696E732E526967687405
00000000000000C001400A506F736974696F6E2E580500000000000000C00240
0A506F736974696F6E2E5905000000000000008002400D526F746174696F6E41
6E676C650500000000000000B405400A53697A652E5769647468050000000000
0000C002400B53697A652E4865696768740500000000000000B003401453697A
652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704
4E6F6E6508577261704D6F646507034669740000005450463007544C61796F75
7400095374796C654E616D65060B627574746F6E7374796C6505416C69676E07
0643656E7465720C50616464696E672E4C6566740500000000000000C002400B
50616464696E672E546F7005000000000000008002400D50616464696E672E52
696768740500000000000000C002400E50616464696E672E426F74746F6D0500
0000000000008002400A53697A652E57696474680500000000000000F406400B
53697A652E48656967687405000000000000009804401453697A652E506C6174
666F726D44656661756C74080756697369626C6508085461624F72646572020D
000A5452656374616E676C6500095374796C654E616D65060F52656374616E67
6C65315374796C6505416C69676E0708436F6E74656E74730A46696C6C2E436F
6C6F7207097846463334333534310748697454657374080A53697A652E576964
74680500000000000000F406400B53697A652E48656967687405000000000000
009804401453697A652E506C6174666F726D44656661756C74080C5374726F6B
652E436F6C6F7207097846463536353836390758526164697573050000000000
0000C0014007595261646975730500000000000000C00140000F54436F6C6F72
416E696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D61
74696F6E315374796C65084475726174696F6E0500000000000AD7A3F83F0C50
726F70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C
756507097846463334333534310953746F7056616C7565070978464634313430
34450754726967676572061049734D6F7573654F7665723D747275650E547269
67676572496E7665727365061149734D6F7573654F7665723D66616C73650000
001654427574746F6E5374796C65546578744F626A65637400095374796C654E
616D6506047465787405416C69676E0706436C69656E74064C6F636B6564090A
53697A652E57696474680500000000000000DC06400B53697A652E4865696768
740500000000000000B003401453697A652E506C6174666F726D44656661756C
7408165465787453657474696E67732E466F6E742E53697A6505000000000000
00E00240165465787453657474696E67732E466F6E74436F6C6F720708636C61
5768697465155465787453657474696E67732E5472696D6D696E670709436861
726163746572155465787453657474696E67732E576F72645772617008165465
787453657474696E67732E486F727A416C69676E07074C656164696E670D5368
61646F7756697369626C650808486F74436F6C6F720708636C6157686974650C
466F6375736564436F6C6F720708636C6157686974650B4E6F726D616C436F6C
6F720708636C6157686974650C50726573736564436F6C6F720708636C615768
69746500000654476C79706800095374796C654E616D650605676C7970680D4D
617267696E732E52696768740500000000000000C0014005416C69676E07044C
6566740A506F736974696F6E2E580500000000000000C002400A506F73697469
6F6E2E5905000000000000008002400A53697A652E5769647468050000000000
00008003400B53697A652E4865696768740500000000000000B003401453697A
652E506C6174666F726D44656661756C74080000005450463007544C61796F75
7400095374796C654E616D650619627574746F6E7374796C655F696D706F7274
5F6578706F727405416C69676E070643656E7465720C50616464696E672E4C65
66740500000000000000C002400B50616464696E672E546F7005000000000000
008002400D50616464696E672E52696768740500000000000000C002400E5061
6464696E672E426F74746F6D05000000000000008002400A53697A652E576964
74680500000000000000F406400B53697A652E48656967687405000000000000
009804401453697A652E506C6174666F726D44656661756C7408075669736962
6C6508085461624F72646572020C000A5452656374616E676C6500095374796C
654E616D65060F52656374616E676C65315374796C6505416C69676E0708436F
6E74656E74730A46696C6C2E436F6C6F72070978464633343335343107486974
54657374080A53697A652E57696474680500000000000000F406400B53697A65
2E48656967687405000000000000009804401453697A652E506C6174666F726D
44656661756C74080C5374726F6B652E436F6C6F720709784646353635383639
07585261646975730500000000000000C0014007595261646975730500000000
000000C00140000F54436F6C6F72416E696D6174696F6E00095374796C654E61
6D650614436F6C6F72416E696D6174696F6E315374796C65084475726174696F
6E0500000000000AD7A3F83F0C50726F70657274794E616D65060A46696C6C2E
436F6C6F720A537461727456616C756507097846463334333534310953746F70
56616C756507097846463431343034450754726967676572061049734D6F7573
654F7665723D747275650E54726967676572496E7665727365061149734D6F75
73654F7665723D66616C73650000001654427574746F6E5374796C6554657874
4F626A65637400095374796C654E616D6506047465787405416C69676E070643
6C69656E74064C6F636B6564090A53697A652E57696474680500000000000000
C606400B53697A652E4865696768740500000000000000B003401453697A652E
506C6174666F726D44656661756C7408165465787453657474696E67732E466F
6E742E53697A650500000000000000E00240165465787453657474696E67732E
466F6E74436F6C6F720708636C615768697465155465787453657474696E6773
2E5472696D6D696E670709436861726163746572155465787453657474696E67
732E576F72645772617008165465787453657474696E67732E486F727A416C69
676E07074C656164696E670D536861646F7756697369626C650808486F74436F
6C6F720708636C6157686974650C466F6375736564436F6C6F720708636C6157
686974650B4E6F726D616C436F6C6F720708636C6157686974650C5072657373
6564436F6C6F720708636C61576869746500000654476C79706800095374796C
654E616D650605676C7970680D4D617267696E732E5269676874050000000000
0000C0014005416C69676E07044C6566740A506F736974696F6E2E5805000000
00000000C002400A506F736974696F6E2E5905000000000000008002400A5369
7A652E576964746805000000000000008003400B53697A652E48656967687405
00000000000000B003401453697A652E506C6174666F726D44656661756C7408
000005545061746800095374796C654E616D65060A50617468315374796C6505
416C69676E07044C65667409446174612E506174680AAC0000000E0000000000
000000006041CCFFCF41010000000000A040E6FF0B420100000000006041E6FF
2F42000000000000A04080080C42010000000000B44180080C42000000000000
0842000090410100000000002C420000D8410100000000000842000010420000
000000002C423411D841010000000000CC413411D84100000000000090400000
C04101000000000090400000F0400100000000002E420000F040010000000000
2E42000070410946696C6C2E4B696E6407044E6F6E650748697454657374080D
4D617267696E732E52696768740500000000000000C001400A506F736974696F
6E2E580500000000000000C002400A506F736974696F6E2E5905000000000000
008002400D526F746174696F6E416E676C650500000000000000B405400A5369
7A652E576964746805000000000000008003400B53697A652E48656967687405
00000000000000B003401453697A652E506C6174666F726D44656661756C7408
0C5374726F6B652E436F6C6F720709784646443944394533105374726F6B652E
546869636B6E6573730500000000003333B3FF3F08577261704D6F6465070346
69740000005450463007544C61796F757400095374796C654E616D6506137261
64696F627574746F6E7374796C655F6D6405416C69676E070643656E7465720A
53697A652E57696474680500000000000000F005400B53697A652E4865696768
740500000000000000A003401453697A652E506C6174666F726D44656661756C
74080756697369626C6508085461624F72646572022F0007544C61796F757400
05416C69676E07044C6566740A53697A652E57696474680500000000000000A0
03400B53697A652E4865696768740500000000000000A003401453697A652E50
6C6174666F726D44656661756C7408000754436972636C6500095374796C654E
616D65060A6261636B67726F756E6405416C69676E070643656E746572094669
6C6C2E4B696E6407044E6F6E650748697454657374080C50616464696E672E4C
6566740500000000000000A001400B50616464696E672E546F70050000000000
0000A001400D50616464696E672E52696768740500000000000000A001400E50
616464696E672E426F74746F6D0500000000000000A001400A53697A652E5769
6474680500000000000000A003400B53697A652E486569676874050000000000
0000A003401453697A652E506C6174666F726D44656661756C74080C5374726F
6B652E436F6C6F720709784646333433353431105374726F6B652E546869636B
6E6573730500000000000000800040000754436972636C6500095374796C654E
616D650605636865636B05416C69676E0706436C69656E740A46696C6C2E436F
6C6F720709784646414341434245074869745465737408074F70616369747905
000000000000000000000A53697A652E57696474680500000000000000A00240
0B53697A652E4865696768740500000000000000A002401453697A652E506C61
74666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E6500
0F54466C6F6174416E696D6174696F6E00095374796C654E616D6506076F7061
63697479084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274
794E616D6506074F7061636974790A537461727456616C756505000000000000
000000000953746F7056616C7565050000000000000080FF3F07547269676765
72060E4973436865636B65643D747275650E54726967676572496E7665727365
060F4973436865636B65643D66616C73650000000F54436F6C6F72416E696D61
74696F6E00095374796C654E616D6506067374726F6B65084475726174696F6E
050000000000CDCCCCFC3F0C50726F70657274794E616D65060C5374726F6B65
2E436F6C6F720A537461727456616C756507097846463334333534310953746F
7056616C756507097846464143414342450754726967676572060E4973436865
636B65643D747275650E54726967676572496E7665727365060F497343686563
6B65643D66616C7365000000001654427574746F6E5374796C65546578744F62
6A65637400095374796C654E616D6506047465787405416C69676E0706436C69
656E74064C6F636B6564090C4D617267696E732E4C6566740500000000000000
A002400A53697A652E57696474680500000000000000B405400B53697A652E48
65696768740500000000000000A003401453697A652E506C6174666F726D4465
6661756C7408185465787453657474696E67732E466F6E742E46616D696C7906
06526F626F746F165465787453657474696E67732E466F6E74436F6C6F720708
636C6157686974650D536861646F7756697369626C650808486F74436F6C6F72
0708636C6157686974650C466F6375736564436F6C6F720708636C6157686974
650B4E6F726D616C436F6C6F720708636C6157686974650C5072657373656443
6F6C6F720708636C6157686974650000005450463007544C61796F7574000953
74796C654E616D650615627574746F6E7374796C655F636C6561726D696E6905
416C69676E070643656E7465720A53697A652E57696474680500000000000000
8004400B53697A652E48656967687405000000000000008004401453697A652E
506C6174666F726D44656661756C74080756697369626C6508085461624F7264
65720208000A5452656374616E676C6500095374796C654E616D65060F526563
74616E676C65315374796C6505416C69676E0708436F6E74656E74730A46696C
6C2E436F6C6F7207097830303230323132330748697454657374080A53697A65
2E576964746805000000000000008004400B53697A652E486569676874050000
00000000008004401453697A652E506C6174666F726D44656661756C74080B53
74726F6B652E4B696E6407044E6F6E6507585261646975730500000000000000
C0014007595261646975730500000000000000C00140000F54436F6C6F72416E
696D6174696F6E00095374796C654E616D650614436F6C6F72416E696D617469
6F6E315374796C65084475726174696F6E0500000000006F1283F53F0C50726F
70657274794E616D65060A46696C6C2E436F6C6F720A537461727456616C7565
07097830303230323132330953746F7056616C75650709784646323032313233
0754726967676572061049734D6F7573654F7665723D747275650E5472696767
6572496E7665727365061149734D6F7573654F7665723D66616C736500000006
54476C79706800095374796C654E616D65060A676C7970687374796C650C4D61
7267696E732E4C65667405000000000000008000400B4D617267696E732E546F
7005000000000000008000400D4D617267696E732E5269676874050000000000
00008000400E4D617267696E732E426F74746F6D050000000000000080004005
416C69676E070643656E7465720A53697A652E57696474680500000000000000
C003400B53697A652E4865696768740500000000000000C003401453697A652E
506C6174666F726D44656661756C74080A496D616765496E6465780202000E54
46696C6C52474245666665637400095374796C654E616D65061346696C6C5247
42456666656374315374796C6505436F6C6F7207097846464439443945330000
0000545046300A5452656374616E676C6500095374796C654E616D65060F6261
636B67726F756E647374796C6505416C69676E070643656E7465720A46696C6C
2E436F6C6F7207097846463230323132330A53697A652E576964746805000000
00000000C804400B53697A652E4865696768740500000000000000C804401453
697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E64
07044E6F6E650756697369626C65080000}
end
item
Platform = 'iOS'
ResourcesBin = {
464D585F5354594C4520322E3501060F6D656D6F7374796C655F636C65617203
8807060E6D656D6F7374796C655F636F646503E30806106D656D6F7374796C65
5F6E6F726D616C03300A06176C65667473656C656374696F6E706F696E747374
796C6503C5010618726967687473656C656374696F6E706F696E747374796C65
039B01005450463007544C61796F757400095374796C654E616D65060F6D656D
6F7374796C655F636C65617205416C69676E070643656E7465720A53697A652E
57696474680500000000000000F406400B53697A652E48656967687405000000
000000009908401453697A652E506C6174666F726D44656661756C7408075669
7369626C6508085461624F726465720228000C5442727573684F626A65637400
095374796C654E616D65060A666F726567726F756E640B42727573682E436F6C
6F720708636C61426C61636B00000C5442727573684F626A6563740009537479
6C654E616D65060973656C656374696F6E0B42727573682E436F6C6F72070978
363431463230323700000B54466F6E744F626A65637400095374796C654E616D
650604666F6E74000007544C61796F757400095374796C654E616D650607636F
6E74656E7405416C69676E0706436C69656E740C4D617267696E732E4C656674
0500000000000000A001400D4D617267696E732E526967687405000000000000
00A001400A53697A652E57696474680500000000000000E206400B53697A652E
48656967687405000000000000009708401453697A652E506C6174666F726D44
656661756C7408085461624F72646572020000000A545363726F6C6C42617200
095374796C654E616D65060A767363726F6C6C62617205416C69676E07055269
67687406437572736F72070763724172726F770B536D616C6C4368616E676505
000000000000000000000B4F7269656E746174696F6E0708566572746963616C
0A506F736974696F6E2E580500000000000000EC06400A53697A652E57696474
6805000000000000008002400B53697A652E4865696768740500000000000000
9708401453697A652E506C6174666F726D44656661756C7408085461624F7264
6572020100000A545363726F6C6C42617200095374796C654E616D65060A6873
63726F6C6C62617205416C69676E0706426F74746F6D06437572736F72070763
724172726F770B536D616C6C4368616E676505000000000000000000000B4F72
69656E746174696F6E070A486F72697A6F6E74616C0A506F736974696F6E2E59
05000000000000009708400A53697A652E57696474680500000000000000F406
400B53697A652E48656967687405000000000000008002401453697A652E506C
6174666F726D44656661756C7408085461624F726465720202000007544C6179
6F75740005416C69676E0706436C69656E740A53697A652E5769647468050000
0000000000EC06400B53697A652E486569676874050000000000000097084014
53697A652E506C6174666F726D44656661756C7408085461624F726465720203
000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F7673
6D616C6C7363726F6C6C62617205416C69676E0705526967687406437572736F
72070763724172726F770B536D616C6C4368616E676505000000000000000000
000B4F7269656E746174696F6E0708566572746963616C0C4D617267696E732E
4C65667405000000000000008000400A53697A652E5769647468050000000000
00008002400B53697A652E48656967687405000000000000008002401453697A
652E506C6174666F726D44656661756C74080756697369626C650800000F5453
6D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C
7363726F6C6C62617205416C69676E0706426F74746F6D06437572736F720707
63724172726F770B536D616C6C4368616E676505000000000000000000000B4F
7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E54
6F7005000000000000008000400A53697A652E57696474680500000000000000
9606400B53697A652E48656967687405000000000000008002401453697A652E
506C6174666F726D44656661756C74080756697369626C65080000000F545365
6C656374696F6E506F696E7400095374796C654E616D6506126C65667473656C
656374696F6E706F696E74084772697053697A650500000000000000C000400C
4772697043656E7465722E580500000000000000E002400C4772697043656E74
65722E590500000000000000B003C00A53697A652E5769647468050000000000
0000C003400B53697A652E4865696768740500000000000000C004401453697A
652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75700617
6C65667473656C656374696F6E706F696E747374796C6519546F756368546172
676574457870616E73696F6E2E4C6566740500000000000000E003401A546F75
6368546172676574457870616E73696F6E2E52696768740500000000000000E0
03C000000F5453656C656374696F6E506F696E7400095374796C654E616D6506
13726967687473656C656374696F6E706F696E74084772697053697A65050000
0000000000C000400C4772697043656E7465722E590500000000000000B004C0
0A53697A652E57696474680500000000000000C003400B53697A652E48656967
68740500000000000000C004401453697A652E506C6174666F726D4465666175
6C74080B5374796C654C6F6F6B75700618726967687473656C656374696F6E70
6F696E747374796C650000005450463007544C61796F757400095374796C654E
616D65060E6D656D6F7374796C655F636F646505416C69676E070643656E7465
720A53697A652E57696474680500000000000000C806400B53697A652E486569
6768740500000000000000C806401453697A652E506C6174666F726D44656661
756C74080756697369626C6508085461624F72646572022B000A545265637461
6E676C6500095374796C654E616D65060F52656374616E676C65315374796C65
05416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F720709783332
3030303030300748697454657374080A53697A652E5769647468050000000000
0000C806400B53697A652E4865696768740500000000000000C806401453697A
652E506C6174666F726D44656661756C74080B5374726F6B652E4B696E640704
4E6F6E6507585261646975730500000000000000C00140075952616469757305
00000000000000C0014000000C5442727573684F626A65637400095374796C65
4E616D65060A666F726567726F756E640B42727573682E436F6C6F720708636C
61426C61636B00000C5442727573684F626A65637400095374796C654E616D65
060973656C656374696F6E0B42727573682E436F6C6F72070978363434453445
353300000B54466F6E744F626A65637400095374796C654E616D650604666F6E
74000007544C61796F757400095374796C654E616D650607636F6E74656E7405
416C69676E0706436C69656E740C4D617267696E732E4C656674050000000000
0000A001400B4D617267696E732E546F700500000000000000A001400D4D6172
67696E732E52696768740500000000000000A001400E4D617267696E732E426F
74746F6D0500000000000000A001400A53697A652E5769647468050000000000
0000B606400B53697A652E4865696768740500000000000000B606401453697A
652E506C6174666F726D44656661756C7408085461624F72646572020000000A
545363726F6C6C42617200095374796C654E616D65060A767363726F6C6C6261
7205416C69676E0705526967687406437572736F72070763724172726F770B53
6D616C6C4368616E676505000000000000000000000B4F7269656E746174696F
6E0708566572746963616C0A506F736974696F6E2E580500000000000000C006
400A53697A652E576964746805000000000000008002400B53697A652E486569
6768740500000000000000C006401453697A652E506C6174666F726D44656661
756C7408085461624F72646572020100000A545363726F6C6C42617200095374
796C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F
6D06437572736F72070763724172726F770B536D616C6C4368616E6765050000
00000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C
0A506F736974696F6E2E590500000000000000C006400A53697A652E57696474
680500000000000000C806400B53697A652E4865696768740500000000000000
8002401453697A652E506C6174666F726D44656661756C7408085461624F7264
65720202000007544C61796F75740005416C69676E0706436C69656E740A5369
7A652E57696474680500000000000000C006400B53697A652E48656967687405
00000000000000C006401453697A652E506C6174666F726D44656661756C7408
085461624F726465720203000F54536D616C6C5363726F6C6C42617200095374
796C654E616D65060F76736D616C6C7363726F6C6C62617205416C69676E0705
526967687406437572736F72070763724172726F770B536D616C6C4368616E67
6505000000000000000000000B4F7269656E746174696F6E0708566572746963
616C0C4D617267696E732E4C65667405000000000000008000400A53697A652E
576964746805000000000000008002400B53697A652E48656967687405000000
000000008002401453697A652E506C6174666F726D44656661756C7408075669
7369626C650800000F54536D616C6C5363726F6C6C42617200095374796C654E
616D65060F68736D616C6C7363726F6C6C62617205416C69676E0706426F7474
6F6D06437572736F72070763724172726F770B536D616C6C4368616E67650500
0000000000000000000B4F7269656E746174696F6E070A486F72697A6F6E7461
6C0B4D617267696E732E546F7005000000000000008000400A53697A652E5769
64746805000000000000009606400B53697A652E486569676874050000000000
00008002401453697A652E506C6174666F726D44656661756C74080756697369
626C65080000000F5453656C656374696F6E506F696E7400095374796C654E61
6D6506126C65667473656C656374696F6E706F696E74084772697053697A6505
00000000000000C000400C4772697043656E7465722E580500000000000000E0
02400C4772697043656E7465722E590500000000000000B003C00A506F736974
696F6E2E580500000000000000B005400A506F736974696F6E2E590500000000
000000B005400A53697A652E57696474680500000000000000C003400B53697A
652E4865696768740500000000000000C004401453697A652E506C6174666F72
6D44656661756C74080B5374796C654C6F6F6B757006176C65667473656C6563
74696F6E706F696E747374796C6519546F756368546172676574457870616E73
696F6E2E4C6566740500000000000000E003401A546F75636854617267657445
7870616E73696F6E2E52696768740500000000000000E003C000000F5453656C
656374696F6E506F696E7400095374796C654E616D650613726967687473656C
656374696F6E706F696E74084772697053697A650500000000000000C000400C
4772697043656E7465722E590500000000000000B004C00A506F736974696F6E
2E580500000000000000B005400A506F736974696F6E2E590500000000000000
B005400A53697A652E57696474680500000000000000C003400B53697A652E48
65696768740500000000000000C004401453697A652E506C6174666F726D4465
6661756C74080B5374796C654C6F6F6B75700618726967687473656C65637469
6F6E706F696E747374796C650000005450463007544C61796F75740009537479
6C654E616D6506106D656D6F7374796C655F6E6F726D616C05416C69676E0706
43656E7465720C50616464696E672E4C65667405000000000000008001400B50
616464696E672E546F7005000000000000008001400D50616464696E672E5269
67687405000000000000008001400E50616464696E672E426F74746F6D050000
00000000008001400A53697A652E57696474680500000000000000F406400B53
697A652E48656967687405000000000000009908401453697A652E506C617466
6F726D44656661756C74080756697369626C6508085461624F72646572022100
0A5452656374616E676C6500095374796C654E616D650602626705416C69676E
0708436F6E74656E74730A46696C6C2E436F6C6F720709783343464646464646
0748697454657374080A53697A652E57696474680500000000000000F406400B
53697A652E48656967687405000000000000009908401453697A652E506C6174
666F726D44656661756C74080C5374726F6B652E436F6C6F7207097835414646
4646464607585261646975730500000000000000C00040075952616469757305
00000000000000C00040000F54436F6C6F72416E696D6174696F6E0009537479
6C654E616D650614436F6C6F72416E696D6174696F6E315374796C6508447572
6174696F6E050000000000CDCCCCFC3F0C50726F70657274794E616D65060C53
74726F6B652E436F6C6F720A537461727456616C756507097835414646464646
460953746F7056616C756507097843384646464646460754726967676572060E
4973466F63757365643D747275650E54726967676572496E7665727365060F49
73466F63757365643D66616C73650000000C5442727573684F626A6563740009
5374796C654E616D65060A666F726567726F756E6400000C5442727573684F62
6A65637400095374796C654E616D65060973656C656374696F6E0B4272757368
2E436F6C6F72070978374632413936464600000B54466F6E744F626A65637400
095374796C654E616D650604666F6E7409466F6E742E53697A65050000000000
0000E00240000007544C61796F757400095374796C654E616D650607636F6E74
656E7405416C69676E0706436C69656E740C4D617267696E732E4C6566740500
0000000000008001400B4D617267696E732E546F700500000000000000800140
0D4D617267696E732E526967687405000000000000008001400E4D617267696E
732E426F74746F6D05000000000000008001400A53697A652E57696474680500
000000000000DC06400B53697A652E4865696768740500000000000000930840
1453697A652E506C6174666F726D44656661756C7408085461624F7264657202
0000000A545363726F6C6C42617200095374796C654E616D65060A767363726F
6C6C62617205416C69676E0705526967687406437572736F7207076372417272
6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74
6174696F6E0708566572746963616C0A506F736974696F6E2E58050000000000
0000E806400A506F736974696F6E2E5905000000000000008001400A53697A65
2E576964746805000000000000008002400B53697A652E486569676874050000
00000000009508401453697A652E506C6174666F726D44656661756C74080854
61624F72646572020100000A545363726F6C6C42617200095374796C654E616D
65060A687363726F6C6C62617205416C69676E0706426F74746F6D0643757273
6F72070763724172726F770B536D616C6C4368616E6765050000000000000000
00000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974
696F6E2E5805000000000000008001400A506F736974696F6E2E590500000000
0000009608400A53697A652E57696474680500000000000000EC06400B53697A
652E48656967687405000000000000008002401453697A652E506C6174666F72
6D44656661756C7408085461624F726465720202000007544C61796F75740005
416C69676E0706436C69656E740A53697A652E57696474680500000000000000
E406400B53697A652E48656967687405000000000000009508401453697A652E
506C6174666F726D44656661756C7408085461624F726465720203000F54536D
616C6C5363726F6C6C42617200095374796C654E616D65060F76736D616C6C73
63726F6C6C62617205416C69676E0705526967687406437572736F7207076372
4172726F770B536D616C6C4368616E676505000000000000000000000B4F7269
656E746174696F6E0708566572746963616C0C4D617267696E732E4C65667405
000000000000008000400A53697A652E57696474680500000000000000800240
0B53697A652E48656967687405000000000000008002401453697A652E506C61
74666F726D44656661756C74080756697369626C650800000F54536D616C6C53
63726F6C6C42617200095374796C654E616D65060F68736D616C6C7363726F6C
6C62617205416C69676E0706426F74746F6D06437572736F7207076372417272
6F770B536D616C6C4368616E676505000000000000000000000B4F7269656E74
6174696F6E070A486F72697A6F6E74616C0B4D617267696E732E546F70050000
00000000008000400A53697A652E576964746805000000000000009606400B53
697A652E48656967687405000000000000008002401453697A652E506C617466
6F726D44656661756C74080756697369626C65080000000F5453656C65637469
6F6E506F696E7400095374796C654E616D6506126C65667473656C656374696F
6E706F696E74084772697053697A650500000000000000C000400C4772697043
656E7465722E580500000000000000E002400C4772697043656E7465722E5905
00000000000000B003C00A506F736974696F6E2E580500000000000000DC0540
0A506F736974696F6E2E5905000000000000009307400A53697A652E57696474
680500000000000000C003400B53697A652E4865696768740500000000000000
C004401453697A652E506C6174666F726D44656661756C74080B5374796C654C
6F6F6B757006176C65667473656C656374696F6E706F696E747374796C651954
6F756368546172676574457870616E73696F6E2E4C6566740500000000000000
E003401A546F756368546172676574457870616E73696F6E2E52696768740500
000000000000E003C000000F5453656C656374696F6E506F696E740009537479
6C654E616D650613726967687473656C656374696F6E706F696E740847726970
53697A650500000000000000C000400C4772697043656E7465722E5905000000
00000000B004C00A506F736974696F6E2E580500000000000000DC05400A506F
736974696F6E2E5905000000000000009307400A53697A652E57696474680500
000000000000C003400B53697A652E4865696768740500000000000000C00440
1453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B
75700618726967687473656C656374696F6E706F696E747374796C6500000054
50463007544C61796F757400095374796C654E616D6506176C65667473656C65
6374696F6E706F696E747374796C6505416C69676E070643656E7465720A5369
7A652E57696474680500000000000000C003400B53697A652E48656967687405
00000000000000C004401453697A652E506C6174666F726D44656661756C7408
0756697369626C6508085461624F7264657202400A4669786564576964746802
180B46697865644865696768740230000A5452656374616E676C650009537479
6C654E616D65060A6261636B67726F756E6407436F726E6572730B07546F704C
6566740A426F74746F6D4C6566740B426F74746F6D5269676874000A46696C6C
2E436F6C6F7207097846464143414342450748697454657374080A506F736974
696F6E2E580500000000000000A803C00A506F736974696F6E2E590500000000
0000008404400A53697A652E57696474680500000000000000A003400B53697A
652E4865696768740500000000000000A003401453697A652E506C6174666F72
6D44656661756C74080B5374726F6B652E4B696E6407044E6F6E650758526164
6975730500000000000000A0024007595261646975730500000000000000A002
400000005450463007544C61796F757400095374796C654E616D650618726967
687473656C656374696F6E706F696E747374796C6505416C69676E070643656E
7465720A53697A652E57696474680500000000000000C003400B53697A652E48
65696768740500000000000000C004401453697A652E506C6174666F726D4465
6661756C74080756697369626C6508085461624F7264657202440A4669786564
576964746802180B46697865644865696768740230000A5452656374616E676C
6500095374796C654E616D65060A6261636B67726F756E6407436F726E657273
0B08546F7052696768740A426F74746F6D4C6566740B426F74746F6D52696768
74000A46696C6C2E436F6C6F7207097846464143414342450748697454657374
080A53697A652E57696474680500000000000000A003400B53697A652E486569
6768740500000000000000A003401453697A652E506C6174666F726D44656661
756C74080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500
000000000000A0024007595261646975730500000000000000A00240000000}
end
item
Platform = 'Android'
ResourcesBin = {
464D585F5354594C4520322E350106176C65667473656C656374696F6E706F69
6E747374796C6503C501060F6D656D6F7374796C655F636C656172038807060E
6D656D6F7374796C655F636F646503E30806106D656D6F7374796C655F6E6F72
6D616C03300A0618726967687473656C656374696F6E706F696E747374796C65
039B01005450463007544C61796F757400095374796C654E616D6506176C6566
7473656C656374696F6E706F696E747374796C6505416C69676E070643656E74
65720A53697A652E57696474680500000000000000C003400B53697A652E4865
696768740500000000000000C004401453697A652E506C6174666F726D446566
61756C74080756697369626C6508085461624F7264657202370A466978656457
6964746802180B46697865644865696768740230000A5452656374616E676C65
00095374796C654E616D65060A6261636B67726F756E6407436F726E6572730B
07546F704C6566740A426F74746F6D4C6566740B426F74746F6D526967687400
0A46696C6C2E436F6C6F7207097846464143414342450748697454657374080A
506F736974696F6E2E580500000000000000A803C00A506F736974696F6E2E59
05000000000000008404400A53697A652E57696474680500000000000000A003
400B53697A652E4865696768740500000000000000A003401453697A652E506C
6174666F726D44656661756C74080B5374726F6B652E4B696E6407044E6F6E65
07585261646975730500000000000000A0024007595261646975730500000000
000000A002400000005450463007544C61796F757400095374796C654E616D65
060F6D656D6F7374796C655F636C65617205416C69676E070643656E7465720A
53697A652E57696474680500000000000000F406400B53697A652E4865696768
7405000000000000009908401453697A652E506C6174666F726D44656661756C
74080756697369626C6508085461624F726465720228000C5442727573684F62
6A65637400095374796C654E616D65060A666F726567726F756E640B42727573
682E436F6C6F720708636C61426C61636B00000C5442727573684F626A656374
00095374796C654E616D65060973656C656374696F6E0B42727573682E436F6C
6F72070978363431463230323700000B54466F6E744F626A6563740009537479
6C654E616D650604666F6E74000007544C61796F757400095374796C654E616D
650607636F6E74656E7405416C69676E0706436C69656E740C4D617267696E73
2E4C6566740500000000000000A001400D4D617267696E732E52696768740500
000000000000A001400A53697A652E57696474680500000000000000E206400B
53697A652E48656967687405000000000000009708401453697A652E506C6174
666F726D44656661756C7408085461624F72646572020000000A545363726F6C
6C42617200095374796C654E616D65060A767363726F6C6C62617205416C6967
6E0705526967687406437572736F72070763724172726F770B536D616C6C4368
616E676505000000000000000000000B4F7269656E746174696F6E0708566572
746963616C0A506F736974696F6E2E580500000000000000EC06400A53697A65
2E576964746805000000000000008002400B53697A652E486569676874050000
00000000009708401453697A652E506C6174666F726D44656661756C74080854
61624F72646572020100000A545363726F6C6C42617200095374796C654E616D
65060A687363726F6C6C62617205416C69676E0706426F74746F6D0643757273
6F72070763724172726F770B536D616C6C4368616E6765050000000000000000
00000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A506F736974
696F6E2E5905000000000000009708400A53697A652E57696474680500000000
000000F406400B53697A652E4865696768740500000000000000800240145369
7A652E506C6174666F726D44656661756C7408085461624F7264657202020000
07544C61796F75740005416C69676E0706436C69656E740A53697A652E576964
74680500000000000000EC06400B53697A652E48656967687405000000000000
009708401453697A652E506C6174666F726D44656661756C7408085461624F72
6465720203000F54536D616C6C5363726F6C6C42617200095374796C654E616D
65060F76736D616C6C7363726F6C6C62617205416C69676E0705526967687406
437572736F72070763724172726F770B536D616C6C4368616E67650500000000
0000000000000B4F7269656E746174696F6E0708566572746963616C0C4D6172
67696E732E4C65667405000000000000008000400A53697A652E576964746805
000000000000008002400B53697A652E48656967687405000000000000008002
401453697A652E506C6174666F726D44656661756C74080756697369626C6508
00000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F68
736D616C6C7363726F6C6C62617205416C69676E0706426F74746F6D06437572
736F72070763724172726F770B536D616C6C4368616E67650500000000000000
0000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267
696E732E546F7005000000000000008000400A53697A652E5769647468050000
00000000009606400B53697A652E486569676874050000000000000080024014
53697A652E506C6174666F726D44656661756C74080756697369626C65080000
000F5453656C656374696F6E506F696E7400095374796C654E616D6506126C65
667473656C656374696F6E706F696E74084772697053697A6505000000000000
00C000400C4772697043656E7465722E580500000000000000E002400C477269
7043656E7465722E590500000000000000B003C00A53697A652E576964746805
00000000000000C003400B53697A652E4865696768740500000000000000C004
401453697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F
6B757006176C65667473656C656374696F6E706F696E747374796C6519546F75
6368546172676574457870616E73696F6E2E4C6566740500000000000000E003
401A546F756368546172676574457870616E73696F6E2E526967687405000000
00000000E003C000000F5453656C656374696F6E506F696E7400095374796C65
4E616D650613726967687473656C656374696F6E706F696E7408477269705369
7A650500000000000000C000400C4772697043656E7465722E59050000000000
0000B004C00A53697A652E57696474680500000000000000C003400B53697A65
2E4865696768740500000000000000C004401453697A652E506C6174666F726D
44656661756C74080B5374796C654C6F6F6B75700618726967687473656C6563
74696F6E706F696E747374796C650000005450463007544C61796F7574000953
74796C654E616D65060E6D656D6F7374796C655F636F646505416C69676E0706
43656E7465720A53697A652E57696474680500000000000000C806400B53697A
652E4865696768740500000000000000C806401453697A652E506C6174666F72
6D44656661756C74080756697369626C6508085461624F72646572022B000A54
52656374616E676C6500095374796C654E616D65060F52656374616E676C6531
5374796C6505416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72
07097833323030303030300748697454657374080A53697A652E576964746805
00000000000000C806400B53697A652E4865696768740500000000000000C806
401453697A652E506C6174666F726D44656661756C74080B5374726F6B652E4B
696E6407044E6F6E6507585261646975730500000000000000C0014007595261
646975730500000000000000C0014000000C5442727573684F626A6563740009
5374796C654E616D65060A666F726567726F756E640B42727573682E436F6C6F
720708636C61426C61636B00000C5442727573684F626A65637400095374796C
654E616D65060973656C656374696F6E0B42727573682E436F6C6F7207097836
3434453445353300000B54466F6E744F626A65637400095374796C654E616D65
0604666F6E74000007544C61796F757400095374796C654E616D650607636F6E
74656E7405416C69676E0706436C69656E740C4D617267696E732E4C65667405
00000000000000A001400B4D617267696E732E546F700500000000000000A001
400D4D617267696E732E52696768740500000000000000A001400E4D61726769
6E732E426F74746F6D0500000000000000A001400A53697A652E576964746805
00000000000000B606400B53697A652E4865696768740500000000000000B606
401453697A652E506C6174666F726D44656661756C7408085461624F72646572
020000000A545363726F6C6C42617200095374796C654E616D65060A76736372
6F6C6C62617205416C69676E0705526967687406437572736F72070763724172
726F770B536D616C6C4368616E676505000000000000000000000B4F7269656E
746174696F6E0708566572746963616C0A506F736974696F6E2E580500000000
000000C006400A53697A652E576964746805000000000000008002400B53697A
652E4865696768740500000000000000C006401453697A652E506C6174666F72
6D44656661756C7408085461624F72646572020100000A545363726F6C6C4261
7200095374796C654E616D65060A687363726F6C6C62617205416C69676E0706
426F74746F6D06437572736F72070763724172726F770B536D616C6C4368616E
676505000000000000000000000B4F7269656E746174696F6E070A486F72697A
6F6E74616C0A506F736974696F6E2E590500000000000000C006400A53697A65
2E57696474680500000000000000C806400B53697A652E486569676874050000
00000000008002401453697A652E506C6174666F726D44656661756C74080854
61624F726465720202000007544C61796F75740005416C69676E0706436C6965
6E740A53697A652E57696474680500000000000000C006400B53697A652E4865
696768740500000000000000C006401453697A652E506C6174666F726D446566
61756C7408085461624F726465720203000F54536D616C6C5363726F6C6C4261
7200095374796C654E616D65060F76736D616C6C7363726F6C6C62617205416C
69676E0705526967687406437572736F72070763724172726F770B536D616C6C
4368616E676505000000000000000000000B4F7269656E746174696F6E070856
6572746963616C0C4D617267696E732E4C65667405000000000000008000400A
53697A652E576964746805000000000000008002400B53697A652E4865696768
7405000000000000008002401453697A652E506C6174666F726D44656661756C
74080756697369626C650800000F54536D616C6C5363726F6C6C426172000953
74796C654E616D65060F68736D616C6C7363726F6C6C62617205416C69676E07
06426F74746F6D06437572736F72070763724172726F770B536D616C6C436861
6E676505000000000000000000000B4F7269656E746174696F6E070A486F7269
7A6F6E74616C0B4D617267696E732E546F7005000000000000008000400A5369
7A652E576964746805000000000000009606400B53697A652E48656967687405
000000000000008002401453697A652E506C6174666F726D44656661756C7408
0756697369626C65080000000F5453656C656374696F6E506F696E7400095374
796C654E616D6506126C65667473656C656374696F6E706F696E740847726970
53697A650500000000000000C000400C4772697043656E7465722E5805000000
00000000E002400C4772697043656E7465722E590500000000000000B003C00A
506F736974696F6E2E580500000000000000B005400A506F736974696F6E2E59
0500000000000000B005400A53697A652E57696474680500000000000000C003
400B53697A652E4865696768740500000000000000C004401453697A652E506C
6174666F726D44656661756C74080B5374796C654C6F6F6B757006176C656674
73656C656374696F6E706F696E747374796C6519546F75636854617267657445
7870616E73696F6E2E4C6566740500000000000000E003401A546F7563685461
72676574457870616E73696F6E2E52696768740500000000000000E003C00000
0F5453656C656374696F6E506F696E7400095374796C654E616D650613726967
687473656C656374696F6E706F696E74084772697053697A6505000000000000
00C000400C4772697043656E7465722E590500000000000000B004C00A506F73
6974696F6E2E580500000000000000B005400A506F736974696F6E2E59050000
0000000000B005400A53697A652E57696474680500000000000000C003400B53
697A652E4865696768740500000000000000C004401453697A652E506C617466
6F726D44656661756C74080B5374796C654C6F6F6B7570061872696768747365
6C656374696F6E706F696E747374796C650000005450463007544C61796F7574
00095374796C654E616D6506106D656D6F7374796C655F6E6F726D616C05416C
69676E070643656E7465720C50616464696E672E4C6566740500000000000000
8001400B50616464696E672E546F7005000000000000008001400D5061646469
6E672E526967687405000000000000008001400E50616464696E672E426F7474
6F6D05000000000000008001400A53697A652E57696474680500000000000000
F406400B53697A652E48656967687405000000000000009908401453697A652E
506C6174666F726D44656661756C74080756697369626C6508085461624F7264
65720221000A5452656374616E676C6500095374796C654E616D650602626705
416C69676E0708436F6E74656E74730A46696C6C2E436F6C6F72070978334346
46464646460748697454657374080A53697A652E576964746805000000000000
00F406400B53697A652E48656967687405000000000000009908401453697A65
2E506C6174666F726D44656661756C74080C5374726F6B652E436F6C6F720709
78354146464646464607585261646975730500000000000000C0004007595261
646975730500000000000000C00040000F54436F6C6F72416E696D6174696F6E
00095374796C654E616D650614436F6C6F72416E696D6174696F6E315374796C
65084475726174696F6E050000000000CDCCCCFC3F0C50726F70657274794E61
6D65060C5374726F6B652E436F6C6F720A537461727456616C75650709783541
4646464646460953746F7056616C756507097843384646464646460754726967
676572060E4973466F63757365643D747275650E54726967676572496E766572
7365060F4973466F63757365643D66616C73650000000C5442727573684F626A
65637400095374796C654E616D65060A666F726567726F756E6400000C544272
7573684F626A65637400095374796C654E616D65060973656C656374696F6E0B
42727573682E436F6C6F72070978374632413936464600000B54466F6E744F62
6A65637400095374796C654E616D650604666F6E7409466F6E742E53697A6505
00000000000000E00240000007544C61796F757400095374796C654E616D6506
07636F6E74656E7405416C69676E0706436C69656E740C4D617267696E732E4C
65667405000000000000008001400B4D617267696E732E546F70050000000000
00008001400D4D617267696E732E526967687405000000000000008001400E4D
617267696E732E426F74746F6D05000000000000008001400A53697A652E5769
6474680500000000000000DC06400B53697A652E486569676874050000000000
00009308401453697A652E506C6174666F726D44656661756C7408085461624F
72646572020000000A545363726F6C6C42617200095374796C654E616D65060A
767363726F6C6C62617205416C69676E0705526967687406437572736F720707
63724172726F770B536D616C6C4368616E676505000000000000000000000B4F
7269656E746174696F6E0708566572746963616C0A506F736974696F6E2E5805
00000000000000E806400A506F736974696F6E2E590500000000000000800140
0A53697A652E576964746805000000000000008002400B53697A652E48656967
687405000000000000009508401453697A652E506C6174666F726D4465666175
6C7408085461624F72646572020100000A545363726F6C6C4261720009537479
6C654E616D65060A687363726F6C6C62617205416C69676E0706426F74746F6D
06437572736F72070763724172726F770B536D616C6C4368616E676505000000
000000000000000B4F7269656E746174696F6E070A486F72697A6F6E74616C0A
506F736974696F6E2E5805000000000000008001400A506F736974696F6E2E59
05000000000000009608400A53697A652E57696474680500000000000000EC06
400B53697A652E48656967687405000000000000008002401453697A652E506C
6174666F726D44656661756C7408085461624F726465720202000007544C6179
6F75740005416C69676E0706436C69656E740A53697A652E5769647468050000
0000000000E406400B53697A652E486569676874050000000000000095084014
53697A652E506C6174666F726D44656661756C7408085461624F726465720203
000F54536D616C6C5363726F6C6C42617200095374796C654E616D65060F7673
6D616C6C7363726F6C6C62617205416C69676E0705526967687406437572736F
72070763724172726F770B536D616C6C4368616E676505000000000000000000
000B4F7269656E746174696F6E0708566572746963616C0C4D617267696E732E
4C65667405000000000000008000400A53697A652E5769647468050000000000
00008002400B53697A652E48656967687405000000000000008002401453697A
652E506C6174666F726D44656661756C74080756697369626C650800000F5453
6D616C6C5363726F6C6C42617200095374796C654E616D65060F68736D616C6C
7363726F6C6C62617205416C69676E0706426F74746F6D06437572736F720707
63724172726F770B536D616C6C4368616E676505000000000000000000000B4F
7269656E746174696F6E070A486F72697A6F6E74616C0B4D617267696E732E54
6F7005000000000000008000400A53697A652E57696474680500000000000000
9606400B53697A652E48656967687405000000000000008002401453697A652E
506C6174666F726D44656661756C74080756697369626C65080000000F545365
6C656374696F6E506F696E7400095374796C654E616D6506126C65667473656C
656374696F6E706F696E74084772697053697A650500000000000000C000400C
4772697043656E7465722E580500000000000000E002400C4772697043656E74
65722E590500000000000000B003C00A506F736974696F6E2E58050000000000
0000DC05400A506F736974696F6E2E5905000000000000009307400A53697A65
2E57696474680500000000000000C003400B53697A652E486569676874050000
0000000000C004401453697A652E506C6174666F726D44656661756C74080B53
74796C654C6F6F6B757006176C65667473656C656374696F6E706F696E747374
796C6519546F756368546172676574457870616E73696F6E2E4C656674050000
0000000000E003401A546F756368546172676574457870616E73696F6E2E5269
6768740500000000000000E003C000000F5453656C656374696F6E506F696E74
00095374796C654E616D650613726967687473656C656374696F6E706F696E74
084772697053697A650500000000000000C000400C4772697043656E7465722E
590500000000000000B004C00A506F736974696F6E2E580500000000000000DC
05400A506F736974696F6E2E5905000000000000009307400A53697A652E5769
6474680500000000000000C003400B53697A652E486569676874050000000000
0000C004401453697A652E506C6174666F726D44656661756C74080B5374796C
654C6F6F6B75700618726967687473656C656374696F6E706F696E747374796C
650000005450463007544C61796F757400095374796C654E616D650618726967
687473656C656374696F6E706F696E747374796C6505416C69676E070643656E
7465720A53697A652E57696474680500000000000000C003400B53697A652E48
65696768740500000000000000C004401453697A652E506C6174666F726D4465
6661756C74080756697369626C6508085461624F7264657202440A4669786564
576964746802180B46697865644865696768740230000A5452656374616E676C
6500095374796C654E616D65060A6261636B67726F756E6407436F726E657273
0B08546F7052696768740A426F74746F6D4C6566740B426F74746F6D52696768
74000A46696C6C2E436F6C6F7207097846464143414342450748697454657374
080A53697A652E57696474680500000000000000A003400B53697A652E486569
6768740500000000000000A003401453697A652E506C6174666F726D44656661
756C74080B5374726F6B652E4B696E6407044E6F6E6507585261646975730500
000000000000A0024007595261646975730500000000000000A00240000000}
end>
Left = 64
Top = 386
end
object LayoutMenuContent: TLayout
Align = Contents
Size.Width = 1053.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
Visible = False
TabOrder = 3
object RectangleMenuBG: TRectangle
Align = Contents
Fill.Color = xBF565869
Size.Width = 1053.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
OnClick = ButtonCloseMenuClick
end
object LayoutMenuContainer: TLayout
Align = Left
Size.Width = 320.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
end
end
object RectangleMenu: TRectangle
Align = Left
Fill.Color = xFF202123
Padding.Left = 8.000000000000000000
Padding.Top = 8.000000000000000000
Padding.Right = 8.000000000000000000
Padding.Bottom = 8.000000000000000000
Size.Width = 270.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
Stroke.Kind = None
object LayoutMenu: TLayout
Align = Client
Size.Width = 251.000000000000000000
Size.Height = 670.000000000000000000
Size.PlatformDefault = False
TabOrder = 0
object ButtonNewChat: TButton
Align = Top
Cursor = crHandPoint
StyledSettings = [Family, Style, FontColor]
Images = Manager.SVGIconImageList
ImageIndex = 0
Margins.Bottom = 8.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 46.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_newchat'
TabOrder = 0
Text = 'New chat'
TextSettings.Font.Size = 14.000000000000000000
TextSettings.HorzAlign = Leading
OnClick = ButtonNewChatClick
end
object ListBoxChatList: TListBox
Align = Client
Margins.Top = 4.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 402.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'listboxstyle_clear'
TabOrder = 1
TabStop = False
CanFocus = False
DisableFocusEffect = True
ItemIndex = 0
ItemHeight = 44.000000000000000000
Images = Manager.SVGIconImageList
DefaultItemStyles.ItemStyle = 'listboxitemstyle_chat'
DefaultItemStyles.GroupHeaderStyle = ''
DefaultItemStyles.GroupFooterStyle = ''
Viewport.Width = 251.000000000000000000
Viewport.Height = 402.000000000000000000
object ListBoxItem1: TListBoxItem
HitTest = True
IsSelected = True
ImageIndex = 1
Margins.Bottom = 8.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'listboxitemstyle_chat'
TabOrder = 0
Text = 'New chat'
end
object ListBoxItem3: TListBoxItem
HitTest = True
ImageIndex = 1
Margins.Bottom = 8.000000000000000000
Position.Y = 52.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'listboxitemstyle_chat'
TabOrder = 1
Text = 'Make HTTP Request in JavaScript'
end
end
object LayoutMenuButtons: TLayout
Align = Bottom
ClipChildren = True
Position.Y = 460.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 210.000000000000000000
Size.PlatformDefault = False
TabOrder = 2
object ButtonAbout: TButton
Align = Top
Cursor = crHandPoint
Images = Manager.SVGIconImageList
ImageIndex = 13
Margins.Top = 4.000000000000000000
Position.Y = 165.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 4
Text = 'About'
TextSettings.HorzAlign = Leading
OnClick = ButtonAboutClick
end
object ButtonClear: TButton
Align = Top
Cursor = crHandPoint
Images = Manager.SVGIconImageList
ImageIndex = 8
Margins.Top = 4.000000000000000000
Position.Y = 21.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 2
Text = 'Clear conversations'
TextSettings.HorzAlign = Leading
OnClick = ButtonClearClick
object Layout2: TLayout
Align = Right
Margins.Top = 6.000000000000000000
Margins.Right = 6.000000000000000000
Margins.Bottom = 6.000000000000000000
Position.X = 181.000000000000000000
Position.Y = 6.000000000000000000
Size.Width = 64.000000000000000000
Size.Height = 32.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object ButtonClearConfirm: TButton
Align = Right
Cursor = crHandPoint
Hint = 'Confirm'
Images = Manager.SVGIconImageList
ImageIndex = 10
Size.Width = 32.000000000000000000
Size.Height = 32.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_confirm'
TabOrder = 1
OnClick = ButtonClearConfirmClick
end
object ButtonClearCancel: TButton
Align = Right
Cursor = crHandPoint
Hint = 'Cancel'
Images = Manager.SVGIconImageList
ImageIndex = 11
Position.X = 32.000000000000000000
Size.Width = 32.000000000000000000
Size.Height = 32.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_confirm'
TabOrder = 0
OnClick = ButtonClearCancelClick
end
end
end
object ButtonFAQ: TButton
Align = Top
Cursor = crHandPoint
Images = Manager.SVGIconImageList
ImageIndex = 9
Margins.Top = 4.000000000000000000
Position.Y = 117.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 5
Text = 'Updates & FAQ'
TextSettings.HorzAlign = Leading
OnClick = ButtonFAQClick
end
object ButtonSettings: TButton
Align = Top
Cursor = crHandPoint
Images = Manager.SVGIconImageList
ImageIndex = 12
Margins.Top = 4.000000000000000000
Position.Y = 69.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 44.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menu'
TabOrder = 3
Text = 'Settings'
TextSettings.HorzAlign = Leading
OnClick = ButtonSettingsClick
end
object Line1: TLine
Align = Top
LineType = Top
Size.Width = 251.000000000000000000
Size.Height = 1.000000000000000000
Size.PlatformDefault = False
Stroke.Color = x33FFFFFF
end
object ButtonMenuButonsSwitch: TButton
Align = Top
Images = Manager.SVGIconImageList
ImageIndex = 16
Position.Y = 1.000000000000000000
Size.Width = 251.000000000000000000
Size.Height = 16.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_menubuttons'
TabOrder = 7
Text = 'buttonstyle_menubuttons'
OnClick = ButtonMenuButonsSwitchClick
end
end
end
object LayoutCloseMenu: TLayout
Align = Right
Margins.Left = 8.000000000000000000
Margins.Right = -55.000000000000000000
Position.X = 267.000000000000000000
Position.Y = 8.000000000000000000
Size.Width = 50.000000000000000000
Size.Height = 670.000000000000000000
Size.PlatformDefault = False
TabOrder = 1
object ButtonCloseMenu: TButton
Align = Top
Cursor = crHandPoint
ImageIndex = 3
Size.Width = 50.000000000000000000
Size.Height = 45.000000000000000000
Size.PlatformDefault = False
StyleLookup = 'buttonstyle_primary'
TabOrder = 0
OnClick = ButtonCloseMenuClick
end
end
end
object LayoutOverlay: TLayout
Align = Contents
Size.Width = 1053.000000000000000000
Size.Height = 686.000000000000000000
Size.PlatformDefault = False
Visible = False
TabOrder = 7
end
object TimerFPS: TTimer
Interval = 10
OnTimer = TimerFPSTimer
Left = 136
Top = 384
end
object GestureManager: TGestureManager
Sensitivity = 80.000000000000000000
Left = 64
Top = 328
GestureData = <
item
Control = Owner
Collection = <
item
GestureID = sgiRightLeft
end>
end>
end
object FDConnection: TFDConnection
Left = 136
Top = 330
end
end
================================================
FILE: ChatGPT.Main.pas
================================================
unit ChatGPT.Main;
interface
{$IF DEFINED(ANDROID) OR DEFINED(IOS) OR DEFINED(IOS64)}
{$DEFINE MOBILE}
{$ENDIF}
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, OpenAI,
FMX.Objects, FMX.Layouts, FMX.ListBox, FMX.Controls.Presentation, FMX.StdCtrls,
System.ImageList, FMX.ImgList, FMX.SVGIconImageList, ChatGPT.FrameChat,
FMX.Memo.Types, FMX.ScrollBox, FMX.Memo, FMX.Effects, FMX.Filter.Effects,
FMX.Edit, ChatGPT.Classes, System.JSON, FMX.ComboEdit, FMX.Menus, System.Skia,
System.Generics.Collections, System.Actions, FMX.ActnList, FMX.StdActns,
FMX.MediaLibrary.Actions, OpenAI.Chat.Functions, FMX.Gestures, FMX.Ani,
FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error, FireDAC.UI.Intf,
FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool, FireDAC.Stan.Async,
FireDAC.Phys, FireDAC.FMXUI.Wait, Data.DB, FireDAC.Comp.Client;
type
TListBoxItemChat = class(TListBoxItem)
public
JSON: TJSONObject;
ChatId: string;
procedure Paint; override;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
TFormMain = class(TForm)
LayoutChats: TLayout;
Rectangle1: TRectangle;
StyleBook: TStyleBook;
LayoutHead: TLayout;
ButtonMenu: TButton;
ButtonNewChatCompact: TButton;
LabelChatName: TLabel;
LayoutMenuContent: TLayout;
RectangleMenu: TRectangle;
LayoutMenu: TLayout;
ButtonNewChat: TButton;
ListBoxChatList: TListBox;
ListBoxItem1: TListBoxItem;
ListBoxItem3: TListBoxItem;
RectangleMenuBG: TRectangle;
ButtonCloseMenu: TButton;
LayoutMenuContainer: TLayout;
LayoutCloseMenu: TLayout;
Line1: TLine;
ButtonClear: TButton;
ButtonFAQ: TButton;
LayoutChatsBox: TLayout;
Layout2: TLayout;
ButtonClearConfirm: TButton;
ButtonClearCancel: TButton;
LayoutOverlay: TLayout;
ButtonSettings: TButton;
Line2: TLine;
ButtonAbout: TButton;
LayoutMenuButtons: TLayout;
ButtonMenuButonsSwitch: TButton;
TimerFPS: TTimer;
GestureManager: TGestureManager;
FDConnection: TFDConnection;
procedure ButtonNewChatClick(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure ButtonMenuClick(Sender: TObject);
procedure ButtonCloseMenuClick(Sender: TObject);
procedure ButtonNewChatCompactClick(Sender: TObject);
procedure FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Single);
procedure FormVirtualKeyboardShown(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect);
procedure FormVirtualKeyboardHidden(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect);
procedure ButtonClearClick(Sender: TObject);
procedure ButtonClearConfirmClick(Sender: TObject);
procedure ButtonClearCancelClick(Sender: TObject);
procedure ButtonFAQClick(Sender: TObject);
procedure ButtonSettingsClick(Sender: TObject);
procedure ButtonAboutClick(Sender: TObject);
procedure ButtonMenuButonsSwitchClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormSaveState(Sender: TObject);
procedure TimerFPSTimer(Sender: TObject);
procedure FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
class var
FChatIdCount: Integer;
private
FOpenAI: TOpenAIComponent;
FMode: TWindowMode;
FToken: string;
FTemperature: Single;
FChatsFileName: string;
FSettingsFileName: string;
FSelectedChatId: string;
FPresencePenalty: Single;
FMaxTokens: Integer;
FMaxTokensQuery: Integer;
FFrequencyPenalty: Single;
FOrganization: string;
FBaseUrl: string;
FModel: string;
FTopP: Single;
FGPTFuncList: TList;
FUseFunctions: Boolean;
FAutoExecFuncs: Boolean;
FTimeout: Integer;
procedure SetMode(const Value: TWindowMode);
procedure UpdateMode;
procedure SelectChat(const ChatId: string);
procedure DeleteChat(const ChatId: string);
procedure FOnChatItemClick(Sender: TObject);
{$HINTS OFF}
procedure FOnChatItemTap(Sender: TObject; const Point: TPointF);
{$HINTS ON}
function CreateChat(JSON: TJSONObject = nil): string;
procedure CloseMenu;
procedure Clear;
procedure ShowClearConfirm;
procedure HideClearConfirm;
procedure FOnChatEditClick(Sender: TObject);
procedure FOnChatDeleteClick(Sender: TObject);
procedure OpenSettings;
procedure LoadSettings;
procedure SaveSettings;
procedure SetToken(const Value: string);
procedure SetTemperature(const Value: Single);
function GetSettingsFileName: string;
function GetChatsFileName: string;
procedure SetFrequencyPenalty(const Value: Single);
procedure SetMaxTokens(const Value: Integer);
procedure SetMaxTokensQuery(const Value: Integer);
procedure SetPresencePenalty(const Value: Single);
procedure SetOrganization(const Value: string);
procedure SetBaseUrl(const Value: string);
procedure SetModel(const Value: string);
function GetChatFrame(const ChatId: string): TFrameChat;
procedure SetTopP(const Value: Single);
procedure Defaults;
procedure FOnNeedFuncList(Sender: TObject; out Items: TArray);
procedure CreateGPTFunctions;
procedure SetUseFunctions(const Value: Boolean);
procedure SetAutoExecFuncs(const Value: Boolean);
procedure SetTimeout(const Value: Integer);
procedure RenameChat(const ChatId, Text: string);
procedure FOnChatTitleChanged(Sender: TObject);
protected
procedure CreateHandle; override;
public
procedure LoadChats;
procedure SaveChats;
class function NextChatId: Integer; static;
property UseFunctions: Boolean read FUseFunctions write SetUseFunctions;
property AutoExecFuncs: Boolean read FAutoExecFuncs write SetAutoExecFuncs;
property OpenAI: TOpenAIComponent read FOpenAI;
property Mode: TWindowMode read FMode write SetMode;
property Token: string read FToken write SetToken;
property Temperature: Single read FTemperature write SetTemperature;
property Timeout: Integer read FTimeout write SetTimeout;
property Organization: string read FOrganization write SetOrganization;
property BaseUrl: string read FBaseUrl write SetBaseUrl;
property MaxTokens: Integer read FMaxTokens write SetMaxTokens;
property MaxTokensQuery: Integer read FMaxTokensQuery write SetMaxTokensQuery;
property PresencePenalty: Single read FPresencePenalty write SetPresencePenalty;
property FrequencyPenalty: Single read FFrequencyPenalty write SetFrequencyPenalty;
property TopP: Single read FTopP write SetTopP;
property Model: string read FModel write SetModel;
property GPTFuncList: TList read FGPTFuncList;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
const
URL_FAQ = 'https://help.openai.com/en/collections/3742473-chatgpt';
DEFAULT_TIMEOUT = 120000;
const
VersionName = '1.1.30';
var
FormMain: TFormMain;
const
AniInterpolation = TInterpolationType.Quadratic;
implementation
uses
FMX.Text, System.Math, System.Rtti, FMX.Utils, FMX.DialogService,
System.Threading, System.Net.URLClient, System.IOUtils, ChatGPT.Settings,
ChatGPT.Overlay, FMX.Styles, HGM.FMX.Ani, HGM.FMX.Image, OpenAI.API,
ChatGPT.Manager,
{$IFDEF MSWINDOWS}
DarkModeApi.FMX, FMX.Platform.Win,
{$ENDIF}
ChatGPT.About, ChatGPT.Functions, System.Math.Vectors;
{$R *.fmx}
{ TFormMain }
class function TFormMain.NextChatId: Integer;
begin
Inc(FChatIdCount);
Result := FChatIdCount;
end;
procedure TFormMain.ShowClearConfirm;
begin
ButtonClear.Text := 'Confirm clear';
ButtonClearConfirm.Visible := True;
ButtonClearCancel.Visible := True;
end;
procedure TFormMain.TimerFPSTimer(Sender: TObject);
begin
Invalidate;
end;
procedure TFormMain.HideClearConfirm;
begin
ButtonClear.Text := 'Clear conversations';
ButtonClearConfirm.Visible := False;
ButtonClearCancel.Visible := False;
end;
procedure TFormMain.ButtonAboutClick(Sender: TObject);
begin
LayoutOverlay.BringToFront;
TFrameAbout.Execute(LayoutOverlay,
procedure(Frame: TFrameAbout)
begin
Frame.Mode := Mode;
end,
procedure(Frame: TFrameAbout; Success: Boolean)
begin
//
end);
end;
procedure TFormMain.ButtonClearCancelClick(Sender: TObject);
begin
HideClearConfirm;
end;
procedure TFormMain.ButtonClearClick(Sender: TObject);
begin
ShowClearConfirm;
end;
procedure TFormMain.ButtonClearConfirmClick(Sender: TObject);
begin
Clear;
SelectChat(CreateChat);
end;
procedure TFormMain.ButtonCloseMenuClick(Sender: TObject);
begin
CloseMenu;
end;
procedure TFormMain.ButtonFAQClick(Sender: TObject);
begin
OpenUrl(URL_FAQ);
end;
procedure TFormMain.ButtonMenuButonsSwitchClick(Sender: TObject);
begin
if LayoutMenuButtons.Height < 210 then
begin
TAnimator.AnimateFloat(LayoutMenuButtons, 'Height', 210, 0.1);
ButtonMenuButonsSwitch.RotationAngle := 0;
end
else
begin
TAnimator.AnimateFloat(LayoutMenuButtons, 'Height', 17, 0.1);
ButtonMenuButonsSwitch.RotationAngle := 180;
end;
end;
procedure TFormMain.ButtonMenuClick(Sender: TObject);
begin
RectangleMenuBG.Opacity := 0;
LayoutMenuContainer.Opacity := 0;
LayoutMenuContainer.Margins.Left := -(LayoutMenuContainer.Width - 45);
ButtonCloseMenu.Opacity := 0;
LayoutMenuContent.Visible := True;
TAnimator.AnimateFloat(RectangleMenuBG, 'Opacity', 1, 0.2, TAnimationType.InOut, AniInterpolation);
TAnimator.AnimateFloat(ButtonCloseMenu, 'Opacity', 1, 0.2, TAnimationType.InOut, AniInterpolation);
TAnimator.AnimateFloat(LayoutMenuContainer, 'Opacity', 1, 0.2, TAnimationType.InOut, AniInterpolation);
TAnimator.AnimateFloat(LayoutMenuContainer, 'Margins.Left', 0, 0.2, TAnimationType.InOut, AniInterpolation);
end;
procedure TFormMain.CloseMenu;
begin
TAnimator.AnimateFloat(RectangleMenuBG, 'Opacity', 0, 0.2, TAnimationType.InOut, AniInterpolation);
TAnimator.AnimateFloat(ButtonCloseMenu, 'Opacity', 0, 0.2, TAnimationType.InOut, AniInterpolation);
TAnimator.AnimateFloat(LayoutMenuContainer, 'Opacity', 0, 0.2, TAnimationType.InOut, AniInterpolation);
TAnimator.AnimateFloatWithFinish(LayoutMenuContainer, 'Margins.Left', -(LayoutMenuContainer.Width - 45),
procedure
begin
LayoutMenuContent.Visible := False;
end, 0.2, TAnimationType.InOut, AniInterpolation);
end;
function TFormMain.CreateChat(JSON: TJSONObject): string;
begin
var IsNew: Boolean := not Assigned(JSON);
var ItemList := TListBoxItemChat.Create(ListBoxChatList);
if IsNew then
begin
ItemList.JSON := nil;
ItemList.ChatId := TGUID.NewGuid.ToString;
ItemList.Text := 'New chat ' + NextChatId.ToString;
end
else
begin
ItemList.JSON := JSON.Clone as TJSONObject;
ItemList.Text := JSON.GetValue('title', '').Replace(#13, ' ').Replace(#10, ' ').Replace('&', '');
ItemList.ChatId := JSON.GetValue('chat_id', TGUID.NewGuid.ToString);
end;
ItemList.TabStop := False;
ItemList.HitTest := True;
{$IFDEF MOBILE}
ItemList.OnTap := FOnChatItemTap;
{$ELSE}
ItemList.OnClick := FOnChatItemClick;
{$ENDIF}
ItemList.Margins.Bottom := 8;
ItemList.TextSettings.WordWrap := False;
ItemList.ImageIndex := 1;
ItemList.DisableDisappear := True;
ItemList.StylesData['edit.OnClick'] := TValue.From(FOnChatEditClick);
ItemList.StylesData['delete.OnClick'] := TValue.From(FOnChatDeleteClick);
if IsNew then
ListBoxChatList.InsertObject(0, ItemList)
else
ListBoxChatList.AddObject(ItemList);
ItemList.ApplyStyleLookup;
Result := ItemList.ChatId;
end;
procedure TFormMain.CreateHandle;
begin
inherited;
{$IFDEF MSWINDOWS}
SetWindowColorModeAsSystem;
{$ENDIF}
end;
procedure TFormMain.DeleteChat(const ChatId: string);
begin
for var Control in LayoutChatsBox.Controls do
if Control is TFrameChat then
begin
var Frame := TFrameChat(Control);
if Frame.ChatId = ChatId then
begin
Frame.Release;
Break;
end;
end;
var DeletedIndex: Integer := -1;
for var i := 0 to Pred(ListBoxChatList.Count) do
if ListBoxChatList.ListItems[i] is TListBoxItemChat then
if TListBoxItemChat(ListBoxChatList.ListItems[i]).ChatId = ChatId then
begin
DeletedIndex := i;
ListBoxChatList.ListItems[i].Release;
Break;
end;
if ListBoxChatList.Count <= 0 then
SelectChat(CreateChat)
else
begin
DeletedIndex := Max(0, Min(DeletedIndex - 1, ListBoxChatList.Count - 1));
SelectChat((ListBoxChatList.ListItems[DeletedIndex] as TListBoxItemChat).ChatId);
end;
end;
procedure TFormMain.RenameChat(const ChatId, Text: string);
begin
for var Control in LayoutChatsBox.Controls do
if Control is TFrameChat then
begin
var Frame := TFrameChat(Control);
if Frame.ChatId = ChatId then
begin
Frame.Title := Text;
Break;
end;
end;
end;
destructor TFormMain.Destroy;
begin
FGPTFuncList.Free;
inherited;
end;
procedure TFormMain.ButtonNewChatClick(Sender: TObject);
begin
SelectChat(CreateChat);
if Mode = TWindowMode.Compact then
CloseMenu;
end;
procedure TFormMain.ButtonNewChatCompactClick(Sender: TObject);
begin
SelectChat(CreateChat);
end;
procedure TFormMain.ButtonSettingsClick(Sender: TObject);
begin
OpenSettings;
end;
procedure TFormMain.FOnChatEditClick(Sender: TObject);
var
Button: TButton absolute Sender;
ListItem: TListBoxItemChat;
ChatId: string;
begin
if TFMXObjectHelper.FindNearestParentOfClass(Button, ListItem) then
begin
ChatId := ListItem.ChatId;
TDialogService.InputQuery('New Chat name', ['Name'], [ListItem.Text],
procedure(const AResult: TModalResult; const AValues: array of string)
begin
if AResult = mrOk then
RenameChat(ChatId, AValues[0]);
end);
end;
end;
procedure TFormMain.FOnChatDeleteClick(Sender: TObject);
var
Button: TButton absolute Sender;
ListItem: TListBoxItemChat;
ChatId: string;
begin
if TFMXObjectHelper.FindNearestParentOfClass(Button, ListItem) then
begin
ChatId := ListItem.ChatId;
TDialogService.MessageDialog('Delete "' + ListItem.Text + '"?',
TMsgDlgType.mtConfirmation, [TMsgDlgBtn.mbYes, TMsgDlgBtn.mbNo],
TMsgDlgBtn.mbNo, 0,
procedure(const AResult: TModalResult)
begin
if AResult = mrYes then
DeleteChat(ChatId);
end);
end;
end;
procedure TFormMain.FOnChatItemClick(Sender: TObject);
var
Item: TListBoxItemChat absolute Sender;
begin
if not (Item is TListBoxItemChat) then
Exit;
SelectChat(Item.ChatId);
if Mode = TWindowMode.Compact then
CloseMenu;
end;
procedure TFormMain.FOnChatItemTap(Sender: TObject; const Point: TPointF);
begin
FOnChatItemClick(Sender);
end;
procedure TFormMain.FOnNeedFuncList(Sender: TObject; out Items: TArray);
begin
Items := FGPTFuncList.ToArray;
end;
function TFormMain.GetSettingsFileName: string;
begin
if FSettingsFileName.IsEmpty then
FSettingsFileName := TPath.Combine(Manager.AppFolder, 'settings.json');
Result := FSettingsFileName;
end;
function TFormMain.GetChatsFileName: string;
begin
if FChatsFileName.IsEmpty then
FChatsFileName := TPath.Combine(Manager.AppFolder, 'chats.json');
Result := FChatsFileName;
end;
procedure TFormMain.Defaults;
begin
TimeOut := DEFAULT_TIMEOUT;
Token := '';
Temperature := 1;
FrequencyPenalty := 0;
PresencePenalty := 0;
TopP := 1;
Model := '';
MaxTokens := 0;
MaxTokensQuery := 0;
FSelectedChatId := '';
end;
procedure TFormMain.LoadSettings;
begin
try
if not TFile.Exists(GetSettingsFileName) then
Exit;
var JsonText: string := '';
try
JsonText := TFile.ReadAllText(GetSettingsFileName, TEncoding.UTF8);
except
Exit;
end;
if JsonText.IsEmpty then
Exit;
var JSON := TJSONObject.ParseJSONValue(JsonText);
if Assigned(JSON) then
try
Token := JSON.GetValue('api_key', '');
Temperature := JSON.GetValue('temperature', 1);
FrequencyPenalty := JSON.GetValue('frequency_penalty', 0.0);
PresencePenalty := JSON.GetValue('presence_penalty', 0.0);
TopP := JSON.GetValue('top_p', 1);
Model := JSON.GetValue('model', '');
MaxTokens := JSON.GetValue('max_tokens', 0);
MaxTokensQuery := JSON.GetValue('max_tokens_query', 0);
FSelectedChatId := JSON.GetValue('selected_chat', '');
OpenAI.BaseUrl := JSON.GetValue('base_url', OpenAI.BaseUrl);
UseFunctions := JSON.GetValue('use_functions', False);
AutoExecFuncs := JSON.GetValue('auto_exec_funcs', False);
Manager.SendByEnter := JSON.GetValue('send_by_enter', True);
if JSON.GetValue('on_top', False) then
FormStyle := TFormStyle.StayOnTop
else
FormStyle := TFormStyle.Normal;
OpenAI.API.ProxySettings := TProxySettings.Create(
JSON.GetValue('proxy_host', ''),
JSON.GetValue('proxy_port', 0),
JSON.GetValue('proxy_username', ''),
JSON.GetValue('proxy_password', ''));
TBitmap.Client.ProxySettings := OpenAI.API.ProxySettings;
var Headers: TNetHeaders;
var JHeaders: TJSONArray;
if JSON.TryGetValue('custom_headers', JHeaders) then
for var JHead in JHeaders do
if JHead is TJSONObject then
begin
var HName: string;
var HValue: string;
if JHead.TryGetValue('name', HName) and JHead.TryGetValue('value', HValue) then
Headers := Headers + [TNetHeader.Create(HName, HValue)];
end;
Width := Max(Trunc(Constraints.MinWidth), JSON.GetValue('width', Width));
Height := Max(Trunc(Constraints.MinHeight), JSON.GetValue('height', Height));
Left := JSON.GetValue('left', Left);
Top := JSON.GetValue('top', Top);
if JSON.GetValue('menubuttons', True) then
begin
LayoutMenuButtons.Height := 210;
ButtonMenuButonsSwitch.RotationAngle := 0;
end
else
begin
LayoutMenuButtons.Height := 17;
ButtonMenuButonsSwitch.RotationAngle := 180;
end;
OpenAI.API.CustomHeaders := Headers;
finally
JSON.Free;
end;
finally
if Token.IsEmpty then
OpenSettings;
end;
end;
procedure TFormMain.SaveSettings;
begin
var JSON := TJSONObject.Create;
try
JSON.AddPair('api_key', Token);
JSON.AddPair('temperature', TJSONNumber.Create(Temperature));
JSON.AddPair('selected_chat', FSelectedChatId);
JSON.AddPair('frequency_penalty', TJSONNumber.Create(FrequencyPenalty));
JSON.AddPair('presence_penalty', TJSONNumber.Create(PresencePenalty));
JSON.AddPair('top_p', TJSONNumber.Create(TopP));
JSON.AddPair('max_tokens', TJSONNumber.Create(MaxTokens));
JSON.AddPair('max_tokens_query', TJSONNumber.Create(MaxTokensQuery));
JSON.AddPair('model', Model);
JSON.AddPair('on_top', FormStyle = TFormStyle.StayOnTop);
JSON.AddPair('use_functions', UseFunctions);
JSON.AddPair('auto_exec_funcs', AutoExecFuncs);
JSON.AddPair('send_by_enter', Manager.SendByEnter);
JSON.AddPair('proxy_host', OpenAI.API.ProxySettings.Host);
JSON.AddPair('proxy_port', OpenAI.API.ProxySettings.Port);
JSON.AddPair('proxy_username', OpenAI.API.ProxySettings.UserName);
JSON.AddPair('proxy_password', OpenAI.API.ProxySettings.Password);
JSON.AddPair('base_url', OpenAI.BaseUrl);
JSON.AddPair('width', Width);
JSON.AddPair('height', Height);
JSON.AddPair('left', Left);
JSON.AddPair('top', Top);
JSON.AddPair('menubuttons', LayoutMenuButtons.Height >= 210);
if Length(OpenAI.API.CustomHeaders) > 0 then
begin
var JHeaders := TJSONArray.Create;
JSON.AddPair('custom_headers', JHeaders);
for var Header in OpenAI.API.CustomHeaders do
begin
var JHead := TJSONObject.Create;
JHead.AddPair('name', Header.Name);
JHead.AddPair('value', Header.Value);
JHeaders.Add(JHead);
end;
end;
TFile.WriteAllText(GetSettingsFileName, JSON.ToJSON, TEncoding.UTF8);
except
//
end;
JSON.Free;
end;
procedure TFormMain.LoadChats;
begin
try
if not TFile.Exists(GetChatsFileName) then
Exit;
var JsonText: string := '';
try
JsonText := TFile.ReadAllText(GetChatsFileName, TEncoding.UTF8);
except
Exit;
end;
if JsonText.IsEmpty then
Exit;
var JSON := TJSONObject.ParseJSONValue(JsonText);
if Assigned(JSON) then
try
var JSONChats: TJSONArray;
if JSON.TryGetValue('items', JSONChats) then
begin
for var JChat in JSONChats do
if JChat is TJSONObject then
CreateChat(TJSONObject(JChat));
end;
SelectChat(FSelectedChatId);
finally
JSON.Free;
end;
finally
if LayoutChatsBox.ControlsCount <= 0 then
SelectChat(CreateChat)
else if (ListBoxChatList.Count > 0) and (ListBoxChatList.Selected = nil) then
SelectChat((ListBoxChatList.ListItems[0] as TListBoxItemChat).ChatId);
end;
end;
procedure TFormMain.SaveChats;
begin
var JSON := TJSONObject.Create;
try
var JSONChats := TJSONArray.Create;
JSON.AddPair('items', JSONChats);
for var i := 0 to ListBoxChatList.Count - 1 do
if ListBoxChatList.ListItems[i] is TListBoxItemChat then
begin
var Frame := GetChatFrame(TListBoxItemChat(ListBoxChatList.ListItems[i]).ChatId);
if Assigned(Frame) then
JSONChats.Add(Frame.SaveAsJson)
else
JSONChats.Add(TListBoxItemChat(ListBoxChatList.ListItems[i]).JSON.Clone as TJSONObject);
end;
TFile.WriteAllText(GetChatsFileName, JSON.ToJSON, TEncoding.UTF8);
except
on E: Exception do
ShowMessage(E.Message);
end;
JSON.Free;
end;
function TFormMain.GetChatFrame(const ChatId: string): TFrameChat;
begin
for var Control in LayoutChatsBox.Controls do
if Control is TFrameChat then
begin
var Frame := TFrameChat(Control);
if Frame.ChatId = ChatId then
Exit(Frame);
end;
Result := nil;
end;
procedure TFormMain.SelectChat(const ChatId: string);
begin
FSelectedChatId := ChatId;
var ItemList: TListBoxItemChat := nil;
for var i := 0 to Pred(ListBoxChatList.Count) do
if (ListBoxChatList.ListItems[i] as TListBoxItemChat).ChatId = ChatId then
begin
ListBoxChatList.ListItems[i].IsSelected := True;
LabelChatName.Text := ListBoxChatList.ListItems[i].Text;
ItemList := TListBoxItemChat(ListBoxChatList.ListItems[i]);
Break;
end;
if not Assigned(ItemList) then
Exit;
var SelFrame: TFrameChat := nil;
for var Control in LayoutChatsBox.Controls do
if Control is TFrameChat then
begin
var Frame := TFrameChat(Control);
Frame.Visible := Frame.ChatId = ChatId;
if Frame.Visible then
SelFrame := Frame;
end;
if not Assigned(SelFrame) then
begin
SelFrame := TFrameChat.Create(LayoutChatsBox);
SelFrame.Parent := LayoutChatsBox;
SelFrame.Align := TAlignLayout.Client;
SelFrame.API := OpenAI;
SelFrame.Mode := Mode;
SelFrame.OnNeedFuncList := FOnNeedFuncList;
SelFrame.OnTitleChanged := FOnChatTitleChanged;
if Assigned(ItemList.JSON) then
SelFrame.LoadFromJson(ItemList.JSON)
else
begin
SelFrame.ChatId := ItemList.ChatId;
SelFrame.Title := ItemList.Text;
SelFrame.Temperature := Temperature;
SelFrame.TopP := TopP;
SelFrame.PresencePenalty := PresencePenalty;
SelFrame.FrequencyPenalty := FrequencyPenalty;
SelFrame.Model := Model;
SelFrame.MaxTokens := MaxTokens;
SelFrame.MaxTokensQuery := MaxTokensQuery;
SelFrame.UseFunctions := UseFunctions;
SelFrame.AutoExecFuncs := AutoExecFuncs;
end;
SelFrame.MenuItem := ItemList;
SelFrame.Visible := True;
end;
SelFrame.Init;
end;
procedure TFormMain.FOnChatTitleChanged(Sender: TObject);
var
Frame: TFrameChat absolute Sender;
begin
for var i := 0 to Pred(ListBoxChatList.Count) do
if ListBoxChatList.ListItems[i] is TListBoxItemChat then
if TListBoxItemChat(ListBoxChatList.ListItems[i]).ChatId = Frame.ChatId then
begin
ListBoxChatList.ListItems[i].Text := Frame.Title;
Break;
end;
if FSelectedChatId = Frame.ChatId then
LabelChatName.Text := Frame.Title;
end;
procedure TFormMain.CreateGPTFunctions;
begin
// FGPTFuncList.Add(TChatFunctionWeather.Create);
FGPTFuncList.AddRange(LoadExternalFunctions);
end;
constructor TFormMain.Create(AOwner: TComponent);
begin
inherited;
FMode := TWindowMode.Full;
//TAnimation.AniFrameRate := 300;
ListBoxChatList.AniCalculations.Animation := True;
//ListBoxChatList.AniCalculations.Interval := 1;
ListBoxChatList.AniCalculations.Averaging := True;
ListBoxChatList.DisableDisappear := True;
{$IFDEF NEW_MEMO}
var Style := StyleBook.Style;
if Assigned(Style) then
begin
var ObjStyle := Style.FindStyleResource('memostyle_clear');
if Assigned(ObjStyle) then
begin
var Sel := ObjStyle.FindStyleResource('selection');
if Assigned(Sel) and (Sel is TBrushObject) then
TBrushObject(Sel).Brush.Color := $FF1F2027;
end;
ObjStyle := Style.FindStyleResource('memostyle_code');
if Assigned(ObjStyle) then
begin
var Sel := ObjStyle.FindStyleResource('selection');
if Assigned(Sel) and (Sel is TBrushObject) then
TBrushObject(Sel).Brush.Color := $FF4E4E53;
end;
TStyleManager.UpdateScenes;
end;
{$ENDIF}
LayoutOverlay.Visible := True;
LayoutOverlay.BringToFront;
ListBoxChatList.AniCalculations.Animation := True;
FGPTFuncList := TList.Create;
FOpenAI := TOpenAIComponent.Create(Self);
//FOpenAI.DisableBearerPrefix := True;
FOpenAI.API.ConnectionTimeout := 30000;
Manager.OverlayContainer := LayoutOverlay;
Manager.GPTFuncList := FGPTFuncList;
CreateGPTFunctions;
Defaults;
Clear;
UpdateMode;
end;
procedure TFormMain.Clear;
begin
HideClearConfirm;
ListBoxChatList.Clear;
LayoutChatsBox.BeginUpdate;
try
while LayoutChatsBox.ControlsCount > 0 do
LayoutChatsBox.Controls[0].Free;
finally
LayoutChatsBox.EndUpdate;
end;
end;
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
{$IFDEF MOBILE}
if Overlays.Count > 0 then
begin
var Active := Overlays.Last;
Active.Cancel;
CanClose := False;
end;
{$ENDIF}
end;
procedure TFormMain.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight, MaxWidth, MaxHeight: Single);
begin
FormResize(Sender);
end;
procedure TFormMain.FormCreate(Sender: TObject);
begin
LoadSettings;
LoadChats;
end;
procedure TFormMain.FormGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean);
begin
if (EventInfo.GestureID = sgiRightLeft) then
begin
Handled := True;
ButtonMenuClick(nil);
end;
end;
procedure TFormMain.OpenSettings;
begin
LayoutOverlay.BringToFront;
TFrameSettings.Execute(LayoutOverlay,
procedure(Frame: TFrameSettings)
begin
Frame.Mode := FMode;
Frame.EditToken.Text := Token;
Frame.EditOrg.Text := Organization;
Frame.TrackBarTemp.Value := Temperature * 10;
Frame.TrackBarPP.Value := PresencePenalty * 10;
Frame.TrackBarFP.Value := FrequencyPenalty * 10;
if MaxTokens <> 0 then
Frame.EditMaxTokens.Text := MaxTokens.ToString
else
Frame.EditMaxTokens.Text := '';
if MaxTokensQuery <> 0 then
Frame.EditQueryMaxToken.Text := MaxTokensQuery.ToString
else
Frame.EditQueryMaxToken.Text := '';
if (Timeout <> 0) and (Timeout <> DEFAULT_TIMEOUT) then
Frame.EditTimeout.Text := Timeout.ToString
else
Frame.EditTimeout.Text := '';
Frame.ComboEditModel.Text := Model;
Frame.TrackBarTopP.Value := TopP * 10;
Frame.SwitchOnTop.IsChecked := FormStyle = TFormStyle.StayOnTop;
Frame.EditProxyServer.Text := OpenAI.API.ProxySettings.Host;
Frame.EditProxyPort.Text := OpenAI.API.ProxySettings.Port.ToString;
Frame.EditProxyUsername.Text := OpenAI.API.ProxySettings.UserName;
Frame.EditProxyPassword.Text := OpenAI.API.ProxySettings.Password;
Frame.LabelVersion.Text := 'Version: ' + VersionName;
Frame.EditBaseUrl.Text := OpenAI.BaseUrl;
Frame.SwitchUseFunctions.IsChecked := UseFunctions;
Frame.SwitchAutoExecFuncs.IsChecked := AutoExecFuncs;
Frame.SwitchSendEnter.IsChecked := Manager.SendByEnter;
for var Head in OpenAI.API.CustomHeaders do
Frame.MemoCustomHeaders.Lines.AddPair(Head.Name, Head.Value);
end,
procedure(Frame: TFrameSettings; Success: Boolean)
begin
if not Success then
Exit;
Token := Frame.EditToken.Text;
Organization := Frame.EditOrg.Text;
Temperature := Frame.TrackBarTemp.Value / 10;
PresencePenalty := Frame.TrackBarPP.Value / 10;
FrequencyPenalty := Frame.TrackBarFP.Value / 10;
TopP := Frame.TrackBarTopP.Value / 10;
MaxTokens := StrToIntDef(Frame.EditMaxTokens.Text, 0);
MaxTokensQuery := StrToIntDef(Frame.EditQueryMaxToken.Text, 0);
Timeout := StrToIntDef(Frame.EditTimeout.Text, DEFAULT_TIMEOUT);
Model := Frame.ComboEditModel.Text;
if Frame.SwitchOnTop.IsChecked then
FormStyle := TFormStyle.StayOnTop
else
FormStyle := TFormStyle.Normal;
OpenAI.API.ProxySettings := TProxySettings.Create(
Frame.EditProxyServer.Text,
StrToIntDef(Frame.EditProxyPort.Text, 0),
Frame.EditProxyUsername.Text,
Frame.EditProxyPassword.Text);
TBitmap.Client.ProxySettings := OpenAI.API.ProxySettings;
OpenAI.BaseUrl := Frame.EditBaseUrl.Text;
UseFunctions := Frame.SwitchUseFunctions.IsChecked;
AutoExecFuncs := Frame.SwitchAutoExecFuncs.IsChecked;
Manager.SendByEnter := Frame.SwitchSendEnter.IsChecked;
var FHeaders: TNetHeaders;
try
for var Line in Frame.MemoCustomHeaders.Lines do
begin
var Pair := Line.Split([':']);
if Length(Pair) = 2 then
begin
SetLength(FHeaders, Length(FHeaders) + 1);
FHeaders[High(FHeaders)] := TNetHeader.Create(Pair[0], Pair[1]);
end;
end;
except
//
end;
OpenAI.API.CustomHeaders := FHeaders;
if OpenAI.BaseUrl.IsEmpty then
OpenAI.BaseUrl := TOpenAIAPI.URL_BASE;
{$IFDEF MSWINDOWS}
SetWindowColorModeAsSystem;
{$ENDIF}
SaveSettings;
end);
end;
procedure TFormMain.FormResize(Sender: TObject);
begin
LayoutMenuContainer.Width := Min(320, ClientWidth - 45);
if ClientWidth < 768 then
Mode := TWindowMode.Compact
else
Mode := TWindowMode.Full;
end;
procedure TFormMain.FormSaveState(Sender: TObject);
begin
SaveChats;
SaveSettings;
end;
procedure TFormMain.FormVirtualKeyboardHidden(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect);
begin
TAnimator.AnimateFloat(Self, 'Padding.Bottom', 0);
TAnimator.AnimateFloat(LayoutOverlay, 'Margins.Bottom', 0);
// Padding.Bottom := 0;
// LayoutOverlay.Margins.Bottom := 0;
end;
procedure TFormMain.FormVirtualKeyboardShown(Sender: TObject; KeyboardVisible: Boolean; const Bounds: TRect);
begin
TAnimator.AnimateFloat(Self, 'Padding.Bottom', Bounds.Height);
TAnimator.AnimateFloat(LayoutOverlay, 'Margins.Bottom', Bounds.Height);
// LayoutOverlay.Margins.Bottom := Bounds.Height;
// Padding.Bottom := Bounds.Height;
end;
procedure TFormMain.UpdateMode;
begin
for var Control in LayoutChatsBox.Controls do
if Control is TFrameChat then
begin
var Frame := TFrameChat(Control);
Frame.Mode := FMode;
end;
for var Control in LayoutOverlay.Controls do
if Control is TFrameOveraly then
begin
var Frame := TFrameOveraly(Control);
Frame.Mode := FMode;
end;
case FMode of
TWindowMode.Compact:
begin
RectangleMenu.Align := TAlignLayout.Client;
RectangleMenu.Parent := LayoutMenuContainer;
LayoutHead.Visible := True;
ButtonCloseMenu.Visible := True;
end;
TWindowMode.Full:
begin
RectangleMenu.Align := TAlignLayout.Left;
RectangleMenu.Width := 260;
RectangleMenu.Parent := Self;
LayoutHead.Visible := False;
ButtonCloseMenu.Visible := False;
LayoutMenuContent.Visible := False;
RectangleMenu.SendToBack;
end;
end;
end;
procedure TFormMain.SetAutoExecFuncs(const Value: Boolean);
begin
FAutoExecFuncs := Value;
end;
procedure TFormMain.SetBaseUrl(const Value: string);
begin
FBaseUrl := Value;
OpenAI.BaseUrl := FBaseUrl;
end;
procedure TFormMain.SetFrequencyPenalty(const Value: Single);
begin
FFrequencyPenalty := Value;
end;
procedure TFormMain.SetMaxTokens(const Value: Integer);
begin
FMaxTokens := Value;
end;
procedure TFormMain.SetMaxTokensQuery(const Value: Integer);
begin
FMaxTokensQuery := Value;
end;
procedure TFormMain.SetMode(const Value: TWindowMode);
begin
if FMode = Value then
Exit;
FMode := Value;
UpdateMode;
end;
procedure TFormMain.SetModel(const Value: string);
begin
FModel := Value;
end;
procedure TFormMain.SetOrganization(const Value: string);
begin
FOrganization := Value;
OpenAI.Organization := FOrganization;
end;
procedure TFormMain.SetPresencePenalty(const Value: Single);
begin
FPresencePenalty := Value;
end;
procedure TFormMain.SetTemperature(const Value: Single);
begin
FTemperature := Value;
end;
procedure TFormMain.SetTimeout(const Value: Integer);
begin
FTimeout := Value;
if Value <= 0 then
FTimeout := DEFAULT_TIMEOUT;
FOpenAI.API.ResponseTimeout := FTimeout;
FOpenAI.API.SendTimeout := FTimeout;
end;
procedure TFormMain.SetToken(const Value: string);
begin
FToken := Value;
FOpenAI.Token := FToken;
end;
procedure TFormMain.SetTopP(const Value: Single);
begin
FTopP := Value;
end;
procedure TFormMain.SetUseFunctions(const Value: Boolean);
begin
FUseFunctions := Value;
end;
{ TListBoxItemChat }
constructor TListBoxItemChat.Create(AOwner: TComponent);
begin
inherited;
JSON := nil;
end;
destructor TListBoxItemChat.Destroy;
begin
if Assigned(JSON) then
JSON.Free;
inherited;
end;
procedure TListBoxItemChat.Paint;
begin
var Canv: ISkCanvas;
if Supports(Canvas, ISkCanvas, Canv) then
Canv.Skew(1, 0.2);
Canvas.SetMatrix(TMatrix.CreateScaling(1, 2));
inherited;
Canvas.SetMatrix(TMatrix.CreateScaling(1, 2));
end;
initialization
{$IFDEF DEBUG}
ReportMemoryLeaksOnShutdown := True;
{$ENDIF}
end.
================================================
FILE: ChatGPT.Manager.dfm
================================================
object Manager: TManager
Height = 480
Width = 640
object SVGIconImageList: TSVGIconImageList
Source = <
item
MultiResBitmap = <
item
Size = 24
end>
IconName = 'Item 0'
SVGText =
''
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 16
end>
IconName = 'Item 1'
SVGText =
''
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 24
end>
IconName = 'Item 2'
SVGText =
''
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 24
end>
IconName = 'Item 3'
SVGText =
''
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 24
end>
IconName = 'Item 4'
SVGText =
''
FixedColor = claWhite
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 24
end>
IconName = 'Item 7'
SVGText =
''
FixedColor = claWhite
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 24
end>
IconName = 'Item 8'
SVGText =
''
FixedColor = claWhite
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Width = 19
Height = 15
end>
IconName = 'Item 9'
SVGText =
''
Opacity = 1.000000000000000000
end
item
MultiResBitmap = <
item
Size = 16
end>
IconName = 'Item 10'
SVGText =
'

### This is NOT a web page, this is a native application with its own interface!
## ⚒️ Builds
|Platform|Available||
|--------|---------|--|
|
|❌| |
## ⚡ Features
- Access to gpt-3 and gpt-4
- Image generation with DALL-E
- Sound recognition and use of this context with GPT
- Separate settings for each chat
- SVG display
- Ability to edit chat
- All model settings
- Custom headers for third party APIs
- Send message as assistant, user or system
- Doesn't require a VPN (*Now required!*)
- GPT functions (external load from "funcs" folder)
- Syntax highlighting (pascal, python, json, sql, markdown)
## 🙌 List of planned features
- Display of mathematical formulas
- Support MarkDown
- Syntax highlighting for Linux
- Additional functions OpenAI (such as: text correction, customizing your model via Fine-tunes, quick commands)
## Dependencies
❗ Build requires Delphi 11.3+
Skia - https://github.com/skia4delphi/skia4delphi
SVGImageList - https://github.com/EtheaDev/SVGIconImageList
And some submodules