This commit is contained in:
朱小炯 2025-06-28 11:05:56 +08:00
commit 5aecb67f5a
176 changed files with 28333 additions and 0 deletions

63
.gitattributes vendored Normal file
View File

@ -0,0 +1,63 @@
###############################################################################
# Set default behavior to automatically normalize line endings.
###############################################################################
* text=auto
###############################################################################
# Set default behavior for command prompt diff.
#
# This is need for earlier builds of msysgit that does not have it on by
# default for csharp files.
# Note: This is only used by command line
###############################################################################
#*.cs diff=csharp
###############################################################################
# Set the merge driver for project and solution files
#
# Merging from the command prompt will add diff markers to the files if there
# are conflicts (Merging from VS is not affected by the settings below, in VS
# the diff markers are never inserted). Diff markers may cause the following
# file extensions to fail to load in VS. An alternative would be to treat
# these files as binary and thus will always conflict and require user
# intervention with every merge. To do so, just uncomment the entries below
###############################################################################
#*.sln merge=binary
#*.csproj merge=binary
#*.vbproj merge=binary
#*.vcxproj merge=binary
#*.vcproj merge=binary
#*.dbproj merge=binary
#*.fsproj merge=binary
#*.lsproj merge=binary
#*.wixproj merge=binary
#*.modelproj merge=binary
#*.sqlproj merge=binary
#*.wwaproj merge=binary
###############################################################################
# behavior for image files
#
# image files are treated as binary by default.
###############################################################################
#*.jpg binary
#*.png binary
#*.gif binary
###############################################################################
# diff behavior for common document formats
#
# Convert binary document formats to text before diffing them. This feature
# is only available from the command line. Turn it on by uncommenting the
# entries below.
###############################################################################
#*.doc diff=astextplain
#*.DOC diff=astextplain
#*.docx diff=astextplain
#*.DOCX diff=astextplain
#*.dot diff=astextplain
#*.DOT diff=astextplain
#*.pdf diff=astextplain
#*.PDF diff=astextplain
#*.rtf diff=astextplain
#*.RTF diff=astextplain

242
.gitignore vendored Normal file
View File

@ -0,0 +1,242 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Xx]64/
[Xx]86/
[Bb]uild/
bld/
[Bb]in/
[Oo]bj/
# Visual Studio 2015 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# DNX
project.lock.json
artifacts/
*_i.c
*_p.c
*_i.h
*.ilk
*.meta
*.obj
*.pch
*.pdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# TODO: Un-comment the next line if you do not want to checkin
# your web deploy settings because they may include unencrypted
# passwords
#*.pubxml
*.publishproj
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/packages/*
# except build/, which is used as an MSBuild target.
!**/packages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/packages/repositories.config
# NuGet v3's project.json files produces more ignoreable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directory
AppPackages/
BundleArtifacts/
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
[Ss]tyle[Cc]op.*
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.pfx
*.publishsettings
node_modules/
orleans.codegen.cs
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
# SQL Server files
*.mdf
*.ldf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# LightSwitch generated files
GeneratedArtifacts/
ModelManifest.xml
# Paket dependency manager
.paket/paket.exe
# FAKE - F# Make
.fake/

37
DBCHM_Sln.sln Normal file
View File

@ -0,0 +1,37 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29324.140
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBCHM", "DBChm\DBCHM.csproj", "{55B00DB1-BA55-47B7-BD44-35C0FCD05FD5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MJTop.Data", "MJTop.Data\MJTop.Data.csproj", "{3D36CDC9-E989-465B-A9F1-AD85DC42F242}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DocTools", "DocTools\DocTools.csproj", "{130A8861-0C39-4933-9DE8-AA9525488211}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{55B00DB1-BA55-47B7-BD44-35C0FCD05FD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{55B00DB1-BA55-47B7-BD44-35C0FCD05FD5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{55B00DB1-BA55-47B7-BD44-35C0FCD05FD5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{55B00DB1-BA55-47B7-BD44-35C0FCD05FD5}.Release|Any CPU.Build.0 = Release|Any CPU
{3D36CDC9-E989-465B-A9F1-AD85DC42F242}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3D36CDC9-E989-465B-A9F1-AD85DC42F242}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3D36CDC9-E989-465B-A9F1-AD85DC42F242}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3D36CDC9-E989-465B-A9F1-AD85DC42F242}.Release|Any CPU.Build.0 = Release|Any CPU
{130A8861-0C39-4933-9DE8-AA9525488211}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{130A8861-0C39-4933-9DE8-AA9525488211}.Debug|Any CPU.Build.0 = Debug|Any CPU
{130A8861-0C39-4933-9DE8-AA9525488211}.Release|Any CPU.ActiveCfg = Release|Any CPU
{130A8861-0C39-4933-9DE8-AA9525488211}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {6EF98F13-0310-44EE-AF0C-6A033D4E8EB1}
EndGlobalSection
EndGlobal

196
DBChm/AboutBox.Designer.cs generated Normal file
View File

@ -0,0 +1,196 @@
namespace DBCHM
{
partial class AboutBox
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox));
this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel();
this.logoPictureBox = new System.Windows.Forms.PictureBox();
this.labelProductName = new System.Windows.Forms.Label();
this.labelVersion = new System.Windows.Forms.Label();
this.labelCopyright = new System.Windows.Forms.Label();
this.labelCompanyName = new System.Windows.Forms.Label();
this.textBoxDescription = new System.Windows.Forms.TextBox();
this.okButton = new System.Windows.Forms.Button();
this.tableLayoutPanel.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit();
this.SuspendLayout();
//
// tableLayoutPanel
//
this.tableLayoutPanel.ColumnCount = 2;
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F));
this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F));
this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0);
this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0);
this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1);
this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2);
this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3);
this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4);
this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5);
this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8);
this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tableLayoutPanel.Name = "tableLayoutPanel";
this.tableLayoutPanel.RowCount = 6;
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F));
this.tableLayoutPanel.Size = new System.Drawing.Size(417, 246);
this.tableLayoutPanel.TabIndex = 0;
//
// logoPictureBox
//
this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill;
this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image")));
this.logoPictureBox.Location = new System.Drawing.Point(3, 2);
this.logoPictureBox.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.logoPictureBox.Name = "logoPictureBox";
this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6);
this.logoPictureBox.Size = new System.Drawing.Size(131, 242);
this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.logoPictureBox.TabIndex = 12;
this.logoPictureBox.TabStop = false;
//
// labelProductName
//
this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelProductName.Location = new System.Drawing.Point(143, 0);
this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelProductName.MaximumSize = new System.Drawing.Size(0, 16);
this.labelProductName.Name = "labelProductName";
this.labelProductName.Size = new System.Drawing.Size(271, 16);
this.labelProductName.TabIndex = 19;
this.labelProductName.Text = "DBCHM";
this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelVersion
//
this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelVersion.Location = new System.Drawing.Point(143, 24);
this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16);
this.labelVersion.Name = "labelVersion";
this.labelVersion.Size = new System.Drawing.Size(271, 16);
this.labelVersion.TabIndex = 0;
this.labelVersion.Text = "Version 1.0.0.0";
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelCopyright
//
this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelCopyright.Location = new System.Drawing.Point(143, 48);
this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16);
this.labelCopyright.Name = "labelCopyright";
this.labelCopyright.Size = new System.Drawing.Size(271, 16);
this.labelCopyright.TabIndex = 21;
this.labelCopyright.Text = "Copyright 2018 , lztkdr";
this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// labelCompanyName
//
this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill;
this.labelCompanyName.Location = new System.Drawing.Point(143, 72);
this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0);
this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 16);
this.labelCompanyName.Name = "labelCompanyName";
this.labelCompanyName.Size = new System.Drawing.Size(271, 16);
this.labelCompanyName.TabIndex = 22;
this.labelCompanyName.Text = "QQ群132941648";
this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// textBoxDescription
//
this.textBoxDescription.Cursor = System.Windows.Forms.Cursors.Hand;
this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill;
this.textBoxDescription.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxDescription.ForeColor = System.Drawing.SystemColors.ActiveCaption;
this.textBoxDescription.Location = new System.Drawing.Point(143, 98);
this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 2, 3, 2);
this.textBoxDescription.Multiline = true;
this.textBoxDescription.Name = "textBoxDescription";
this.textBoxDescription.ReadOnly = true;
this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.textBoxDescription.Size = new System.Drawing.Size(271, 119);
this.textBoxDescription.TabIndex = 23;
this.textBoxDescription.TabStop = false;
this.textBoxDescription.Text = "有问题,我要反馈!";
this.textBoxDescription.Click += new System.EventHandler(this.textBoxDescription_Click);
//
// okButton
//
this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.okButton.Location = new System.Drawing.Point(339, 222);
this.okButton.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.okButton.Name = "okButton";
this.okButton.Size = new System.Drawing.Size(75, 22);
this.okButton.TabIndex = 24;
this.okButton.Text = "&OK";
this.okButton.Click += new System.EventHandler(this.okButton_Click);
//
// AboutBox
//
this.AcceptButton = this.okButton;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.okButton;
this.ClientSize = new System.Drawing.Size(435, 262);
this.Controls.Add(this.tableLayoutPanel);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AboutBox";
this.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8);
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "AboutBox";
this.tableLayoutPanel.ResumeLayout(false);
this.tableLayoutPanel.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel;
private System.Windows.Forms.PictureBox logoPictureBox;
private System.Windows.Forms.Label labelProductName;
private System.Windows.Forms.Label labelVersion;
private System.Windows.Forms.Label labelCopyright;
private System.Windows.Forms.Label labelCompanyName;
private System.Windows.Forms.TextBox textBoxDescription;
private System.Windows.Forms.Button okButton;
}
}

121
DBChm/AboutBox.cs Normal file
View File

@ -0,0 +1,121 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Reflection;
using ComponentFactory.Krypton.Toolkit;
namespace DBCHM
{
partial class AboutBox : KryptonForm
{
public AboutBox()
{
InitializeComponent();
this.Text = String.Format("About {0}", AssemblyTitle);
this.labelProductName.Text = AssemblyProduct;
this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion);
this.labelCopyright.Text = AssemblyCopyright;
this.labelCompanyName.Text = AssemblyCompany;
}
#region Assembly Attribute Accessors
public string AssemblyTitle
{
get
{
// Get all Title attributes on this assembly
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);
// If there is at least one Title attribute
if (attributes.Length > 0)
{
// Select the first one
AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];
// If it is not an empty string, return it
if (titleAttribute.Title != "")
return titleAttribute.Title;
}
// If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name
return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
}
}
public string AssemblyVersion
{
get
{
return Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
}
public string AssemblyDescription
{
get
{
// Get all Description attributes on this assembly
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);
// If there aren't any Description attributes, return an empty string
if (attributes.Length == 0)
return "";
// If there is a Description attribute, return its value
return ((AssemblyDescriptionAttribute)attributes[0]).Description;
}
}
public string AssemblyProduct
{
get
{
// Get all Product attributes on this assembly
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);
// If there aren't any Product attributes, return an empty string
if (attributes.Length == 0)
return "";
// If there is a Product attribute, return its value
return ((AssemblyProductAttribute)attributes[0]).Product;
}
}
public string AssemblyCopyright
{
get
{
// Get all Copyright attributes on this assembly
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);
// If there aren't any Copyright attributes, return an empty string
if (attributes.Length == 0)
return "";
// If there is a Copyright attribute, return its value
return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;
}
}
public string AssemblyCompany
{
get
{
// Get all Company attributes on this assembly
object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
// If there aren't any Company attributes, return an empty string
if (attributes.Length == 0)
return "";
// If there is a Company attribute, return its value
return ((AssemblyCompanyAttribute)attributes[0]).Company;
}
}
#endregion
private void okButton_Click(object sender, EventArgs e)
{
this.Dispose();
}
private void textBoxDescription_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://shang.qq.com/wpa/qunwpa?idkey=43619cbe3b2a10ded01b5354ac6928b30cc91bda45176f89a191796b7a7c0e26");
}
}
}

603
DBChm/AboutBox.resx Normal file
View File

@ -0,0 +1,603 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="logoPictureBox.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
</root>

View File

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace DBCHM
{
public static class CommonExtension
{
public static string FormatString(this string s, params object[] args)
{
return string.Format(s, args);
}
public static void SetHidden(this FileInfo file)
{
if (file != null && file.Exists)
{
file.Attributes = FileAttributes.Hidden;
}
}
/// <summary>
/// 深度复制
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static T DeepCopy<T>(this T source)
{
if (source == null)
{
return default(T);
}
using (Stream objectStream = new MemoryStream())
{
//利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, source);
objectStream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(objectStream);
}
}
}
}

304
DBChm/Common/ConfigUtils.cs Normal file
View File

@ -0,0 +1,304 @@
using MJTop.Data;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
namespace DBCHM
{
/// <summary>
/// 管理 配置的连接字符串
/// </summary>
public static class ConfigUtils
{
/// <summary>
/// 当前应用程序的名称
/// </summary>
private static string ConfigFileName = Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName).Replace(".vshost", "");
/// <summary>
/// 定义配置存放的路径
/// </summary>
public static string AppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.Create), ConfigFileName);
/// <summary>
/// sqlite db文件的存放路径
/// </summary>
private static string ConfigFilePath = string.Empty;
/// <summary>
/// 针对配置的 数据库操作对象
/// </summary>
private static DB db = null;
/// <summary>
/// 初始化静态数据
/// 将sqlite数据库写入 C:\Users\用户名\AppData\Local\DBChm 目录中
/// </summary>
static ConfigUtils()
{
try
{
if (!ZetaLongPaths.ZlpIOHelper.DirectoryExists(AppPath))
{
ZetaLongPaths.ZlpIOHelper.CreateDirectory(AppPath);
}
AddSecurityControll2Folder(AppPath);
ConfigFilePath = Path.Combine(AppPath, ConfigFileName + ".db");
Init();
}
catch (Exception ex)
{
LogUtils.LogError("ConfigUtils初始化", Developer.SysDefault, ex);
}
}
/// <summary>
/// 初始化创建配置数据库
/// </summary>
private static void Init()
{
db = DBMgr.UseDB(DBType.SQLite, ConfigFilePath);
string strSql = @"create table DBCHMConfig
(
Id integer PRIMARY KEY autoincrement,
Name nvarchar(200) unique,
DBType varchar(30),
Server varchar(100),
Port integer,
DBName varchar(100),
Uid varchar(50),
Pwd varchar(100),
ConnTimeOut integer,
ConnString text,
Modified text
)";
//表不存在则创建 连接字符串 配置表
if (db.Info.TableNames == null || !db.Info.TableNames.Contains(nameof(DBCHMConfig), StringComparer.OrdinalIgnoreCase))
{
db.ExecSql(strSql);
//执行后,刷新实例 表结构信息
db.Info.Refresh();
}
else
{
// v1.7.3.7 版本 增加 连接超时 与 最后连接时间
var info = db.Info;
if(!info.IsExistColumn(nameof(DBCHMConfig), nameof(DBCHMConfig.Modified)))
{
var configs = db.GetListDictionary("select * from " + nameof(DBCHMConfig));
db.Info.DropTable(nameof(DBCHMConfig));
db.ExecSql(strSql);
//执行后,刷新实例 表结构信息
db.Info.Refresh();
if (configs != null && configs.Count > 0)
{
foreach (var config in configs)
{
try
{
db.Insert(config, nameof(DBCHMConfig));
}
catch (Exception ex)
{
LogUtils.LogError("Init", Developer.SysDefault, ex, config);
}
}
db.ExecSql("update " + nameof(DBCHMConfig) + " set ConnTimeOut = 120 ");
}
}
}
}
/// <summary>
/// 判断磁盘路径下是否安装存在某个文件,最后返回存在某个文件的路径
/// </summary>
/// <param name="installPaths"></param>
/// <param name="installPath"></param>
/// <returns></returns>
public static bool IsInstall(string[] installPaths, out string installPath)
{
installPath = string.Empty;
var driInfos = DriveInfo.GetDrives();
foreach (DriveInfo dInfo in driInfos)
{
if (dInfo.DriveType == DriveType.Fixed)
{
foreach (string ipath in installPaths)
{
string path = Path.Combine(dInfo.Name, ipath);
if (File.Exists(path))
{
installPath = path;
return true;
}
}
}
}
return false;
}
/// <summary>
/// 检测是否安装某个软件,并返回软件的卸载安装路径
/// </summary>
/// <param name="softName"></param>
/// <param name="installPath"></param>
/// <returns></returns>
public static bool CheckInstall(string softName, string str_exe, out string installPath)
{
//即时刷新注册表
SHChangeNotify(0x8000000, 0, IntPtr.Zero, IntPtr.Zero);
installPath = string.Empty;
bool isFind = false;
var uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall", false);
if (uninstallNode != null)
{
//LocalMachine_64
using (uninstallNode)
{
foreach (var subKeyName in uninstallNode.GetSubKeyNames())
{
var subKey = uninstallNode.OpenSubKey(subKeyName);
string displayName = (subKey.GetValue("DisplayName") ?? string.Empty).ToString();
string path = (subKey.GetValue("UninstallString") ?? string.Empty).ToString();
Console.WriteLine(displayName);
if (displayName.Contains(softName) && !string.IsNullOrWhiteSpace(path))
{
installPath = Path.Combine(Path.GetDirectoryName(path), str_exe);
if (File.Exists(installPath))
{
isFind = true;
break;
}
}
}
}
}
if (!isFind)
{
//LocalMachine_32
uninstallNode = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall", false);
using (uninstallNode)
{
foreach (var subKeyName in uninstallNode.GetSubKeyNames())
{
var subKey = uninstallNode.OpenSubKey(subKeyName);
string displayName = (subKey.GetValue("DisplayName") ?? string.Empty).ToString();
string path = (subKey.GetValue("UninstallString") ?? string.Empty).ToString();
Console.WriteLine(displayName);
if (displayName.Contains(softName) && !string.IsNullOrWhiteSpace(path))
{
installPath = Path.Combine(Path.GetDirectoryName(path), str_exe);
if (File.Exists(installPath))
{
isFind = true;
break;
}
}
}
}
}
return isFind;
}
[DllImport("shell32.dll")]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
/// <summary>
///为文件夹添加userseveryone用户组的完全控制权限
/// </summary>
/// <param name="dirPath"></param>
public static void AddSecurityControll2Folder(string dirPath)
{
//获取文件夹信息
DirectoryInfo dir = new DirectoryInfo(dirPath);
if (dir.Exists)
{
//获得该文件夹的所有访问权限
System.Security.AccessControl.DirectorySecurity dirSecurity = dir.GetAccessControl(AccessControlSections.All);
//设定文件ACL继承
InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
//添加ereryone用户组的访问权限规则 完全控制权限
FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
//添加Users用户组的访问权限规则 完全控制权限
FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
bool isModified = false;
dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified);
dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified);
//设置访问权限
dir.SetAccessControl(dirSecurity);
}
}
/// <summary>
/// 添加或修改配置连接
/// </summary>
/// <param name="dbCHMConfig"></param>
public static void Save(NameValueCollection dbCHMConfig)
{
db.Save(dbCHMConfig, "DBCHMConfig");
}
public static void UpLastModified(int id)
{
db.ExecSql("update DBCHMConfig set Modified='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' where id=" + id);
}
/// <summary>
/// 删除连接
/// </summary>
/// <param name="id"></param>
public static void Delete(int id)
{
db.Delete("DBCHMConfig", "Id", id);
}
/// <summary>
/// 查询出所有配置的连接
/// </summary>
/// <returns></returns>
public static List<DBCHMConfig> SelectAll()
{
return db.GetDataTable("select * from DBCHMConfig order by Modified desc ").ConvertToListObject<DBCHMConfig>();
}
/// <summary>
/// 得到其中1个连接
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static DBCHMConfig Get(int id)
{
return db.GetDataTable("select * from DBCHMConfig where id = " + id).ConvertToListObject<DBCHMConfig>().FirstOrDefault();
}
/// <summary>
/// 判断配置表是否存在连接字符串
/// </summary>
/// <returns></returns>
public static bool HasValue()
{
string strSql = "select count(1) from DBCHMConfig";
return db.Single<int>(strSql, 0) > 0;
}
}
}

View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DBCHM
{
public class DBCHMConfig
{
[DisplayName("ID")]
public int Id { get; set; }
[DisplayName("连接名")]
public string Name { get; set; }
[DisplayName("数据库类型")]
public string DBType { get; set; }
[DisplayName("主机")]
public string Server { get; set; }
[DisplayName("端口")]
public int? Port { get; set; }
[DisplayName("数据库")]
public string DBName { get; set; }
[DisplayName("用户名")]
public string Uid { get; set; }
[DisplayName("密码")]
public string Pwd { get; set; }
[DisplayName("连接超时")]
public int? ConnTimeOut { get; set; }
[DisplayName("连接字符串")]
public string ConnString { get; set; }
[DisplayName("最后使用时间")]
public DateTime Modified { get; set; }
}
}

15
DBChm/Common/DBUtils.cs Normal file
View File

@ -0,0 +1,15 @@
using MJTop.Data;
namespace DBCHM
{
public static class DBUtils
{
/// <summary>
/// 数据库对象
/// MJTop.Data 已开源。
/// </summary>
public static DB Instance
{ get; set; }
}
}

View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
public static class EnumExt<TEnum>
where TEnum : struct
{
private static readonly Dictionary<string, TEnum> read_dict_Enums;
private static readonly Dictionary<string, string> read_dict_Enums_desc;
static EnumExt()
{
read_dict_Enums = new Dictionary<string, TEnum>();
read_dict_Enums_desc = new Dictionary<string, string>();
Type enumType = typeof(TEnum);
foreach (var val in Enum.GetValues(enumType))
{
string valstr = val.ToString();
read_dict_Enums.Add(valstr, (TEnum)val);
var descAttr = enumType.GetField(valstr).GetCustomAttributes(typeof(DescriptionAttribute), false);
string desc = valstr;
if (descAttr.Length > 0)
{
desc = (descAttr.FirstOrDefault() as DescriptionAttribute).Description;
}
read_dict_Enums_desc.Add(val.ToString(), desc);
}
}
public static Dictionary<string, TEnum> All()
{
return new Dictionary<string, TEnum>(read_dict_Enums);
}
public static string ToDescriptionString(TEnum @this)
{
return read_dict_Enums_desc[@this.ToString()];
}
public static int ToInt(TEnum @this)
{
return Convert.ToInt32(@this);
}
}

18
DBChm/Common/Enums.cs Normal file
View File

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DBCHM
{
/// <summary>
/// 操作类型
/// </summary>
public enum OPType
{
,
,
,
}
}

82
DBChm/Common/FormUtils.cs Normal file
View File

@ -0,0 +1,82 @@
using MJTop.Data;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Windows.Forms;
namespace DBCHM
{
public static class FormUtils
{
/// <summary>
/// 静态构造函数执行1次记载 可以处理DBCHM的数据库类型
/// </summary>
static FormUtils()
{
DictDBType = EnumExt<DBType>.All();
DictDBType.Remove(DBType.Oracle.ToString());
}
/// <summary>
/// 所有数据库类型 对应的端口
/// </summary>
public static readonly Dictionary<string, string> DictPort = new Dictionary<string, string>()
{
{ DBType.SQLite.ToString(),string.Empty},
{ DBType.SqlServer.ToString(),"1433"},
{ DBType.MySql.ToString(),"3306"},
{ DBType.OracleDDTek.ToString(),"1521"},
//{ DBType.Oracle.ToString(),"1521"},
{ DBType.PostgreSql.ToString(),"5432"},
{ DBType.DB2.ToString(),"50000"},
};
/// <summary>
/// 所有数据库类型
/// </summary>
public static Dictionary<string, DBType> DictDBType
{
get; private set;
}
/// <summary>
/// 是否正常的Close
/// </summary>
public static bool IsOK_Close { get; set; } = false;
public static ProgressArg ProgArg { get; set; }
/// <summary>
/// Loading加载
/// </summary>
/// <param name="msg">loading提示消息</param>
/// <param name="owner">当前窗体 this </param>
/// <param name="work">异步执行方法</param>
/// <param name="workArg">异步执行方法的参数</param>
public static void ShowProcessing(string msg, Form owner, Action<object> work, object workArg = null)
{
try
{
FrmProcessing processingForm = new FrmProcessing(msg);
dynamic expObj = new ExpandoObject();
expObj.Form = processingForm;
expObj.WorkArg = workArg;
processingForm.SetWorkAction(work, expObj);
processingForm.ShowDialog(owner);
if (processingForm.WorkException != null)
{
throw processingForm.WorkException;
}
}
catch (System.Exception ex)
{
LogUtils.LogError("FrmProcessing", Developer.SysDefault, ex, msg);
}
}
}
}

View File

@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DBCHM
{
/// <summary>
/// 进度条参数类
/// </summary>
public class ProgressArg
{
public ProgressArg(Action execAct, int maxNum)
{
this.ExecAct = execAct;
this.MaxNum = maxNum;
}
public Action ExecAct { get; set; }
public int MaxNum { get; set; }
}
}

View File

@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
namespace DBCHM.Common
{
/// <summary>
/// 解析VS生成的 XML文档文件
/// </summary>
public class XmlAnalyze
{
public Dictionary<KeyValuePair<string, string>, List<KeyValuePair<string, string>>> Data { get; set; } = new Dictionary<KeyValuePair<string, string>, List<KeyValuePair<string, string>>>();
public List<string> EntityNames { get; set; } = new List<string>();
public Dictionary<string, string> EntityComments { get; set; } = new Dictionary<string, string>();
private Dictionary<string, string> EntityXPaths { get; set; } = new Dictionary<string, string>();
public XmlAnalyze(string path)
{
var content = File.ReadAllText(path, Encoding.UTF8);
XmlDocument doc = new XmlDocument();
doc.LoadXml(content);
var rootNode = doc.DocumentElement;
var nodeList = rootNode.SelectNodes("//members/member[starts-with(@name,'T:')]");
foreach (XmlNode node in nodeList)
{
var value = node.Attributes["name"]?.Value;
var entityName = value?.Split('.')?.LastOrDefault();
//实体名 必须由 字母数字或下划线组成
if (Regex.IsMatch(entityName, @"^[a-z\d_]+$", RegexOptions.Compiled | RegexOptions.IgnoreCase))
{
var comment = node?.InnerText?.Trim();
EntityNames.Add(entityName);
EntityComments.Add(entityName, comment);
var xpath = value?.Replace("T:", "P:") + ".";
EntityXPaths.Add(entityName, xpath);
}
}
foreach (var item in EntityXPaths)
{
var nodes = rootNode.SelectNodes($"//members/member[starts-with(@name,'{item.Value}')]");
var ecKey = new KeyValuePair<string, string>(item.Key, EntityComments[item.Key]);
var lstKV = new List<KeyValuePair<string, string>>();
foreach (XmlNode node in nodes)
{
var value = node.Attributes["name"]?.Value;
var propName = value?.Split('.')?.LastOrDefault();
var comment = node.InnerText?.Trim();
lstKV.Add(new KeyValuePair<string, string>(propName, comment));
}
Data.Add(ecKey, lstKV);
}
}
}
}

217
DBChm/DBCHM.csproj Normal file
View File

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{55B00DB1-BA55-47B7-BD44-35C0FCD05FD5}</ProjectGuid>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DBCHM</RootNamespace>
<AssemblyName>DBCHM</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<DocumentationFile>
</DocumentationFile>
<NoWarn>CS7035</NoWarn>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>ico\dbchm.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="ComponentFactory.Krypton.Toolkit, Version=4.5.0.0, Culture=neutral, PublicKeyToken=a87e673e9ecb6e8e, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>lib\ComponentFactory.Krypton.Toolkit.dll</HintPath>
</Reference>
<Reference Include="ICSharpCode.TextEditor, Version=4.2.0.0, Culture=neutral, PublicKeyToken=4d61825e8dd49f1a, processorArchitecture=MSIL">
<HintPath>..\packages\ICSharpCode.TextEditor.Extended.4.2.4\lib\net45\ICSharpCode.TextEditor.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.Data.Linq" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
<Reference Include="ZetaLongPaths, Version=1.0.0.38, Culture=neutral, PublicKeyToken=b764f59068f31f38, processorArchitecture=MSIL">
<HintPath>..\packages\ZetaLongPaths.1.0.0.38\lib\net452-full\ZetaLongPaths.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AboutBox.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AboutBox.Designer.cs">
<DependentUpon>AboutBox.cs</DependentUpon>
</Compile>
<Compile Include="Common\CommonExtension.cs" />
<Compile Include="Common\DBCHMConfig.cs" />
<Compile Include="Common\DBUtils.cs" />
<Compile Include="Common\EnumExtension.cs" />
<Compile Include="Common\Enums.cs" />
<Compile Include="Common\FormUtils.cs" />
<Compile Include="Common\ConfigUtils.cs" />
<Compile Include="Common\ProgressArg.cs" />
<Compile Include="Common\XmlAnalyze.cs" />
<Compile Include="FrmProcessing.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="FrmProcessing.Designer.cs">
<DependentUpon>FrmProcessing.cs</DependentUpon>
</Compile>
<Compile Include="GridFormMgr.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="GridFormMgr.Designer.cs">
<DependentUpon>GridFormMgr.cs</DependentUpon>
</Compile>
<Compile Include="DBForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="DBForm.Designer.cs">
<DependentUpon>DBForm.cs</DependentUpon>
</Compile>
<Compile Include="ImportForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="ImportForm.designer.cs">
<DependentUpon>ImportForm.cs</DependentUpon>
</Compile>
<Compile Include="PdmModels\ColumnInfo.cs" />
<Compile Include="PdmModels\PdmKey.cs" />
<Compile Include="PdmModels\PdmModels.cs" />
<Compile Include="PdmModels\SelectedTables.cs" />
<Compile Include="PdmModels\TableInfo.cs" />
<Compile Include="PDM\PdmReader.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="MainForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="MainForm.designer.cs">
<DependentUpon>MainForm.cs</DependentUpon>
</Compile>
<Compile Include="TreeViewEnhanced.cs">
<SubType>Component</SubType>
</Compile>
<EmbeddedResource Include="AboutBox.resx">
<DependentUpon>AboutBox.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="FrmProcessing.resx">
<DependentUpon>FrmProcessing.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="GridFormMgr.resx">
<DependentUpon>GridFormMgr.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="DBForm.resx">
<DependentUpon>DBForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="ImportForm.resx">
<DependentUpon>ImportForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<SubType>Designer</SubType>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<EmbeddedResource Include="MainForm.resx">
<DependentUpon>MainForm.cs</DependentUpon>
</EmbeddedResource>
<None Include="app.config">
<SubType>Designer</SubType>
</None>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<Content Include="htmlhelp.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Include="ico\about.png" />
<Content Include="ico\connect.png" />
<Content Include="ico\DBCHM.ico" />
<Content Include="ico\empty.png" />
<Content Include="ico\excel.png" />
<Content Include="ico\exp.png" />
<Content Include="ico\html.png" />
<Content Include="ico\logo.png" />
<Content Include="ico\md.png" />
<Content Include="ico\pdf.png" />
<Content Include="ico\refresh_reload.png" />
<Content Include="ico\upload.png" />
<Content Include="ico\word.png" />
<Content Include="ico\xml.png" />
<Content Include="Images\DBCHM001.png" />
<Content Include="Images\DBCHM002.png" />
<Content Include="Images\DBCHM003.png" />
<Content Include="Images\DBCHM004.png" />
<Content Include="Images\DBCHM005.png" />
<EmbeddedResource Include="Resources\loading.gif" />
<EmbeddedResource Include="lib\ComponentFactory.Krypton.Toolkit.dll" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DocTools\DocTools.csproj">
<Project>{130a8861-0c39-4933-9de8-aa9525488211}</Project>
<Name>DocTools</Name>
</ProjectReference>
<ProjectReference Include="..\MJTop.Data\MJTop.Data.csproj">
<Project>{3d36cdc9-e989-465b-a9f1-ad85dc42f242}</Project>
<Name>MJTop.Data</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Target Name="AfterBuild">
<ItemGroup>
<MoveToLibFolder Include="$(OutputPath)*.dll ; $(OutputPath)*.pdb ; $(OutputPath)*.xml" />
</ItemGroup>
</Target>
</Project>

387
DBChm/DBForm.Designer.cs generated Normal file
View File

@ -0,0 +1,387 @@
namespace DBCHM
{
partial class DBForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(DBForm));
this.labelControl1 = new System.Windows.Forms.Label();
this.TxtConnectName = new System.Windows.Forms.TextBox();
this.labelControl2 = new System.Windows.Forms.Label();
this.TxtHost = new System.Windows.Forms.TextBox();
this.labelControl3 = new System.Windows.Forms.Label();
this.TxtPort = new System.Windows.Forms.TextBox();
this.labelControl4 = new System.Windows.Forms.Label();
this.TxtUName = new System.Windows.Forms.TextBox();
this.labelControl5 = new System.Windows.Forms.Label();
this.TxtPwd = new System.Windows.Forms.TextBox();
this.labelControl6 = new System.Windows.Forms.Label();
this.BtnOk = new System.Windows.Forms.Button();
this.BtnCancel = new System.Windows.Forms.Button();
this.cboDBType = new System.Windows.Forms.ComboBox();
this.labDBName = new System.Windows.Forms.Label();
this.BtnTestConnect = new System.Windows.Forms.Button();
this.cboDBName = new System.Windows.Forms.ComboBox();
this.lblMsg = new System.Windows.Forms.Label();
this.btnSelectFile = new System.Windows.Forms.Button();
this.txtConnTimeOut = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.noneSSLCB = new System.Windows.Forms.CheckBox();
this.requiredSSLCB = new System.Windows.Forms.CheckBox();
this.sslLabel = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// labelControl1
//
this.labelControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl1.Location = new System.Drawing.Point(85, 59);
this.labelControl1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labelControl1.Name = "labelControl1";
this.labelControl1.Size = new System.Drawing.Size(122, 18);
this.labelControl1.TabIndex = 2;
this.labelControl1.Text = "连接名";
//
// TxtConnectName
//
this.TxtConnectName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.TxtConnectName.Location = new System.Drawing.Point(177, 57);
this.TxtConnectName.Margin = new System.Windows.Forms.Padding(2);
this.TxtConnectName.Name = "TxtConnectName";
this.TxtConnectName.Size = new System.Drawing.Size(213, 21);
this.TxtConnectName.TabIndex = 0;
//
// labelControl2
//
this.labelControl2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl2.Location = new System.Drawing.Point(84, 136);
this.labelControl2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labelControl2.Name = "labelControl2";
this.labelControl2.Size = new System.Drawing.Size(144, 14);
this.labelControl2.TabIndex = 2;
this.labelControl2.Text = "主机名或IP地址";
//
// TxtHost
//
this.TxtHost.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.TxtHost.Location = new System.Drawing.Point(176, 133);
this.TxtHost.Margin = new System.Windows.Forms.Padding(2);
this.TxtHost.Name = "TxtHost";
this.TxtHost.Size = new System.Drawing.Size(213, 21);
this.TxtHost.TabIndex = 2;
//
// labelControl3
//
this.labelControl3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl3.Location = new System.Drawing.Point(84, 173);
this.labelControl3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labelControl3.Name = "labelControl3";
this.labelControl3.Size = new System.Drawing.Size(100, 18);
this.labelControl3.TabIndex = 2;
this.labelControl3.Text = "端口";
//
// TxtPort
//
this.TxtPort.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.TxtPort.Location = new System.Drawing.Point(176, 170);
this.TxtPort.Margin = new System.Windows.Forms.Padding(2);
this.TxtPort.Name = "TxtPort";
this.TxtPort.Size = new System.Drawing.Size(213, 21);
this.TxtPort.TabIndex = 3;
this.TxtPort.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.TxtPort_KeyPress);
//
// labelControl4
//
this.labelControl4.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl4.Location = new System.Drawing.Point(85, 239);
this.labelControl4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labelControl4.Name = "labelControl4";
this.labelControl4.Size = new System.Drawing.Size(100, 14);
this.labelControl4.TabIndex = 2;
this.labelControl4.Text = "用户名";
//
// TxtUName
//
this.TxtUName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.TxtUName.Location = new System.Drawing.Point(177, 237);
this.TxtUName.Margin = new System.Windows.Forms.Padding(2);
this.TxtUName.Name = "TxtUName";
this.TxtUName.Size = new System.Drawing.Size(213, 21);
this.TxtUName.TabIndex = 4;
//
// labelControl5
//
this.labelControl5.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl5.Location = new System.Drawing.Point(85, 270);
this.labelControl5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labelControl5.Name = "labelControl5";
this.labelControl5.Size = new System.Drawing.Size(107, 18);
this.labelControl5.TabIndex = 2;
this.labelControl5.Text = "密码";
//
// TxtPwd
//
this.TxtPwd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.TxtPwd.Location = new System.Drawing.Point(177, 268);
this.TxtPwd.Margin = new System.Windows.Forms.Padding(2);
this.TxtPwd.Name = "TxtPwd";
this.TxtPwd.PasswordChar = '*';
this.TxtPwd.Size = new System.Drawing.Size(213, 21);
this.TxtPwd.TabIndex = 5;
//
// labelControl6
//
this.labelControl6.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labelControl6.Location = new System.Drawing.Point(83, 98);
this.labelControl6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labelControl6.Name = "labelControl6";
this.labelControl6.Size = new System.Drawing.Size(134, 15);
this.labelControl6.TabIndex = 2;
this.labelControl6.Text = "数据库类型";
//
// BtnOk
//
this.BtnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.BtnOk.Location = new System.Drawing.Point(346, 380);
this.BtnOk.Margin = new System.Windows.Forms.Padding(2);
this.BtnOk.Name = "BtnOk";
this.BtnOk.Size = new System.Drawing.Size(61, 28);
this.BtnOk.TabIndex = 8;
this.BtnOk.Text = "确定";
this.BtnOk.Click += new System.EventHandler(this.BtnOk_Click);
//
// BtnCancel
//
this.BtnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.BtnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.BtnCancel.Location = new System.Drawing.Point(423, 380);
this.BtnCancel.Margin = new System.Windows.Forms.Padding(2);
this.BtnCancel.Name = "BtnCancel";
this.BtnCancel.Size = new System.Drawing.Size(57, 28);
this.BtnCancel.TabIndex = 9;
this.BtnCancel.Text = "取消";
this.BtnCancel.Click += new System.EventHandler(this.BtnCancel_Click);
//
// cboDBType
//
this.cboDBType.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.cboDBType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cboDBType.Location = new System.Drawing.Point(176, 93);
this.cboDBType.Margin = new System.Windows.Forms.Padding(2);
this.cboDBType.Name = "cboDBType";
this.cboDBType.Size = new System.Drawing.Size(214, 20);
this.cboDBType.TabIndex = 1;
this.cboDBType.SelectedIndexChanged += new System.EventHandler(this.cboDBType_SelectedIndexChanged);
//
// labDBName
//
this.labDBName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.labDBName.Location = new System.Drawing.Point(84, 204);
this.labDBName.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labDBName.Name = "labDBName";
this.labDBName.Size = new System.Drawing.Size(108, 20);
this.labDBName.TabIndex = 2;
this.labDBName.Text = "数据库";
//
// BtnTestConnect
//
this.BtnTestConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.BtnTestConnect.Location = new System.Drawing.Point(32, 380);
this.BtnTestConnect.Margin = new System.Windows.Forms.Padding(2);
this.BtnTestConnect.Name = "BtnTestConnect";
this.BtnTestConnect.Size = new System.Drawing.Size(70, 28);
this.BtnTestConnect.TabIndex = 7;
this.BtnTestConnect.Text = "连接/测试";
this.BtnTestConnect.Click += new System.EventHandler(this.BtnTestConnect_Click);
//
// cboDBName
//
this.cboDBName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.cboDBName.Location = new System.Drawing.Point(177, 204);
this.cboDBName.Margin = new System.Windows.Forms.Padding(2);
this.cboDBName.Name = "cboDBName";
this.cboDBName.Size = new System.Drawing.Size(214, 20);
this.cboDBName.TabIndex = 6;
this.cboDBName.SelectedIndexChanged += new System.EventHandler(this.cboDBName_SelectedIndexChanged);
//
// lblMsg
//
this.lblMsg.AutoSize = true;
this.lblMsg.Location = new System.Drawing.Point(116, 386);
this.lblMsg.Name = "lblMsg";
this.lblMsg.Size = new System.Drawing.Size(41, 12);
this.lblMsg.TabIndex = 10;
this.lblMsg.Text = "lblMsg";
//
// btnSelectFile
//
this.btnSelectFile.Location = new System.Drawing.Point(399, 164);
this.btnSelectFile.Name = "btnSelectFile";
this.btnSelectFile.Size = new System.Drawing.Size(81, 29);
this.btnSelectFile.TabIndex = 11;
this.btnSelectFile.Text = "选择文件";
this.btnSelectFile.UseVisualStyleBackColor = true;
this.btnSelectFile.Click += new System.EventHandler(this.BtnSelectFile_Click);
//
// txtConnTimeOut
//
this.txtConnTimeOut.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.txtConnTimeOut.Location = new System.Drawing.Point(178, 303);
this.txtConnTimeOut.Margin = new System.Windows.Forms.Padding(2);
this.txtConnTimeOut.Name = "txtConnTimeOut";
this.txtConnTimeOut.Size = new System.Drawing.Size(66, 21);
this.txtConnTimeOut.TabIndex = 13;
this.txtConnTimeOut.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
this.txtConnTimeOut.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtConnectionOut_KeyPress);
//
// label1
//
this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.label1.Location = new System.Drawing.Point(86, 305);
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(88, 18);
this.label1.TabIndex = 12;
this.label1.Text = "连接超时";
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(249, 306);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(17, 12);
this.label2.TabIndex = 14;
this.label2.Text = "秒";
//
// noneSSLCB
//
this.noneSSLCB.AutoSize = true;
this.noneSSLCB.Checked = true;
this.noneSSLCB.CheckState = System.Windows.Forms.CheckState.Checked;
this.noneSSLCB.Location = new System.Drawing.Point(176, 341);
this.noneSSLCB.Name = "noneSSLCB";
this.noneSSLCB.Size = new System.Drawing.Size(48, 16);
this.noneSSLCB.TabIndex = 15;
this.noneSSLCB.Text = "None";
this.noneSSLCB.UseVisualStyleBackColor = true;
this.noneSSLCB.Click += new System.EventHandler(this.noneSSLCB_Click);
//
// requiredSSLCB
//
this.requiredSSLCB.AutoSize = true;
this.requiredSSLCB.Location = new System.Drawing.Point(230, 341);
this.requiredSSLCB.Name = "requiredSSLCB";
this.requiredSSLCB.Size = new System.Drawing.Size(72, 16);
this.requiredSSLCB.TabIndex = 16;
this.requiredSSLCB.Text = "Required";
this.requiredSSLCB.UseVisualStyleBackColor = true;
this.requiredSSLCB.Click += new System.EventHandler(this.requiredSSLCB_Click);
//
// sslLabel
//
this.sslLabel.AutoSize = true;
this.sslLabel.Location = new System.Drawing.Point(86, 341);
this.sslLabel.Name = "sslLabel";
this.sslLabel.Size = new System.Drawing.Size(47, 12);
this.sslLabel.TabIndex = 17;
this.sslLabel.Text = "SSL连接";
//
// DBForm
//
this.AcceptButton = this.BtnOk;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.CancelButton = this.BtnCancel;
this.ClientSize = new System.Drawing.Size(516, 443);
this.Controls.Add(this.sslLabel);
this.Controls.Add(this.requiredSSLCB);
this.Controls.Add(this.noneSSLCB);
this.Controls.Add(this.label2);
this.Controls.Add(this.txtConnTimeOut);
this.Controls.Add(this.label1);
this.Controls.Add(this.btnSelectFile);
this.Controls.Add(this.lblMsg);
this.Controls.Add(this.cboDBName);
this.Controls.Add(this.cboDBType);
this.Controls.Add(this.BtnCancel);
this.Controls.Add(this.BtnTestConnect);
this.Controls.Add(this.BtnOk);
this.Controls.Add(this.labDBName);
this.Controls.Add(this.TxtPwd);
this.Controls.Add(this.labelControl5);
this.Controls.Add(this.TxtUName);
this.Controls.Add(this.labelControl4);
this.Controls.Add(this.TxtPort);
this.Controls.Add(this.labelControl3);
this.Controls.Add(this.TxtHost);
this.Controls.Add(this.labelControl2);
this.Controls.Add(this.TxtConnectName);
this.Controls.Add(this.labelControl6);
this.Controls.Add(this.labelControl1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(2);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "DBForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "连接数据库";
this.Load += new System.EventHandler(this.DBFrom_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label labelControl1;
private System.Windows.Forms.TextBox TxtConnectName;
private System.Windows.Forms.Label labelControl2;
private System.Windows.Forms.TextBox TxtHost;
private System.Windows.Forms.Label labelControl3;
private System.Windows.Forms.TextBox TxtPort;
private System.Windows.Forms.Label labelControl4;
private System.Windows.Forms.TextBox TxtUName;
private System.Windows.Forms.Label labelControl5;
private System.Windows.Forms.TextBox TxtPwd;
private System.Windows.Forms.Label labelControl6;
private System.Windows.Forms.Button BtnOk;
private System.Windows.Forms.Button BtnCancel;
private System.Windows.Forms.ComboBox cboDBType;
private System.Windows.Forms.Label labDBName;
private System.Windows.Forms.Button BtnTestConnect;
private System.Windows.Forms.ComboBox cboDBName;
private System.Windows.Forms.Label lblMsg;
private System.Windows.Forms.Button btnSelectFile;
private System.Windows.Forms.TextBox txtConnTimeOut;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.CheckBox noneSSLCB;
private System.Windows.Forms.CheckBox requiredSSLCB;
private System.Windows.Forms.Label sslLabel;
}
}

481
DBChm/DBForm.cs Normal file
View File

@ -0,0 +1,481 @@
using ComponentFactory.Krypton.Toolkit;
using MJTop.Data;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Windows.Forms;
namespace DBCHM
{
public partial class DBForm : KryptonForm
{
private DBForm()
: this(OPType.)
{
}
/// <summary>
/// 当前操作类型
/// </summary>
public OPType OpType { get; private set; }
public int Id { get; private set; }
public DBForm(OPType opType, int? id = null)
{
InitializeComponent();
this.OpType = opType;
if ((this.OpType == OPType. || this.OpType == OPType.) && !id.HasValue)
{
throw new ArgumentNullException(this.OpType + "操作必须传递要操作的Id");
}
else
{
if (id.HasValue)
{
foreach (var item in FormUtils.DictDBType)
{
cboDBType.Items.Add(item.Value.ToString());
}
this.Id = id.Value;
DBCHMConfig config = ConfigUtils.Get(id.Value);
TxtConnectName.Text = config.Name;
cboDBType.Text = config.DBType;
TxtHost.Text = config.Server;
TxtPort.Text = config.Port?.ToString();
TxtUName.Text = config.Uid;
TxtPwd.Text = config.Pwd;
cboDBName.Text = config.DBName;
txtConnTimeOut.Text = config.ConnTimeOut?.ToString();
if (this.OpType == OPType.)
{
TxtConnectName.Text += "_Clone";
}
if (config.DBType == DBType.SQLite.ToString())
{
btnSelectFile.Visible = true;
TxtHost.Enabled = false;
TxtPort.Enabled = false;
TxtUName.Enabled = false;
//暂不支持 加密的 Sqlite数据库
TxtPwd.Enabled = false;
}
//编辑时,确定后刷新连接列表
BtnOk.DialogResult = DialogResult.OK;
}
else
{
btnSelectFile.Visible = false;
}
if (string.IsNullOrWhiteSpace(txtConnTimeOut.Text))
{
txtConnTimeOut.Text = "30";
}
}
//为KeyDown能应用到所有控件上 注册 KeyDown 事件
foreach (Control control in this.Controls)
{
control.KeyDown += control_KeyDown;
}
lblMsg.Text = string.Empty;
}
void control_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
private void DBFrom_Load(object sender, EventArgs e)
{
if (OpType == OPType.)
{
foreach (var item in FormUtils.DictDBType)
{
cboDBType.Items.Add(item.Value.ToString());
}
cboDBType.SelectedIndex = 0;
string port;
if (FormUtils.DictPort.TryGetValue(cboDBType.Text, out port))
{
TxtPort.Text = port;
}
TxtHost.Text = "127.0.0.1";
// TODO 设置默认用户名等
SetUserNameByDbType();
}
}
private void BtnSelectFile_Click(object sender, EventArgs e)
{
OpenFileDialog fileDia = new OpenFileDialog();
var dia = fileDia.ShowDialog();
if (dia == DialogResult.OK)
{
cboDBName.Text = fileDia.FileName;
}
}
public void SetMsg(string msg, bool isSuccess = false)
{
lblMsg.Text = msg;
lblMsg.ForeColor = isSuccess ? System.Drawing.Color.Green : System.Drawing.Color.Red;
}
private void BtnTestConnect_Click(object sender, EventArgs e)
{
DBType type = (DBType)Enum.Parse(typeof(DBType), cboDBType.Text);
try
{
if (type == DBType.Oracle && string.IsNullOrWhiteSpace(cboDBName.Text))
{
throw new Exception("Oracle没有提供数据库名称查询支持请输入服务名");
}
var connString = InitConnectionStr(type);
List<string> dbNames = null;
DBMgr.TryConnect(type, connString, out dbNames);
if (dbNames != null && dbNames.Count > 0)
{
cboDBName.Items.Clear();
foreach (var dbName in dbNames)
{
cboDBName.Items.Add(dbName);
}
}
this.Text = "连接服务器成功!";
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
}
private void BtnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void BtnOk_Click(object sender, EventArgs e)
{
try
{
if (string.IsNullOrWhiteSpace(TxtConnectName.Text))
{
MessageBox.Show("请输入连接名!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (string.IsNullOrWhiteSpace(cboDBName.Text))
{
MessageBox.Show("请输入数据库名称!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
DBType type = (DBType)Enum.Parse(typeof(DBType), cboDBType.Text);
string connString = InitConnectionStr(type);
NameValueCollection nvc = new NameValueCollection();
if (OpType == OPType. || OpType == OPType.)
{
nvc.Add("Name", TxtConnectName.Text.Trim());
nvc.Add("DBType", cboDBType.Text.Trim());
nvc.Add("Server", TxtHost.Enabled ? TxtHost.Text.Trim() : string.Empty);
nvc.Add("Port", TxtPort.Enabled ? TxtPort.Text : string.Empty);
nvc.Add("DBName", cboDBName.Text.Trim());
nvc.Add("Uid", TxtUName.Enabled ? TxtUName.Text.Trim() : string.Empty);
nvc.Add("Pwd", TxtPwd.Enabled ? TxtPwd.Text : string.Empty);
nvc.Add("ConnTimeOut", txtConnTimeOut.Enabled ? txtConnTimeOut.Text : "30");
nvc.Add("ConnString", connString);
nvc.Add("Modified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
ConfigUtils.Save(nvc);
}
else if (OpType == OPType.)
{
nvc.Add("Id", Id.ToString());
nvc.Add("Name", TxtConnectName.Text.Trim());
nvc.Add("DBType", cboDBType.Text.Trim());
nvc.Add("Server", TxtHost.Enabled ? TxtHost.Text.Trim() : string.Empty);
nvc.Add("Port", TxtPort.Enabled ? TxtPort.Text : string.Empty);
nvc.Add("DBName", cboDBName.Text.Trim());
nvc.Add("Uid", TxtUName.Enabled ? TxtUName.Text.Trim() : string.Empty);
nvc.Add("Pwd", TxtPwd.Enabled ? TxtPwd.Text : string.Empty);
nvc.Add("ConnTimeOut", txtConnTimeOut.Enabled ? txtConnTimeOut.Text : "30");
nvc.Add("ConnString", connString);
nvc.Add("Modified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
ConfigUtils.Save(nvc);
}
FormUtils.ShowProcessing("正在查询表结构信息,请稍等......", this, arg =>
{
try
{
InitDb(type);
}
catch (Exception ex)
{
LogUtils.LogError("BtnOk_Click", Developer.SysDefault, ex, connString);
}
}, null);
this.DialogResult = DialogResult.OK;
this.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
}
private void cboDBType_SelectedIndexChanged(object sender, EventArgs e)
{
this.Text = "连接数据库";
string port;
if (FormUtils.DictPort.TryGetValue(cboDBType.Text, out port))
{
TxtPort.Text = port;
}
// TODO 设置默认用户名等
SetUserNameByDbType();
}
/// <summary>
/// 根据数据库类型设置默认用户名等 扩展修改 2019-01-24 21:23
/// </summary>
private void SetUserNameByDbType()
{
btnSelectFile.Visible = false;
TxtHost.Enabled = true;
TxtPort.Enabled = true;
TxtUName.Enabled = true;
sslLabel.Visible = false;
noneSSLCB.Visible = false;
requiredSSLCB.Visible = false;
labDBName.Text = "数据库";
DBType dbtype = (DBType)Enum.Parse(typeof(DBType), cboDBType.Text.ToString());
if (dbtype == DBType.SqlServer)
{
TxtUName.Text = "sa";
}
else if (dbtype == DBType.MySql)
{
TxtUName.Text = "root";
sslLabel.Visible = true;
noneSSLCB.Visible = true;
requiredSSLCB.Visible = true;
}
else if (dbtype == DBType.Oracle || dbtype == DBType.OracleDDTek)
{
TxtUName.Text = "scott";
labDBName.Text = "服务名";
}
else if (dbtype == DBType.PostgreSql)
{
TxtUName.Text = "postgres";
}
else if (dbtype == DBType.DB2)
{
TxtUName.Text = "db2admin";
}
else if(dbtype == DBType.SQLite)
{
btnSelectFile.Visible = true;
TxtHost.Enabled = false;
TxtPort.Enabled = false;
TxtUName.Enabled = false;
//暂不支持 加密的 Sqlite数据库
TxtPwd.Enabled = false;
}
else
{
TxtUName.Text = "";
}
}
/// <summary>
/// 端口验证 只能输入数字
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TxtPort_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
if (e.KeyChar == 8 || e.KeyChar == 127)//退格删除delete删除
{
e.Handled = false;
}
else
{
if (e.KeyChar >= '0' && e.KeyChar <= '9')//只能输入数字
{
int maxPort = 0;
int.TryParse(TxtPort.Text + e.KeyChar.ToString(), out maxPort);
if (maxPort > 0 && maxPort <= 65535)
{
e.Handled = false;
}
}
}
}
private void txtConnectionOut_KeyPress(object sender, KeyPressEventArgs e)
{
e.Handled = true;
if (e.KeyChar == 8 || e.KeyChar == 127)//退格删除delete删除
{
e.Handled = false;
}
else
{
if (e.KeyChar >= '0' && e.KeyChar <= '9')//只能输入数字
{
int timtOut = 0;
int.TryParse(TxtPort.Text + e.KeyChar.ToString(), out timtOut);
if (timtOut > -1)
{
e.Handled = false;
}
}
}
}
private void cboDBName_SelectedIndexChanged(object sender, EventArgs e)
{
this.Text = "连接数据库";
}
private void noneSSLCB_Click(object sender, EventArgs e)
{
if ((sender as CheckBox).Checked == true)
{
requiredSSLCB.Checked = false;
}
else
{
requiredSSLCB.Checked = true;
}
}
private void requiredSSLCB_Click(object sender, EventArgs e)
{
if ((sender as CheckBox).Checked == true)
{
noneSSLCB.Checked = false;
}
else
{
noneSSLCB.Checked = true;
}
}
private string extraParam = ""; // 额外参数
/// <summary>
/// 临时处理
/// TODO 创建额外参数
/// </summary>
private void CreateExtraParam()
{
// TODO 额外参数
if (noneSSLCB.Checked == true)
{
this.extraParam = "SslMode=None;";
}
else if (requiredSSLCB.Checked == true)
{
this.extraParam = "SslMode=Required;";
}
else
{
this.extraParam = "";
}
}
/// <summary>
/// 临时处理
/// TODO 初始化DB连接
/// </summary>
/// <param name="type"></param>
/// <param name="strDBName"></param>
private void InitDb(DBType type)
{
if (type == DBType.MySql)
{
CreateExtraParam();
DBUtils.Instance = DBMgr.UseDB(type, TxtHost.Text,
(string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable<int>(Convert.ToInt32(TxtPort.Text))),
cboDBName.Text.Trim(), TxtUName.Text, TxtPwd.Text,
(string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text))
, 300, this.extraParam);
}
else
{
DBUtils.Instance = DBMgr.UseDB(type, TxtHost.Text,
(string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable<int>(Convert.ToInt32(TxtPort.Text))),
cboDBName.Text.Trim(), TxtUName.Text, TxtPwd.Text,
(string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text))
, 300);
}
}
/// <summary>
/// 临时处理
/// TODO 初始化连接串
/// </summary>
private string InitConnectionStr(DBType type) {
CreateExtraParam();
string connString = "";
if (type == DBType.MySql)
{
connString = DBMgr.GetConnectionString(type, TxtHost.Text,
(string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable<int>(Convert.ToInt32(TxtPort.Text))),
cboDBName.Text, TxtUName.Text, TxtPwd.Text,
(string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text)),
this.extraParam);
}
else
{
connString = DBMgr.GetConnectionString(type, TxtHost.Text,
(string.IsNullOrWhiteSpace(TxtPort.Text) ? null : new Nullable<int>(Convert.ToInt32(TxtPort.Text))),
cboDBName.Text, TxtUName.Text, TxtPwd.Text,
(string.IsNullOrWhiteSpace(txtConnTimeOut.Text) ? 30 : Convert.ToInt32(txtConnTimeOut.Text))
);
}
return connString;
}
}
}

487
DBChm/DBForm.resx Normal file
View File

@ -0,0 +1,487 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEASEgAAAEAIACIVAAAFgAAACgAAABIAAAAkAAAAAEAIAAAAAAAAFEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8vLwA+LS4ASkVBAEtL
RABLS0YAS0tEAElHQgBAQD8APz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAE1KQwBMSUMAU1BLAFtYUgBdWlQAXVxVAGBeWABramMADggHAyotJQYpKykFKiwlBiEf
HQSAfXIAYF5ZAF9cVgBcWlQAWVdRAFZUTgBNTEYAQjc6AEc/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0xJAAAAAABQSUEAQ0E+AFVS
TACEhYEAREE9CFVRTBVaV1A1WllSVl5cVm9iX1mCZmNdlGhmX5tpZ2CbaGZfm2VjXJhhX1mFX1xXdVxa
VF1ZVlFAVFFLHkpKQwwABAABW1pRAEtJQgAbJBgARUU5AElJPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBPzwAODY1AFFPSQCFgnYAREM/DVZTTjlcWlRwYV9YqGdl
X9RvbGXodXJr9Hl2b/59enL/hIB4/4eEfP+JhX3/iIR9/4WBev9/fHT/e3dw/3d0bfdyb2jsamdh3WRh
W7heXFWDWFVPSktKQxUAAAABWVZTAEhFQwBPS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAT01HAExKRABYVk8AAAAAAk9NSCZbWVNwYmBavmxpYul0cWr/fnpy/4eDe/+Pi4L/lZCI/5qV
jP+dmZD/oZyT/6Self+ln5f/paCX/6Oflf+gm5L/nZiP/5qVjP+UkIj/jomB/4WBev96d3D/cG1m8mVj
XcxbWlOJU1BLOz07OwhcWlQATk1GAGdmWQAvLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSAAAAAAAU1FMAP//
/wBQTkgsWFZQimJgWdlua2T+e3dw/4eDe/+RjIT/mJOL/56ZkP+inZT/pJ+X/6ehmP+po5r/qqSb/6ul
nP+rpZz/rKad/6ymnf+rpZz/qqSb/6mkm/+oopn/pZ+W/6Cbkv+alYz/kIyE/4SAef92c2z/aGVf6l1b
VaVTUUtBQ0M7BldVTgBIRj8AT0xHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkI/ADwxLQBTUEwAT05IE1lXUW9fXVfaamdh/3l1
bv+Ggnv/kY2F/5mUi/+dmI//oJuS/6KdlP+kn5b/pqGY/6eimf+po5r/qqSb/6ulnP+rpZz/q6Wc/6ym
nf+rpZz/q6Wc/6ulnP+qpJv/qaOa/6eimf+loJf/op2T/5yXj/+Tj4b/hoJ6/3Vya/9kYlzsV1VPk09O
SCZbXFsAS0dCAExHQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABFRT8ARUI9AG1xaQBRTUkvWVdSrWNgWvpxbmf/gHx1/4yIf/+Uj4f/mZOL/5yW
jv+emZD/oJuS/6KdlP+kn5X/paCX/6ahmP+moJf/pqCX/6Wflv+inZT/op2U/6Wflv+nopj/qKKZ/6mj
mv+qpJv/qKOa/6eimf+loJf/pJ+V/6Kdk/+empH/mZSL/46Kgv9/e3T/a2hi/1pYUs5NTEZTQjs3BEhH
QQBHR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVF
PwBHRkAAoJKOAFJQSUdYVlDPZGFb/3Zya/+EgHj/jYmA/5KOhf+VkYn/mZOL/5uWjf+dmI//npmQ/5yX
jv+Yk4r/ko2E/4qFff+BfHT/fHhw/3Vxaf9taWL/a2hg/3JuZv94dGz/e3hv/4aBef+Qi4P/mZSM/5+a
kf+inZT/o56U/6Gdk/+fm5H/nZiP/5qUjP+SjYX/hYF5/3BtZv9bWVPtTkxIcjw9OQZCQj0AOjo1AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk1IAEdHQQCdjYwATUxGS1RS
TN5iX1n/dnJr/4R/eP+Lh37/j4qC/5GNhP+UkIj/l5GJ/5aQiP+RjIP/iYR8/4B7c/92cWn/bmli/2hk
Xf9iXlf/XVlT/11ZU/9dWVP/WlZR/1VRTP9UUUv/V1RN/1tXUf9hXVb/bGdg/3dya/+GgXj/k46F/5qV
jP+dmI//nJeO/5qVjf+Xkor/kY2F/4aCev9zcGj/W1lU80lIQ3MtLigGOzo2AD48OgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8ATktFAE1KRwBMSkU8T01I3F5bVv9yb2j/gHx1/4eC
e/+Lhn7/jomB/5CLg/+Qi4P/jId+/4WAd/9/eXH/fHdv/355cf+Dfnb/iIN7/4+Kgv+RjYX/ko2G/5iT
i/+dl4//m5aO/5GMhf+Mh4D/i4Z//4SAeP99eXH/dnJr/3BsZf9vamP/dXBp/4B7c/+MiH//lpCI/5iS
iv+WkYn/k4+H/4+Kgv+EgHj/cW1n/1dVT/NEQj5wMjAvBD8+OwBGRkQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADGu4cATkxFAEpIQxtLSkW/V1VP/21pY/97d3D/gn52/4WBev+JhHz/i4V9/4uF
fP+Jg3r/iYN6/4+JgP+ZlIz/paCX/6+qov+1saj/uLOr/7u2rv+8t67/vLiv/724r/+9uK//vLev/7u2
rv+6taz/ubOr/7axqP+yraX/raif/6Sfl/+YlIz/kIuD/4yHf/+Lh3//jYiA/5CLgv+SjYX/kY2E/4+L
gv+Lhn7/f3t0/2lmYP9OTEfqQkE9TT87NgBKS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABISEQAT1JRAkZEQH1OTEb9ZGFb/3Vxa/98eXH/gHx1/4N/d/+Ef3f/hoB4/4+JgP+dmI//r6qj/765
sf/Gwrr/ycS9/8jDvP/Fwbn/wr61/8K9tP/CvbT/wb20/8G9tP/BvLP/wLyz/8C7sv+/u7L/vrqx/765
sP++ubD/vbiv/7y3rv+6taz/tbCo/7Cro/+sp5//pKCa/6Kdl/+Yk4v/kIuD/42IgP+Lhn7/hYF5/3dz
bP9dW1X/R0ZBx0ZFQx9FREEAWlpaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBGRT8ARUQ+KEdF
QNpYVVD/bWlj/3dzbP97d3D/fXly/396cv+KhX3/pKCY/7+7tP/OysX/0s7I/8/Lw//Lx8D/ycS9/8fD
u//Fwbn/xcC4/8S/t//AvLP/u7au/7q2rv+6tq7/ubWt/7m1rP+7tq7/wLyz/8C8s//AvLP/wLyz/8C7
sv+/urH/vrmw/724sP+9uK//l5ON/7Cspv++u7b/r6ul/5eSi/+JhHz/hYF5/356c/9raGH/UE5J/ENC
P3UAAAAAXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBAQDoAREI9cUtIQ/1hXlj/cGxm/3Vx
a/94dG3/gX11/52Ykf/Bvbf/19PO/9fUzv/Szsf/zcjB/8rGvv/FwLn/ubWu/6+ro/+empP/kY2H/4aD
fP+Cf3j/gn54/4SAef+EgXr/hIB5/4J/eP+AfXb/gn95/4uIgf+Xk4z/pqKa/7Gtpf+6tq3/wbyz/8C8
s//AvLL/rquk/52Ykv/Fwrr/z83I/8bDv/+gnZf/hoF6/397c/9zb2j/WldS/0NBPchAQD8bQkJBAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBPTkkMQ0E9rFBOSf9mY13/cG1n/3ZybP+MiIL/uLaw/9rX
0//d29b/1NHK/9DKw//Iw7z/ubSt/52ak/+Jhn//endx/3Rxav94dW7/fXpz/4F9dv+Ggnr/jIiA/5CL
g/+RjYT/kYyE/4+Lg/+Khn7/hIB4/4B8df97d3D/dHFr/3Zzbf+Bfnf/kY6H/6umnv+7tq7/yMS9/5qV
kf+8tq7/xsK7/9nX0v/X1dL/p6Oe/4F9dv92cmv/Yl9Z/0ZEQO87OjhFNDIvAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEZEQABGREAdRUM/2FVSTv9oZV//c3Bq/5aTjv/Pzcr/5+Xi/93a1P/Tz8j/ycW9/62o
ov+Lh4H/dXJs/3Vxa/97eHH/hoN7/4+Lg/+Wkon/m5aO/5+bkf+inpT/paCX/6eimf+oo5r/qaOa/6ij
mv+moZj/o56V/6Cbkv+bl47/lZGI/46Jgf+Cf3f/eHVu/3Rxav9+e3T/qqaf/62ppP+qpZ3/v7qx/8nF
vv/i4Nz/4N/d/6eln/96dm//ZmNd/0lHQ/06OTdsNDMrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpI
RABJSEQkSkhE7FlWUf9raGP/mJaR/9va1//q5+T/3NnT/87Kw/+tqqP/hoN9/3FuZ/90cGr/gX52/42I
gP+WkYj/nJeO/6Cbkv+jnpX/paCX/6eimf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6qk
nP+po5r/pqGY/6Oelf+emZD/lpGJ/4uHf/98eHH/fntz/66rpf9tamT/Y2Ba/7ezq//NycP/6Ofk/+Xk
4/+fnJf/aWZg/0xJRf85NzWDXVhLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5NSQBOTUklTkxI7F1b
Vv+Ni4b/2tjV/+3r6f/d2dP/vrqz/4eEfv9qZ2H/cW1m/397dP+MiH//lZCH/5qVjf+emZD/oJuS/6Kd
lP+kn5b/pqGX/6eimf+po5v/qqSb/6ulnP+rpZz/rKWc/6ymnf+spp3/q6Wc/6ulnP+qpJv/qaOa/6ei
mf+loJf/o56U/5+ZkP+Xkon/i4d//25rY/8wLyj/Dg0L/3Rxbf/Ev7j/1dLM//X08//X1dP/fHl0/0xK
Rf82NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBPTkolUE5L7HNwbf/KyMb/7+7r/9zZ
0/+tqqT/cG1n/2RhW/91cmv/hYF5/4+Lg/+VkYj/mZSM/5yWjv+emZD/oJuS/6Kdk/+jnpX/pJ+V/6Oe
lf+hnJT/oZuS/52Xjv+blY3/mpWM/5yXjv+hnJP/o56U/6agmP+oopn/qKKZ/6eimP+loJf/pJ+V/6Kd
k/+fm5H/nJeO/3BtZf83Ni3/FRQQ/xsaGP+Cf3n/wLy1/+Xi3v/29vX/qaek/09NSf8yMS6aAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJRTABPTkolWFZS7KKgnv/q6Ob/4d3Z/6Sgmv9kYlv/ZmNd/3l1
bv+Hgnv/joqB/5KOhf+VkIj/mZOL/5uVjf+cl47/m5aN/5eSif+QjIP/iIN7/396cv92cWr/cGxl/2hj
Xf9jX1j/YV1X/2NfWf9rZl//cGxl/3p2b/+FgXn/kIuD/5mUi/+fmpD/oZyT/6Gck/+fmpH/npmQ/4iD
fP9IRz3/JSQd/wcGBf8zMi//fnt1/8XBuv/08/H/1NPR/19dWf8wLiyZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFZVUQBQTkolbGpn7MvJxv/o5eL/op+a/1xaVP9kYVv/eHRt/4WBef+Lh3//joqC/5GN
hP+Uj4f/lZCI/5ONhf+Mh37/g311/3p1bf9xbWX/bWhh/2llXv9lYVr/ZGFa/2djXP9lYVr/Y19Z/2Fd
WP9bV1L/WlZR/11YUv9fW1X/ZmFb/29rY/98d2//ioV9/5aRiP+bl43/nJaO/5eRif9VU0r/NDMq/w4O
Cv8VFBP/UlBL/3t4cv/Z1tL/6+vp/3p5df8wLy2ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJg
XABXVVEliIaD7d/d2v+0saz/W1lT/2BeWP90cWr/gX12/4eCe/+Khn7/jYmA/4+Kgv+OiYH/iYR7/4N9
dP+AenL/gXxz/4aBef+NiYH/lZCJ/5yXj/+emZH/op2V/6eimv+nopr/p6Ka/6WgmP+dmJD/mZSM/5OP
h/+Khn7/gn12/3l1bf91cGj/dnJq/355cv+Ig3v/kYyD/5aRiP9qaGD/PTwy/x8eGP8FBAP/QDw3/1xa
VP+KiIT/5+bk/5eVkv81NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9uagBiYV0nn56b7cnH
xP9mZF//WldR/3BtZv98eHH/gX52/4WBev+Ig3z/iYN7/4qEe/+KhHv/joiA/5iTi/+moZn/s66m/7u2
rv++urL/vrqx/7+7sv/Au7L/wLuy/7+7sv+/urH/v7qx/765sP+9ubD/vbiv/7u2rv+5tKv/tbCo/6+q
of+nopn/nZiR/5aSi/+Tj4j/kIyE/5GMhP98eHD/RUQ6/y8uJv8KCgb/HRkW/2FdV/9ZV1L/qKek/6Wj
oP89PDmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzcABraWYooZ+c7YiGgv9RTkn/aGRe/3Zy
a/98eHH/gHx0/4J+dv+CfnX/iIN6/5iTiv+sp6D/vbix/8fDvP/Lxr//y8a//8nEvP/Fwbn/w762/8K+
tf/CvrX/wr21/8K+tf/CvbT/wb20/8C8s//Au7L/v7uy/7+6sf++urH/vrmw/724sP+8t6//urSs/7aw
qP+yraX/sKyl/66qpP+dmJL/VlVM/zo5L/8YFxL/CAUD/0xIQv9iYFn/Y2Fd/4qJhf9DQj6YAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIF+ewCCgH0pioiF7VdVUP9aV1L/bmpk/3dzbP96d2//fHhx/4F8
dP+Sjob/sKyl/8nFv//U0cv/0s7I/83Jwv/Kxr7/yMS8/8bCuv/Dv7f/wby0/765sf+1san/sq2l/6mm
nv+opJz/p6Sc/6+ro/+yrqb/uLSs/7y4r/++ubD/v7uy/8G8s//Au7L/v7qx/765sP+8uK//vLev/766
tP/Fwr3/goB6/0JBN/8oKCD/BgUD/yYhG/9lYVv/VVNN/1dWUv9DQj6H////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHh2cgCDgH0hX11Z3k1KRv9iX1r/cG1m/3Vxav95dG3/h4N8/6yoov/Pzcj/2tfS/9bS
zP/Qy8T/zMfA/8jDvP+8uLH/rKmi/5uYkf+NioL/gH13/3h1b/94dW7/fHhx/3p3cP96d3D/endv/3x5
cv96d3D/eHVu/3t4cv+HhH3/lJCJ/6OfmP+wrKT/vrqx/8G8s//AvLP/v7qx/766sf/Fwbr/sa6p/09O
Rf82Niz/EREN/wwIBP9QS0P/XVpV/0A+Ov0zMzBoPzw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJP
SwBWU08YRkRBy1FPSv9nZF7/cGxm/3h0bv+Xk47/x8XA/+De2v/d2tX/08/I/87Jwv/Au7T/qaSe/4uH
gf97eHL/dXJs/3Vya/98eXH/g394/4mFff+OioH/k46G/5eSiv+ZlIv/mZSL/5eSiv+Tjob/jYmB/4iE
ff+Cfnf/endv/3VybP94dW//goB5/5qXj/+wraT/v7qy/8K9tP/BvbT/vrmy/2tpYf8+PTP/ISEa/wUD
Af8tJx//XltV/0RCPvw3NjNbKigjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZEPwBGQz8fRkQ/3lZT
T/9oZV//dnNt/6OhnP/a2NX/5+Tg/9rWz//QzMT/vbmx/5eUjf96d3D/cW1n/3h0bf+Cfnb/jIiA/5SQ
iP+alo3/n5qR/6OelP+loJf/qKKZ/6mkm/+qpJv/q6Wc/6qlnP+po5r/p6GY/6Wflv+hnJP/nJeO/5WQ
iP+Lh3//f3x0/3Rxav9zcGn/h4R9/6qmnv+/u7L/xcC4/4yJgf9FRDr/MTAo/wsLCP8TDQf/TEdA/0tJ
RP47OTZxNzUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBLSUUlS0lF7FpXUv9va2b/paOf/+Tj
4P/n5eH/2NTO/8XAuf+Zlo//dXJs/25rZf95dW7/h4N7/5GMhP+ZlIv/npmQ/6Gck/+kn5b/paCY/6ei
mf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6ulnP+qpJv/qKKZ/6Wgl/+hnJP/m5aN/5KN
hP+EgHj/dXFq/3BtZ/+Fgnv/r6uj/6+ro/9SUUf/PDwy/xoaFP8GAwD/MSoi/0lHQv85NzWHcGlYAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSQBPTUklT01J7GBeWf+cmpb/4+Lg/+ro5P/X083/r6ul/3p3
cf9pZmD/dnJr/4SAef+Pi4P/l5GJ/5uWjv+emZD/oJuS/6KdlP+kn5X/pqGX/6eimf+po5r/qqSb/6qk
m/+rpZz/q6Wc/6ulnP+rpZz/q6Wc/6ulnP+qpJv/qKOa/6eimf+loJf/pJ+V/6Cckv+alo3/kIyE/4J+
dv9va2X/bWpk/5GNhv9raWH/QkE2/ysqIv8IBwX/GBEK/z06Nf83NjOZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFBPSwBQTkslUU9L7H58eP/Y1tT/7uvo/9TQyv+ZlpD/aWZh/2tnYf98eHH/iYV9/5GN
hP+WkYn/mZSM/5uWjv+emZD/oJuS/6Gck/+inZP/oZuS/52Yj/+alYz/lpGI/5CLg/+OioH/joqB/4+K
gv+VkIf/mpWM/5+Zkf+jnZX/paCX/6WhmP+loJb/o56V/6Kdk/+gm5H/nJeP/5aRiP+JhX3/d3Ns/2dl
Xv9aWFH/REM5/zg4Lv8TEw//CgYB/yokHP8yMS+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJR
TQBPTkolW1lW7K6sqf/t6+j/1tLN/4uIgv9fXVf/bGli/356c/+JhX3/j4uC/5KOhf+VkIj/mJOL/5qV
jf+alYz/l5KK/5GMhP+Ig3v/fnlx/3NvZ/9qZl//ZGBZ/11ZU/9aVlD/V1RO/1hUT/9dWVP/Yl9Y/2xn
Yf93cmr/g352/5GMg/+alYz/n5qR/6Cbkv+fmpH/nZiP/5uVjf+WkYn/jIiA/3x4cf9hX1n/QUA3/0FA
Nf8kIxz/BgUD/xoSC/8oJSKamv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlXUwBRT0sldHJv7NLQ
zv/h3tn/jImD/1tYUv9qZ2H/fHhx/4aCev+Lh37/joqB/5GNhP+Tj4b/k46F/4+Kgf+Hgnr/fnlx/3dy
av9ybWb/cGxk/29rZP9taWL/cW1m/3JuZ/9wbGX/bmtk/25qZP9oZV//Y19Z/2RfWf9iXVf/ZGBa/2tm
X/91cGj/gn51/4+Kgv+Yk4r/m5WN/5qUjP+Xkor/k46G/4uHfv97eHD/UVBI/0JBN/8zMin/Dg0K/w4I
Av8eFw+nDTBaATUaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjYABZV1QmkI6L7eDe2/+fnJj/V1RP/2Zj
Xf94dW3/gn53/4aCe/+KhX7/jYiA/46JgP+Nh37/h4J4/4N+dP+Efnb/ioR8/5KOhf+dmJH/p6Ob/7Cs
pP+zr6f/urav/7y4sf+7t7D/urau/7i0rP+xrKX/qaWd/6Sfl/+alY3/kYyE/4aCev99eHD/enVu/355
cf+FgHj/jYiA/5SPhv+UkIj/ko6G/4+Lgv+JhH3/amdg/0RDOv8+PTP/HBwW/wcFAv8XDgTGCQUBEgIA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFwbABkY18noqCd7b+9uv9dW1f/XVtV/3NvaP99eXH/gX12/4WA
ef+Hgnv/iIJ6/4mDev+Nh37/l5KJ/6ikm/+7t7D/y8jC/9fUz//d2tb/3tzY/+Dd2f/e3Nf/3dvV/9vY
0//Y1dD/1tPN/9PQyv/QzMX/zcnC/8nFvv/FwLn/wLuz/7m0rP+wq6L/pqCZ/56Zkf+ZlI3/lpGL/5OO
hv+QjIP/kIuD/46Kgf+Lh3//gHx1/09NRP9CQTf/LCwk/wkJBv8QCQL0Fg0DTyMVBQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHl4dABycG0ooJ6a7Xd1cf9RT0r/amZg/3dzbP98eHH/f3t0/4F8dP+CfXX/jId//6Oe
lv++urT/2NXQ/+fl4v/u7On/7u3q/+3r6P/q6OX/5+Xi/+Ti3//i4Nz/393Y/93a1f/a19L/19TP/9TR
zP/Sz8j/0MzF/83Jwv/Kxr//x8O8/8TAuP/BvbT/vbiw/7mzq/+0sKj/s6+o/7Ovqf+qp6D/mZSM/42I
gP+KhH3/hoJ7/2ViWv9DQjf/Ojkw/xUVEP8JBQH/GA0EoQIAAAcKBQIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKA
fACHhYIogX977FFPS/9cWVT/b2tl/3ZybP96dm7/fHhw/4eCev+inpb/yMS//+Xj4P/z8vD/9vX0//Tz
8f/x8O7/7+3q/+zq5//p5+T/5+Xi/+Xj3//j4N3/4N7Z/97b1v/b2NP/2NXQ/9bTzv/T0Mr/0c7H/87L
xP/Mx8H/ycS9/8bCuv/Dv7f/wLyz/7+6sf++ubD/vLev/725sv/Fwrz/w8C7/6mlnv+OiYL/hYB5/3Zy
a/9JRz7/QkE2/yYlHv8GBQP/EwsC5Q4GADMJAwAABgUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBuagB4dnIfV1VR2E1L
R/9kYVv/cG1n/3Vxav97d3D/lZGK/8TBvP/o5+T/+Pf2//n49//29vT/9PPx//Lx7//w7+3/7u3q/+zq
5//p5+T/5+Xi/+Xj3//j4d3/4d/a/9/c1//d2dT/2tbR/9fUz//U0cz/0s/I/9DMxf/NycL/y8a//8fD
vP/Fwbn/wr61/8C8s//AvLP/wLuy/7+6sf/BvbT/zcrE/9bU0f+7uLP/j4uF/397c/9WVEz/QkE3/zQz
Kv8VFRL/Ih0X/y8nH3wAAAABAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRABMSUUXREI+yVJQS/9nZF//cG1m/315
c/+npJ7/3NrX//b29P/5+fj/+Pf2//b19P/19PL/8/Lw//Lw7v/w7uz/7uzp/+zq5//p5+T/6OXi/+bj
4P/j4d7/4d/b/9/d1//d2tX/29fS/9jVz//V0s3/09DJ/9HNxv/PysT/zMfA/8nFvv/Gwrv/xL+3/8K+
tf/CvbX/wb20/8G8tP/AvLP/wr62/9TQy//l4+H/yMbC/4+LhP9pZV7/SEY9/19eVv90cm3/rKaf/2Ve
VsoAAAAZGxYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVEPwBFQz4hRkRA41dUT/9oZV//fXp0/7a0sP/p6Ob/+fj3//j3
9v/29fT/9fTz//X08v/z8vD/8vHv//Hv7f/v7uv/7uvo/+vp5v/p5+T/5+Xi/+bj4P/k4d3/4t/b/9/d
2P/e2tX/29jT/9jV0P/W083/1NDL/9LOx//PzMT/zcjC/8vGv//Iw7z/xcG6/8TAuP/Ev7f/w7+2/8O/
tv/DvrX/wr61/8bBuf/a2NP/7ezq/8PBvf9+enT/ZWJc/7q4s/9ubWj/T0xH/yIbFPYSCQJXGA4FABcK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAExLRwBMS0clTEpH7VpXUv9zcGv/tbOv//Hx7//5+Pf/9vXz//Xz8v/08/H/9PPx//Py
8P/y8e7/8e/t//Du6//u7On/7ern/+ro5f/p5uP/5+Xi/+bj4P/k4d3/4t/b/+Dd2P/e2tX/3NjT/9nW
0f/X087/1dHL/9LPyP/QzcX/zsrC/8zHwP/JxL3/x8K7/8bCuv/Gwbr/xcG5/8XBuf/FwLj/xMC3/8S/
t//Iw7z/4d7b//Lx8P+2tLD/Y2Bb/2NhWP9DQTj/FRUQ/wYDAP8YDgSmAAAACQYCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO
SgBPTkolT01J7GRiXf+qqKT/7u3r//j39v/08/H/8/Lw//Py8P/y8e//8vHv//Hw7v/x7+3/8O7r/+/t
6f/t6+j/7Onm/+ro5P/o5uP/5+Xh/+Xj3//k4d3/4t/b/+Dd1//e29b/3NjT/9rW0f/X1M7/1dLM/9PQ
yf/Rzcb/z8vD/83Iwf/Lxr//ycS9/8nEvf/Iw7z/yMO8/8fDu//Hwrv/xsK6/8bBuv/Fwbn/zcnC/+7t
6f/r6+n/jouH/0A+Nv9DQjf/Kikh/wgHBP8SCgLnFg0DMx4RBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBQT0slUlBM7IeF
gf/g393/9/b1//Px7//y8O7/8vDu//Lw7v/x8O3/8e/t//Du7P/v7ur/7+3p/+7r6P/s6ub/6+jl/+nn
5P/o5eL/5uTg/+Xj3v/j4dz/4t/a/+Dd1//f29b/3dnT/9vW0f/Y1M//1tLM/9TQyv/Szsf/0MzE/87J
wv/Mx8D/zMa//8vGvv/Lxb7/ysW+/8rEvf/JxL3/ycS8/8jDvP/Hw7v/yMK7/9vY0v/5+Pf/wcC+/09N
SP9ZV07/XlxU/xUUEP8LBgH+FAsCeyUWBgD/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNSTgBPTkolX15a7Le1s//z8vD/8/Hu//Dv
7P/x7+z/8O/s//Dv7P/w7uv/8O7q/+/t6f/u7Oj/7evn/+3q5v/r6eX/6ufk/+jm4//n5eH/5uTg/+Xi
3v/j4Nz/4t/Z/+Dd1//f3Nb/3dnT/9vX0f/Y1c//1tPN/9XRy//Tz8f/0c3F/8/Lw//OycL/zcnB/83I
wf/Nx8D/zMfA/8zGv//Mxr//y8a//8vFvv/Kxb7/ycS9/8/Kw//t6+j/4uHg/2VkYP9YVk/9hoN9/z07
Nf8FAwH/FAsDwgsEABMHAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtZVgBRUEwlfHp37NrZ1//z8u//8O7q//Dt6v/w7er/7+3q/+/t
6f/v7en/7+zo/+7s6P/t6+f/7enm/+zo5f/q6OT/6efj/+jl4v/n5OD/5uPf/+Xi3f/j4Nz/4t/Z/+Dd
1//f3Nb/3dnU/9vX0f/Z1c//19PN/9XRy//T0Mj/0s7G/9HMxP/QzMT/0MzE/8/Lw//Py8P/z8rC/87J
wv/OyMH/zcjB/83HwP/Mx8D/zMa//8zHv//e29b/7+7t/4uKh/45ODLrh4V//V9dVv8REQ3/CgUA8xQK
AUccDwIABQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGlnZABbWlcmlZSR7ejm5P/x7+v/7+3p/+/t6P/v7en/7+3p/+7s6P/u7Oj/7uvn/+3q
5//t6eb/7Onl/+ro5P/p5+P/6ebi/+jl4f/n5OD/5eLe/+Th3f/j4Nv/4t7Z/+Dd1//f3NX/3dnU/9zX
0f/a1dD/2NTO/9bSy//U0Mn/08/H/9POx//Szsb/0s7G/9HNxf/RzcX/0czE/9DMxP/Qy8P/z8vD/8/L
w//PysL/zsnC/83Iwf/W0sz/7uzq/6Oinv4zMi7CbWtk3ISBe/8sKyX/BgQB/xEJApQDAQACAQEAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJx
bQBlZGAnoqGe7ezp5v/w7en/7uzn/+7s6P/u7Oj/7uzo/+7r5//u6uf/7erm/+3p5v/s6OX/6+jk/+rn
4//p5uL/6OXh/+fk4P/m49//5eLe/+Th3f/j4Nv/4d7Y/+Dd1v/f3NX/3tnU/9zX0v/a1tD/2NTO/9fT
zP/V0cv/1dHK/9XQyf/U0Mn/1M/I/9PPx//Tz8f/0s7G/9LOxv/SzcX/0c3F/9HNxf/QzMT/0MzE/8/L
w//Tz8j/6Obi/6mnpP88OzecTkxFkoiGgP9WVE7/CQgG/w4HAdULBQEgBAEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt5dgBxcGwpq6mm7e3r
6P/v7ej/7uzn/+7s5//u6+f/7urn/+7q5//t6ub/7enm/+zp5f/s6OT/6ufj/+nn4//p5uL/6OXh/+fk
4P/m497/5eLd/+Th3P/j4Nr/4t7Y/+Hd1//g3NX/3tnU/93Y0v/b1tD/2dXO/9fTzf/X083/19LM/9bS
zP/W0sv/1dHL/9XRyv/V0Mr/1NDJ/9TPyP/Tz8j/08/H/9POx//Szsb/0s3G/9HNxf/Uz8j/5ePe/6im
ov9CQT2PJyYfOYOBe+h7eXP/IiEc/wUCAPgRCQFbIxICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKBfQB7enYnr66q6u3r5//v7Of/7uvn/+7q
5v/u6ub/7urm/+3q5v/t6eX/7enl/+zo5P/r6OP/6ufj/+nn4v/p5uH/6OXg/+fk3//m497/5eLd/+Th
3P/j4Nr/4t7Y/+Hd1//g3Nb/39rU/93Y0v/c19H/29bQ/9vWz//a1c//2dXO/9nUzv/Y1M3/2NPN/9fT
zP/X0sz/1tLM/9bSy//W0cv/1dHK/9XQyv/U0Mn/1NDI/9PPx//V0cn/4+Db/6Shnv9DQj56AAAABmJg
Wp+Uko3/SEZA/wYFAv8KBACmDAIACAsDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHp3cwBsamYcpaKf0+fk4f/v6+f/7uvm/+7q5v/u6ub/7urm/+3p
5f/t6eX/7Ojk/+zo5P/r6OP/6ufi/+nm4v/p5uH/6OXg/+fk3//m497/5uLd/+Xh3P/k4Nr/49/Y/+He
1//g3Nb/39vU/97Z0//e2NL/3djS/93Y0v/c19H/3NfR/9vW0P/b1tD/29bP/9rVz//Z1c//2dTO/9jU
zv/Y083/19PN/9fTzP/W0sz/1tLL/9bRy//X08z/39zX/5uYlPtGREBUW1lTADk3MkSPjYjsdXJs/xgX
FP8FAQDeCgMAJgkDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHFuagBQTUoKnZuWp93b1//w7ej/7+vm/+7q5v/u6ub/7urm/+7q5f/t6eX/7enk/+zo
5P/s6OP/6ufi/+nm4v/p5uH/6OXg/+jk3//n497/5uLd/+Xh3P/k4Nv/49/Z/+Le1//h3db/4d3W/+Dc
1f/g29T/39rU/9/a1P/e2dP/3tnT/97Y0v/d2NL/3dfR/9zX0f/c19H/29bQ/9rW0P/a1c//2dXP/9nV
zv/Z1M7/2NTN/9jTzf/a1s//2dXP/5CNiOZGREEuRUM/AAAAAAt6eXOolJKO/z89N/8CAQD5BAAAZAUA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1q
aACqp6IAkY6Kbs/Lx/zv7Of/7+zm/+/r5v/v6ub/7+rm/+7q5f/u6eX/7enk/+3o5P/s6OP/6+fi/+rn
4v/p5uH/6eXg/+jk3//n497/5uPd/+bi3P/l4dv/5ODa/+Pf2f/j39j/4t7Y/+Le1//h3df/4d3W/+Hd
1v/g3NX/4NzV/9/b1P/f29T/39rT/97Z0//e2NL/3djS/93Y0v/d19H/3NfR/9zW0P/b1tD/29bP/9rV
z//c2NH/x8S+/316dbY8ODQOT0tHAGVjWQBQT0hQmJeT8nRxa/8SEQ7/AAAApAAAAAkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4tACQjIkAhIF9Kri1
sdvp5eD/8O3n//Ds5//v6+b/7+rm/+/q5f/u6eX/7unl/+3o5P/t6OP/7Oji/+zn4v/q5uH/6eXh/+nl
3//o5N//5+Pe/+fj3f/m4t3/5uLc/+Xh2//l4dv/5ODa/+Tg2f/j39n/49/Y/+Pf2P/i3tf/4t7X/+Le
1//h3db/4d3W/+Dc1f/g3NX/39vU/9/b1P/f2tT/3tnT/97Z0//d2NL/3djS/93X0f/b1tD/sK2n+nVy
bmiloZkAQ0ZLACIhHAAAAAANkI+KspeUkP9APjn/AAAA3wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFg38AVlZSBJ6cl4bU0Mz+8Ozn//Ht
5//x7ef/8Ozm/+/r5v/v6uX/7unl/+7p5P/u6eT/7ejj/+zo4v/s5+L/6ubh/+rm4f/p5eD/6eXg/+nl
3//o5N//6OTe/+fj3v/n493/5uLd/+bi3P/m4tz/5eHb/+Xh2//k4Nr/5ODZ/+Tg2f/j39j/49/Y/+Le
1//i3tf/4d3W/+Hd1v/h3db/4NzV/+Dc1f/f29T/39rU/9/a1P/OycP/mpeRxHZybRp+e3UAU1NTAAAA
AADGwr0AeHZxT6imo/N5dnD/ERAO+QAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPytAAhoN9AIiGgCCyr6vI49/a//Dt5//x7ef/8e3o//Ds
5//w6+b/8Ovm/+/r5f/v6uX/7+rl/+7p5P/u6eT/7ejj/+3o4//s6OL/6+fi/+vn4f/q5uH/6ubg/+nl
4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3f/m4t3/5uLc/+bi3P/l4dv/5eHa/+Tg2v/k4Nn/49/Z/+Pf
2P/j39j/4t7X/+Le1//h3db/4d3W/9vX0f+yr6nth4N+VJ6UlQB7e3IAAAAAAAUFAAAmJSIAPjw4DKup
pq+hnpr/RUM+/wAAAKAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDwsIAGz0YALu4tQCWk5BKwb645erm4P/x7Of/8u7p//Lv6v/w7ef/8Ozm//Ds
5v/w7Ob/8Ozm/+/r5f/v6+X/7+vl/+/q5f/u6uT/7unk/+7o4//t6OP/7Oji/+zn4v/r5+L/6+bh/+rm
4f/q5eD/6eXg/+nl3//o5N//6OTe/+fj3v/n493/5+Pd/+bi3f/m4tz/5eHc/+Xh2//k4Nr/5ODa/+Tg
2f/j39n/4NzW/8C8t/uTkIqFdnRxCI2LhQDPz8EAAAAAAAAAAAAuLisA1dTRANXTzkmvrarzkIyG/xwb
GdEAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAeHhvAHZ2cgANFBQCnpyWZ8vHwu7q5eD/8e3o//Pw7P/z8Ov/8e3n//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm/+/r5f/v6+X/7+rl/+7p5P/u6eT/7ejj/+3o4//s5+L/7Ofi/+vn
4f/r5uH/6ubh/+rl4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3v/n493/5uLd/+bi3P/j39n/yMW//5mW
kaNoZWERfn95AP///wAAAAAAAAAAAAAAAAAAAAAA0c3FAOPe1Q/KycazqaWh/3FtaPQODQxCLCooAK+n
nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH19
eACRkIsAnJmVBaGfmmfBvrnl5uHc//Lu6f/18u7/9PHt//Hu6f/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/7+vl/+/q5f/u6uT/7unk/+7p5P/t6OP/7ejj/+zn
4v/s5+L/6+fh/+rm4f/q5uD/6eXg/+nl4P/p5d//6eXf/+Pf2v/EwLv6m5eSm3p4cxuMioMAoKmXAH5z
cwAAAAAAAAAAAAAAAAAAAAAA3NjSAN7c2QDh3ttQtbOx8bKtp/+inZaLZmFaAq6mngAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVkYoAlZONAFJY
VQKZlZBOuLWw0dvX0v/v6+b/9fPv//b08P/z8Oz/8e3n//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm//Dr5v/v6+X/7+rl/+/q5f/u6eT/7unk/+3o
4//t6OP/7Ofi/+zn4v/q5eD/3dnU/7u4s+uVkYx/dHNtD5SSjQAAAAAALCsqAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAODc1gDk3tYK2NbTn6qmo//HwLnTwbuyHbmyqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj42IAIaCfgD///8AiYeFK6ej
n5/Hw77x5eHc//Tx7f/49vP/9/Tx//Pw7P/x7ej/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w6+b/8Ovm//Dr5v/v6uX/7unk/+bh
3P/KxsH9qKahxIuJhU1UUE4Fe3lzAI6LhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wDl4t4A7OnlLrCuqsOnpJ6e2NDJD763sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH11cgCPgoEAkI6LAHdycAuXlJBUsq+ruMvH
w/Xl4t7/9fPx//r49v/59/T/9fLu//Lv6v/x7ef/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8e3n/+/r5f/l4Nv/zsrF/bKuqdiTkIx7endzHK2m
qwCHhH8Ah4N/ALa2tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/JxADLyMEA4+DYAb26
sxOmpJ4NuLGrAL63sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AY2VzAIyIhQCxq6cAiIaDE5qYlFauq6exxsTA6dza
1//v7ev/+Pf1//r59//49vP/9vPv//Tw7P/y7+r/8u7p//Hu6P/x7ef/8e3n//Ht5//x7ef/8e3n//Hu
6P/y7uj/8O3n/+3p4//m4tz/2tbR/8bCvfauq6bGmJWQeICAeigAAAABiYeCAHh4cADJyLwAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX1M8A6ebhALm2sACmpJ4AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSUjgCanJYAkI2KALy4swBqamkLjoyIN6OhnXSysKy3xsTA39bU
0ffi4d7/7Orn//Du7P/z8O3/8/Dt//Lw7P/x7ur/8Ozo/+/r5//u6uX/6OXg/+Lf2v/Z1dD/zMjD/b67
t+etqqbJn5yXko6MiExwb2sY////AI2MhQB+fHoAlpOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAADAwMAP///wCEgoEAlJGPAP///wBcW1kJe3p2LJGPi1KjoZ13rKmmmrKv
rLq5trPRvLq33L27t+C6uLTlt7Wx4ra0sNuyr6vYqKaiwaGemqeal5OEjouHYHx6djhraGcSAAAAAZqY
kwB+fHgAXmBeAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8Axse9ADUzMQBqa2oAfHt4AJCOigD///8AOjs5BmJgXg1+fHoThYSAFYB/
eiF6eXUvenl2JoSDgBV8enYUZmVhDklHRQkAAAAClZKOAHx5dQBwbWwAeHd1AHJvbAD07OQABQUFAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUwB4eHUAenl3AIOBfwCUko8AmZeUAI+OigCGhYEAiIaDAJeV
kgCQjooAgn98AHRybwBwb2kAc3NsAP///wAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8AAAD///////////8A
AAD/////AH////8AAAD////AAAD///8AAAD///wAAAAf//8AAAD///gAAAAP//8AAAD//+AAAAAB//8A
AAD//4AAAAAA//8AAAD//wAAAAAAf/8AAAD//gAAAAAAP/8AAAD//AAAAAAAH/8AAAD/+AAAAAAAD/8A
AAD/8AAAAAAAB/8AAAD/8AAAAAAAB/8AAAD/8AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAP8A
AAD/4AAAAAAAAP8AAAD/4AAAAAAAAP8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8A
AAD/4AAAAAAAAD8AAAD/4AAAAAAAAD8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAA8A
AAD/4AAAAAAAAA8AAAD/4AAAAAAAAA8AAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcA
AAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAEA
AAD/8AAAAAAABAEAAAD/8AAAAAAABgEAAAD/+AAAAAAABwAAAAD/+AAAAAAADwAAAAD//gAAAAAAH4AA
AAD//wAAAAAAP4AAAAD//wAAAAAAf4AAAAD//4AAAAAA/8EAAAD///AAAAAD//8AAAD///wAAAAP//8A
AAD///4AAAA///8AAAD////gAAP///8AAAD///////////8AAAD///////////8AAAD///////////8A
AAA=
</value>
</data>
</root>

108
DBChm/FrmProcessing.Designer.cs generated Normal file
View File

@ -0,0 +1,108 @@
namespace DBCHM
{
partial class FrmProcessing
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.lbMessage = new System.Windows.Forms.Label();
this.panImage = new System.Windows.Forms.Panel();
this.tableLayoutPanel1.SuspendLayout();
this.SuspendLayout();
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
this.tableLayoutPanel1.Controls.Add(this.lbMessage, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.panImage, 0, 1);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 2;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(776, 398);
this.tableLayoutPanel1.TabIndex = 1;
//
// lbMessage
//
this.lbMessage.BackColor = System.Drawing.Color.Transparent;
this.lbMessage.Dock = System.Windows.Forms.DockStyle.Fill;
this.lbMessage.Font = new System.Drawing.Font("微软雅黑", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lbMessage.Location = new System.Drawing.Point(4, 0);
this.lbMessage.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.lbMessage.Name = "lbMessage";
this.lbMessage.Padding = new System.Windows.Forms.Padding(0, 0, 0, 38);
this.lbMessage.Size = new System.Drawing.Size(768, 199);
this.lbMessage.TabIndex = 1;
this.lbMessage.Text = "lbMessage\r\nadsfadsf";
this.lbMessage.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
//
// panImage
//
this.panImage.Dock = System.Windows.Forms.DockStyle.Fill;
this.panImage.Location = new System.Drawing.Point(4, 203);
this.panImage.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.panImage.Name = "panImage";
this.panImage.Size = new System.Drawing.Size(768, 191);
this.panImage.TabIndex = 2;
//
// FrmProcessing
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.Control;
this.ClientSize = new System.Drawing.Size(776, 398);
this.Controls.Add(this.tableLayoutPanel1);
this.Cursor = System.Windows.Forms.Cursors.WaitCursor;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.Name = "FrmProcessing";
this.Opacity = 0.85D;
this.ShowInTaskbar = false;
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
this.Text = "FrmProcessing";
this.Load += new System.EventHandler(this.FrmProcessing_Load);
this.Shown += new System.EventHandler(this.FrmProcessing_Shown);
this.tableLayoutPanel1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.Label lbMessage;
private System.Windows.Forms.Panel panImage;
}
}

175
DBChm/FrmProcessing.cs Normal file
View File

@ -0,0 +1,175 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DBCHM
{
public partial class FrmProcessing : Form
{
private static Image m_Image = null;
private EventHandler evtHandler = null;
private Action<object> workAction = null;
private object workActionArg = null;
private Thread workThread = null;
public string Message
{
get
{
return lbMessage.Text;
}
set
{
lbMessage.Text = value;
}
}
public bool WorkCompleted = false;
public Exception WorkException
{ get; private set; }
public void SetWorkAction(Action<object> workAction, object arg)
{
this.workAction = workAction;
this.workActionArg = arg;
}
public FrmProcessing(string msg)
{
InitializeComponent();
this.Message = msg;
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (m_Image != null)
{
//获得当前gif动画下一步要渲染的帧。
UpdateImage();
//将获得的当前gif动画需要渲染的帧显示在界面上的某个位置。
int x = (int)(panImage.ClientRectangle.Width - m_Image.Width) / 2;
int y = 0;
//e.Graphics.DrawImage(m_Image, new Rectangle(x, y, m_Image.Width, m_Image.Height));
panImage.CreateGraphics().DrawImage(m_Image, new Rectangle(x, y, m_Image.Width, m_Image.Height));
}
if (this.WorkCompleted)
{
this.Close();
}
}
private void FrmProcessing_Load(object sender, EventArgs e)
{
if (this.Owner != null)
{
this.StartPosition = FormStartPosition.Manual;
this.Location = new Point(this.Owner.Left, this.Owner.Top);
//MessageBox.Show(string.Format("X={0},Y={1}", this.Owner.Left, this.Owner.Top));
this.Width = this.Owner.Width;
this.Height = this.Owner.Height;
}
else
{
Rectangle screenRect = Screen.PrimaryScreen.WorkingArea;
this.Location = new Point((screenRect.Width - this.Width) / 2, (screenRect.Height - this.Height) / 2);
}
//为委托关联一个处理方法
evtHandler = new EventHandler(OnImageAnimate);
if (m_Image == null)
{
Assembly assy = Assembly.GetExecutingAssembly();
//获取要加载的gif动画文件
m_Image = Image.FromStream(assy.GetManifestResourceStream(assy.GetName().Name + ".Resources.loading.gif"));
}
//调用开始动画方法
BeginAnimate();
}
//开始动画方法
private void BeginAnimate()
{
if (m_Image != null)
{
//当gif动画每隔一定时间后都会变换一帧那么就会触发一事件该方法就是将当前image每变换一帧时都会调用当前这个委托所关联的方法。
ImageAnimator.Animate(m_Image, evtHandler);
}
}
//委托所关联的方法
private void OnImageAnimate(Object sender, EventArgs e)
{
//该方法中只是使得当前这个winform重绘然后去调用该winform的OnPaint方法进行重绘)
this.Invalidate();
}
//获得当前gif动画的下一步需要渲染的帧当下一步任何对当前gif动画的操作都是对该帧进行操作)
private void UpdateImage()
{
ImageAnimator.UpdateFrames(m_Image);
}
//关闭显示动画该方法可以在winform关闭时或者某个按钮的触发事件中进行调用以停止渲染当前gif动画。
private void StopAnimate()
{
m_Image = null;
ImageAnimator.StopAnimate(m_Image, evtHandler);
}
private void FrmProcessing_Shown(object sender, EventArgs e)
{
if (this.workAction != null)
{
workThread = new Thread(ExecWorkAction);
workThread.IsBackground = true;
workThread.Start();
}
}
private void ExecWorkAction()
{
try
{
var workTask = new Task((arg) =>
{
this.workAction(arg);
},
this.workActionArg);
workTask.Start();
Task.WaitAll(workTask);
}
catch (Exception ex)
{
this.WorkException = ex;
}
finally
{
this.WorkCompleted = true;
}
}
}
}

120
DBChm/FrmProcessing.resx Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

185
DBChm/GridFormMgr.Designer.cs generated Normal file
View File

@ -0,0 +1,185 @@
namespace DBCHM
{
partial class GridFormMgr
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(GridFormMgr));
this.linkAdd = new System.Windows.Forms.LinkLabel();
this.linkEdit = new System.Windows.Forms.LinkLabel();
this.linkRemove = new System.Windows.Forms.LinkLabel();
this.linkClone = new System.Windows.Forms.LinkLabel();
this.GV_DBConfigs = new System.Windows.Forms.DataGridView();
this.BtnConnect = new ComponentFactory.Krypton.Toolkit.KryptonButton();
this.BtnCancel = new ComponentFactory.Krypton.Toolkit.KryptonButton();
((System.ComponentModel.ISupportInitialize)(this.GV_DBConfigs)).BeginInit();
this.SuspendLayout();
//
// linkAdd
//
this.linkAdd.AutoSize = true;
this.linkAdd.Location = new System.Drawing.Point(22, 10);
this.linkAdd.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.linkAdd.Name = "linkAdd";
this.linkAdd.Size = new System.Drawing.Size(29, 12);
this.linkAdd.TabIndex = 0;
this.linkAdd.TabStop = true;
this.linkAdd.Text = "新建";
this.linkAdd.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkAdd_LinkClicked);
//
// linkEdit
//
this.linkEdit.AutoSize = true;
this.linkEdit.Location = new System.Drawing.Point(63, 10);
this.linkEdit.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.linkEdit.Name = "linkEdit";
this.linkEdit.Size = new System.Drawing.Size(29, 12);
this.linkEdit.TabIndex = 0;
this.linkEdit.TabStop = true;
this.linkEdit.Text = "编辑";
this.linkEdit.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkEdit_LinkClicked);
//
// linkRemove
//
this.linkRemove.AutoSize = true;
this.linkRemove.Location = new System.Drawing.Point(103, 10);
this.linkRemove.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.linkRemove.Name = "linkRemove";
this.linkRemove.Size = new System.Drawing.Size(29, 12);
this.linkRemove.TabIndex = 0;
this.linkRemove.TabStop = true;
this.linkRemove.Text = "删除";
this.linkRemove.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkRemove_LinkClicked);
//
// linkClone
//
this.linkClone.AutoSize = true;
this.linkClone.Location = new System.Drawing.Point(142, 10);
this.linkClone.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.linkClone.Name = "linkClone";
this.linkClone.Size = new System.Drawing.Size(29, 12);
this.linkClone.TabIndex = 0;
this.linkClone.TabStop = true;
this.linkClone.Text = "克隆";
this.linkClone.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkClone_LinkClicked);
//
// GV_DBConfigs
//
this.GV_DBConfigs.AllowUserToAddRows = false;
this.GV_DBConfigs.AllowUserToDeleteRows = false;
this.GV_DBConfigs.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.GV_DBConfigs.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.Raised;
this.GV_DBConfigs.ColumnHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Sunken;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.GV_DBConfigs.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.GV_DBConfigs.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.GV_DBConfigs.Location = new System.Drawing.Point(9, 34);
this.GV_DBConfigs.Margin = new System.Windows.Forms.Padding(2);
this.GV_DBConfigs.MultiSelect = false;
this.GV_DBConfigs.Name = "GV_DBConfigs";
this.GV_DBConfigs.ReadOnly = true;
this.GV_DBConfigs.RowHeadersVisible = false;
this.GV_DBConfigs.RowTemplate.Height = 27;
this.GV_DBConfigs.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.GV_DBConfigs.Size = new System.Drawing.Size(762, 255);
this.GV_DBConfigs.TabIndex = 5;
this.GV_DBConfigs.CellDoubleClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.GV_DBConfigs_CellDoubleClick);
this.GV_DBConfigs.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.GV_DBConfigs_CellFormatting);
//
// BtnConnect
//
this.BtnConnect.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.BtnConnect.AutoSize = true;
this.BtnConnect.DialogResult = System.Windows.Forms.DialogResult.OK;
this.BtnConnect.Location = new System.Drawing.Point(525, 302);
this.BtnConnect.Margin = new System.Windows.Forms.Padding(2);
this.BtnConnect.Name = "BtnConnect";
this.BtnConnect.Size = new System.Drawing.Size(90, 26);
this.BtnConnect.TabIndex = 6;
this.BtnConnect.Values.Text = "连接";
this.BtnConnect.Click += new System.EventHandler(this.btnConnect_Click);
//
// BtnCancel
//
this.BtnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.BtnCancel.AutoSize = true;
this.BtnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
this.BtnCancel.Location = new System.Drawing.Point(652, 302);
this.BtnCancel.Margin = new System.Windows.Forms.Padding(2);
this.BtnCancel.Name = "BtnCancel";
this.BtnCancel.Size = new System.Drawing.Size(90, 26);
this.BtnCancel.TabIndex = 7;
this.BtnCancel.Values.Text = "取消";
this.BtnCancel.Click += new System.EventHandler(this.btnCancel_Click);
//
// GridFormMgr
//
this.AcceptButton = this.BtnConnect;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(780, 337);
this.Controls.Add(this.GV_DBConfigs);
this.Controls.Add(this.BtnCancel);
this.Controls.Add(this.BtnConnect);
this.Controls.Add(this.linkClone);
this.Controls.Add(this.linkRemove);
this.Controls.Add(this.linkEdit);
this.Controls.Add(this.linkAdd);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(2);
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "GridFormMgr";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "数据库连接管理";
this.Load += new System.EventHandler(this.GridFormMgr_Load);
((System.ComponentModel.ISupportInitialize)(this.GV_DBConfigs)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.LinkLabel linkAdd;
private System.Windows.Forms.LinkLabel linkEdit;
private System.Windows.Forms.LinkLabel linkRemove;
private System.Windows.Forms.LinkLabel linkClone;
private System.Windows.Forms.DataGridView GV_DBConfigs;
private ComponentFactory.Krypton.Toolkit.KryptonButton BtnConnect;
private ComponentFactory.Krypton.Toolkit.KryptonButton BtnCancel;
}
}

185
DBChm/GridFormMgr.cs Normal file
View File

@ -0,0 +1,185 @@
using ComponentFactory.Krypton.Toolkit;
using MJTop.Data;
using System;
using System.Windows.Forms;
namespace DBCHM
{
public partial class GridFormMgr : KryptonForm
{
public GridFormMgr()
{
InitializeComponent();
//为KeyDown能应用到所有控件上 注册 KeyDown 事件
foreach (Control control in this.Controls)
{
control.KeyDown += control_KeyDown;
}
}
void control_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
DBForm dbForm = null;
private void linkAdd_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
dbForm = new DBForm(OPType.);
var dia = dbForm.ShowDialog();
if (dia == DialogResult.OK)
{
RefreshListView();
}
}
private void linkEdit_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (GV_DBConfigs.SelectedRows.Count <= 0)
{
MessageBox.Show("请选择连接!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
int Id = Convert.ToInt32(GV_DBConfigs.SelectedRows[0].Cells[0].Value);
DBForm dbForm = new DBForm(OPType., Id);
var diaResult = dbForm.ShowDialog();
if (diaResult == DialogResult.OK)
{
RefreshListView();
}
}
private void linkRemove_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (GV_DBConfigs.SelectedRows.Count <= 0)
{
MessageBox.Show("请选择连接!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (MessageBox.Show("确定要删除该连接吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)
{
int Id = Convert.ToInt32(GV_DBConfigs.SelectedRows[0].Cells[0].Value);
ConfigUtils.Delete(Id);
RefreshListView();
}
}
private void linkClone_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
if (GV_DBConfigs.SelectedRows.Count <= 0)
{
MessageBox.Show("请选择连接!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
int Id = Convert.ToInt32(GV_DBConfigs.SelectedRows[0].Cells[0].Value);
DBForm dbForm = new DBForm(OPType., Id);
var diaResult = dbForm.ShowDialog(this);
if (diaResult == DialogResult.OK)
{
RefreshListView();
}
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (GV_DBConfigs.SelectedRows.Count <= 0)
{
MessageBox.Show("请选择连接!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
int Id = Convert.ToInt32(GV_DBConfigs.SelectedRows[0].Cells[0].Value);
DBCHMConfig config = ConfigUtils.Get(Id);
if ((DBType)Enum.Parse(typeof(DBType), config.DBType) == DBType.SqlServer
&& !GV_DBConfigs.SelectedRows[0].Cells[6].Value.ToString().Equals("sa", StringComparison.OrdinalIgnoreCase))
{
var dia = MessageBox.Show("非超级管理员的账号,可能因权限不足,查询不出表结构信息,确定要继续吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dia == DialogResult.Cancel)
{
return;
}
}
FormUtils.ShowProcessing("正在查询表结构信息,请稍等......", this, arg =>
{
try
{
DBUtils.Instance = DBMgr.UseDB((DBType)Enum.Parse(typeof(DBType), config.DBType), config.ConnString, 300);
ConfigUtils.UpLastModified(Id);
}
catch (Exception ex)
{
LogUtils.LogError("连接数据库失败", Developer.SysDefault, ex, config);
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}, null);
}
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void GridFormMgr_Load(object sender, EventArgs e)
{
RefreshListView();
}
/// <summary>
/// 刷新列表
/// </summary>
private void RefreshListView()
{
var data = ConfigUtils.SelectAll();
if (data != null)
{
GV_DBConfigs.DataSource = data;
if (data.Count > 0)
{
GV_DBConfigs.Columns[0].Visible = false;
GV_DBConfigs.Columns[1].Width = 150;
}
}
}
private void GV_DBConfigs_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
btnConnect_Click(sender, e);
//代表已经正常选中
FormUtils.IsOK_Close = true;
this.Close();
}
private void GV_DBConfigs_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 7)
{
if (GV_DBConfigs.Columns[e.ColumnIndex].DataPropertyName == "Pwd")
{
string str = e.Value.ToString();
string strEncrypt = string.Empty;
for (int j = 0; j < str.Length; j++)
{
strEncrypt += "*";
}
e.Value = strEncrypt;
}
}
}
}
}

487
DBChm/GridFormMgr.resx Normal file
View File

@ -0,0 +1,487 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEASEgAAAEAIACIVAAAFgAAACgAAABIAAAAkAAAAAEAIAAAAAAAAFEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8vLwA+LS4ASkVBAEtL
RABLS0YAS0tEAElHQgBAQD8APz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAE1KQwBMSUMAU1BLAFtYUgBdWlQAXVxVAGBeWABramMADggHAyotJQYpKykFKiwlBiEf
HQSAfXIAYF5ZAF9cVgBcWlQAWVdRAFZUTgBNTEYAQjc6AEc/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0xJAAAAAABQSUEAQ0E+AFVS
TACEhYEAREE9CFVRTBVaV1A1WllSVl5cVm9iX1mCZmNdlGhmX5tpZ2CbaGZfm2VjXJhhX1mFX1xXdVxa
VF1ZVlFAVFFLHkpKQwwABAABW1pRAEtJQgAbJBgARUU5AElJPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBPzwAODY1AFFPSQCFgnYAREM/DVZTTjlcWlRwYV9YqGdl
X9RvbGXodXJr9Hl2b/59enL/hIB4/4eEfP+JhX3/iIR9/4WBev9/fHT/e3dw/3d0bfdyb2jsamdh3WRh
W7heXFWDWFVPSktKQxUAAAABWVZTAEhFQwBPS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAT01HAExKRABYVk8AAAAAAk9NSCZbWVNwYmBavmxpYul0cWr/fnpy/4eDe/+Pi4L/lZCI/5qV
jP+dmZD/oZyT/6Self+ln5f/paCX/6Oflf+gm5L/nZiP/5qVjP+UkIj/jomB/4WBev96d3D/cG1m8mVj
XcxbWlOJU1BLOz07OwhcWlQATk1GAGdmWQAvLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSAAAAAAAU1FMAP//
/wBQTkgsWFZQimJgWdlua2T+e3dw/4eDe/+RjIT/mJOL/56ZkP+inZT/pJ+X/6ehmP+po5r/qqSb/6ul
nP+rpZz/rKad/6ymnf+rpZz/qqSb/6mkm/+oopn/pZ+W/6Cbkv+alYz/kIyE/4SAef92c2z/aGVf6l1b
VaVTUUtBQ0M7BldVTgBIRj8AT0xHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkI/ADwxLQBTUEwAT05IE1lXUW9fXVfaamdh/3l1
bv+Ggnv/kY2F/5mUi/+dmI//oJuS/6KdlP+kn5b/pqGY/6eimf+po5r/qqSb/6ulnP+rpZz/q6Wc/6ym
nf+rpZz/q6Wc/6ulnP+qpJv/qaOa/6eimf+loJf/op2T/5yXj/+Tj4b/hoJ6/3Vya/9kYlzsV1VPk09O
SCZbXFsAS0dCAExHQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABFRT8ARUI9AG1xaQBRTUkvWVdSrWNgWvpxbmf/gHx1/4yIf/+Uj4f/mZOL/5yW
jv+emZD/oJuS/6KdlP+kn5X/paCX/6ahmP+moJf/pqCX/6Wflv+inZT/op2U/6Wflv+nopj/qKKZ/6mj
mv+qpJv/qKOa/6eimf+loJf/pJ+V/6Kdk/+empH/mZSL/46Kgv9/e3T/a2hi/1pYUs5NTEZTQjs3BEhH
QQBHR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVF
PwBHRkAAoJKOAFJQSUdYVlDPZGFb/3Zya/+EgHj/jYmA/5KOhf+VkYn/mZOL/5uWjf+dmI//npmQ/5yX
jv+Yk4r/ko2E/4qFff+BfHT/fHhw/3Vxaf9taWL/a2hg/3JuZv94dGz/e3hv/4aBef+Qi4P/mZSM/5+a
kf+inZT/o56U/6Gdk/+fm5H/nZiP/5qUjP+SjYX/hYF5/3BtZv9bWVPtTkxIcjw9OQZCQj0AOjo1AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk1IAEdHQQCdjYwATUxGS1RS
TN5iX1n/dnJr/4R/eP+Lh37/j4qC/5GNhP+UkIj/l5GJ/5aQiP+RjIP/iYR8/4B7c/92cWn/bmli/2hk
Xf9iXlf/XVlT/11ZU/9dWVP/WlZR/1VRTP9UUUv/V1RN/1tXUf9hXVb/bGdg/3dya/+GgXj/k46F/5qV
jP+dmI//nJeO/5qVjf+Xkor/kY2F/4aCev9zcGj/W1lU80lIQ3MtLigGOzo2AD48OgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8ATktFAE1KRwBMSkU8T01I3F5bVv9yb2j/gHx1/4eC
e/+Lhn7/jomB/5CLg/+Qi4P/jId+/4WAd/9/eXH/fHdv/355cf+Dfnb/iIN7/4+Kgv+RjYX/ko2G/5iT
i/+dl4//m5aO/5GMhf+Mh4D/i4Z//4SAeP99eXH/dnJr/3BsZf9vamP/dXBp/4B7c/+MiH//lpCI/5iS
iv+WkYn/k4+H/4+Kgv+EgHj/cW1n/1dVT/NEQj5wMjAvBD8+OwBGRkQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADGu4cATkxFAEpIQxtLSkW/V1VP/21pY/97d3D/gn52/4WBev+JhHz/i4V9/4uF
fP+Jg3r/iYN6/4+JgP+ZlIz/paCX/6+qov+1saj/uLOr/7u2rv+8t67/vLiv/724r/+9uK//vLev/7u2
rv+6taz/ubOr/7axqP+yraX/raif/6Sfl/+YlIz/kIuD/4yHf/+Lh3//jYiA/5CLgv+SjYX/kY2E/4+L
gv+Lhn7/f3t0/2lmYP9OTEfqQkE9TT87NgBKS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABISEQAT1JRAkZEQH1OTEb9ZGFb/3Vxa/98eXH/gHx1/4N/d/+Ef3f/hoB4/4+JgP+dmI//r6qj/765
sf/Gwrr/ycS9/8jDvP/Fwbn/wr61/8K9tP/CvbT/wb20/8G9tP/BvLP/wLyz/8C7sv+/u7L/vrqx/765
sP++ubD/vbiv/7y3rv+6taz/tbCo/7Cro/+sp5//pKCa/6Kdl/+Yk4v/kIuD/42IgP+Lhn7/hYF5/3dz
bP9dW1X/R0ZBx0ZFQx9FREEAWlpaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBGRT8ARUQ+KEdF
QNpYVVD/bWlj/3dzbP97d3D/fXly/396cv+KhX3/pKCY/7+7tP/OysX/0s7I/8/Lw//Lx8D/ycS9/8fD
u//Fwbn/xcC4/8S/t//AvLP/u7au/7q2rv+6tq7/ubWt/7m1rP+7tq7/wLyz/8C8s//AvLP/wLyz/8C7
sv+/urH/vrmw/724sP+9uK//l5ON/7Cspv++u7b/r6ul/5eSi/+JhHz/hYF5/356c/9raGH/UE5J/ENC
P3UAAAAAXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBAQDoAREI9cUtIQ/1hXlj/cGxm/3Vx
a/94dG3/gX11/52Ykf/Bvbf/19PO/9fUzv/Szsf/zcjB/8rGvv/FwLn/ubWu/6+ro/+empP/kY2H/4aD
fP+Cf3j/gn54/4SAef+EgXr/hIB5/4J/eP+AfXb/gn95/4uIgf+Xk4z/pqKa/7Gtpf+6tq3/wbyz/8C8
s//AvLL/rquk/52Ykv/Fwrr/z83I/8bDv/+gnZf/hoF6/397c/9zb2j/WldS/0NBPchAQD8bQkJBAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBPTkkMQ0E9rFBOSf9mY13/cG1n/3ZybP+MiIL/uLaw/9rX
0//d29b/1NHK/9DKw//Iw7z/ubSt/52ak/+Jhn//endx/3Rxav94dW7/fXpz/4F9dv+Ggnr/jIiA/5CL
g/+RjYT/kYyE/4+Lg/+Khn7/hIB4/4B8df97d3D/dHFr/3Zzbf+Bfnf/kY6H/6umnv+7tq7/yMS9/5qV
kf+8tq7/xsK7/9nX0v/X1dL/p6Oe/4F9dv92cmv/Yl9Z/0ZEQO87OjhFNDIvAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEZEQABGREAdRUM/2FVSTv9oZV//c3Bq/5aTjv/Pzcr/5+Xi/93a1P/Tz8j/ycW9/62o
ov+Lh4H/dXJs/3Vxa/97eHH/hoN7/4+Lg/+Wkon/m5aO/5+bkf+inpT/paCX/6eimf+oo5r/qaOa/6ij
mv+moZj/o56V/6Cbkv+bl47/lZGI/46Jgf+Cf3f/eHVu/3Rxav9+e3T/qqaf/62ppP+qpZ3/v7qx/8nF
vv/i4Nz/4N/d/6eln/96dm//ZmNd/0lHQ/06OTdsNDMrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpI
RABJSEQkSkhE7FlWUf9raGP/mJaR/9va1//q5+T/3NnT/87Kw/+tqqP/hoN9/3FuZ/90cGr/gX52/42I
gP+WkYj/nJeO/6Cbkv+jnpX/paCX/6eimf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6qk
nP+po5r/pqGY/6Oelf+emZD/lpGJ/4uHf/98eHH/fntz/66rpf9tamT/Y2Ba/7ezq//NycP/6Ofk/+Xk
4/+fnJf/aWZg/0xJRf85NzWDXVhLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5NSQBOTUklTkxI7F1b
Vv+Ni4b/2tjV/+3r6f/d2dP/vrqz/4eEfv9qZ2H/cW1m/397dP+MiH//lZCH/5qVjf+emZD/oJuS/6Kd
lP+kn5b/pqGX/6eimf+po5v/qqSb/6ulnP+rpZz/rKWc/6ymnf+spp3/q6Wc/6ulnP+qpJv/qaOa/6ei
mf+loJf/o56U/5+ZkP+Xkon/i4d//25rY/8wLyj/Dg0L/3Rxbf/Ev7j/1dLM//X08//X1dP/fHl0/0xK
Rf82NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBPTkolUE5L7HNwbf/KyMb/7+7r/9zZ
0/+tqqT/cG1n/2RhW/91cmv/hYF5/4+Lg/+VkYj/mZSM/5yWjv+emZD/oJuS/6Kdk/+jnpX/pJ+V/6Oe
lf+hnJT/oZuS/52Xjv+blY3/mpWM/5yXjv+hnJP/o56U/6agmP+oopn/qKKZ/6eimP+loJf/pJ+V/6Kd
k/+fm5H/nJeO/3BtZf83Ni3/FRQQ/xsaGP+Cf3n/wLy1/+Xi3v/29vX/qaek/09NSf8yMS6aAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJRTABPTkolWFZS7KKgnv/q6Ob/4d3Z/6Sgmv9kYlv/ZmNd/3l1
bv+Hgnv/joqB/5KOhf+VkIj/mZOL/5uVjf+cl47/m5aN/5eSif+QjIP/iIN7/396cv92cWr/cGxl/2hj
Xf9jX1j/YV1X/2NfWf9rZl//cGxl/3p2b/+FgXn/kIuD/5mUi/+fmpD/oZyT/6Gck/+fmpH/npmQ/4iD
fP9IRz3/JSQd/wcGBf8zMi//fnt1/8XBuv/08/H/1NPR/19dWf8wLiyZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFZVUQBQTkolbGpn7MvJxv/o5eL/op+a/1xaVP9kYVv/eHRt/4WBef+Lh3//joqC/5GN
hP+Uj4f/lZCI/5ONhf+Mh37/g311/3p1bf9xbWX/bWhh/2llXv9lYVr/ZGFa/2djXP9lYVr/Y19Z/2Fd
WP9bV1L/WlZR/11YUv9fW1X/ZmFb/29rY/98d2//ioV9/5aRiP+bl43/nJaO/5eRif9VU0r/NDMq/w4O
Cv8VFBP/UlBL/3t4cv/Z1tL/6+vp/3p5df8wLy2ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJg
XABXVVEliIaD7d/d2v+0saz/W1lT/2BeWP90cWr/gX12/4eCe/+Khn7/jYmA/4+Kgv+OiYH/iYR7/4N9
dP+AenL/gXxz/4aBef+NiYH/lZCJ/5yXj/+emZH/op2V/6eimv+nopr/p6Ka/6WgmP+dmJD/mZSM/5OP
h/+Khn7/gn12/3l1bf91cGj/dnJq/355cv+Ig3v/kYyD/5aRiP9qaGD/PTwy/x8eGP8FBAP/QDw3/1xa
VP+KiIT/5+bk/5eVkv81NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9uagBiYV0nn56b7cnH
xP9mZF//WldR/3BtZv98eHH/gX52/4WBev+Ig3z/iYN7/4qEe/+KhHv/joiA/5iTi/+moZn/s66m/7u2
rv++urL/vrqx/7+7sv/Au7L/wLuy/7+7sv+/urH/v7qx/765sP+9ubD/vbiv/7u2rv+5tKv/tbCo/6+q
of+nopn/nZiR/5aSi/+Tj4j/kIyE/5GMhP98eHD/RUQ6/y8uJv8KCgb/HRkW/2FdV/9ZV1L/qKek/6Wj
oP89PDmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzcABraWYooZ+c7YiGgv9RTkn/aGRe/3Zy
a/98eHH/gHx0/4J+dv+CfnX/iIN6/5iTiv+sp6D/vbix/8fDvP/Lxr//y8a//8nEvP/Fwbn/w762/8K+
tf/CvrX/wr21/8K+tf/CvbT/wb20/8C8s//Au7L/v7uy/7+6sf++urH/vrmw/724sP+8t6//urSs/7aw
qP+yraX/sKyl/66qpP+dmJL/VlVM/zo5L/8YFxL/CAUD/0xIQv9iYFn/Y2Fd/4qJhf9DQj6YAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIF+ewCCgH0pioiF7VdVUP9aV1L/bmpk/3dzbP96d2//fHhx/4F8
dP+Sjob/sKyl/8nFv//U0cv/0s7I/83Jwv/Kxr7/yMS8/8bCuv/Dv7f/wby0/765sf+1san/sq2l/6mm
nv+opJz/p6Sc/6+ro/+yrqb/uLSs/7y4r/++ubD/v7uy/8G8s//Au7L/v7qx/765sP+8uK//vLev/766
tP/Fwr3/goB6/0JBN/8oKCD/BgUD/yYhG/9lYVv/VVNN/1dWUv9DQj6H////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHh2cgCDgH0hX11Z3k1KRv9iX1r/cG1m/3Vxav95dG3/h4N8/6yoov/Pzcj/2tfS/9bS
zP/Qy8T/zMfA/8jDvP+8uLH/rKmi/5uYkf+NioL/gH13/3h1b/94dW7/fHhx/3p3cP96d3D/endv/3x5
cv96d3D/eHVu/3t4cv+HhH3/lJCJ/6OfmP+wrKT/vrqx/8G8s//AvLP/v7qx/766sf/Fwbr/sa6p/09O
Rf82Niz/EREN/wwIBP9QS0P/XVpV/0A+Ov0zMzBoPzw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJP
SwBWU08YRkRBy1FPSv9nZF7/cGxm/3h0bv+Xk47/x8XA/+De2v/d2tX/08/I/87Jwv/Au7T/qaSe/4uH
gf97eHL/dXJs/3Vya/98eXH/g394/4mFff+OioH/k46G/5eSiv+ZlIv/mZSL/5eSiv+Tjob/jYmB/4iE
ff+Cfnf/endv/3VybP94dW//goB5/5qXj/+wraT/v7qy/8K9tP/BvbT/vrmy/2tpYf8+PTP/ISEa/wUD
Af8tJx//XltV/0RCPvw3NjNbKigjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZEPwBGQz8fRkQ/3lZT
T/9oZV//dnNt/6OhnP/a2NX/5+Tg/9rWz//QzMT/vbmx/5eUjf96d3D/cW1n/3h0bf+Cfnb/jIiA/5SQ
iP+alo3/n5qR/6OelP+loJf/qKKZ/6mkm/+qpJv/q6Wc/6qlnP+po5r/p6GY/6Wflv+hnJP/nJeO/5WQ
iP+Lh3//f3x0/3Rxav9zcGn/h4R9/6qmnv+/u7L/xcC4/4yJgf9FRDr/MTAo/wsLCP8TDQf/TEdA/0tJ
RP47OTZxNzUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBLSUUlS0lF7FpXUv9va2b/paOf/+Tj
4P/n5eH/2NTO/8XAuf+Zlo//dXJs/25rZf95dW7/h4N7/5GMhP+ZlIv/npmQ/6Gck/+kn5b/paCY/6ei
mf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6ulnP+qpJv/qKKZ/6Wgl/+hnJP/m5aN/5KN
hP+EgHj/dXFq/3BtZ/+Fgnv/r6uj/6+ro/9SUUf/PDwy/xoaFP8GAwD/MSoi/0lHQv85NzWHcGlYAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSQBPTUklT01J7GBeWf+cmpb/4+Lg/+ro5P/X083/r6ul/3p3
cf9pZmD/dnJr/4SAef+Pi4P/l5GJ/5uWjv+emZD/oJuS/6KdlP+kn5X/pqGX/6eimf+po5r/qqSb/6qk
m/+rpZz/q6Wc/6ulnP+rpZz/q6Wc/6ulnP+qpJv/qKOa/6eimf+loJf/pJ+V/6Cckv+alo3/kIyE/4J+
dv9va2X/bWpk/5GNhv9raWH/QkE2/ysqIv8IBwX/GBEK/z06Nf83NjOZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFBPSwBQTkslUU9L7H58eP/Y1tT/7uvo/9TQyv+ZlpD/aWZh/2tnYf98eHH/iYV9/5GN
hP+WkYn/mZSM/5uWjv+emZD/oJuS/6Gck/+inZP/oZuS/52Yj/+alYz/lpGI/5CLg/+OioH/joqB/4+K
gv+VkIf/mpWM/5+Zkf+jnZX/paCX/6WhmP+loJb/o56V/6Kdk/+gm5H/nJeP/5aRiP+JhX3/d3Ns/2dl
Xv9aWFH/REM5/zg4Lv8TEw//CgYB/yokHP8yMS+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJR
TQBPTkolW1lW7K6sqf/t6+j/1tLN/4uIgv9fXVf/bGli/356c/+JhX3/j4uC/5KOhf+VkIj/mJOL/5qV
jf+alYz/l5KK/5GMhP+Ig3v/fnlx/3NvZ/9qZl//ZGBZ/11ZU/9aVlD/V1RO/1hUT/9dWVP/Yl9Y/2xn
Yf93cmr/g352/5GMg/+alYz/n5qR/6Cbkv+fmpH/nZiP/5uVjf+WkYn/jIiA/3x4cf9hX1n/QUA3/0FA
Nf8kIxz/BgUD/xoSC/8oJSKamv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlXUwBRT0sldHJv7NLQ
zv/h3tn/jImD/1tYUv9qZ2H/fHhx/4aCev+Lh37/joqB/5GNhP+Tj4b/k46F/4+Kgf+Hgnr/fnlx/3dy
av9ybWb/cGxk/29rZP9taWL/cW1m/3JuZ/9wbGX/bmtk/25qZP9oZV//Y19Z/2RfWf9iXVf/ZGBa/2tm
X/91cGj/gn51/4+Kgv+Yk4r/m5WN/5qUjP+Xkor/k46G/4uHfv97eHD/UVBI/0JBN/8zMin/Dg0K/w4I
Av8eFw+nDTBaATUaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjYABZV1QmkI6L7eDe2/+fnJj/V1RP/2Zj
Xf94dW3/gn53/4aCe/+KhX7/jYiA/46JgP+Nh37/h4J4/4N+dP+Efnb/ioR8/5KOhf+dmJH/p6Ob/7Cs
pP+zr6f/urav/7y4sf+7t7D/urau/7i0rP+xrKX/qaWd/6Sfl/+alY3/kYyE/4aCev99eHD/enVu/355
cf+FgHj/jYiA/5SPhv+UkIj/ko6G/4+Lgv+JhH3/amdg/0RDOv8+PTP/HBwW/wcFAv8XDgTGCQUBEgIA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFwbABkY18noqCd7b+9uv9dW1f/XVtV/3NvaP99eXH/gX12/4WA
ef+Hgnv/iIJ6/4mDev+Nh37/l5KJ/6ikm/+7t7D/y8jC/9fUz//d2tb/3tzY/+Dd2f/e3Nf/3dvV/9vY
0//Y1dD/1tPN/9PQyv/QzMX/zcnC/8nFvv/FwLn/wLuz/7m0rP+wq6L/pqCZ/56Zkf+ZlI3/lpGL/5OO
hv+QjIP/kIuD/46Kgf+Lh3//gHx1/09NRP9CQTf/LCwk/wkJBv8QCQL0Fg0DTyMVBQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHl4dABycG0ooJ6a7Xd1cf9RT0r/amZg/3dzbP98eHH/f3t0/4F8dP+CfXX/jId//6Oe
lv++urT/2NXQ/+fl4v/u7On/7u3q/+3r6P/q6OX/5+Xi/+Ti3//i4Nz/393Y/93a1f/a19L/19TP/9TR
zP/Sz8j/0MzF/83Jwv/Kxr//x8O8/8TAuP/BvbT/vbiw/7mzq/+0sKj/s6+o/7Ovqf+qp6D/mZSM/42I
gP+KhH3/hoJ7/2ViWv9DQjf/Ojkw/xUVEP8JBQH/GA0EoQIAAAcKBQIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKA
fACHhYIogX977FFPS/9cWVT/b2tl/3ZybP96dm7/fHhw/4eCev+inpb/yMS//+Xj4P/z8vD/9vX0//Tz
8f/x8O7/7+3q/+zq5//p5+T/5+Xi/+Xj3//j4N3/4N7Z/97b1v/b2NP/2NXQ/9bTzv/T0Mr/0c7H/87L
xP/Mx8H/ycS9/8bCuv/Dv7f/wLyz/7+6sf++ubD/vLev/725sv/Fwrz/w8C7/6mlnv+OiYL/hYB5/3Zy
a/9JRz7/QkE2/yYlHv8GBQP/EwsC5Q4GADMJAwAABgUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBuagB4dnIfV1VR2E1L
R/9kYVv/cG1n/3Vxav97d3D/lZGK/8TBvP/o5+T/+Pf2//n49//29vT/9PPx//Lx7//w7+3/7u3q/+zq
5//p5+T/5+Xi/+Xj3//j4d3/4d/a/9/c1//d2dT/2tbR/9fUz//U0cz/0s/I/9DMxf/NycL/y8a//8fD
vP/Fwbn/wr61/8C8s//AvLP/wLuy/7+6sf/BvbT/zcrE/9bU0f+7uLP/j4uF/397c/9WVEz/QkE3/zQz
Kv8VFRL/Ih0X/y8nH3wAAAABAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRABMSUUXREI+yVJQS/9nZF//cG1m/315
c/+npJ7/3NrX//b29P/5+fj/+Pf2//b19P/19PL/8/Lw//Lw7v/w7uz/7uzp/+zq5//p5+T/6OXi/+bj
4P/j4d7/4d/b/9/d1//d2tX/29fS/9jVz//V0s3/09DJ/9HNxv/PysT/zMfA/8nFvv/Gwrv/xL+3/8K+
tf/CvbX/wb20/8G8tP/AvLP/wr62/9TQy//l4+H/yMbC/4+LhP9pZV7/SEY9/19eVv90cm3/rKaf/2Ve
VsoAAAAZGxYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVEPwBFQz4hRkRA41dUT/9oZV//fXp0/7a0sP/p6Ob/+fj3//j3
9v/29fT/9fTz//X08v/z8vD/8vHv//Hv7f/v7uv/7uvo/+vp5v/p5+T/5+Xi/+bj4P/k4d3/4t/b/9/d
2P/e2tX/29jT/9jV0P/W083/1NDL/9LOx//PzMT/zcjC/8vGv//Iw7z/xcG6/8TAuP/Ev7f/w7+2/8O/
tv/DvrX/wr61/8bBuf/a2NP/7ezq/8PBvf9+enT/ZWJc/7q4s/9ubWj/T0xH/yIbFPYSCQJXGA4FABcK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAExLRwBMS0clTEpH7VpXUv9zcGv/tbOv//Hx7//5+Pf/9vXz//Xz8v/08/H/9PPx//Py
8P/y8e7/8e/t//Du6//u7On/7ern/+ro5f/p5uP/5+Xi/+bj4P/k4d3/4t/b/+Dd2P/e2tX/3NjT/9nW
0f/X087/1dHL/9LPyP/QzcX/zsrC/8zHwP/JxL3/x8K7/8bCuv/Gwbr/xcG5/8XBuf/FwLj/xMC3/8S/
t//Iw7z/4d7b//Lx8P+2tLD/Y2Bb/2NhWP9DQTj/FRUQ/wYDAP8YDgSmAAAACQYCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO
SgBPTkolT01J7GRiXf+qqKT/7u3r//j39v/08/H/8/Lw//Py8P/y8e//8vHv//Hw7v/x7+3/8O7r/+/t
6f/t6+j/7Onm/+ro5P/o5uP/5+Xh/+Xj3//k4d3/4t/b/+Dd1//e29b/3NjT/9rW0f/X1M7/1dLM/9PQ
yf/Rzcb/z8vD/83Iwf/Lxr//ycS9/8nEvf/Iw7z/yMO8/8fDu//Hwrv/xsK6/8bBuv/Fwbn/zcnC/+7t
6f/r6+n/jouH/0A+Nv9DQjf/Kikh/wgHBP8SCgLnFg0DMx4RBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBQT0slUlBM7IeF
gf/g393/9/b1//Px7//y8O7/8vDu//Lw7v/x8O3/8e/t//Du7P/v7ur/7+3p/+7r6P/s6ub/6+jl/+nn
5P/o5eL/5uTg/+Xj3v/j4dz/4t/a/+Dd1//f29b/3dnT/9vW0f/Y1M//1tLM/9TQyv/Szsf/0MzE/87J
wv/Mx8D/zMa//8vGvv/Lxb7/ysW+/8rEvf/JxL3/ycS8/8jDvP/Hw7v/yMK7/9vY0v/5+Pf/wcC+/09N
SP9ZV07/XlxU/xUUEP8LBgH+FAsCeyUWBgD/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNSTgBPTkolX15a7Le1s//z8vD/8/Hu//Dv
7P/x7+z/8O/s//Dv7P/w7uv/8O7q/+/t6f/u7Oj/7evn/+3q5v/r6eX/6ufk/+jm4//n5eH/5uTg/+Xi
3v/j4Nz/4t/Z/+Dd1//f3Nb/3dnT/9vX0f/Y1c//1tPN/9XRy//Tz8f/0c3F/8/Lw//OycL/zcnB/83I
wf/Nx8D/zMfA/8zGv//Mxr//y8a//8vFvv/Kxb7/ycS9/8/Kw//t6+j/4uHg/2VkYP9YVk/9hoN9/z07
Nf8FAwH/FAsDwgsEABMHAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtZVgBRUEwlfHp37NrZ1//z8u//8O7q//Dt6v/w7er/7+3q/+/t
6f/v7en/7+zo/+7s6P/t6+f/7enm/+zo5f/q6OT/6efj/+jl4v/n5OD/5uPf/+Xi3f/j4Nz/4t/Z/+Dd
1//f3Nb/3dnU/9vX0f/Z1c//19PN/9XRy//T0Mj/0s7G/9HMxP/QzMT/0MzE/8/Lw//Py8P/z8rC/87J
wv/OyMH/zcjB/83HwP/Mx8D/zMa//8zHv//e29b/7+7t/4uKh/45ODLrh4V//V9dVv8REQ3/CgUA8xQK
AUccDwIABQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGlnZABbWlcmlZSR7ejm5P/x7+v/7+3p/+/t6P/v7en/7+3p/+7s6P/u7Oj/7uvn/+3q
5//t6eb/7Onl/+ro5P/p5+P/6ebi/+jl4f/n5OD/5eLe/+Th3f/j4Nv/4t7Z/+Dd1//f3NX/3dnU/9zX
0f/a1dD/2NTO/9bSy//U0Mn/08/H/9POx//Szsb/0s7G/9HNxf/RzcX/0czE/9DMxP/Qy8P/z8vD/8/L
w//PysL/zsnC/83Iwf/W0sz/7uzq/6Oinv4zMi7CbWtk3ISBe/8sKyX/BgQB/xEJApQDAQACAQEAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJx
bQBlZGAnoqGe7ezp5v/w7en/7uzn/+7s6P/u7Oj/7uzo/+7r5//u6uf/7erm/+3p5v/s6OX/6+jk/+rn
4//p5uL/6OXh/+fk4P/m49//5eLe/+Th3f/j4Nv/4d7Y/+Dd1v/f3NX/3tnU/9zX0v/a1tD/2NTO/9fT
zP/V0cv/1dHK/9XQyf/U0Mn/1M/I/9PPx//Tz8f/0s7G/9LOxv/SzcX/0c3F/9HNxf/QzMT/0MzE/8/L
w//Tz8j/6Obi/6mnpP88OzecTkxFkoiGgP9WVE7/CQgG/w4HAdULBQEgBAEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt5dgBxcGwpq6mm7e3r
6P/v7ej/7uzn/+7s5//u6+f/7urn/+7q5//t6ub/7enm/+zp5f/s6OT/6ufj/+nn4//p5uL/6OXh/+fk
4P/m497/5eLd/+Th3P/j4Nr/4t7Y/+Hd1//g3NX/3tnU/93Y0v/b1tD/2dXO/9fTzf/X083/19LM/9bS
zP/W0sv/1dHL/9XRyv/V0Mr/1NDJ/9TPyP/Tz8j/08/H/9POx//Szsb/0s3G/9HNxf/Uz8j/5ePe/6im
ov9CQT2PJyYfOYOBe+h7eXP/IiEc/wUCAPgRCQFbIxICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKBfQB7enYnr66q6u3r5//v7Of/7uvn/+7q
5v/u6ub/7urm/+3q5v/t6eX/7enl/+zo5P/r6OP/6ufj/+nn4v/p5uH/6OXg/+fk3//m497/5eLd/+Th
3P/j4Nr/4t7Y/+Hd1//g3Nb/39rU/93Y0v/c19H/29bQ/9vWz//a1c//2dXO/9nUzv/Y1M3/2NPN/9fT
zP/X0sz/1tLM/9bSy//W0cv/1dHK/9XQyv/U0Mn/1NDI/9PPx//V0cn/4+Db/6Shnv9DQj56AAAABmJg
Wp+Uko3/SEZA/wYFAv8KBACmDAIACAsDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHp3cwBsamYcpaKf0+fk4f/v6+f/7uvm/+7q5v/u6ub/7urm/+3p
5f/t6eX/7Ojk/+zo5P/r6OP/6ufi/+nm4v/p5uH/6OXg/+fk3//m497/5uLd/+Xh3P/k4Nr/49/Y/+He
1//g3Nb/39vU/97Z0//e2NL/3djS/93Y0v/c19H/3NfR/9vW0P/b1tD/29bP/9rVz//Z1c//2dTO/9jU
zv/Y083/19PN/9fTzP/W0sz/1tLL/9bRy//X08z/39zX/5uYlPtGREBUW1lTADk3MkSPjYjsdXJs/xgX
FP8FAQDeCgMAJgkDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHFuagBQTUoKnZuWp93b1//w7ej/7+vm/+7q5v/u6ub/7urm/+7q5f/t6eX/7enk/+zo
5P/s6OP/6ufi/+nm4v/p5uH/6OXg/+jk3//n497/5uLd/+Xh3P/k4Nv/49/Z/+Le1//h3db/4d3W/+Dc
1f/g29T/39rU/9/a1P/e2dP/3tnT/97Y0v/d2NL/3dfR/9zX0f/c19H/29bQ/9rW0P/a1c//2dXP/9nV
zv/Z1M7/2NTN/9jTzf/a1s//2dXP/5CNiOZGREEuRUM/AAAAAAt6eXOolJKO/z89N/8CAQD5BAAAZAUA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1q
aACqp6IAkY6Kbs/Lx/zv7Of/7+zm/+/r5v/v6ub/7+rm/+7q5f/u6eX/7enk/+3o5P/s6OP/6+fi/+rn
4v/p5uH/6eXg/+jk3//n497/5uPd/+bi3P/l4dv/5ODa/+Pf2f/j39j/4t7Y/+Le1//h3df/4d3W/+Hd
1v/g3NX/4NzV/9/b1P/f29T/39rT/97Z0//e2NL/3djS/93Y0v/d19H/3NfR/9zW0P/b1tD/29bP/9rV
z//c2NH/x8S+/316dbY8ODQOT0tHAGVjWQBQT0hQmJeT8nRxa/8SEQ7/AAAApAAAAAkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4tACQjIkAhIF9Kri1
sdvp5eD/8O3n//Ds5//v6+b/7+rm/+/q5f/u6eX/7unl/+3o5P/t6OP/7Oji/+zn4v/q5uH/6eXh/+nl
3//o5N//5+Pe/+fj3f/m4t3/5uLc/+Xh2//l4dv/5ODa/+Tg2f/j39n/49/Y/+Pf2P/i3tf/4t7X/+Le
1//h3db/4d3W/+Dc1f/g3NX/39vU/9/b1P/f2tT/3tnT/97Z0//d2NL/3djS/93X0f/b1tD/sK2n+nVy
bmiloZkAQ0ZLACIhHAAAAAANkI+KspeUkP9APjn/AAAA3wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFg38AVlZSBJ6cl4bU0Mz+8Ozn//Ht
5//x7ef/8Ozm/+/r5v/v6uX/7unl/+7p5P/u6eT/7ejj/+zo4v/s5+L/6ubh/+rm4f/p5eD/6eXg/+nl
3//o5N//6OTe/+fj3v/n493/5uLd/+bi3P/m4tz/5eHb/+Xh2//k4Nr/5ODZ/+Tg2f/j39j/49/Y/+Le
1//i3tf/4d3W/+Hd1v/h3db/4NzV/+Dc1f/f29T/39rU/9/a1P/OycP/mpeRxHZybRp+e3UAU1NTAAAA
AADGwr0AeHZxT6imo/N5dnD/ERAO+QAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPytAAhoN9AIiGgCCyr6vI49/a//Dt5//x7ef/8e3o//Ds
5//w6+b/8Ovm/+/r5f/v6uX/7+rl/+7p5P/u6eT/7ejj/+3o4//s6OL/6+fi/+vn4f/q5uH/6ubg/+nl
4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3f/m4t3/5uLc/+bi3P/l4dv/5eHa/+Tg2v/k4Nn/49/Z/+Pf
2P/j39j/4t7X/+Le1//h3db/4d3W/9vX0f+yr6nth4N+VJ6UlQB7e3IAAAAAAAUFAAAmJSIAPjw4DKup
pq+hnpr/RUM+/wAAAKAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDwsIAGz0YALu4tQCWk5BKwb645erm4P/x7Of/8u7p//Lv6v/w7ef/8Ozm//Ds
5v/w7Ob/8Ozm/+/r5f/v6+X/7+vl/+/q5f/u6uT/7unk/+7o4//t6OP/7Oji/+zn4v/r5+L/6+bh/+rm
4f/q5eD/6eXg/+nl3//o5N//6OTe/+fj3v/n493/5+Pd/+bi3f/m4tz/5eHc/+Xh2//k4Nr/5ODa/+Tg
2f/j39n/4NzW/8C8t/uTkIqFdnRxCI2LhQDPz8EAAAAAAAAAAAAuLisA1dTRANXTzkmvrarzkIyG/xwb
GdEAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAeHhvAHZ2cgANFBQCnpyWZ8vHwu7q5eD/8e3o//Pw7P/z8Ov/8e3n//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm/+/r5f/v6+X/7+rl/+7p5P/u6eT/7ejj/+3o4//s5+L/7Ofi/+vn
4f/r5uH/6ubh/+rl4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3v/n493/5uLd/+bi3P/j39n/yMW//5mW
kaNoZWERfn95AP///wAAAAAAAAAAAAAAAAAAAAAA0c3FAOPe1Q/KycazqaWh/3FtaPQODQxCLCooAK+n
nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH19
eACRkIsAnJmVBaGfmmfBvrnl5uHc//Lu6f/18u7/9PHt//Hu6f/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/7+vl/+/q5f/u6uT/7unk/+7p5P/t6OP/7ejj/+zn
4v/s5+L/6+fh/+rm4f/q5uD/6eXg/+nl4P/p5d//6eXf/+Pf2v/EwLv6m5eSm3p4cxuMioMAoKmXAH5z
cwAAAAAAAAAAAAAAAAAAAAAA3NjSAN7c2QDh3ttQtbOx8bKtp/+inZaLZmFaAq6mngAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVkYoAlZONAFJY
VQKZlZBOuLWw0dvX0v/v6+b/9fPv//b08P/z8Oz/8e3n//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm//Dr5v/v6+X/7+rl/+/q5f/u6eT/7unk/+3o
4//t6OP/7Ofi/+zn4v/q5eD/3dnU/7u4s+uVkYx/dHNtD5SSjQAAAAAALCsqAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAODc1gDk3tYK2NbTn6qmo//HwLnTwbuyHbmyqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj42IAIaCfgD///8AiYeFK6ej
n5/Hw77x5eHc//Tx7f/49vP/9/Tx//Pw7P/x7ej/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w6+b/8Ovm//Dr5v/v6uX/7unk/+bh
3P/KxsH9qKahxIuJhU1UUE4Fe3lzAI6LhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wDl4t4A7OnlLrCuqsOnpJ6e2NDJD763sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH11cgCPgoEAkI6LAHdycAuXlJBUsq+ruMvH
w/Xl4t7/9fPx//r49v/59/T/9fLu//Lv6v/x7ef/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8e3n/+/r5f/l4Nv/zsrF/bKuqdiTkIx7endzHK2m
qwCHhH8Ah4N/ALa2tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/JxADLyMEA4+DYAb26
sxOmpJ4NuLGrAL63sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AY2VzAIyIhQCxq6cAiIaDE5qYlFauq6exxsTA6dza
1//v7ev/+Pf1//r59//49vP/9vPv//Tw7P/y7+r/8u7p//Hu6P/x7ef/8e3n//Ht5//x7ef/8e3n//Hu
6P/y7uj/8O3n/+3p4//m4tz/2tbR/8bCvfauq6bGmJWQeICAeigAAAABiYeCAHh4cADJyLwAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX1M8A6ebhALm2sACmpJ4AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSUjgCanJYAkI2KALy4swBqamkLjoyIN6OhnXSysKy3xsTA39bU
0ffi4d7/7Orn//Du7P/z8O3/8/Dt//Lw7P/x7ur/8Ozo/+/r5//u6uX/6OXg/+Lf2v/Z1dD/zMjD/b67
t+etqqbJn5yXko6MiExwb2sY////AI2MhQB+fHoAlpOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAADAwMAP///wCEgoEAlJGPAP///wBcW1kJe3p2LJGPi1KjoZ13rKmmmrKv
rLq5trPRvLq33L27t+C6uLTlt7Wx4ra0sNuyr6vYqKaiwaGemqeal5OEjouHYHx6djhraGcSAAAAAZqY
kwB+fHgAXmBeAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8Axse9ADUzMQBqa2oAfHt4AJCOigD///8AOjs5BmJgXg1+fHoThYSAFYB/
eiF6eXUvenl2JoSDgBV8enYUZmVhDklHRQkAAAAClZKOAHx5dQBwbWwAeHd1AHJvbAD07OQABQUFAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUwB4eHUAenl3AIOBfwCUko8AmZeUAI+OigCGhYEAiIaDAJeV
kgCQjooAgn98AHRybwBwb2kAc3NsAP///wAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8AAAD///////////8A
AAD/////AH////8AAAD////AAAD///8AAAD///wAAAAf//8AAAD///gAAAAP//8AAAD//+AAAAAB//8A
AAD//4AAAAAA//8AAAD//wAAAAAAf/8AAAD//gAAAAAAP/8AAAD//AAAAAAAH/8AAAD/+AAAAAAAD/8A
AAD/8AAAAAAAB/8AAAD/8AAAAAAAB/8AAAD/8AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAP8A
AAD/4AAAAAAAAP8AAAD/4AAAAAAAAP8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8A
AAD/4AAAAAAAAD8AAAD/4AAAAAAAAD8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAA8A
AAD/4AAAAAAAAA8AAAD/4AAAAAAAAA8AAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcA
AAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAEA
AAD/8AAAAAAABAEAAAD/8AAAAAAABgEAAAD/+AAAAAAABwAAAAD/+AAAAAAADwAAAAD//gAAAAAAH4AA
AAD//wAAAAAAP4AAAAD//wAAAAAAf4AAAAD//4AAAAAA/8EAAAD///AAAAAD//8AAAD///wAAAAP//8A
AAD///4AAAA///8AAAD////gAAP///8AAAD///////////8AAAD///////////8AAAD///////////8A
AAA=
</value>
</data>
</root>

BIN
DBChm/Images/DBCHM000.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

BIN
DBChm/Images/DBCHM001.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

BIN
DBChm/Images/DBCHM002.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
DBChm/Images/DBCHM003.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
DBChm/Images/DBCHM004.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
DBChm/Images/DBCHM005.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 840 KiB

BIN
DBChm/Images/ORA-28040.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
DBChm/Images/dbchm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

225
DBChm/ImportForm.cs Normal file
View File

@ -0,0 +1,225 @@
using ComponentFactory.Krypton.Toolkit;
using DBCHM.Common;
using DocTools;
using DocTools.Dtos;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
namespace DBCHM
{
public partial class ImportForm : KryptonForm
{
public ImportForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
//为KeyDown能应用到所有控件上 注册 KeyDown 事件
foreach (Control control in this.Controls)
{
control.KeyDown += control_KeyDown;
}
}
public void control_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Escape)
{
this.Close();
}
}
private void ImportForm_Load(object sender, EventArgs e)
{
txtExplain.Text = @"本工具目前支持 pdm/xml 文件来 进行更新批注(注释)
pdm powerdesigner设计数据库时产生
xml visual studio设置 XML文档文件
xml dbchm的 XML导出 ";
}
private void BtnBrow_Click(object sender, EventArgs e)
{
var openFileDialog = new OpenFileDialog
{
//支持 pdm实体类注释产生的xml文档dbchm导出的xml文件
Filter = "支持文件类型(*.pdm;*.xml)|*.pdm;*.xml|PowerDesigner文件(*.pdm)|*.pdm|xml文件|*.xml",
Multiselect = true
};
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
txtMulItem.Text = string.Join("\r\n", openFileDialog.FileNames);
}
}
private void BtnUpdateDisplayName_Click(object sender, EventArgs e)
{
if (DBUtils.Instance == null)
{
MessageBox.Show("更新批注,需连接数据库,请切换到要更新批注的数据库!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
if (string.IsNullOrWhiteSpace(txtMulItem.Text))
{
MessageBox.Show("请先选择批注数据文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
FormUtils.ShowProcessing("正在更新批注到数据库,请稍等......", this, arg =>
{
string[] paths = txtMulItem.Text.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (string ph in paths)
{
string extName = Path.GetExtension(ph).ToLower();
try
{
if (File.Exists(ph))
{
if (extName == ".pdm")
{
UpdateCommentByPDM(ph);
}
else if (extName == ".xml")
{
UpdateCommentByXML(ph);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "出错", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
}
MessageBox.Show("更新表列批注完成!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
FormUtils.IsOK_Close = true;
this.Close();
}, null);
}
/// <summary>
/// 通过pdm文件更新批注
/// </summary>
/// <param name="path"></param>
void UpdateCommentByPDM(string path)
{
var lstTabs = GetTables(path);
var dbInfo = DBUtils.Instance?.Info;
foreach (var tab in lstTabs)
{
string tab_Comment = tab.Name;
if (!string.IsNullOrWhiteSpace(tab_Comment)
&& !tab.Code.Equals(tab_Comment, StringComparison.OrdinalIgnoreCase))
{
dbInfo.SetTableComment(tab.Code, tab_Comment);
}
var lstCols = tab.Columns;
foreach (var col in lstCols)
{
string col_Comment = col.Name;
if (!string.IsNullOrWhiteSpace(col_Comment)
&& !col.Code.Equals(col_Comment, StringComparison.OrdinalIgnoreCase))
{
dbInfo.SetColumnComment(tab.Code, col.Code, col_Comment);
}
}
}
}
static IList<PdmModels.TableInfo> GetTables(params string[] pdmPaths)
{
List<PdmModels.TableInfo> lstTables = new List<PdmModels.TableInfo>();
var pdmReader = new PDM.PdmReader();
foreach (string path in pdmPaths)
{
if (File.Exists(path))
{
var models = pdmReader.ReadFromFile(path);
lstTables.AddRange(models.Tables);
}
}
lstTables = lstTables.OrderBy(t => t.Code).ToList();
return lstTables;
}
void UpdateCommentByXML(string path)
{
var xmlContent = File.ReadAllText(path, Encoding.UTF8);
if (xmlContent.Contains("ArrayOfTableDto"))
{
//通过 dbchm 导出的 XML文件 来更新 表列批注
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlContent);
var dbName = doc.DocumentElement.GetAttribute("databaseName");
if (!DBUtils.Instance.Info.DBName.Equals(dbName, StringComparison.OrdinalIgnoreCase))
{
if (MessageBox.Show("检测到数据库名称不一致,确定要继续吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.Cancel)
{
return;
}
}
var lstDTO = typeof(List<TableDto>).DeserializeXml(xmlContent) as List<TableDto>;
foreach (var tabInfo in lstDTO)
{
if (DBUtils.Instance.Info.IsExistTable(tabInfo.TableName) && !string.IsNullOrWhiteSpace(tabInfo.Comment))
{
DBUtils.Instance.Info.SetTableComment(tabInfo.TableName, tabInfo.Comment);
}
foreach (var colInfo in tabInfo.Columns)
{
if (DBUtils.Instance.Info.IsExistColumn(tabInfo.TableName, colInfo.ColumnName) && !string.IsNullOrWhiteSpace(colInfo.Comment))
{
DBUtils.Instance.Info.SetColumnComment(tabInfo.TableName, colInfo.ColumnName, colInfo.Comment);
}
}
}
}
else
{
//通过 有 VS 生成的 实体类库 XML文档文件 来更新 表列批注
XmlAnalyze analyze = new XmlAnalyze(path);
var data = analyze.Data;
foreach (var item in data)
{
if (DBUtils.Instance.Info.IsExistTable(item.Key.Key) && !string.IsNullOrWhiteSpace(item.Key.Value))
{
DBUtils.Instance.Info.SetTableComment(item.Key.Key, item.Key.Value);
}
foreach (var colKV in item.Value)
{
if (DBUtils.Instance.Info.IsExistColumn(item.Key.Key, colKV.Key) && !string.IsNullOrWhiteSpace(colKV.Value))
{
DBUtils.Instance.Info.SetColumnComment(item.Key.Key, colKV.Key, colKV.Value);
}
}
}
}
}
}
}

149
DBChm/ImportForm.designer.cs generated Normal file
View File

@ -0,0 +1,149 @@
namespace DBCHM
{
partial class ImportForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ImportForm));
this.txtMulItem = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.BtnBrow = new System.Windows.Forms.Button();
this.BtnUpdateDisplayName = new System.Windows.Forms.Button();
this.GP_Import = new System.Windows.Forms.GroupBox();
this.gpxDesc = new System.Windows.Forms.GroupBox();
this.txtExplain = new System.Windows.Forms.TextBox();
this.GP_Import.SuspendLayout();
this.gpxDesc.SuspendLayout();
this.SuspendLayout();
//
// txtMulItem
//
this.txtMulItem.Location = new System.Drawing.Point(77, 26);
this.txtMulItem.Multiline = true;
this.txtMulItem.Name = "txtMulItem";
this.txtMulItem.ReadOnly = true;
this.txtMulItem.Size = new System.Drawing.Size(497, 71);
this.txtMulItem.TabIndex = 7;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(6, 50);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(65, 12);
this.label1.TabIndex = 6;
this.label1.Text = "文件路径:";
//
// BtnBrow
//
this.BtnBrow.Location = new System.Drawing.Point(178, 18);
this.BtnBrow.Name = "BtnBrow";
this.BtnBrow.Size = new System.Drawing.Size(104, 36);
this.BtnBrow.TabIndex = 5;
this.BtnBrow.Text = "选择(可多选)";
this.BtnBrow.UseVisualStyleBackColor = true;
this.BtnBrow.Click += new System.EventHandler(this.BtnBrow_Click);
//
// BtnUpdateDisplayName
//
this.BtnUpdateDisplayName.Location = new System.Drawing.Point(371, 18);
this.BtnUpdateDisplayName.Name = "BtnUpdateDisplayName";
this.BtnUpdateDisplayName.Size = new System.Drawing.Size(104, 36);
this.BtnUpdateDisplayName.TabIndex = 8;
this.BtnUpdateDisplayName.Text = "更新表列批注";
this.BtnUpdateDisplayName.UseVisualStyleBackColor = true;
this.BtnUpdateDisplayName.Click += new System.EventHandler(this.BtnUpdateDisplayName_Click);
//
// GP_Import
//
this.GP_Import.Controls.Add(this.label1);
this.GP_Import.Controls.Add(this.txtMulItem);
this.GP_Import.Location = new System.Drawing.Point(5, 59);
this.GP_Import.Margin = new System.Windows.Forms.Padding(2);
this.GP_Import.Name = "GP_Import";
this.GP_Import.Padding = new System.Windows.Forms.Padding(2);
this.GP_Import.Size = new System.Drawing.Size(584, 113);
this.GP_Import.TabIndex = 9;
this.GP_Import.TabStop = false;
this.GP_Import.Text = "批注数据导入";
//
// gpxDesc
//
this.gpxDesc.Controls.Add(this.txtExplain);
this.gpxDesc.Location = new System.Drawing.Point(5, 177);
this.gpxDesc.Name = "gpxDesc";
this.gpxDesc.Size = new System.Drawing.Size(584, 100);
this.gpxDesc.TabIndex = 10;
this.gpxDesc.TabStop = false;
this.gpxDesc.Text = "使用说明";
//
// txtExplain
//
this.txtExplain.ForeColor = System.Drawing.Color.Black;
this.txtExplain.Location = new System.Drawing.Point(7, 20);
this.txtExplain.Multiline = true;
this.txtExplain.Name = "txtExplain";
this.txtExplain.ReadOnly = true;
this.txtExplain.Size = new System.Drawing.Size(571, 73);
this.txtExplain.TabIndex = 0;
//
// ImportForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(595, 282);
this.Controls.Add(this.gpxDesc);
this.Controls.Add(this.GP_Import);
this.Controls.Add(this.BtnUpdateDisplayName);
this.Controls.Add(this.BtnBrow);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ImportForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "批注上载";
this.Load += new System.EventHandler(this.ImportForm_Load);
this.GP_Import.ResumeLayout(false);
this.GP_Import.PerformLayout();
this.gpxDesc.ResumeLayout(false);
this.gpxDesc.PerformLayout();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.TextBox txtMulItem;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button BtnBrow;
private System.Windows.Forms.Button BtnUpdateDisplayName;
private System.Windows.Forms.GroupBox GP_Import;
private System.Windows.Forms.GroupBox gpxDesc;
private System.Windows.Forms.TextBox txtExplain;
}
}

487
DBChm/ImportForm.resx Normal file
View File

@ -0,0 +1,487 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEASEgAAAEAIACIVAAAFgAAACgAAABIAAAAkAAAAAEAIAAAAAAAAFEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8vLwA+LS4ASkVBAEtL
RABLS0YAS0tEAElHQgBAQD8APz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAE1KQwBMSUMAU1BLAFtYUgBdWlQAXVxVAGBeWABramMADggHAyotJQYpKykFKiwlBiEf
HQSAfXIAYF5ZAF9cVgBcWlQAWVdRAFZUTgBNTEYAQjc6AEc/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0xJAAAAAABQSUEAQ0E+AFVS
TACEhYEAREE9CFVRTBVaV1A1WllSVl5cVm9iX1mCZmNdlGhmX5tpZ2CbaGZfm2VjXJhhX1mFX1xXdVxa
VF1ZVlFAVFFLHkpKQwwABAABW1pRAEtJQgAbJBgARUU5AElJPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBPzwAODY1AFFPSQCFgnYAREM/DVZTTjlcWlRwYV9YqGdl
X9RvbGXodXJr9Hl2b/59enL/hIB4/4eEfP+JhX3/iIR9/4WBev9/fHT/e3dw/3d0bfdyb2jsamdh3WRh
W7heXFWDWFVPSktKQxUAAAABWVZTAEhFQwBPS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAT01HAExKRABYVk8AAAAAAk9NSCZbWVNwYmBavmxpYul0cWr/fnpy/4eDe/+Pi4L/lZCI/5qV
jP+dmZD/oZyT/6Self+ln5f/paCX/6Oflf+gm5L/nZiP/5qVjP+UkIj/jomB/4WBev96d3D/cG1m8mVj
XcxbWlOJU1BLOz07OwhcWlQATk1GAGdmWQAvLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSAAAAAAAU1FMAP//
/wBQTkgsWFZQimJgWdlua2T+e3dw/4eDe/+RjIT/mJOL/56ZkP+inZT/pJ+X/6ehmP+po5r/qqSb/6ul
nP+rpZz/rKad/6ymnf+rpZz/qqSb/6mkm/+oopn/pZ+W/6Cbkv+alYz/kIyE/4SAef92c2z/aGVf6l1b
VaVTUUtBQ0M7BldVTgBIRj8AT0xHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkI/ADwxLQBTUEwAT05IE1lXUW9fXVfaamdh/3l1
bv+Ggnv/kY2F/5mUi/+dmI//oJuS/6KdlP+kn5b/pqGY/6eimf+po5r/qqSb/6ulnP+rpZz/q6Wc/6ym
nf+rpZz/q6Wc/6ulnP+qpJv/qaOa/6eimf+loJf/op2T/5yXj/+Tj4b/hoJ6/3Vya/9kYlzsV1VPk09O
SCZbXFsAS0dCAExHQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABFRT8ARUI9AG1xaQBRTUkvWVdSrWNgWvpxbmf/gHx1/4yIf/+Uj4f/mZOL/5yW
jv+emZD/oJuS/6KdlP+kn5X/paCX/6ahmP+moJf/pqCX/6Wflv+inZT/op2U/6Wflv+nopj/qKKZ/6mj
mv+qpJv/qKOa/6eimf+loJf/pJ+V/6Kdk/+empH/mZSL/46Kgv9/e3T/a2hi/1pYUs5NTEZTQjs3BEhH
QQBHR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVF
PwBHRkAAoJKOAFJQSUdYVlDPZGFb/3Zya/+EgHj/jYmA/5KOhf+VkYn/mZOL/5uWjf+dmI//npmQ/5yX
jv+Yk4r/ko2E/4qFff+BfHT/fHhw/3Vxaf9taWL/a2hg/3JuZv94dGz/e3hv/4aBef+Qi4P/mZSM/5+a
kf+inZT/o56U/6Gdk/+fm5H/nZiP/5qUjP+SjYX/hYF5/3BtZv9bWVPtTkxIcjw9OQZCQj0AOjo1AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk1IAEdHQQCdjYwATUxGS1RS
TN5iX1n/dnJr/4R/eP+Lh37/j4qC/5GNhP+UkIj/l5GJ/5aQiP+RjIP/iYR8/4B7c/92cWn/bmli/2hk
Xf9iXlf/XVlT/11ZU/9dWVP/WlZR/1VRTP9UUUv/V1RN/1tXUf9hXVb/bGdg/3dya/+GgXj/k46F/5qV
jP+dmI//nJeO/5qVjf+Xkor/kY2F/4aCev9zcGj/W1lU80lIQ3MtLigGOzo2AD48OgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8ATktFAE1KRwBMSkU8T01I3F5bVv9yb2j/gHx1/4eC
e/+Lhn7/jomB/5CLg/+Qi4P/jId+/4WAd/9/eXH/fHdv/355cf+Dfnb/iIN7/4+Kgv+RjYX/ko2G/5iT
i/+dl4//m5aO/5GMhf+Mh4D/i4Z//4SAeP99eXH/dnJr/3BsZf9vamP/dXBp/4B7c/+MiH//lpCI/5iS
iv+WkYn/k4+H/4+Kgv+EgHj/cW1n/1dVT/NEQj5wMjAvBD8+OwBGRkQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADGu4cATkxFAEpIQxtLSkW/V1VP/21pY/97d3D/gn52/4WBev+JhHz/i4V9/4uF
fP+Jg3r/iYN6/4+JgP+ZlIz/paCX/6+qov+1saj/uLOr/7u2rv+8t67/vLiv/724r/+9uK//vLev/7u2
rv+6taz/ubOr/7axqP+yraX/raif/6Sfl/+YlIz/kIuD/4yHf/+Lh3//jYiA/5CLgv+SjYX/kY2E/4+L
gv+Lhn7/f3t0/2lmYP9OTEfqQkE9TT87NgBKS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABISEQAT1JRAkZEQH1OTEb9ZGFb/3Vxa/98eXH/gHx1/4N/d/+Ef3f/hoB4/4+JgP+dmI//r6qj/765
sf/Gwrr/ycS9/8jDvP/Fwbn/wr61/8K9tP/CvbT/wb20/8G9tP/BvLP/wLyz/8C7sv+/u7L/vrqx/765
sP++ubD/vbiv/7y3rv+6taz/tbCo/7Cro/+sp5//pKCa/6Kdl/+Yk4v/kIuD/42IgP+Lhn7/hYF5/3dz
bP9dW1X/R0ZBx0ZFQx9FREEAWlpaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBGRT8ARUQ+KEdF
QNpYVVD/bWlj/3dzbP97d3D/fXly/396cv+KhX3/pKCY/7+7tP/OysX/0s7I/8/Lw//Lx8D/ycS9/8fD
u//Fwbn/xcC4/8S/t//AvLP/u7au/7q2rv+6tq7/ubWt/7m1rP+7tq7/wLyz/8C8s//AvLP/wLyz/8C7
sv+/urH/vrmw/724sP+9uK//l5ON/7Cspv++u7b/r6ul/5eSi/+JhHz/hYF5/356c/9raGH/UE5J/ENC
P3UAAAAAXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBAQDoAREI9cUtIQ/1hXlj/cGxm/3Vx
a/94dG3/gX11/52Ykf/Bvbf/19PO/9fUzv/Szsf/zcjB/8rGvv/FwLn/ubWu/6+ro/+empP/kY2H/4aD
fP+Cf3j/gn54/4SAef+EgXr/hIB5/4J/eP+AfXb/gn95/4uIgf+Xk4z/pqKa/7Gtpf+6tq3/wbyz/8C8
s//AvLL/rquk/52Ykv/Fwrr/z83I/8bDv/+gnZf/hoF6/397c/9zb2j/WldS/0NBPchAQD8bQkJBAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBPTkkMQ0E9rFBOSf9mY13/cG1n/3ZybP+MiIL/uLaw/9rX
0//d29b/1NHK/9DKw//Iw7z/ubSt/52ak/+Jhn//endx/3Rxav94dW7/fXpz/4F9dv+Ggnr/jIiA/5CL
g/+RjYT/kYyE/4+Lg/+Khn7/hIB4/4B8df97d3D/dHFr/3Zzbf+Bfnf/kY6H/6umnv+7tq7/yMS9/5qV
kf+8tq7/xsK7/9nX0v/X1dL/p6Oe/4F9dv92cmv/Yl9Z/0ZEQO87OjhFNDIvAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEZEQABGREAdRUM/2FVSTv9oZV//c3Bq/5aTjv/Pzcr/5+Xi/93a1P/Tz8j/ycW9/62o
ov+Lh4H/dXJs/3Vxa/97eHH/hoN7/4+Lg/+Wkon/m5aO/5+bkf+inpT/paCX/6eimf+oo5r/qaOa/6ij
mv+moZj/o56V/6Cbkv+bl47/lZGI/46Jgf+Cf3f/eHVu/3Rxav9+e3T/qqaf/62ppP+qpZ3/v7qx/8nF
vv/i4Nz/4N/d/6eln/96dm//ZmNd/0lHQ/06OTdsNDMrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpI
RABJSEQkSkhE7FlWUf9raGP/mJaR/9va1//q5+T/3NnT/87Kw/+tqqP/hoN9/3FuZ/90cGr/gX52/42I
gP+WkYj/nJeO/6Cbkv+jnpX/paCX/6eimf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6qk
nP+po5r/pqGY/6Oelf+emZD/lpGJ/4uHf/98eHH/fntz/66rpf9tamT/Y2Ba/7ezq//NycP/6Ofk/+Xk
4/+fnJf/aWZg/0xJRf85NzWDXVhLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5NSQBOTUklTkxI7F1b
Vv+Ni4b/2tjV/+3r6f/d2dP/vrqz/4eEfv9qZ2H/cW1m/397dP+MiH//lZCH/5qVjf+emZD/oJuS/6Kd
lP+kn5b/pqGX/6eimf+po5v/qqSb/6ulnP+rpZz/rKWc/6ymnf+spp3/q6Wc/6ulnP+qpJv/qaOa/6ei
mf+loJf/o56U/5+ZkP+Xkon/i4d//25rY/8wLyj/Dg0L/3Rxbf/Ev7j/1dLM//X08//X1dP/fHl0/0xK
Rf82NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBPTkolUE5L7HNwbf/KyMb/7+7r/9zZ
0/+tqqT/cG1n/2RhW/91cmv/hYF5/4+Lg/+VkYj/mZSM/5yWjv+emZD/oJuS/6Kdk/+jnpX/pJ+V/6Oe
lf+hnJT/oZuS/52Xjv+blY3/mpWM/5yXjv+hnJP/o56U/6agmP+oopn/qKKZ/6eimP+loJf/pJ+V/6Kd
k/+fm5H/nJeO/3BtZf83Ni3/FRQQ/xsaGP+Cf3n/wLy1/+Xi3v/29vX/qaek/09NSf8yMS6aAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJRTABPTkolWFZS7KKgnv/q6Ob/4d3Z/6Sgmv9kYlv/ZmNd/3l1
bv+Hgnv/joqB/5KOhf+VkIj/mZOL/5uVjf+cl47/m5aN/5eSif+QjIP/iIN7/396cv92cWr/cGxl/2hj
Xf9jX1j/YV1X/2NfWf9rZl//cGxl/3p2b/+FgXn/kIuD/5mUi/+fmpD/oZyT/6Gck/+fmpH/npmQ/4iD
fP9IRz3/JSQd/wcGBf8zMi//fnt1/8XBuv/08/H/1NPR/19dWf8wLiyZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFZVUQBQTkolbGpn7MvJxv/o5eL/op+a/1xaVP9kYVv/eHRt/4WBef+Lh3//joqC/5GN
hP+Uj4f/lZCI/5ONhf+Mh37/g311/3p1bf9xbWX/bWhh/2llXv9lYVr/ZGFa/2djXP9lYVr/Y19Z/2Fd
WP9bV1L/WlZR/11YUv9fW1X/ZmFb/29rY/98d2//ioV9/5aRiP+bl43/nJaO/5eRif9VU0r/NDMq/w4O
Cv8VFBP/UlBL/3t4cv/Z1tL/6+vp/3p5df8wLy2ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJg
XABXVVEliIaD7d/d2v+0saz/W1lT/2BeWP90cWr/gX12/4eCe/+Khn7/jYmA/4+Kgv+OiYH/iYR7/4N9
dP+AenL/gXxz/4aBef+NiYH/lZCJ/5yXj/+emZH/op2V/6eimv+nopr/p6Ka/6WgmP+dmJD/mZSM/5OP
h/+Khn7/gn12/3l1bf91cGj/dnJq/355cv+Ig3v/kYyD/5aRiP9qaGD/PTwy/x8eGP8FBAP/QDw3/1xa
VP+KiIT/5+bk/5eVkv81NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9uagBiYV0nn56b7cnH
xP9mZF//WldR/3BtZv98eHH/gX52/4WBev+Ig3z/iYN7/4qEe/+KhHv/joiA/5iTi/+moZn/s66m/7u2
rv++urL/vrqx/7+7sv/Au7L/wLuy/7+7sv+/urH/v7qx/765sP+9ubD/vbiv/7u2rv+5tKv/tbCo/6+q
of+nopn/nZiR/5aSi/+Tj4j/kIyE/5GMhP98eHD/RUQ6/y8uJv8KCgb/HRkW/2FdV/9ZV1L/qKek/6Wj
oP89PDmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzcABraWYooZ+c7YiGgv9RTkn/aGRe/3Zy
a/98eHH/gHx0/4J+dv+CfnX/iIN6/5iTiv+sp6D/vbix/8fDvP/Lxr//y8a//8nEvP/Fwbn/w762/8K+
tf/CvrX/wr21/8K+tf/CvbT/wb20/8C8s//Au7L/v7uy/7+6sf++urH/vrmw/724sP+8t6//urSs/7aw
qP+yraX/sKyl/66qpP+dmJL/VlVM/zo5L/8YFxL/CAUD/0xIQv9iYFn/Y2Fd/4qJhf9DQj6YAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIF+ewCCgH0pioiF7VdVUP9aV1L/bmpk/3dzbP96d2//fHhx/4F8
dP+Sjob/sKyl/8nFv//U0cv/0s7I/83Jwv/Kxr7/yMS8/8bCuv/Dv7f/wby0/765sf+1san/sq2l/6mm
nv+opJz/p6Sc/6+ro/+yrqb/uLSs/7y4r/++ubD/v7uy/8G8s//Au7L/v7qx/765sP+8uK//vLev/766
tP/Fwr3/goB6/0JBN/8oKCD/BgUD/yYhG/9lYVv/VVNN/1dWUv9DQj6H////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHh2cgCDgH0hX11Z3k1KRv9iX1r/cG1m/3Vxav95dG3/h4N8/6yoov/Pzcj/2tfS/9bS
zP/Qy8T/zMfA/8jDvP+8uLH/rKmi/5uYkf+NioL/gH13/3h1b/94dW7/fHhx/3p3cP96d3D/endv/3x5
cv96d3D/eHVu/3t4cv+HhH3/lJCJ/6OfmP+wrKT/vrqx/8G8s//AvLP/v7qx/766sf/Fwbr/sa6p/09O
Rf82Niz/EREN/wwIBP9QS0P/XVpV/0A+Ov0zMzBoPzw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJP
SwBWU08YRkRBy1FPSv9nZF7/cGxm/3h0bv+Xk47/x8XA/+De2v/d2tX/08/I/87Jwv/Au7T/qaSe/4uH
gf97eHL/dXJs/3Vya/98eXH/g394/4mFff+OioH/k46G/5eSiv+ZlIv/mZSL/5eSiv+Tjob/jYmB/4iE
ff+Cfnf/endv/3VybP94dW//goB5/5qXj/+wraT/v7qy/8K9tP/BvbT/vrmy/2tpYf8+PTP/ISEa/wUD
Af8tJx//XltV/0RCPvw3NjNbKigjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZEPwBGQz8fRkQ/3lZT
T/9oZV//dnNt/6OhnP/a2NX/5+Tg/9rWz//QzMT/vbmx/5eUjf96d3D/cW1n/3h0bf+Cfnb/jIiA/5SQ
iP+alo3/n5qR/6OelP+loJf/qKKZ/6mkm/+qpJv/q6Wc/6qlnP+po5r/p6GY/6Wflv+hnJP/nJeO/5WQ
iP+Lh3//f3x0/3Rxav9zcGn/h4R9/6qmnv+/u7L/xcC4/4yJgf9FRDr/MTAo/wsLCP8TDQf/TEdA/0tJ
RP47OTZxNzUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBLSUUlS0lF7FpXUv9va2b/paOf/+Tj
4P/n5eH/2NTO/8XAuf+Zlo//dXJs/25rZf95dW7/h4N7/5GMhP+ZlIv/npmQ/6Gck/+kn5b/paCY/6ei
mf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6ulnP+qpJv/qKKZ/6Wgl/+hnJP/m5aN/5KN
hP+EgHj/dXFq/3BtZ/+Fgnv/r6uj/6+ro/9SUUf/PDwy/xoaFP8GAwD/MSoi/0lHQv85NzWHcGlYAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSQBPTUklT01J7GBeWf+cmpb/4+Lg/+ro5P/X083/r6ul/3p3
cf9pZmD/dnJr/4SAef+Pi4P/l5GJ/5uWjv+emZD/oJuS/6KdlP+kn5X/pqGX/6eimf+po5r/qqSb/6qk
m/+rpZz/q6Wc/6ulnP+rpZz/q6Wc/6ulnP+qpJv/qKOa/6eimf+loJf/pJ+V/6Cckv+alo3/kIyE/4J+
dv9va2X/bWpk/5GNhv9raWH/QkE2/ysqIv8IBwX/GBEK/z06Nf83NjOZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFBPSwBQTkslUU9L7H58eP/Y1tT/7uvo/9TQyv+ZlpD/aWZh/2tnYf98eHH/iYV9/5GN
hP+WkYn/mZSM/5uWjv+emZD/oJuS/6Gck/+inZP/oZuS/52Yj/+alYz/lpGI/5CLg/+OioH/joqB/4+K
gv+VkIf/mpWM/5+Zkf+jnZX/paCX/6WhmP+loJb/o56V/6Kdk/+gm5H/nJeP/5aRiP+JhX3/d3Ns/2dl
Xv9aWFH/REM5/zg4Lv8TEw//CgYB/yokHP8yMS+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJR
TQBPTkolW1lW7K6sqf/t6+j/1tLN/4uIgv9fXVf/bGli/356c/+JhX3/j4uC/5KOhf+VkIj/mJOL/5qV
jf+alYz/l5KK/5GMhP+Ig3v/fnlx/3NvZ/9qZl//ZGBZ/11ZU/9aVlD/V1RO/1hUT/9dWVP/Yl9Y/2xn
Yf93cmr/g352/5GMg/+alYz/n5qR/6Cbkv+fmpH/nZiP/5uVjf+WkYn/jIiA/3x4cf9hX1n/QUA3/0FA
Nf8kIxz/BgUD/xoSC/8oJSKamv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlXUwBRT0sldHJv7NLQ
zv/h3tn/jImD/1tYUv9qZ2H/fHhx/4aCev+Lh37/joqB/5GNhP+Tj4b/k46F/4+Kgf+Hgnr/fnlx/3dy
av9ybWb/cGxk/29rZP9taWL/cW1m/3JuZ/9wbGX/bmtk/25qZP9oZV//Y19Z/2RfWf9iXVf/ZGBa/2tm
X/91cGj/gn51/4+Kgv+Yk4r/m5WN/5qUjP+Xkor/k46G/4uHfv97eHD/UVBI/0JBN/8zMin/Dg0K/w4I
Av8eFw+nDTBaATUaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjYABZV1QmkI6L7eDe2/+fnJj/V1RP/2Zj
Xf94dW3/gn53/4aCe/+KhX7/jYiA/46JgP+Nh37/h4J4/4N+dP+Efnb/ioR8/5KOhf+dmJH/p6Ob/7Cs
pP+zr6f/urav/7y4sf+7t7D/urau/7i0rP+xrKX/qaWd/6Sfl/+alY3/kYyE/4aCev99eHD/enVu/355
cf+FgHj/jYiA/5SPhv+UkIj/ko6G/4+Lgv+JhH3/amdg/0RDOv8+PTP/HBwW/wcFAv8XDgTGCQUBEgIA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFwbABkY18noqCd7b+9uv9dW1f/XVtV/3NvaP99eXH/gX12/4WA
ef+Hgnv/iIJ6/4mDev+Nh37/l5KJ/6ikm/+7t7D/y8jC/9fUz//d2tb/3tzY/+Dd2f/e3Nf/3dvV/9vY
0//Y1dD/1tPN/9PQyv/QzMX/zcnC/8nFvv/FwLn/wLuz/7m0rP+wq6L/pqCZ/56Zkf+ZlI3/lpGL/5OO
hv+QjIP/kIuD/46Kgf+Lh3//gHx1/09NRP9CQTf/LCwk/wkJBv8QCQL0Fg0DTyMVBQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHl4dABycG0ooJ6a7Xd1cf9RT0r/amZg/3dzbP98eHH/f3t0/4F8dP+CfXX/jId//6Oe
lv++urT/2NXQ/+fl4v/u7On/7u3q/+3r6P/q6OX/5+Xi/+Ti3//i4Nz/393Y/93a1f/a19L/19TP/9TR
zP/Sz8j/0MzF/83Jwv/Kxr//x8O8/8TAuP/BvbT/vbiw/7mzq/+0sKj/s6+o/7Ovqf+qp6D/mZSM/42I
gP+KhH3/hoJ7/2ViWv9DQjf/Ojkw/xUVEP8JBQH/GA0EoQIAAAcKBQIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKA
fACHhYIogX977FFPS/9cWVT/b2tl/3ZybP96dm7/fHhw/4eCev+inpb/yMS//+Xj4P/z8vD/9vX0//Tz
8f/x8O7/7+3q/+zq5//p5+T/5+Xi/+Xj3//j4N3/4N7Z/97b1v/b2NP/2NXQ/9bTzv/T0Mr/0c7H/87L
xP/Mx8H/ycS9/8bCuv/Dv7f/wLyz/7+6sf++ubD/vLev/725sv/Fwrz/w8C7/6mlnv+OiYL/hYB5/3Zy
a/9JRz7/QkE2/yYlHv8GBQP/EwsC5Q4GADMJAwAABgUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBuagB4dnIfV1VR2E1L
R/9kYVv/cG1n/3Vxav97d3D/lZGK/8TBvP/o5+T/+Pf2//n49//29vT/9PPx//Lx7//w7+3/7u3q/+zq
5//p5+T/5+Xi/+Xj3//j4d3/4d/a/9/c1//d2dT/2tbR/9fUz//U0cz/0s/I/9DMxf/NycL/y8a//8fD
vP/Fwbn/wr61/8C8s//AvLP/wLuy/7+6sf/BvbT/zcrE/9bU0f+7uLP/j4uF/397c/9WVEz/QkE3/zQz
Kv8VFRL/Ih0X/y8nH3wAAAABAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRABMSUUXREI+yVJQS/9nZF//cG1m/315
c/+npJ7/3NrX//b29P/5+fj/+Pf2//b19P/19PL/8/Lw//Lw7v/w7uz/7uzp/+zq5//p5+T/6OXi/+bj
4P/j4d7/4d/b/9/d1//d2tX/29fS/9jVz//V0s3/09DJ/9HNxv/PysT/zMfA/8nFvv/Gwrv/xL+3/8K+
tf/CvbX/wb20/8G8tP/AvLP/wr62/9TQy//l4+H/yMbC/4+LhP9pZV7/SEY9/19eVv90cm3/rKaf/2Ve
VsoAAAAZGxYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVEPwBFQz4hRkRA41dUT/9oZV//fXp0/7a0sP/p6Ob/+fj3//j3
9v/29fT/9fTz//X08v/z8vD/8vHv//Hv7f/v7uv/7uvo/+vp5v/p5+T/5+Xi/+bj4P/k4d3/4t/b/9/d
2P/e2tX/29jT/9jV0P/W083/1NDL/9LOx//PzMT/zcjC/8vGv//Iw7z/xcG6/8TAuP/Ev7f/w7+2/8O/
tv/DvrX/wr61/8bBuf/a2NP/7ezq/8PBvf9+enT/ZWJc/7q4s/9ubWj/T0xH/yIbFPYSCQJXGA4FABcK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAExLRwBMS0clTEpH7VpXUv9zcGv/tbOv//Hx7//5+Pf/9vXz//Xz8v/08/H/9PPx//Py
8P/y8e7/8e/t//Du6//u7On/7ern/+ro5f/p5uP/5+Xi/+bj4P/k4d3/4t/b/+Dd2P/e2tX/3NjT/9nW
0f/X087/1dHL/9LPyP/QzcX/zsrC/8zHwP/JxL3/x8K7/8bCuv/Gwbr/xcG5/8XBuf/FwLj/xMC3/8S/
t//Iw7z/4d7b//Lx8P+2tLD/Y2Bb/2NhWP9DQTj/FRUQ/wYDAP8YDgSmAAAACQYCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO
SgBPTkolT01J7GRiXf+qqKT/7u3r//j39v/08/H/8/Lw//Py8P/y8e//8vHv//Hw7v/x7+3/8O7r/+/t
6f/t6+j/7Onm/+ro5P/o5uP/5+Xh/+Xj3//k4d3/4t/b/+Dd1//e29b/3NjT/9rW0f/X1M7/1dLM/9PQ
yf/Rzcb/z8vD/83Iwf/Lxr//ycS9/8nEvf/Iw7z/yMO8/8fDu//Hwrv/xsK6/8bBuv/Fwbn/zcnC/+7t
6f/r6+n/jouH/0A+Nv9DQjf/Kikh/wgHBP8SCgLnFg0DMx4RBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBQT0slUlBM7IeF
gf/g393/9/b1//Px7//y8O7/8vDu//Lw7v/x8O3/8e/t//Du7P/v7ur/7+3p/+7r6P/s6ub/6+jl/+nn
5P/o5eL/5uTg/+Xj3v/j4dz/4t/a/+Dd1//f29b/3dnT/9vW0f/Y1M//1tLM/9TQyv/Szsf/0MzE/87J
wv/Mx8D/zMa//8vGvv/Lxb7/ysW+/8rEvf/JxL3/ycS8/8jDvP/Hw7v/yMK7/9vY0v/5+Pf/wcC+/09N
SP9ZV07/XlxU/xUUEP8LBgH+FAsCeyUWBgD/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNSTgBPTkolX15a7Le1s//z8vD/8/Hu//Dv
7P/x7+z/8O/s//Dv7P/w7uv/8O7q/+/t6f/u7Oj/7evn/+3q5v/r6eX/6ufk/+jm4//n5eH/5uTg/+Xi
3v/j4Nz/4t/Z/+Dd1//f3Nb/3dnT/9vX0f/Y1c//1tPN/9XRy//Tz8f/0c3F/8/Lw//OycL/zcnB/83I
wf/Nx8D/zMfA/8zGv//Mxr//y8a//8vFvv/Kxb7/ycS9/8/Kw//t6+j/4uHg/2VkYP9YVk/9hoN9/z07
Nf8FAwH/FAsDwgsEABMHAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtZVgBRUEwlfHp37NrZ1//z8u//8O7q//Dt6v/w7er/7+3q/+/t
6f/v7en/7+zo/+7s6P/t6+f/7enm/+zo5f/q6OT/6efj/+jl4v/n5OD/5uPf/+Xi3f/j4Nz/4t/Z/+Dd
1//f3Nb/3dnU/9vX0f/Z1c//19PN/9XRy//T0Mj/0s7G/9HMxP/QzMT/0MzE/8/Lw//Py8P/z8rC/87J
wv/OyMH/zcjB/83HwP/Mx8D/zMa//8zHv//e29b/7+7t/4uKh/45ODLrh4V//V9dVv8REQ3/CgUA8xQK
AUccDwIABQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGlnZABbWlcmlZSR7ejm5P/x7+v/7+3p/+/t6P/v7en/7+3p/+7s6P/u7Oj/7uvn/+3q
5//t6eb/7Onl/+ro5P/p5+P/6ebi/+jl4f/n5OD/5eLe/+Th3f/j4Nv/4t7Z/+Dd1//f3NX/3dnU/9zX
0f/a1dD/2NTO/9bSy//U0Mn/08/H/9POx//Szsb/0s7G/9HNxf/RzcX/0czE/9DMxP/Qy8P/z8vD/8/L
w//PysL/zsnC/83Iwf/W0sz/7uzq/6Oinv4zMi7CbWtk3ISBe/8sKyX/BgQB/xEJApQDAQACAQEAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJx
bQBlZGAnoqGe7ezp5v/w7en/7uzn/+7s6P/u7Oj/7uzo/+7r5//u6uf/7erm/+3p5v/s6OX/6+jk/+rn
4//p5uL/6OXh/+fk4P/m49//5eLe/+Th3f/j4Nv/4d7Y/+Dd1v/f3NX/3tnU/9zX0v/a1tD/2NTO/9fT
zP/V0cv/1dHK/9XQyf/U0Mn/1M/I/9PPx//Tz8f/0s7G/9LOxv/SzcX/0c3F/9HNxf/QzMT/0MzE/8/L
w//Tz8j/6Obi/6mnpP88OzecTkxFkoiGgP9WVE7/CQgG/w4HAdULBQEgBAEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt5dgBxcGwpq6mm7e3r
6P/v7ej/7uzn/+7s5//u6+f/7urn/+7q5//t6ub/7enm/+zp5f/s6OT/6ufj/+nn4//p5uL/6OXh/+fk
4P/m497/5eLd/+Th3P/j4Nr/4t7Y/+Hd1//g3NX/3tnU/93Y0v/b1tD/2dXO/9fTzf/X083/19LM/9bS
zP/W0sv/1dHL/9XRyv/V0Mr/1NDJ/9TPyP/Tz8j/08/H/9POx//Szsb/0s3G/9HNxf/Uz8j/5ePe/6im
ov9CQT2PJyYfOYOBe+h7eXP/IiEc/wUCAPgRCQFbIxICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKBfQB7enYnr66q6u3r5//v7Of/7uvn/+7q
5v/u6ub/7urm/+3q5v/t6eX/7enl/+zo5P/r6OP/6ufj/+nn4v/p5uH/6OXg/+fk3//m497/5eLd/+Th
3P/j4Nr/4t7Y/+Hd1//g3Nb/39rU/93Y0v/c19H/29bQ/9vWz//a1c//2dXO/9nUzv/Y1M3/2NPN/9fT
zP/X0sz/1tLM/9bSy//W0cv/1dHK/9XQyv/U0Mn/1NDI/9PPx//V0cn/4+Db/6Shnv9DQj56AAAABmJg
Wp+Uko3/SEZA/wYFAv8KBACmDAIACAsDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHp3cwBsamYcpaKf0+fk4f/v6+f/7uvm/+7q5v/u6ub/7urm/+3p
5f/t6eX/7Ojk/+zo5P/r6OP/6ufi/+nm4v/p5uH/6OXg/+fk3//m497/5uLd/+Xh3P/k4Nr/49/Y/+He
1//g3Nb/39vU/97Z0//e2NL/3djS/93Y0v/c19H/3NfR/9vW0P/b1tD/29bP/9rVz//Z1c//2dTO/9jU
zv/Y083/19PN/9fTzP/W0sz/1tLL/9bRy//X08z/39zX/5uYlPtGREBUW1lTADk3MkSPjYjsdXJs/xgX
FP8FAQDeCgMAJgkDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHFuagBQTUoKnZuWp93b1//w7ej/7+vm/+7q5v/u6ub/7urm/+7q5f/t6eX/7enk/+zo
5P/s6OP/6ufi/+nm4v/p5uH/6OXg/+jk3//n497/5uLd/+Xh3P/k4Nv/49/Z/+Le1//h3db/4d3W/+Dc
1f/g29T/39rU/9/a1P/e2dP/3tnT/97Y0v/d2NL/3dfR/9zX0f/c19H/29bQ/9rW0P/a1c//2dXP/9nV
zv/Z1M7/2NTN/9jTzf/a1s//2dXP/5CNiOZGREEuRUM/AAAAAAt6eXOolJKO/z89N/8CAQD5BAAAZAUA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1q
aACqp6IAkY6Kbs/Lx/zv7Of/7+zm/+/r5v/v6ub/7+rm/+7q5f/u6eX/7enk/+3o5P/s6OP/6+fi/+rn
4v/p5uH/6eXg/+jk3//n497/5uPd/+bi3P/l4dv/5ODa/+Pf2f/j39j/4t7Y/+Le1//h3df/4d3W/+Hd
1v/g3NX/4NzV/9/b1P/f29T/39rT/97Z0//e2NL/3djS/93Y0v/d19H/3NfR/9zW0P/b1tD/29bP/9rV
z//c2NH/x8S+/316dbY8ODQOT0tHAGVjWQBQT0hQmJeT8nRxa/8SEQ7/AAAApAAAAAkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4tACQjIkAhIF9Kri1
sdvp5eD/8O3n//Ds5//v6+b/7+rm/+/q5f/u6eX/7unl/+3o5P/t6OP/7Oji/+zn4v/q5uH/6eXh/+nl
3//o5N//5+Pe/+fj3f/m4t3/5uLc/+Xh2//l4dv/5ODa/+Tg2f/j39n/49/Y/+Pf2P/i3tf/4t7X/+Le
1//h3db/4d3W/+Dc1f/g3NX/39vU/9/b1P/f2tT/3tnT/97Z0//d2NL/3djS/93X0f/b1tD/sK2n+nVy
bmiloZkAQ0ZLACIhHAAAAAANkI+KspeUkP9APjn/AAAA3wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFg38AVlZSBJ6cl4bU0Mz+8Ozn//Ht
5//x7ef/8Ozm/+/r5v/v6uX/7unl/+7p5P/u6eT/7ejj/+zo4v/s5+L/6ubh/+rm4f/p5eD/6eXg/+nl
3//o5N//6OTe/+fj3v/n493/5uLd/+bi3P/m4tz/5eHb/+Xh2//k4Nr/5ODZ/+Tg2f/j39j/49/Y/+Le
1//i3tf/4d3W/+Hd1v/h3db/4NzV/+Dc1f/f29T/39rU/9/a1P/OycP/mpeRxHZybRp+e3UAU1NTAAAA
AADGwr0AeHZxT6imo/N5dnD/ERAO+QAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPytAAhoN9AIiGgCCyr6vI49/a//Dt5//x7ef/8e3o//Ds
5//w6+b/8Ovm/+/r5f/v6uX/7+rl/+7p5P/u6eT/7ejj/+3o4//s6OL/6+fi/+vn4f/q5uH/6ubg/+nl
4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3f/m4t3/5uLc/+bi3P/l4dv/5eHa/+Tg2v/k4Nn/49/Z/+Pf
2P/j39j/4t7X/+Le1//h3db/4d3W/9vX0f+yr6nth4N+VJ6UlQB7e3IAAAAAAAUFAAAmJSIAPjw4DKup
pq+hnpr/RUM+/wAAAKAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDwsIAGz0YALu4tQCWk5BKwb645erm4P/x7Of/8u7p//Lv6v/w7ef/8Ozm//Ds
5v/w7Ob/8Ozm/+/r5f/v6+X/7+vl/+/q5f/u6uT/7unk/+7o4//t6OP/7Oji/+zn4v/r5+L/6+bh/+rm
4f/q5eD/6eXg/+nl3//o5N//6OTe/+fj3v/n493/5+Pd/+bi3f/m4tz/5eHc/+Xh2//k4Nr/5ODa/+Tg
2f/j39n/4NzW/8C8t/uTkIqFdnRxCI2LhQDPz8EAAAAAAAAAAAAuLisA1dTRANXTzkmvrarzkIyG/xwb
GdEAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAeHhvAHZ2cgANFBQCnpyWZ8vHwu7q5eD/8e3o//Pw7P/z8Ov/8e3n//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm/+/r5f/v6+X/7+rl/+7p5P/u6eT/7ejj/+3o4//s5+L/7Ofi/+vn
4f/r5uH/6ubh/+rl4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3v/n493/5uLd/+bi3P/j39n/yMW//5mW
kaNoZWERfn95AP///wAAAAAAAAAAAAAAAAAAAAAA0c3FAOPe1Q/KycazqaWh/3FtaPQODQxCLCooAK+n
nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH19
eACRkIsAnJmVBaGfmmfBvrnl5uHc//Lu6f/18u7/9PHt//Hu6f/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/7+vl/+/q5f/u6uT/7unk/+7p5P/t6OP/7ejj/+zn
4v/s5+L/6+fh/+rm4f/q5uD/6eXg/+nl4P/p5d//6eXf/+Pf2v/EwLv6m5eSm3p4cxuMioMAoKmXAH5z
cwAAAAAAAAAAAAAAAAAAAAAA3NjSAN7c2QDh3ttQtbOx8bKtp/+inZaLZmFaAq6mngAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVkYoAlZONAFJY
VQKZlZBOuLWw0dvX0v/v6+b/9fPv//b08P/z8Oz/8e3n//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm//Dr5v/v6+X/7+rl/+/q5f/u6eT/7unk/+3o
4//t6OP/7Ofi/+zn4v/q5eD/3dnU/7u4s+uVkYx/dHNtD5SSjQAAAAAALCsqAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAODc1gDk3tYK2NbTn6qmo//HwLnTwbuyHbmyqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj42IAIaCfgD///8AiYeFK6ej
n5/Hw77x5eHc//Tx7f/49vP/9/Tx//Pw7P/x7ej/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w6+b/8Ovm//Dr5v/v6uX/7unk/+bh
3P/KxsH9qKahxIuJhU1UUE4Fe3lzAI6LhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wDl4t4A7OnlLrCuqsOnpJ6e2NDJD763sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH11cgCPgoEAkI6LAHdycAuXlJBUsq+ruMvH
w/Xl4t7/9fPx//r49v/59/T/9fLu//Lv6v/x7ef/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8e3n/+/r5f/l4Nv/zsrF/bKuqdiTkIx7endzHK2m
qwCHhH8Ah4N/ALa2tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/JxADLyMEA4+DYAb26
sxOmpJ4NuLGrAL63sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AY2VzAIyIhQCxq6cAiIaDE5qYlFauq6exxsTA6dza
1//v7ev/+Pf1//r59//49vP/9vPv//Tw7P/y7+r/8u7p//Hu6P/x7ef/8e3n//Ht5//x7ef/8e3n//Hu
6P/y7uj/8O3n/+3p4//m4tz/2tbR/8bCvfauq6bGmJWQeICAeigAAAABiYeCAHh4cADJyLwAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX1M8A6ebhALm2sACmpJ4AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSUjgCanJYAkI2KALy4swBqamkLjoyIN6OhnXSysKy3xsTA39bU
0ffi4d7/7Orn//Du7P/z8O3/8/Dt//Lw7P/x7ur/8Ozo/+/r5//u6uX/6OXg/+Lf2v/Z1dD/zMjD/b67
t+etqqbJn5yXko6MiExwb2sY////AI2MhQB+fHoAlpOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAADAwMAP///wCEgoEAlJGPAP///wBcW1kJe3p2LJGPi1KjoZ13rKmmmrKv
rLq5trPRvLq33L27t+C6uLTlt7Wx4ra0sNuyr6vYqKaiwaGemqeal5OEjouHYHx6djhraGcSAAAAAZqY
kwB+fHgAXmBeAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8Axse9ADUzMQBqa2oAfHt4AJCOigD///8AOjs5BmJgXg1+fHoThYSAFYB/
eiF6eXUvenl2JoSDgBV8enYUZmVhDklHRQkAAAAClZKOAHx5dQBwbWwAeHd1AHJvbAD07OQABQUFAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUwB4eHUAenl3AIOBfwCUko8AmZeUAI+OigCGhYEAiIaDAJeV
kgCQjooAgn98AHRybwBwb2kAc3NsAP///wAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8AAAD///////////8A
AAD/////AH////8AAAD////AAAD///8AAAD///wAAAAf//8AAAD///gAAAAP//8AAAD//+AAAAAB//8A
AAD//4AAAAAA//8AAAD//wAAAAAAf/8AAAD//gAAAAAAP/8AAAD//AAAAAAAH/8AAAD/+AAAAAAAD/8A
AAD/8AAAAAAAB/8AAAD/8AAAAAAAB/8AAAD/8AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAP8A
AAD/4AAAAAAAAP8AAAD/4AAAAAAAAP8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8A
AAD/4AAAAAAAAD8AAAD/4AAAAAAAAD8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAA8A
AAD/4AAAAAAAAA8AAAD/4AAAAAAAAA8AAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcA
AAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAEA
AAD/8AAAAAAABAEAAAD/8AAAAAAABgEAAAD/+AAAAAAABwAAAAD/+AAAAAAADwAAAAD//gAAAAAAH4AA
AAD//wAAAAAAP4AAAAD//wAAAAAAf4AAAAD//4AAAAAA/8EAAAD///AAAAAD//8AAAD///wAAAAP//8A
AAD///4AAAA///8AAAD////gAAP///8AAAD///////////8AAAD///////////8AAAD///////////8A
AAA=
</value>
</data>
</root>

1121
DBChm/MainForm.cs Normal file

File diff suppressed because it is too large Load Diff

837
DBChm/MainForm.designer.cs generated Normal file
View File

@ -0,0 +1,837 @@
namespace DBCHM
{
partial class MainForm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
this.imgList = new System.Windows.Forms.ImageList(this.components);
this.tlTip = new System.Windows.Forms.ToolTip(this.components);
this.TxtSearchWords = new System.Windows.Forms.TextBox();
this.tabLayoutPnl = new System.Windows.Forms.TableLayoutPanel();
this.mainPnl = new System.Windows.Forms.Panel();
this.treePnl = new System.Windows.Forms.Panel();
this.label2 = new System.Windows.Forms.Label();
this.lblTongJi = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.CkAll = new System.Windows.Forms.CheckBox();
this.CkReverse = new System.Windows.Forms.CheckBox();
this.lblSelectRes = new System.Windows.Forms.Label();
this.gpxHandle = new System.Windows.Forms.GroupBox();
this.codePnl = new System.Windows.Forms.Panel();
this.txtCode = new ICSharpCode.TextEditor.TextEditorControl();
this.pizhuPnl = new System.Windows.Forms.Panel();
this.gpCurrTable = new System.Windows.Forms.GroupBox();
this.labCurrTabComment = new System.Windows.Forms.Label();
this.TxtCurrTabComment = new System.Windows.Forms.TextBox();
this.LabCurrTabName = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.GpColumns = new System.Windows.Forms.GroupBox();
this.lblTip = new System.Windows.Forms.Label();
this.GV_ColComments = new System.Windows.Forms.DataGridView();
this.ColXuHao = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColName = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColDataType = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColLength = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.ColComment = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.BtnSaveGridData = new ComponentFactory.Krypton.Toolkit.KryptonButton();
this.RibbonTabContainer = new System.Windows.Forms.TabControl();
this.tpfile = new System.Windows.Forms.TabPage();
this.ribbonPageFile = new System.Windows.Forms.ToolStrip();
this.tsbConnect = new System.Windows.Forms.ToolStripButton();
this.tsbRefresh = new System.Windows.Forms.ToolStripButton();
this.tsbBuild = new System.Windows.Forms.ToolStripButton();
this.tsWordExp = new System.Windows.Forms.ToolStripButton();
this.tsExcelExp = new System.Windows.Forms.ToolStripButton();
this.tsPdfExp = new System.Windows.Forms.ToolStripButton();
this.tsHtmlExp = new System.Windows.Forms.ToolStripButton();
this.tsXmlExp = new System.Windows.Forms.ToolStripButton();
this.tsMarkDownExp = new System.Windows.Forms.ToolStripButton();
this.tptool = new System.Windows.Forms.TabPage();
this.tsbPDMUpload = new System.Windows.Forms.ToolStrip();
this.toolStripButton3 = new System.Windows.Forms.ToolStripButton();
this.apabout = new System.Windows.Forms.TabPage();
this.ribbonPageAbout = new System.Windows.Forms.ToolStrip();
this.toolStripButtonAbout = new System.Windows.Forms.ToolStripButton();
this.miniToolStrip = new System.Windows.Forms.ToolStrip();
this.treeDB = new DBCHM.TreeViewEnhanced();
this.tabLayoutPnl.SuspendLayout();
this.mainPnl.SuspendLayout();
this.treePnl.SuspendLayout();
this.gpxHandle.SuspendLayout();
this.codePnl.SuspendLayout();
this.pizhuPnl.SuspendLayout();
this.gpCurrTable.SuspendLayout();
this.GpColumns.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.GV_ColComments)).BeginInit();
this.RibbonTabContainer.SuspendLayout();
this.tpfile.SuspendLayout();
this.ribbonPageFile.SuspendLayout();
this.tptool.SuspendLayout();
this.tsbPDMUpload.SuspendLayout();
this.apabout.SuspendLayout();
this.ribbonPageAbout.SuspendLayout();
this.SuspendLayout();
//
// imgList
//
this.imgList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList.ImageStream")));
this.imgList.TransparentColor = System.Drawing.Color.Transparent;
this.imgList.Images.SetKeyName(0, "folder");
this.imgList.Images.SetKeyName(1, "table");
this.imgList.Images.SetKeyName(2, "view");
this.imgList.Images.SetKeyName(3, "proc");
this.imgList.Images.SetKeyName(4, "func");
//
// tlTip
//
this.tlTip.AutoPopDelay = 5000;
this.tlTip.InitialDelay = 100;
this.tlTip.IsBalloon = true;
this.tlTip.ReshowDelay = 100;
this.tlTip.ToolTipIcon = System.Windows.Forms.ToolTipIcon.Info;
this.tlTip.ToolTipTitle = "提示";
//
// TxtSearchWords
//
this.TxtSearchWords.Location = new System.Drawing.Point(58, 9);
this.TxtSearchWords.Margin = new System.Windows.Forms.Padding(2);
this.TxtSearchWords.Name = "TxtSearchWords";
this.TxtSearchWords.Size = new System.Drawing.Size(221, 21);
this.TxtSearchWords.TabIndex = 13;
this.tlTip.SetToolTip(this.TxtSearchWords, "多个关键字搜索用英文逗号(,)隔开!");
this.TxtSearchWords.TextChanged += new System.EventHandler(this.TxtSearchWords_TextChanged);
//
// tabLayoutPnl
//
this.tabLayoutPnl.AutoSize = true;
this.tabLayoutPnl.ColumnCount = 1;
this.tabLayoutPnl.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tabLayoutPnl.Controls.Add(this.mainPnl, 0, 1);
this.tabLayoutPnl.Controls.Add(this.RibbonTabContainer, 0, 0);
this.tabLayoutPnl.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabLayoutPnl.Location = new System.Drawing.Point(0, 0);
this.tabLayoutPnl.Name = "tabLayoutPnl";
this.tabLayoutPnl.RowCount = 2;
this.tabLayoutPnl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tabLayoutPnl.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 85F));
this.tabLayoutPnl.Size = new System.Drawing.Size(1076, 700);
this.tabLayoutPnl.TabIndex = 5;
//
// mainPnl
//
this.mainPnl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.mainPnl.Controls.Add(this.treePnl);
this.mainPnl.Controls.Add(this.gpxHandle);
this.mainPnl.Location = new System.Drawing.Point(3, 108);
this.mainPnl.Name = "mainPnl";
this.mainPnl.Size = new System.Drawing.Size(1070, 589);
this.mainPnl.TabIndex = 14;
//
// treePnl
//
this.treePnl.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.treePnl.Controls.Add(this.label2);
this.treePnl.Controls.Add(this.treeDB);
this.treePnl.Controls.Add(this.lblTongJi);
this.treePnl.Controls.Add(this.label1);
this.treePnl.Controls.Add(this.CkAll);
this.treePnl.Controls.Add(this.TxtSearchWords);
this.treePnl.Controls.Add(this.CkReverse);
this.treePnl.Controls.Add(this.lblSelectRes);
this.treePnl.Location = new System.Drawing.Point(3, 0);
this.treePnl.Name = "treePnl";
this.treePnl.Size = new System.Drawing.Size(324, 589);
this.treePnl.TabIndex = 20;
//
// label2
//
this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(5, 571);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(0, 12);
this.label2.TabIndex = 19;
//
// lblTongJi
//
this.lblTongJi.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lblTongJi.AutoSize = true;
this.lblTongJi.Location = new System.Drawing.Point(5, 571);
this.lblTongJi.Name = "lblTongJi";
this.lblTongJi.Size = new System.Drawing.Size(0, 12);
this.lblTongJi.TabIndex = 19;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(14, 14);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(29, 12);
this.label1.TabIndex = 16;
this.label1.Text = "搜索";
//
// CkAll
//
this.CkAll.AutoSize = true;
this.CkAll.Location = new System.Drawing.Point(16, 34);
this.CkAll.Name = "CkAll";
this.CkAll.Size = new System.Drawing.Size(48, 16);
this.CkAll.TabIndex = 15;
this.CkAll.Text = "全选";
this.CkAll.UseVisualStyleBackColor = true;
this.CkAll.CheckedChanged += new System.EventHandler(this.CkAll_CheckedChanged);
//
// CkReverse
//
this.CkReverse.AutoSize = true;
this.CkReverse.Location = new System.Drawing.Point(70, 35);
this.CkReverse.Name = "CkReverse";
this.CkReverse.Size = new System.Drawing.Size(48, 16);
this.CkReverse.TabIndex = 17;
this.CkReverse.Text = "反选";
this.CkReverse.UseVisualStyleBackColor = true;
this.CkReverse.CheckedChanged += new System.EventHandler(this.CkReverse_CheckedChanged);
//
// lblSelectRes
//
this.lblSelectRes.AutoSize = true;
this.lblSelectRes.Location = new System.Drawing.Point(191, 36);
this.lblSelectRes.Name = "lblSelectRes";
this.lblSelectRes.Size = new System.Drawing.Size(83, 12);
this.lblSelectRes.TabIndex = 16;
this.lblSelectRes.Text = "已选择0个项目";
//
// gpxHandle
//
this.gpxHandle.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.gpxHandle.Controls.Add(this.codePnl);
this.gpxHandle.Controls.Add(this.pizhuPnl);
this.gpxHandle.Location = new System.Drawing.Point(330, 3);
this.gpxHandle.Name = "gpxHandle";
this.gpxHandle.Size = new System.Drawing.Size(737, 583);
this.gpxHandle.TabIndex = 21;
this.gpxHandle.TabStop = false;
this.gpxHandle.Text = "操作";
//
// codePnl
//
this.codePnl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.codePnl.Controls.Add(this.txtCode);
this.codePnl.Location = new System.Drawing.Point(8000, 20);
this.codePnl.Name = "codePnl";
this.codePnl.Size = new System.Drawing.Size(725, 557);
this.codePnl.TabIndex = 1;
//
// txtCode
//
this.txtCode.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.txtCode.Highlighting = "SQL";
this.txtCode.Location = new System.Drawing.Point(13, 13);
this.txtCode.Name = "txtCode";
this.txtCode.ShowSpaces = true;
this.txtCode.Size = new System.Drawing.Size(700, 530);
this.txtCode.TabIndex = 0;
this.txtCode.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
//
// pizhuPnl
//
this.pizhuPnl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.pizhuPnl.Controls.Add(this.gpCurrTable);
this.pizhuPnl.Controls.Add(this.GpColumns);
this.pizhuPnl.Location = new System.Drawing.Point(6, 20);
this.pizhuPnl.Name = "pizhuPnl";
this.pizhuPnl.Size = new System.Drawing.Size(725, 557);
this.pizhuPnl.TabIndex = 0;
//
// gpCurrTable
//
this.gpCurrTable.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.gpCurrTable.Controls.Add(this.labCurrTabComment);
this.gpCurrTable.Controls.Add(this.TxtCurrTabComment);
this.gpCurrTable.Controls.Add(this.LabCurrTabName);
this.gpCurrTable.Controls.Add(this.label3);
this.gpCurrTable.Location = new System.Drawing.Point(8, 13);
this.gpCurrTable.Margin = new System.Windows.Forms.Padding(2);
this.gpCurrTable.Name = "gpCurrTable";
this.gpCurrTable.Padding = new System.Windows.Forms.Padding(2);
this.gpCurrTable.Size = new System.Drawing.Size(705, 73);
this.gpCurrTable.TabIndex = 11;
this.gpCurrTable.TabStop = false;
this.gpCurrTable.Text = "表批注";
//
// labCurrTabComment
//
this.labCurrTabComment.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.labCurrTabComment.AutoSize = true;
this.labCurrTabComment.Location = new System.Drawing.Point(199, 42);
this.labCurrTabComment.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.labCurrTabComment.Name = "labCurrTabComment";
this.labCurrTabComment.Size = new System.Drawing.Size(53, 12);
this.labCurrTabComment.TabIndex = 7;
this.labCurrTabComment.Text = "表批注:";
//
// TxtCurrTabComment
//
this.TxtCurrTabComment.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.TxtCurrTabComment.Location = new System.Drawing.Point(254, 39);
this.TxtCurrTabComment.Margin = new System.Windows.Forms.Padding(2);
this.TxtCurrTabComment.Name = "TxtCurrTabComment";
this.TxtCurrTabComment.Size = new System.Drawing.Size(300, 21);
this.TxtCurrTabComment.TabIndex = 3;
//
// LabCurrTabName
//
this.LabCurrTabName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.LabCurrTabName.AutoSize = true;
this.LabCurrTabName.Location = new System.Drawing.Point(259, 17);
this.LabCurrTabName.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.LabCurrTabName.Name = "LabCurrTabName";
this.LabCurrTabName.Size = new System.Drawing.Size(0, 12);
this.LabCurrTabName.TabIndex = 5;
this.LabCurrTabName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label3
//
this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)));
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(212, 17);
this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(41, 12);
this.label3.TabIndex = 6;
this.label3.Text = "表名:";
//
// GpColumns
//
this.GpColumns.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.GpColumns.Controls.Add(this.lblTip);
this.GpColumns.Controls.Add(this.GV_ColComments);
this.GpColumns.Controls.Add(this.BtnSaveGridData);
this.GpColumns.Location = new System.Drawing.Point(8, 90);
this.GpColumns.Margin = new System.Windows.Forms.Padding(2);
this.GpColumns.Name = "GpColumns";
this.GpColumns.Padding = new System.Windows.Forms.Padding(2);
this.GpColumns.Size = new System.Drawing.Size(705, 453);
this.GpColumns.TabIndex = 10;
this.GpColumns.TabStop = false;
this.GpColumns.Text = "列批注";
//
// lblTip
//
this.lblTip.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.lblTip.AutoSize = true;
this.lblTip.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblTip.Location = new System.Drawing.Point(22, 411);
this.lblTip.Name = "lblTip";
this.lblTip.Size = new System.Drawing.Size(0, 21);
this.lblTip.TabIndex = 9;
//
// GV_ColComments
//
this.GV_ColComments.AllowUserToAddRows = false;
this.GV_ColComments.AllowUserToDeleteRows = false;
this.GV_ColComments.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.GV_ColComments.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.DisplayedCells;
this.GV_ColComments.CellBorderStyle = System.Windows.Forms.DataGridViewCellBorderStyle.Raised;
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.GV_ColComments.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.GV_ColComments.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.GV_ColComments.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.ColXuHao,
this.ColName,
this.ColDataType,
this.ColLength,
this.ColComment});
this.GV_ColComments.Location = new System.Drawing.Point(4, 18);
this.GV_ColComments.Margin = new System.Windows.Forms.Padding(2);
this.GV_ColComments.MultiSelect = false;
this.GV_ColComments.Name = "GV_ColComments";
this.GV_ColComments.RowTemplate.Height = 27;
this.GV_ColComments.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.CellSelect;
this.GV_ColComments.Size = new System.Drawing.Size(697, 363);
this.GV_ColComments.TabIndex = 0;
this.GV_ColComments.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.GV_ColComments_CellClick);
this.GV_ColComments.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.GV_ColComments_PreviewKeyDown);
//
// ColXuHao
//
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.ColXuHao.DefaultCellStyle = dataGridViewCellStyle2;
this.ColXuHao.FillWeight = 10F;
this.ColXuHao.HeaderText = "序号";
this.ColXuHao.MinimumWidth = 30;
this.ColXuHao.Name = "ColXuHao";
this.ColXuHao.ReadOnly = true;
this.ColXuHao.Width = 54;
//
// ColName
//
dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.ColName.DefaultCellStyle = dataGridViewCellStyle3;
this.ColName.FillWeight = 20F;
this.ColName.HeaderText = "列名";
this.ColName.MinimumWidth = 150;
this.ColName.Name = "ColName";
this.ColName.ReadOnly = true;
this.ColName.Width = 150;
//
// ColDataType
//
dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.ColDataType.DefaultCellStyle = dataGridViewCellStyle4;
this.ColDataType.FillWeight = 23F;
this.ColDataType.HeaderText = "数据类型";
this.ColDataType.MinimumWidth = 110;
this.ColDataType.Name = "ColDataType";
this.ColDataType.ReadOnly = true;
this.ColDataType.Width = 110;
//
// ColLength
//
dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
this.ColLength.DefaultCellStyle = dataGridViewCellStyle5;
this.ColLength.FillWeight = 12F;
this.ColLength.HeaderText = "长度";
this.ColLength.MinimumWidth = 30;
this.ColLength.Name = "ColLength";
this.ColLength.ReadOnly = true;
this.ColLength.Width = 54;
//
// ColComment
//
this.ColComment.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;
dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
this.ColComment.DefaultCellStyle = dataGridViewCellStyle6;
this.ColComment.FillWeight = 35F;
this.ColComment.HeaderText = "列批注";
this.ColComment.MinimumWidth = 320;
this.ColComment.Name = "ColComment";
this.ColComment.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// BtnSaveGridData
//
this.BtnSaveGridData.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.BtnSaveGridData.Location = new System.Drawing.Point(593, 400);
this.BtnSaveGridData.Margin = new System.Windows.Forms.Padding(2);
this.BtnSaveGridData.Name = "BtnSaveGridData";
this.BtnSaveGridData.Size = new System.Drawing.Size(98, 34);
this.BtnSaveGridData.TabIndex = 8;
this.BtnSaveGridData.Values.Text = "保存";
this.BtnSaveGridData.Click += new System.EventHandler(this.BtnSaveGridData_Click);
//
// RibbonTabContainer
//
this.RibbonTabContainer.Controls.Add(this.tpfile);
this.RibbonTabContainer.Controls.Add(this.tptool);
this.RibbonTabContainer.Controls.Add(this.apabout);
this.RibbonTabContainer.Dock = System.Windows.Forms.DockStyle.Fill;
this.RibbonTabContainer.ItemSize = new System.Drawing.Size(65, 20);
this.RibbonTabContainer.Location = new System.Drawing.Point(3, 2);
this.RibbonTabContainer.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.RibbonTabContainer.Name = "RibbonTabContainer";
this.RibbonTabContainer.SelectedIndex = 0;
this.RibbonTabContainer.Size = new System.Drawing.Size(1070, 101);
this.RibbonTabContainer.SizeMode = System.Windows.Forms.TabSizeMode.Fixed;
this.RibbonTabContainer.TabIndex = 3;
this.RibbonTabContainer.Selecting += new System.Windows.Forms.TabControlCancelEventHandler(this.RibbonTabContainer_Selecting);
this.RibbonTabContainer.Selected += new System.Windows.Forms.TabControlEventHandler(this.RibbonTabContainer_Selected);
this.RibbonTabContainer.MouseClick += new System.Windows.Forms.MouseEventHandler(this.RibbonTabContainer_MouseClick);
this.RibbonTabContainer.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.RibbonTabContainer_MouseDoubleClick);
//
// tpfile
//
this.tpfile.Controls.Add(this.ribbonPageFile);
this.tpfile.Location = new System.Drawing.Point(4, 24);
this.tpfile.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tpfile.Name = "tpfile";
this.tpfile.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.tpfile.Size = new System.Drawing.Size(1062, 73);
this.tpfile.TabIndex = 0;
this.tpfile.Text = "文件";
this.tpfile.ToolTipText = "文件";
//
// ribbonPageFile
//
this.ribbonPageFile.BackColor = System.Drawing.SystemColors.Control;
this.ribbonPageFile.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.ribbonPageFile.Dock = System.Windows.Forms.DockStyle.Fill;
this.ribbonPageFile.Font = new System.Drawing.Font("Segoe UI", 9F);
this.ribbonPageFile.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.ribbonPageFile.ImageScalingSize = new System.Drawing.Size(48, 48);
this.ribbonPageFile.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.tsbConnect,
this.tsbRefresh,
this.tsbBuild,
this.tsWordExp,
this.tsExcelExp,
this.tsPdfExp,
this.tsHtmlExp,
this.tsXmlExp,
this.tsMarkDownExp});
this.ribbonPageFile.Location = new System.Drawing.Point(3, 2);
this.ribbonPageFile.Name = "ribbonPageFile";
this.ribbonPageFile.Size = new System.Drawing.Size(1056, 69);
this.ribbonPageFile.TabIndex = 0;
this.ribbonPageFile.Text = "toolStripFile";
this.ribbonPageFile.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ribbonPageFile_ItemClicked);
//
// tsbConnect
//
this.tsbConnect.Image = ((System.Drawing.Image)(resources.GetObject("tsbConnect.Image")));
this.tsbConnect.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbConnect.Name = "tsbConnect";
this.tsbConnect.Size = new System.Drawing.Size(63, 66);
this.tsbConnect.Text = "数据连接";
this.tsbConnect.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbConnect.Click += new System.EventHandler(this.tsbConnect_Click);
//
// tsbRefresh
//
this.tsbRefresh.Image = ((System.Drawing.Image)(resources.GetObject("tsbRefresh.Image")));
this.tsbRefresh.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbRefresh.Name = "tsbRefresh";
this.tsbRefresh.Size = new System.Drawing.Size(63, 66);
this.tsbRefresh.Text = "重新获取";
this.tsbRefresh.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbRefresh.Click += new System.EventHandler(this.tsbRefresh_Click);
//
// tsbBuild
//
this.tsbBuild.Image = ((System.Drawing.Image)(resources.GetObject("tsbBuild.Image")));
this.tsbBuild.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsbBuild.Name = "tsbBuild";
this.tsbBuild.Size = new System.Drawing.Size(65, 66);
this.tsbBuild.Tag = "chm";
this.tsbBuild.Text = "CHM导出";
this.tsbBuild.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsbBuild.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tsWordExp
//
this.tsWordExp.Image = ((System.Drawing.Image)(resources.GetObject("tsWordExp.Image")));
this.tsWordExp.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsWordExp.Name = "tsWordExp";
this.tsWordExp.Size = new System.Drawing.Size(66, 66);
this.tsWordExp.Tag = "word";
this.tsWordExp.Text = "Word导出";
this.tsWordExp.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsWordExp.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tsExcelExp
//
this.tsExcelExp.Image = ((System.Drawing.Image)(resources.GetObject("tsExcelExp.Image")));
this.tsExcelExp.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsExcelExp.Name = "tsExcelExp";
this.tsExcelExp.Size = new System.Drawing.Size(63, 66);
this.tsExcelExp.Tag = "excel";
this.tsExcelExp.Text = "Excel导出";
this.tsExcelExp.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsExcelExp.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tsPdfExp
//
this.tsPdfExp.Image = ((System.Drawing.Image)(resources.GetObject("tsPdfExp.Image")));
this.tsPdfExp.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsPdfExp.Name = "tsPdfExp";
this.tsPdfExp.Size = new System.Drawing.Size(58, 66);
this.tsPdfExp.Tag = "pdf";
this.tsPdfExp.Text = "PDF导出";
this.tsPdfExp.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsPdfExp.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tsHtmlExp
//
this.tsHtmlExp.Image = ((System.Drawing.Image)(resources.GetObject("tsHtmlExp.Image")));
this.tsHtmlExp.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsHtmlExp.Name = "tsHtmlExp";
this.tsHtmlExp.Size = new System.Drawing.Size(64, 66);
this.tsHtmlExp.Tag = "html";
this.tsHtmlExp.Text = "Html导出";
this.tsHtmlExp.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
this.tsHtmlExp.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsHtmlExp.ToolTipText = "Html导出";
this.tsHtmlExp.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tsXmlExp
//
this.tsXmlExp.Image = ((System.Drawing.Image)(resources.GetObject("tsXmlExp.Image")));
this.tsXmlExp.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsXmlExp.Name = "tsXmlExp";
this.tsXmlExp.Size = new System.Drawing.Size(61, 66);
this.tsXmlExp.Tag = "xml";
this.tsXmlExp.Text = "XML导出";
this.tsXmlExp.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsXmlExp.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tsMarkDownExp
//
this.tsMarkDownExp.Image = ((System.Drawing.Image)(resources.GetObject("tsMarkDownExp.Image")));
this.tsMarkDownExp.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tsMarkDownExp.Name = "tsMarkDownExp";
this.tsMarkDownExp.Size = new System.Drawing.Size(56, 66);
this.tsMarkDownExp.Tag = "markdown";
this.tsMarkDownExp.Text = "MD导出";
this.tsMarkDownExp.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.tsMarkDownExp.Click += new System.EventHandler(this.tsbBuild_Click);
//
// tptool
//
this.tptool.Controls.Add(this.tsbPDMUpload);
this.tptool.Location = new System.Drawing.Point(4, 24);
this.tptool.Name = "tptool";
this.tptool.Size = new System.Drawing.Size(1062, 73);
this.tptool.TabIndex = 3;
this.tptool.Text = "工具";
this.tptool.UseVisualStyleBackColor = true;
//
// tsbPDMUpload
//
this.tsbPDMUpload.BackColor = System.Drawing.SystemColors.Control;
this.tsbPDMUpload.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.tsbPDMUpload.Dock = System.Windows.Forms.DockStyle.Fill;
this.tsbPDMUpload.Font = new System.Drawing.Font("Segoe UI", 9F);
this.tsbPDMUpload.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.tsbPDMUpload.ImageScalingSize = new System.Drawing.Size(48, 48);
this.tsbPDMUpload.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButton3});
this.tsbPDMUpload.Location = new System.Drawing.Point(0, 0);
this.tsbPDMUpload.Name = "tsbPDMUpload";
this.tsbPDMUpload.Size = new System.Drawing.Size(1062, 73);
this.tsbPDMUpload.TabIndex = 1;
this.tsbPDMUpload.Text = "toolStripFile";
this.tsbPDMUpload.Click += new System.EventHandler(this.tsbSaveUpload_Click);
//
// toolStripButton3
//
this.toolStripButton3.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButton3.Image")));
this.toolStripButton3.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButton3.Name = "toolStripButton3";
this.toolStripButton3.Size = new System.Drawing.Size(63, 70);
this.toolStripButton3.Text = "批注上载";
this.toolStripButton3.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
//
// apabout
//
this.apabout.BackColor = System.Drawing.SystemColors.Control;
this.apabout.Controls.Add(this.ribbonPageAbout);
this.apabout.Location = new System.Drawing.Point(4, 24);
this.apabout.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.apabout.Name = "apabout";
this.apabout.Padding = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.apabout.Size = new System.Drawing.Size(1062, 73);
this.apabout.TabIndex = 2;
this.apabout.Text = "关于";
this.apabout.ToolTipText = "关于";
//
// ribbonPageAbout
//
this.ribbonPageAbout.BackColor = System.Drawing.SystemColors.Control;
this.ribbonPageAbout.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.ribbonPageAbout.Dock = System.Windows.Forms.DockStyle.Fill;
this.ribbonPageAbout.Font = new System.Drawing.Font("Segoe UI", 9F);
this.ribbonPageAbout.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.ribbonPageAbout.ImageScalingSize = new System.Drawing.Size(48, 48);
this.ribbonPageAbout.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.toolStripButtonAbout});
this.ribbonPageAbout.Location = new System.Drawing.Point(3, 2);
this.ribbonPageAbout.Name = "ribbonPageAbout";
this.ribbonPageAbout.Size = new System.Drawing.Size(1056, 69);
this.ribbonPageAbout.TabIndex = 0;
this.ribbonPageAbout.Text = "toolStripAbout";
//
// toolStripButtonAbout
//
this.toolStripButtonAbout.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonAbout.Image")));
this.toolStripButtonAbout.ImageTransparentColor = System.Drawing.Color.Magenta;
this.toolStripButtonAbout.Name = "toolStripButtonAbout";
this.toolStripButtonAbout.Size = new System.Drawing.Size(52, 66);
this.toolStripButtonAbout.Text = "About";
this.toolStripButtonAbout.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageAboveText;
this.toolStripButtonAbout.Click += new System.EventHandler(this.toolStripButtonAbout_Click);
//
// miniToolStrip
//
this.miniToolStrip.AccessibleName = "新项选择";
this.miniToolStrip.AccessibleRole = System.Windows.Forms.AccessibleRole.ButtonDropDown;
this.miniToolStrip.AutoSize = false;
this.miniToolStrip.BackColor = System.Drawing.SystemColors.Control;
this.miniToolStrip.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None;
this.miniToolStrip.CanOverflow = false;
this.miniToolStrip.Dock = System.Windows.Forms.DockStyle.None;
this.miniToolStrip.Font = new System.Drawing.Font("Segoe UI", 9F);
this.miniToolStrip.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden;
this.miniToolStrip.ImageScalingSize = new System.Drawing.Size(48, 48);
this.miniToolStrip.Location = new System.Drawing.Point(0, 0);
this.miniToolStrip.Name = "miniToolStrip";
this.miniToolStrip.Size = new System.Drawing.Size(894, 70);
this.miniToolStrip.TabIndex = 0;
//
// treeDB
//
this.treeDB.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.treeDB.CheckBoxes = true;
this.treeDB.HideSelection = false;
this.treeDB.ImageIndex = 0;
this.treeDB.ImageList = this.imgList;
this.treeDB.Indent = 16;
this.treeDB.Location = new System.Drawing.Point(0, 57);
this.treeDB.Name = "treeDB";
this.treeDB.SelectedImageIndex = 0;
this.treeDB.Size = new System.Drawing.Size(321, 511);
this.treeDB.TabIndex = 18;
this.treeDB.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeDB_AfterCheck);
this.treeDB.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeDB_AfterSelect);
//
// MainForm
//
this.AcceptButton = this.BtnSaveGridData;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1076, 700);
this.Controls.Add(this.tabLayoutPnl);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.Name = "MainForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "DBCHM";
this.Load += new System.EventHandler(this.MainForm_Load);
this.Resize += new System.EventHandler(this.MainForm_Resize);
this.tabLayoutPnl.ResumeLayout(false);
this.mainPnl.ResumeLayout(false);
this.treePnl.ResumeLayout(false);
this.treePnl.PerformLayout();
this.gpxHandle.ResumeLayout(false);
this.codePnl.ResumeLayout(false);
this.pizhuPnl.ResumeLayout(false);
this.gpCurrTable.ResumeLayout(false);
this.gpCurrTable.PerformLayout();
this.GpColumns.ResumeLayout(false);
this.GpColumns.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.GV_ColComments)).EndInit();
this.RibbonTabContainer.ResumeLayout(false);
this.tpfile.ResumeLayout(false);
this.tpfile.PerformLayout();
this.ribbonPageFile.ResumeLayout(false);
this.ribbonPageFile.PerformLayout();
this.tptool.ResumeLayout(false);
this.tptool.PerformLayout();
this.tsbPDMUpload.ResumeLayout(false);
this.tsbPDMUpload.PerformLayout();
this.apabout.ResumeLayout(false);
this.apabout.PerformLayout();
this.ribbonPageAbout.ResumeLayout(false);
this.ribbonPageAbout.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.ToolTip tlTip;
private System.Windows.Forms.ImageList imgList;
private System.Windows.Forms.TableLayoutPanel tabLayoutPnl;
private System.Windows.Forms.TabControl RibbonTabContainer;
private System.Windows.Forms.TabPage tpfile;
private System.Windows.Forms.ToolStrip ribbonPageFile;
private System.Windows.Forms.ToolStripButton tsbConnect;
private System.Windows.Forms.ToolStripButton tsbRefresh;
private System.Windows.Forms.ToolStripButton tsbBuild;
private System.Windows.Forms.ToolStripButton tsWordExp;
private System.Windows.Forms.ToolStripButton tsExcelExp;
private System.Windows.Forms.ToolStripButton tsPdfExp;
private System.Windows.Forms.ToolStripButton tsHtmlExp;
private System.Windows.Forms.ToolStripButton tsXmlExp;
private System.Windows.Forms.ToolStripButton tsMarkDownExp;
private System.Windows.Forms.TabPage tptool;
private System.Windows.Forms.TabPage apabout;
private System.Windows.Forms.ToolStrip ribbonPageAbout;
private System.Windows.Forms.ToolStripButton toolStripButtonAbout;
private System.Windows.Forms.Panel mainPnl;
private System.Windows.Forms.Label label1;
private TreeViewEnhanced treeDB;
private System.Windows.Forms.CheckBox CkReverse;
private System.Windows.Forms.Label lblSelectRes;
private System.Windows.Forms.TextBox TxtSearchWords;
private System.Windows.Forms.CheckBox CkAll;
private System.Windows.Forms.ToolStrip miniToolStrip;
private System.Windows.Forms.Label lblTongJi;
private System.Windows.Forms.Panel treePnl;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.GroupBox gpxHandle;
private System.Windows.Forms.Panel pizhuPnl;
private System.Windows.Forms.GroupBox gpCurrTable;
private System.Windows.Forms.Label labCurrTabComment;
private System.Windows.Forms.TextBox TxtCurrTabComment;
private System.Windows.Forms.Label LabCurrTabName;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.GroupBox GpColumns;
private System.Windows.Forms.Label lblTip;
private System.Windows.Forms.DataGridView GV_ColComments;
private ComponentFactory.Krypton.Toolkit.KryptonButton BtnSaveGridData;
private System.Windows.Forms.Panel codePnl;
private ICSharpCode.TextEditor.TextEditorControl txtCode;
private System.Windows.Forms.ToolStrip tsbPDMUpload;
private System.Windows.Forms.ToolStripButton toolStripButton3;
private System.Windows.Forms.DataGridViewTextBoxColumn ColXuHao;
private System.Windows.Forms.DataGridViewTextBoxColumn ColName;
private System.Windows.Forms.DataGridViewTextBoxColumn ColDataType;
private System.Windows.Forms.DataGridViewTextBoxColumn ColLength;
private System.Windows.Forms.DataGridViewTextBoxColumn ColComment;
}
}

944
DBChm/MainForm.resx Normal file
View File

@ -0,0 +1,944 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="imgList.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>544, 17</value>
</metadata>
<data name="imgList.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
<value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAACU
DAAAAk1TRnQBSQFMAgEBBQEAAUABBAFAAQQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm
AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM
AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA
ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz
AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ
AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM
AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA
AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA
AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ
AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/
AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA
AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm
ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ
Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz
AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA
AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM
AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM
ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM
Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA
AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM
AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ
AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz
AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm
AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw
AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wEAEKYwAAGzAeIC4Qfc
BNsBpjAAAbMB4gEZAeEG3AXbAaYwAAGzAeIBkgESB9wE2wGmMAABswHiAdwBkgFtAdwD4QPcA9sBpjAA
AbMC4gEZAdwBEgHcAYsBbAHcAWwBiwHbAtwBpjAAAbMD4gHcARIBGQHcARQBEQETAdwB2wLcAaYwAAGz
A+IB3AESARkB4gHcAREBkQTcAaYwAAGzAfQC4gHcARUB4QHiAdwBEAGLAtsC3AGmMAABswH0AuIBtQFD
AuoB7AEQAdwBiwHsAtwBpjAAAbMB/wLiARkB7AHqA+ICGQHhAtwBpjAAAbMB/wH0AuIB3AHqAhkB4gIZ
AeEC3AGmMAABswH/AvQB4gEZAuwBbQHcAeICGQLhAaYwAAGzAf8D9AHiA9wD4gIZAeEBpjAAAbMF/wH0
COIBpjAAELNSAAH/CfMB/zUAAQcB7Af3AesB8BQAAfQG8wbyAfMB/wIAAbUKZgFsBAABBwHyAfQB8wH0
AfMB9ALzAvcD8wIAA60BiwWGAmYBhgMAAbwBHAFzAW4BSwJKAUQEFQFDARUB8wIAAfcB/wLxAfADvAMH
AWwEAAEHAfMBBwHvAfIB9AG8Ae0BBwHtAa4BuwEHAe8CAAGtAvQC8wEZAfECGQHdAQkBhgMAAbwBmgGg
AXoCWQFYBVIBSwEVAfMCAAG1BP8F9AEHAWwEAAEHAfMB8gEHAfIB/wG8Ae8B9AHtAZEB9AEZAe8CAAGt
Af8HiwIJAYYDAAG8AZkBoAGaBHoBWQNTAVIBSgH0AgAB7wH/AbwBBwH/ArsB9AK1AQkBbAQAAQcB8wH0
Av8B8wP/Ae0BkQH0ARkBtQIAAa0B/wL0AvMBGQHzARkB3QEJAYYDAAG8ARoBoAKaA3oCWQJTATEBSgH0
AgABuwb/A/QBvAFsBAABBwHzAfQB/wH0AfMC/wH0Ae0BkQH0ARkBtQIAAa0B/wKLAfQCiwIZAt0BhgMA
AbwBGgHDAaACmgN6AlkBUwExAUoB9AIAAbsB/wK8Af8CBwH/AQcBuwHwAWwEAAEHAfMB8gHvAfEB/wG8
AfcB/wHtAZEB9AHzAbUCAAGtAv8C9ALzAhkB3QEZAYYDAAG8ARoBwwKgApoDegFZAVMBMQFuAfQCAAG7
Cf8B8QFsBAABBwHzAQcBvAH0Af8B8wH3AQcB9wGRAfQB8wHvAgAB1AT/AfQC8wEZAfEBGQGGAwABvAEa
AsMDoAGaA3oBWQFSAXMB9AIAAbsB/wK8Af8CvAH/AgcB8wFsBAABBwHwAbwB9AHzAfIB9AHyAfAB7AHt
Af8BGQHvAgAB1QH/AosB9AH/AfQBGQHzAhkBiwMAAbwBGgHDAhoEoAGaA3oBcwH0AgABuwr/AWwEAAG8
COwBbQEHAf8B8wHvAgAB1QH2Bf8B9AHzAhkBiwMAAfAEmQMcBZkBvAH/AgAB3APWAdUCtAWtBAAB/wHz
AbwB8QbwAfMC9AG7AgABtALVAc8GrQGLAa0DAAHwAZkDGgGZAe8B8wH/BPQB/wMAAdwDCQLcAtYD1QGt
BQAB/wQZAd0DCQTcAgABtAMJAdwD1gPVAa0DAAH/ArwBBwK8AfQKAAHcBNYB1QS0Aq0FAAH/AxkB3QMJ
BdwCAAG1AdUDtALOBa0EAAX/HAAB/wbzBhlQAAFCAU0BPgcAAT4DAAEoAwABQAMAASADAAEBAQABAQYA
AQEWAAP/gQAE/wHAAQcG/wHAAQcC/wGAAQABwAEDAcABAAHAAQMBgAEAAcABAwHAAQABwAEDAYABAAHA
AQMBwAEAAcABAwGAAQABwAEDAcABAAHAAQMBgAEAAcABAwHAAQABwAEDAYABAAHAAQMBwAEAAcABAwGA
AQABwAEDAcABAAHAAQMBgAEAAcABAwHAAQABwAEDAYABAAHAAQMBwAEAAcABAwGAAQABwAEDAcABAAHA
AQMBgAEBAcABAwHgAQABwAEDAYAB/wHAAQMB4AEAAcABAwHBA/8B4AEACv8L
</value>
</data>
<metadata name="tlTip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>466, 17</value>
</metadata>
<metadata name="ColXuHao.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColName.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColDataType.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColLength.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="ColComment.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="BtnSaveGridData.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="ribbonPageFile.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>169, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="tsbConnect.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAYAAADHl1ErAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAARBSURBVHhe7dxpiFZVHMfxMbVyabdcWmzfKJKiRS0qSluJ
KKhAKIoWokXUxPBFBhWmCEZEURFBQRQULVC9CCujlRZKX1REVJgKuZRmlmnL90tz4XI5zswZn2emM/x/
8OHO3Osz4/nPvc899z7n3I5IJBKJ9DhDsR9OwAW4BjNxNxbjETxc4/cP4V7MwY24DKfhIOyGAZdhOBV3
4Bl8ilXYgK34J8Pf+A1r8BVexwJcgn1RdCzU5XgJ65AqQKtswSe4EweguAzGLdiIVAPb6TmMRlHZAy/C
BvzVuewrHrJnoqgMwW34EalGtdPLGIvishOuxBv4GanGtYrvYctwD8aguNh9OBA7Y3fYhZgHD1Mb5lny
d6Qa351tWIuvsQQP4mocCrM/9vzvy3JyDN7FQni2rLIrDsbp8Ax6E+bifjyKx/FYg+vso92F2zENU3As
moW5GJ4t7d8VFftdm2G/6S1YmMMxCK3OKFyIJ+Ge5144G0XlFKxH/VDy+zdhz90TwkWYgMNg32kvuMe4
rHOd70vume5VZ+M63Ifn8S3qv0czUFRSBWuyl/8rVuBLfID38H6D677Ad/Bn/oHUz6sbkAVrpyhYpihY
pihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihYpihY
pihYpihYpihYpihYpuIK5uidX5BqTF9wKHtROQnV0KP+MB1FxWFKLyDVmHZbjckoLpPgeDCHWKYa1g4/
4FY4ZLTIjMfNeAWOqHZEYqqhO8KTy0eYj4lwMHLxcWCwow0dn+q8oWfxIb7HT3AajSOh/+xc1rluE3xP
XInleBUPwD/GWXCEYjuGg/5v4l4wHL7XOWTzREzFuTi50zk4D+fDPedoOMNjJIo95FodJ0RYIO3iikjX
sTtSvTed4YpI13EeZVUw50RGuslRqArmSSKSyCIshRMgPkZVsM/wNtz2DjwpRIjFqIrUlWsRIa/BgnwD
5xXVPQX7Ym6/CkXHiVb24JszN3JVUwOfQDN2RqvtFjT1+hyz0G8ZARvSKk+jGTu2rbxN5BVGv8W5kE6Q
crLVjvCC2cZ4+DXjJVVVMCeqpl6f4woUHw9rC+KTB5zrWPc5qrsdlyJCnMVmQbpzPSLkBtgX646XTRHi
jFonjzrJdHvc7t2NCPG2jbeUvYXjsslrSueIW9gI8WkA3g87Ej5vom4cjofb7WIUHTuVPmHJG4A2urcs
1HHY3vMm3O5TCpxkn3p9Tx2Bft1LLZjF8pDyLkNvWQgb42OymvEZPofA3+O/Sb2+p5xgn/odfRqf3+Vz
duxg9pZ7lh+W7A3/CHUWzMPSPXkfpF7fU/4/vZwrPjbEe/UeLhatziL5XDC3e2URIV6T+mwKC1ctq6/r
66NgnfGw81MgPwBx6aNnVK2r1g+IzxvbEQuoSCQS6TodHf8CdiWsTC73UTEAAAAASUVORK5CYII=
</value>
</data>
<data name="tsbRefresh.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsbBuild.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsWordExp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsExcelExp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
HhM4NfU38485g/fFut8AAAAASUVORK5CYII=
</value>
</data>
<data name="tsPdfExp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsHtmlExp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsXmlExp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<data name="tsMarkDownExp.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
</value>
</data>
<metadata name="tsbPDMUpload.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>769, 17</value>
</metadata>
<data name="toolStripButton3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMPSURBVHhe7ZxPq01RGMaPf8WUsZCQKEL5VwwNfAhjkvKn
+Axi4hsw4guYiRBXDAgpGRkxY6CUAc9zr12rfd93v2ufs9faq73ep3517r537XP6tZ619733nDXzeLJk
LdgINk2IdWChrAF7wQVwDzwGTybEfXAZHAS9ZdHwDfAV/J0438FtsAVEhXJugT9AOuFUeQBMSawVZ05t
cho4MTYANVxzaqiVxg9wCqjhgiwNrImbQAwv5bxaSYNq4hHgLc2q8CAv5dKgmuAtAC9Uq8KD/KY0qCZc
kIELMnBBBi7IoGhBH8Gb1rHcFCvoPTgB9oGX/4+NQZGCXoMDoMluwBs26WdTU5wgzpxQTpOd4BmQxqSk
KEGUcxJoYd2WgDQ2FcUIatdKS+66FSFIq5WWnHUbXZBVKy256jaqoNhaaclRt9EE9a2VltR1G0XQvLXS
krJu2QXxV4chZk47qeqWVdBQtdKSom7ZBA1RK/4bysrQdcsiKLZWnAFHVx6KOQ2OrDzszJB1Sy4otlY7
wFNwbfkrORcBz3d4+avuDFW3pILegphabQUPAcdc5QEl50Fz3kM8YGQ/eAHC19SXZIJ+g3PACmdOI4dc
AVoaQSRW0lnwEzTj+pJ0BvEvgl0ziHLazxEriLwDXXXbA56DcExfkgoiH4C08Ia1CukjiGgzaRcY4vUn
F0Qo6Rho0q5VSF9BpC2JM2eo155FEPkEjoPtoOu88wgirBsl8RK/6MIckk0Q4ZpkrQnzCiK8BXjVOrYo
WQXFsIigFLggAxdk4IIMXJCBCzJwQQYuyMAFGbggAxdk4IIMXJCBCzIoTtB1wI8g8flD1oNLQBqTkuIE
fQHSxz157DOQxqSEz12UoNJwQQYuyMAFGbggAxdk4IIMVEHcnoHbNUiDaoL3X+KHehnuZSENqok7QA3f
+PQNSANr4Bc4A9SwZtyeQRpcA3eBuP6E2QxqXIv4HsdtICrcBYUziXtZSCebEqwVZ060nCb8cwM3+uBe
FrTLy9+U4NWKCzLXHLNWVqa2PRdRL+Uez1CZzf4B3nCy+2JKK9UAAAAASUVORK5CYII=
</value>
</data>
<metadata name="ribbonPageAbout.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>309, 17</value>
</metadata>
<data name="toolStripButtonAbout.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
RK5CYII=
</value>
</data>
<metadata name="miniToolStrip.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>638, 17</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>66</value>
</metadata>
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEASEgAAAEAIACIVAAAFgAAACgAAABIAAAAkAAAAAEAIAAAAAAAAFEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8vLwA+LS4ASkVBAEtL
RABLS0YAS0tEAElHQgBAQD8APz8/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAE1KQwBMSUMAU1BLAFtYUgBdWlQAXVxVAGBeWABramMADggHAyotJQYpKykFKiwlBiEf
HQSAfXIAYF5ZAF9cVgBcWlQAWVdRAFZUTgBNTEYAQjc6AEc/PwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAT0xJAAAAAABQSUEAQ0E+AFVS
TACEhYEAREE9CFVRTBVaV1A1WllSVl5cVm9iX1mCZmNdlGhmX5tpZ2CbaGZfm2VjXJhhX1mFX1xXdVxa
VF1ZVlFAVFFLHkpKQwwABAABW1pRAEtJQgAbJBgARUU5AElJPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBPzwAODY1AFFPSQCFgnYAREM/DVZTTjlcWlRwYV9YqGdl
X9RvbGXodXJr9Hl2b/59enL/hIB4/4eEfP+JhX3/iIR9/4WBev9/fHT/e3dw/3d0bfdyb2jsamdh3WRh
W7heXFWDWFVPSktKQxUAAAABWVZTAEhFQwBPS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAT01HAExKRABYVk8AAAAAAk9NSCZbWVNwYmBavmxpYul0cWr/fnpy/4eDe/+Pi4L/lZCI/5qV
jP+dmZD/oZyT/6Self+ln5f/paCX/6Oflf+gm5L/nZiP/5qVjP+UkIj/jomB/4WBev96d3D/cG1m8mVj
XcxbWlOJU1BLOz07OwhcWlQATk1GAGdmWQAvLy8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSAAAAAAAU1FMAP//
/wBQTkgsWFZQimJgWdlua2T+e3dw/4eDe/+RjIT/mJOL/56ZkP+inZT/pJ+X/6ehmP+po5r/qqSb/6ul
nP+rpZz/rKad/6ymnf+rpZz/qqSb/6mkm/+oopn/pZ+W/6Cbkv+alYz/kIyE/4SAef92c2z/aGVf6l1b
VaVTUUtBQ0M7BldVTgBIRj8AT0xHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASkI/ADwxLQBTUEwAT05IE1lXUW9fXVfaamdh/3l1
bv+Ggnv/kY2F/5mUi/+dmI//oJuS/6KdlP+kn5b/pqGY/6eimf+po5r/qqSb/6ulnP+rpZz/q6Wc/6ym
nf+rpZz/q6Wc/6ulnP+qpJv/qaOa/6eimf+loJf/op2T/5yXj/+Tj4b/hoJ6/3Vya/9kYlzsV1VPk09O
SCZbXFsAS0dCAExHQQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABFRT8ARUI9AG1xaQBRTUkvWVdSrWNgWvpxbmf/gHx1/4yIf/+Uj4f/mZOL/5yW
jv+emZD/oJuS/6KdlP+kn5X/paCX/6ahmP+moJf/pqCX/6Wflv+inZT/op2U/6Wflv+nopj/qKKZ/6mj
mv+qpJv/qKOa/6eimf+loJf/pJ+V/6Kdk/+empH/mZSL/46Kgv9/e3T/a2hi/1pYUs5NTEZTQjs3BEhH
QQBHR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVF
PwBHRkAAoJKOAFJQSUdYVlDPZGFb/3Zya/+EgHj/jYmA/5KOhf+VkYn/mZOL/5uWjf+dmI//npmQ/5yX
jv+Yk4r/ko2E/4qFff+BfHT/fHhw/3Vxaf9taWL/a2hg/3JuZv94dGz/e3hv/4aBef+Qi4P/mZSM/5+a
kf+inZT/o56U/6Gdk/+fm5H/nZiP/5qUjP+SjYX/hYF5/3BtZv9bWVPtTkxIcjw9OQZCQj0AOjo1AAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATk1IAEdHQQCdjYwATUxGS1RS
TN5iX1n/dnJr/4R/eP+Lh37/j4qC/5GNhP+UkIj/l5GJ/5aQiP+RjIP/iYR8/4B7c/92cWn/bmli/2hk
Xf9iXlf/XVlT/11ZU/9dWVP/WlZR/1VRTP9UUUv/V1RN/1tXUf9hXVb/bGdg/3dya/+GgXj/k46F/5qV
jP+dmI//nJeO/5qVjf+Xkor/kY2F/4aCev9zcGj/W1lU80lIQ3MtLigGOzo2AD48OgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8ATktFAE1KRwBMSkU8T01I3F5bVv9yb2j/gHx1/4eC
e/+Lhn7/jomB/5CLg/+Qi4P/jId+/4WAd/9/eXH/fHdv/355cf+Dfnb/iIN7/4+Kgv+RjYX/ko2G/5iT
i/+dl4//m5aO/5GMhf+Mh4D/i4Z//4SAeP99eXH/dnJr/3BsZf9vamP/dXBp/4B7c/+MiH//lpCI/5iS
iv+WkYn/k4+H/4+Kgv+EgHj/cW1n/1dVT/NEQj5wMjAvBD8+OwBGRkQAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADGu4cATkxFAEpIQxtLSkW/V1VP/21pY/97d3D/gn52/4WBev+JhHz/i4V9/4uF
fP+Jg3r/iYN6/4+JgP+ZlIz/paCX/6+qov+1saj/uLOr/7u2rv+8t67/vLiv/724r/+9uK//vLev/7u2
rv+6taz/ubOr/7axqP+yraX/raif/6Sfl/+YlIz/kIuD/4yHf/+Lh3//jYiA/5CLgv+SjYX/kY2E/4+L
gv+Lhn7/f3t0/2lmYP9OTEfqQkE9TT87NgBKS0kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABISEQAT1JRAkZEQH1OTEb9ZGFb/3Vxa/98eXH/gHx1/4N/d/+Ef3f/hoB4/4+JgP+dmI//r6qj/765
sf/Gwrr/ycS9/8jDvP/Fwbn/wr61/8K9tP/CvbT/wb20/8G9tP/BvLP/wLyz/8C7sv+/u7L/vrqx/765
sP++ubD/vbiv/7y3rv+6taz/tbCo/7Cro/+sp5//pKCa/6Kdl/+Yk4v/kIuD/42IgP+Lhn7/hYF5/3dz
bP9dW1X/R0ZBx0ZFQx9FREEAWlpaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBGRT8ARUQ+KEdF
QNpYVVD/bWlj/3dzbP97d3D/fXly/396cv+KhX3/pKCY/7+7tP/OysX/0s7I/8/Lw//Lx8D/ycS9/8fD
u//Fwbn/xcC4/8S/t//AvLP/u7au/7q2rv+6tq7/ubWt/7m1rP+7tq7/wLyz/8C8s//AvLP/wLyz/8C7
sv+/urH/vrmw/724sP+9uK//l5ON/7Cspv++u7b/r6ul/5eSi/+JhHz/hYF5/356c/9raGH/UE5J/ENC
P3UAAAAAXl5eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtHQwBAQDoAREI9cUtIQ/1hXlj/cGxm/3Vx
a/94dG3/gX11/52Ykf/Bvbf/19PO/9fUzv/Szsf/zcjB/8rGvv/FwLn/ubWu/6+ro/+empP/kY2H/4aD
fP+Cf3j/gn54/4SAef+EgXr/hIB5/4J/eP+AfXb/gn95/4uIgf+Xk4z/pqKa/7Gtpf+6tq3/wbyz/8C8
s//AvLL/rquk/52Ykv/Fwrr/z83I/8bDv/+gnZf/hoF6/397c/9zb2j/WldS/0NBPchAQD8bQkJBAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBPTkkMQ0E9rFBOSf9mY13/cG1n/3ZybP+MiIL/uLaw/9rX
0//d29b/1NHK/9DKw//Iw7z/ubSt/52ak/+Jhn//endx/3Rxav94dW7/fXpz/4F9dv+Ggnr/jIiA/5CL
g/+RjYT/kYyE/4+Lg/+Khn7/hIB4/4B8df97d3D/dHFr/3Zzbf+Bfnf/kY6H/6umnv+7tq7/yMS9/5qV
kf+8tq7/xsK7/9nX0v/X1dL/p6Oe/4F9dv92cmv/Yl9Z/0ZEQO87OjhFNDIvAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAEZEQABGREAdRUM/2FVSTv9oZV//c3Bq/5aTjv/Pzcr/5+Xi/93a1P/Tz8j/ycW9/62o
ov+Lh4H/dXJs/3Vxa/97eHH/hoN7/4+Lg/+Wkon/m5aO/5+bkf+inpT/paCX/6eimf+oo5r/qaOa/6ij
mv+moZj/o56V/6Cbkv+bl47/lZGI/46Jgf+Cf3f/eHVu/3Rxav9+e3T/qqaf/62ppP+qpZ3/v7qx/8nF
vv/i4Nz/4N/d/6eln/96dm//ZmNd/0lHQ/06OTdsNDMrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpI
RABJSEQkSkhE7FlWUf9raGP/mJaR/9va1//q5+T/3NnT/87Kw/+tqqP/hoN9/3FuZ/90cGr/gX52/42I
gP+WkYj/nJeO/6Cbkv+jnpX/paCX/6eimf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6qk
nP+po5r/pqGY/6Oelf+emZD/lpGJ/4uHf/98eHH/fntz/66rpf9tamT/Y2Ba/7ezq//NycP/6Ofk/+Xk
4/+fnJf/aWZg/0xJRf85NzWDXVhLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE5NSQBOTUklTkxI7F1b
Vv+Ni4b/2tjV/+3r6f/d2dP/vrqz/4eEfv9qZ2H/cW1m/397dP+MiH//lZCH/5qVjf+emZD/oJuS/6Kd
lP+kn5b/pqGX/6eimf+po5v/qqSb/6ulnP+rpZz/rKWc/6ymnf+spp3/q6Wc/6ulnP+qpJv/qaOa/6ei
mf+loJf/o56U/5+ZkP+Xkon/i4d//25rY/8wLyj/Dg0L/3Rxbf/Ev7j/1dLM//X08//X1dP/fHl0/0xK
Rf82NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBPTkolUE5L7HNwbf/KyMb/7+7r/9zZ
0/+tqqT/cG1n/2RhW/91cmv/hYF5/4+Lg/+VkYj/mZSM/5yWjv+emZD/oJuS/6Kdk/+jnpX/pJ+V/6Oe
lf+hnJT/oZuS/52Xjv+blY3/mpWM/5yXjv+hnJP/o56U/6agmP+oopn/qKKZ/6eimP+loJf/pJ+V/6Kd
k/+fm5H/nJeO/3BtZf83Ni3/FRQQ/xsaGP+Cf3n/wLy1/+Xi3v/29vX/qaek/09NSf8yMS6aAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJRTABPTkolWFZS7KKgnv/q6Ob/4d3Z/6Sgmv9kYlv/ZmNd/3l1
bv+Hgnv/joqB/5KOhf+VkIj/mZOL/5uVjf+cl47/m5aN/5eSif+QjIP/iIN7/396cv92cWr/cGxl/2hj
Xf9jX1j/YV1X/2NfWf9rZl//cGxl/3p2b/+FgXn/kIuD/5mUi/+fmpD/oZyT/6Gck/+fmpH/npmQ/4iD
fP9IRz3/JSQd/wcGBf8zMi//fnt1/8XBuv/08/H/1NPR/19dWf8wLiyZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFZVUQBQTkolbGpn7MvJxv/o5eL/op+a/1xaVP9kYVv/eHRt/4WBef+Lh3//joqC/5GN
hP+Uj4f/lZCI/5ONhf+Mh37/g311/3p1bf9xbWX/bWhh/2llXv9lYVr/ZGFa/2djXP9lYVr/Y19Z/2Fd
WP9bV1L/WlZR/11YUv9fW1X/ZmFb/29rY/98d2//ioV9/5aRiP+bl43/nJaO/5eRif9VU0r/NDMq/w4O
Cv8VFBP/UlBL/3t4cv/Z1tL/6+vp/3p5df8wLy2ZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJg
XABXVVEliIaD7d/d2v+0saz/W1lT/2BeWP90cWr/gX12/4eCe/+Khn7/jYmA/4+Kgv+OiYH/iYR7/4N9
dP+AenL/gXxz/4aBef+NiYH/lZCJ/5yXj/+emZH/op2V/6eimv+nopr/p6Ka/6WgmP+dmJD/mZSM/5OP
h/+Khn7/gn12/3l1bf91cGj/dnJq/355cv+Ig3v/kYyD/5aRiP9qaGD/PTwy/x8eGP8FBAP/QDw3/1xa
VP+KiIT/5+bk/5eVkv81NTKZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9uagBiYV0nn56b7cnH
xP9mZF//WldR/3BtZv98eHH/gX52/4WBev+Ig3z/iYN7/4qEe/+KhHv/joiA/5iTi/+moZn/s66m/7u2
rv++urL/vrqx/7+7sv/Au7L/wLuy/7+7sv+/urH/v7qx/765sP+9ubD/vbiv/7u2rv+5tKv/tbCo/6+q
of+nopn/nZiR/5aSi/+Tj4j/kIyE/5GMhP98eHD/RUQ6/y8uJv8KCgb/HRkW/2FdV/9ZV1L/qKek/6Wj
oP89PDmaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzcABraWYooZ+c7YiGgv9RTkn/aGRe/3Zy
a/98eHH/gHx0/4J+dv+CfnX/iIN6/5iTiv+sp6D/vbix/8fDvP/Lxr//y8a//8nEvP/Fwbn/w762/8K+
tf/CvrX/wr21/8K+tf/CvbT/wb20/8C8s//Au7L/v7uy/7+6sf++urH/vrmw/724sP+8t6//urSs/7aw
qP+yraX/sKyl/66qpP+dmJL/VlVM/zo5L/8YFxL/CAUD/0xIQv9iYFn/Y2Fd/4qJhf9DQj6YAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIF+ewCCgH0pioiF7VdVUP9aV1L/bmpk/3dzbP96d2//fHhx/4F8
dP+Sjob/sKyl/8nFv//U0cv/0s7I/83Jwv/Kxr7/yMS8/8bCuv/Dv7f/wby0/765sf+1san/sq2l/6mm
nv+opJz/p6Sc/6+ro/+yrqb/uLSs/7y4r/++ubD/v7uy/8G8s//Au7L/v7qx/765sP+8uK//vLev/766
tP/Fwr3/goB6/0JBN/8oKCD/BgUD/yYhG/9lYVv/VVNN/1dWUv9DQj6H////AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHh2cgCDgH0hX11Z3k1KRv9iX1r/cG1m/3Vxav95dG3/h4N8/6yoov/Pzcj/2tfS/9bS
zP/Qy8T/zMfA/8jDvP+8uLH/rKmi/5uYkf+NioL/gH13/3h1b/94dW7/fHhx/3p3cP96d3D/endv/3x5
cv96d3D/eHVu/3t4cv+HhH3/lJCJ/6OfmP+wrKT/vrqx/8G8s//AvLP/v7qx/766sf/Fwbr/sa6p/09O
Rf82Niz/EREN/wwIBP9QS0P/XVpV/0A+Ov0zMzBoPzw3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJP
SwBWU08YRkRBy1FPSv9nZF7/cGxm/3h0bv+Xk47/x8XA/+De2v/d2tX/08/I/87Jwv/Au7T/qaSe/4uH
gf97eHL/dXJs/3Vya/98eXH/g394/4mFff+OioH/k46G/5eSiv+ZlIv/mZSL/5eSiv+Tjob/jYmB/4iE
ff+Cfnf/endv/3VybP94dW//goB5/5qXj/+wraT/v7qy/8K9tP/BvbT/vrmy/2tpYf8+PTP/ISEa/wUD
Af8tJx//XltV/0RCPvw3NjNbKigjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEZEPwBGQz8fRkQ/3lZT
T/9oZV//dnNt/6OhnP/a2NX/5+Tg/9rWz//QzMT/vbmx/5eUjf96d3D/cW1n/3h0bf+Cfnb/jIiA/5SQ
iP+alo3/n5qR/6OelP+loJf/qKKZ/6mkm/+qpJv/q6Wc/6qlnP+po5r/p6GY/6Wflv+hnJP/nJeO/5WQ
iP+Lh3//f3x0/3Rxav9zcGn/h4R9/6qmnv+/u7L/xcC4/4yJgf9FRDr/MTAo/wsLCP8TDQf/TEdA/0tJ
RP47OTZxNzUvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRQBLSUUlS0lF7FpXUv9va2b/paOf/+Tj
4P/n5eH/2NTO/8XAuf+Zlo//dXJs/25rZf95dW7/h4N7/5GMhP+ZlIv/npmQ/6Gck/+kn5b/paCY/6ei
mf+po5r/qqSb/6ulnP+rpZz/rKad/6ymnf+spp3/q6Wc/6ulnP+qpJv/qKKZ/6Wgl/+hnJP/m5aN/5KN
hP+EgHj/dXFq/3BtZ/+Fgnv/r6uj/6+ro/9SUUf/PDwy/xoaFP8GAwD/MSoi/0lHQv85NzWHcGlYAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9NSQBPTUklT01J7GBeWf+cmpb/4+Lg/+ro5P/X083/r6ul/3p3
cf9pZmD/dnJr/4SAef+Pi4P/l5GJ/5uWjv+emZD/oJuS/6KdlP+kn5X/pqGX/6eimf+po5r/qqSb/6qk
m/+rpZz/q6Wc/6ulnP+rpZz/q6Wc/6ulnP+qpJv/qKOa/6eimf+loJf/pJ+V/6Cckv+alo3/kIyE/4J+
dv9va2X/bWpk/5GNhv9raWH/QkE2/ysqIv8IBwX/GBEK/z06Nf83NjOZAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAFBPSwBQTkslUU9L7H58eP/Y1tT/7uvo/9TQyv+ZlpD/aWZh/2tnYf98eHH/iYV9/5GN
hP+WkYn/mZSM/5uWjv+emZD/oJuS/6Gck/+inZP/oZuS/52Yj/+alYz/lpGI/5CLg/+OioH/joqB/4+K
gv+VkIf/mpWM/5+Zkf+jnZX/paCX/6WhmP+loJb/o56V/6Kdk/+gm5H/nJeP/5aRiP+JhX3/d3Ns/2dl
Xv9aWFH/REM5/zg4Lv8TEw//CgYB/yokHP8yMS+aAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFJR
TQBPTkolW1lW7K6sqf/t6+j/1tLN/4uIgv9fXVf/bGli/356c/+JhX3/j4uC/5KOhf+VkIj/mJOL/5qV
jf+alYz/l5KK/5GMhP+Ig3v/fnlx/3NvZ/9qZl//ZGBZ/11ZU/9aVlD/V1RO/1hUT/9dWVP/Yl9Y/2xn
Yf93cmr/g352/5GMg/+alYz/n5qR/6Cbkv+fmpH/nZiP/5uVjf+WkYn/jIiA/3x4cf9hX1n/QUA3/0FA
Nf8kIxz/BgUD/xoSC/8oJSKamv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFlXUwBRT0sldHJv7NLQ
zv/h3tn/jImD/1tYUv9qZ2H/fHhx/4aCev+Lh37/joqB/5GNhP+Tj4b/k46F/4+Kgf+Hgnr/fnlx/3dy
av9ybWb/cGxk/29rZP9taWL/cW1m/3JuZ/9wbGX/bmtk/25qZP9oZV//Y19Z/2RfWf9iXVf/ZGBa/2tm
X/91cGj/gn51/4+Kgv+Yk4r/m5WN/5qUjP+Xkor/k46G/4uHfv97eHD/UVBI/0JBN/8zMin/Dg0K/w4I
Av8eFw+nDTBaATUaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVjYABZV1QmkI6L7eDe2/+fnJj/V1RP/2Zj
Xf94dW3/gn53/4aCe/+KhX7/jYiA/46JgP+Nh37/h4J4/4N+dP+Efnb/ioR8/5KOhf+dmJH/p6Ob/7Cs
pP+zr6f/urav/7y4sf+7t7D/urau/7i0rP+xrKX/qaWd/6Sfl/+alY3/kYyE/4aCev99eHD/enVu/355
cf+FgHj/jYiA/5SPhv+UkIj/ko6G/4+Lgv+JhH3/amdg/0RDOv8+PTP/HBwW/wcFAv8XDgTGCQUBEgIA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFwbABkY18noqCd7b+9uv9dW1f/XVtV/3NvaP99eXH/gX12/4WA
ef+Hgnv/iIJ6/4mDev+Nh37/l5KJ/6ikm/+7t7D/y8jC/9fUz//d2tb/3tzY/+Dd2f/e3Nf/3dvV/9vY
0//Y1dD/1tPN/9PQyv/QzMX/zcnC/8nFvv/FwLn/wLuz/7m0rP+wq6L/pqCZ/56Zkf+ZlI3/lpGL/5OO
hv+QjIP/kIuD/46Kgf+Lh3//gHx1/09NRP9CQTf/LCwk/wkJBv8QCQL0Fg0DTyMVBQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHl4dABycG0ooJ6a7Xd1cf9RT0r/amZg/3dzbP98eHH/f3t0/4F8dP+CfXX/jId//6Oe
lv++urT/2NXQ/+fl4v/u7On/7u3q/+3r6P/q6OX/5+Xi/+Ti3//i4Nz/393Y/93a1f/a19L/19TP/9TR
zP/Sz8j/0MzF/83Jwv/Kxr//x8O8/8TAuP/BvbT/vbiw/7mzq/+0sKj/s6+o/7Ovqf+qp6D/mZSM/42I
gP+KhH3/hoJ7/2ViWv9DQjf/Ojkw/xUVEP8JBQH/GA0EoQIAAAcKBQIAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKA
fACHhYIogX977FFPS/9cWVT/b2tl/3ZybP96dm7/fHhw/4eCev+inpb/yMS//+Xj4P/z8vD/9vX0//Tz
8f/x8O7/7+3q/+zq5//p5+T/5+Xi/+Xj3//j4N3/4N7Z/97b1v/b2NP/2NXQ/9bTzv/T0Mr/0c7H/87L
xP/Mx8H/ycS9/8bCuv/Dv7f/wLyz/7+6sf++ubD/vLev/725sv/Fwrz/w8C7/6mlnv+OiYL/hYB5/3Zy
a/9JRz7/QkE2/yYlHv8GBQP/EwsC5Q4GADMJAwAABgUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBuagB4dnIfV1VR2E1L
R/9kYVv/cG1n/3Vxav97d3D/lZGK/8TBvP/o5+T/+Pf2//n49//29vT/9PPx//Lx7//w7+3/7u3q/+zq
5//p5+T/5+Xi/+Xj3//j4d3/4d/a/9/c1//d2dT/2tbR/9fUz//U0cz/0s/I/9DMxf/NycL/y8a//8fD
vP/Fwbn/wr61/8C8s//AvLP/wLuy/7+6sf/BvbT/zcrE/9bU0f+7uLP/j4uF/397c/9WVEz/QkE3/zQz
Kv8VFRL/Ih0X/y8nH3wAAAABAQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEtJRABMSUUXREI+yVJQS/9nZF//cG1m/315
c/+npJ7/3NrX//b29P/5+fj/+Pf2//b19P/19PL/8/Lw//Lw7v/w7uz/7uzp/+zq5//p5+T/6OXi/+bj
4P/j4d7/4d/b/9/d1//d2tX/29fS/9jVz//V0s3/09DJ/9HNxv/PysT/zMfA/8nFvv/Gwrv/xL+3/8K+
tf/CvbX/wb20/8G8tP/AvLP/wr62/9TQy//l4+H/yMbC/4+LhP9pZV7/SEY9/19eVv90cm3/rKaf/2Ve
VsoAAAAZGxYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVEPwBFQz4hRkRA41dUT/9oZV//fXp0/7a0sP/p6Ob/+fj3//j3
9v/29fT/9fTz//X08v/z8vD/8vHv//Hv7f/v7uv/7uvo/+vp5v/p5+T/5+Xi/+bj4P/k4d3/4t/b/9/d
2P/e2tX/29jT/9jV0P/W083/1NDL/9LOx//PzMT/zcjC/8vGv//Iw7z/xcG6/8TAuP/Ev7f/w7+2/8O/
tv/DvrX/wr61/8bBuf/a2NP/7ezq/8PBvf9+enT/ZWJc/7q4s/9ubWj/T0xH/yIbFPYSCQJXGA4FABcK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAExLRwBMS0clTEpH7VpXUv9zcGv/tbOv//Hx7//5+Pf/9vXz//Xz8v/08/H/9PPx//Py
8P/y8e7/8e/t//Du6//u7On/7ern/+ro5f/p5uP/5+Xi/+bj4P/k4d3/4t/b/+Dd2P/e2tX/3NjT/9nW
0f/X087/1dHL/9LPyP/QzcX/zsrC/8zHwP/JxL3/x8K7/8bCuv/Gwbr/xcG5/8XBuf/FwLj/xMC3/8S/
t//Iw7z/4d7b//Lx8P+2tLD/Y2Bb/2NhWP9DQTj/FRUQ/wYDAP8YDgSmAAAACQYCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBO
SgBPTkolT01J7GRiXf+qqKT/7u3r//j39v/08/H/8/Lw//Py8P/y8e//8vHv//Hw7v/x7+3/8O7r/+/t
6f/t6+j/7Onm/+ro5P/o5uP/5+Xh/+Xj3//k4d3/4t/b/+Dd1//e29b/3NjT/9rW0f/X1M7/1dLM/9PQ
yf/Rzcb/z8vD/83Iwf/Lxr//ycS9/8nEvf/Iw7z/yMO8/8fDu//Hwrv/xsK6/8bBuv/Fwbn/zcnC/+7t
6f/r6+n/jouH/0A+Nv9DQjf/Kikh/wgHBP8SCgLnFg0DMx4RBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBPSwBQT0slUlBM7IeF
gf/g393/9/b1//Px7//y8O7/8vDu//Lw7v/x8O3/8e/t//Du7P/v7ur/7+3p/+7r6P/s6ub/6+jl/+nn
5P/o5eL/5uTg/+Xj3v/j4dz/4t/a/+Dd1//f29b/3dnT/9vW0f/Y1M//1tLM/9TQyv/Szsf/0MzE/87J
wv/Mx8D/zMa//8vGvv/Lxb7/ysW+/8rEvf/JxL3/ycS8/8jDvP/Hw7v/yMK7/9vY0v/5+Pf/wcC+/09N
SP9ZV07/XlxU/xUUEP8LBgH+FAsCeyUWBgD/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNSTgBPTkolX15a7Le1s//z8vD/8/Hu//Dv
7P/x7+z/8O/s//Dv7P/w7uv/8O7q/+/t6f/u7Oj/7evn/+3q5v/r6eX/6ufk/+jm4//n5eH/5uTg/+Xi
3v/j4Nz/4t/Z/+Dd1//f3Nb/3dnT/9vX0f/Y1c//1tPN/9XRy//Tz8f/0c3F/8/Lw//OycL/zcnB/83I
wf/Nx8D/zMfA/8zGv//Mxr//y8a//8vFvv/Kxb7/ycS9/8/Kw//t6+j/4uHg/2VkYP9YVk/9hoN9/z07
Nf8FAwH/FAsDwgsEABMHAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtZVgBRUEwlfHp37NrZ1//z8u//8O7q//Dt6v/w7er/7+3q/+/t
6f/v7en/7+zo/+7s6P/t6+f/7enm/+zo5f/q6OT/6efj/+jl4v/n5OD/5uPf/+Xi3f/j4Nz/4t/Z/+Dd
1//f3Nb/3dnU/9vX0f/Z1c//19PN/9XRy//T0Mj/0s7G/9HMxP/QzMT/0MzE/8/Lw//Py8P/z8rC/87J
wv/OyMH/zcjB/83HwP/Mx8D/zMa//8zHv//e29b/7+7t/4uKh/45ODLrh4V//V9dVv8REQ3/CgUA8xQK
AUccDwIABQMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAGlnZABbWlcmlZSR7ejm5P/x7+v/7+3p/+/t6P/v7en/7+3p/+7s6P/u7Oj/7uvn/+3q
5//t6eb/7Onl/+ro5P/p5+P/6ebi/+jl4f/n5OD/5eLe/+Th3f/j4Nv/4t7Z/+Dd1//f3NX/3dnU/9zX
0f/a1dD/2NTO/9bSy//U0Mn/08/H/9POx//Szsb/0s7G/9HNxf/RzcX/0czE/9DMxP/Qy8P/z8vD/8/L
w//PysL/zsnC/83Iwf/W0sz/7uzq/6Oinv4zMi7CbWtk3ISBe/8sKyX/BgQB/xEJApQDAQACAQEAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJx
bQBlZGAnoqGe7ezp5v/w7en/7uzn/+7s6P/u7Oj/7uzo/+7r5//u6uf/7erm/+3p5v/s6OX/6+jk/+rn
4//p5uL/6OXh/+fk4P/m49//5eLe/+Th3f/j4Nv/4d7Y/+Dd1v/f3NX/3tnU/9zX0v/a1tD/2NTO/9fT
zP/V0cv/1dHK/9XQyf/U0Mn/1M/I/9PPx//Tz8f/0s7G/9LOxv/SzcX/0c3F/9HNxf/QzMT/0MzE/8/L
w//Tz8j/6Obi/6mnpP88OzecTkxFkoiGgP9WVE7/CQgG/w4HAdULBQEgBAEAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt5dgBxcGwpq6mm7e3r
6P/v7ej/7uzn/+7s5//u6+f/7urn/+7q5//t6ub/7enm/+zp5f/s6OT/6ufj/+nn4//p5uL/6OXh/+fk
4P/m497/5eLd/+Th3P/j4Nr/4t7Y/+Hd1//g3NX/3tnU/93Y0v/b1tD/2dXO/9fTzf/X083/19LM/9bS
zP/W0sv/1dHL/9XRyv/V0Mr/1NDJ/9TPyP/Tz8j/08/H/9POx//Szsb/0s3G/9HNxf/Uz8j/5ePe/6im
ov9CQT2PJyYfOYOBe+h7eXP/IiEc/wUCAPgRCQFbIxICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIKBfQB7enYnr66q6u3r5//v7Of/7uvn/+7q
5v/u6ub/7urm/+3q5v/t6eX/7enl/+zo5P/r6OP/6ufj/+nn4v/p5uH/6OXg/+fk3//m497/5eLd/+Th
3P/j4Nr/4t7Y/+Hd1//g3Nb/39rU/93Y0v/c19H/29bQ/9vWz//a1c//2dXO/9nUzv/Y1M3/2NPN/9fT
zP/X0sz/1tLM/9bSy//W0cv/1dHK/9XQyv/U0Mn/1NDI/9PPx//V0cn/4+Db/6Shnv9DQj56AAAABmJg
Wp+Uko3/SEZA/wYFAv8KBACmDAIACAsDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHp3cwBsamYcpaKf0+fk4f/v6+f/7uvm/+7q5v/u6ub/7urm/+3p
5f/t6eX/7Ojk/+zo5P/r6OP/6ufi/+nm4v/p5uH/6OXg/+fk3//m497/5uLd/+Xh3P/k4Nr/49/Y/+He
1//g3Nb/39vU/97Z0//e2NL/3djS/93Y0v/c19H/3NfR/9vW0P/b1tD/29bP/9rVz//Z1c//2dTO/9jU
zv/Y083/19PN/9fTzP/W0sz/1tLL/9bRy//X08z/39zX/5uYlPtGREBUW1lTADk3MkSPjYjsdXJs/xgX
FP8FAQDeCgMAJgkDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAHFuagBQTUoKnZuWp93b1//w7ej/7+vm/+7q5v/u6ub/7urm/+7q5f/t6eX/7enk/+zo
5P/s6OP/6ufi/+nm4v/p5uH/6OXg/+jk3//n497/5uLd/+Xh3P/k4Nv/49/Z/+Le1//h3db/4d3W/+Dc
1f/g29T/39rU/9/a1P/e2dP/3tnT/97Y0v/d2NL/3dfR/9zX0f/c19H/29bQ/9rW0P/a1c//2dXP/9nV
zv/Z1M7/2NTN/9jTzf/a1s//2dXP/5CNiOZGREEuRUM/AAAAAAt6eXOolJKO/z89N/8CAQD5BAAAZAUA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1q
aACqp6IAkY6Kbs/Lx/zv7Of/7+zm/+/r5v/v6ub/7+rm/+7q5f/u6eX/7enk/+3o5P/s6OP/6+fi/+rn
4v/p5uH/6eXg/+jk3//n497/5uPd/+bi3P/l4dv/5ODa/+Pf2f/j39j/4t7Y/+Le1//h3df/4d3W/+Hd
1v/g3NX/4NzV/9/b1P/f29T/39rT/97Z0//e2NL/3djS/93Y0v/d19H/3NfR/9zW0P/b1tD/29bP/9rV
z//c2NH/x8S+/316dbY8ODQOT0tHAGVjWQBQT0hQmJeT8nRxa/8SEQ7/AAAApAAAAAkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL+4tACQjIkAhIF9Kri1
sdvp5eD/8O3n//Ds5//v6+b/7+rm/+/q5f/u6eX/7unl/+3o5P/t6OP/7Oji/+zn4v/q5uH/6eXh/+nl
3//o5N//5+Pe/+fj3f/m4t3/5uLc/+Xh2//l4dv/5ODa/+Tg2f/j39n/49/Y/+Pf2P/i3tf/4t7X/+Le
1//h3db/4d3W/+Dc1f/g3NX/39vU/9/b1P/f2tT/3tnT/97Z0//d2NL/3djS/93X0f/b1tD/sK2n+nVy
bmiloZkAQ0ZLACIhHAAAAAANkI+KspeUkP9APjn/AAAA3wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFg38AVlZSBJ6cl4bU0Mz+8Ozn//Ht
5//x7ef/8Ozm/+/r5v/v6uX/7unl/+7p5P/u6eT/7ejj/+zo4v/s5+L/6ubh/+rm4f/p5eD/6eXg/+nl
3//o5N//6OTe/+fj3v/n493/5uLd/+bi3P/m4tz/5eHb/+Xh2//k4Nr/5ODZ/+Tg2f/j39j/49/Y/+Le
1//i3tf/4d3W/+Hd1v/h3db/4NzV/+Dc1f/f29T/39rU/9/a1P/OycP/mpeRxHZybRp+e3UAU1NTAAAA
AADGwr0AeHZxT6imo/N5dnD/ERAO+QAAAGMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADPytAAhoN9AIiGgCCyr6vI49/a//Dt5//x7ef/8e3o//Ds
5//w6+b/8Ovm/+/r5f/v6uX/7+rl/+7p5P/u6eT/7ejj/+3o4//s6OL/6+fi/+vn4f/q5uH/6ubg/+nl
4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3f/m4t3/5uLc/+bi3P/l4dv/5eHa/+Tg2v/k4Nn/49/Z/+Pf
2P/j39j/4t7X/+Le1//h3db/4d3W/9vX0f+yr6nth4N+VJ6UlQB7e3IAAAAAAAUFAAAmJSIAPjw4DKup
pq+hnpr/RUM+/wAAAKAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADDwsIAGz0YALu4tQCWk5BKwb645erm4P/x7Of/8u7p//Lv6v/w7ef/8Ozm//Ds
5v/w7Ob/8Ozm/+/r5f/v6+X/7+vl/+/q5f/u6uT/7unk/+7o4//t6OP/7Oji/+zn4v/r5+L/6+bh/+rm
4f/q5eD/6eXg/+nl3//o5N//6OTe/+fj3v/n493/5+Pd/+bi3f/m4tz/5eHc/+Xh2//k4Nr/5ODa/+Tg
2f/j39n/4NzW/8C8t/uTkIqFdnRxCI2LhQDPz8EAAAAAAAAAAAAuLisA1dTRANXTzkmvrarzkIyG/xwb
GdEAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAeHhvAHZ2cgANFBQCnpyWZ8vHwu7q5eD/8e3o//Pw7P/z8Ov/8e3n//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm/+/r5f/v6+X/7+rl/+7p5P/u6eT/7ejj/+3o4//s5+L/7Ofi/+vn
4f/r5uH/6ubh/+rl4P/p5eD/6eXf/+jk3//o5N7/5+Pe/+fj3v/n493/5uLd/+bi3P/j39n/yMW//5mW
kaNoZWERfn95AP///wAAAAAAAAAAAAAAAAAAAAAA0c3FAOPe1Q/KycazqaWh/3FtaPQODQxCLCooAK+n
nwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH19
eACRkIsAnJmVBaGfmmfBvrnl5uHc//Lu6f/18u7/9PHt//Hu6f/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/7+vl/+/q5f/u6uT/7unk/+7p5P/t6OP/7ejj/+zn
4v/s5+L/6+fh/+rm4f/q5uD/6eXg/+nl4P/p5d//6eXf/+Pf2v/EwLv6m5eSm3p4cxuMioMAoKmXAH5z
cwAAAAAAAAAAAAAAAAAAAAAA3NjSAN7c2QDh3ttQtbOx8bKtp/+inZaLZmFaAq6mngAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVkYoAlZONAFJY
VQKZlZBOuLWw0dvX0v/v6+b/9fPv//b08P/z8Oz/8e3n//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ovm//Dr5v/v6+X/7+rl/+/q5f/u6eT/7unk/+3o
4//t6OP/7Ofi/+zn4v/q5eD/3dnU/7u4s+uVkYx/dHNtD5SSjQAAAAAALCsqAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAODc1gDk3tYK2NbTn6qmo//HwLnTwbuyHbmyqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAj42IAIaCfgD///8AiYeFK6ej
n5/Hw77x5eHc//Tx7f/49vP/9/Tx//Pw7P/x7ej/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w6+b/8Ovm//Dr5v/v6uX/7unk/+bh
3P/KxsH9qKahxIuJhU1UUE4Fe3lzAI6LhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//
/wDl4t4A7OnlLrCuqsOnpJ6e2NDJD763sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqqqqAH11cgCPgoEAkI6LAHdycAuXlJBUsq+ruMvH
w/Xl4t7/9fPx//r49v/59/T/9fLu//Lv6v/x7ef/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds
5v/w7Ob/8Ozm//Ds5v/w7Ob/8Ozm//Ds5v/w7Ob/8e3n/+/r5f/l4Nv/zsrF/bKuqdiTkIx7endzHK2m
qwCHhH8Ah4N/ALa2tgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM/JxADLyMEA4+DYAb26
sxOmpJ4NuLGrAL63sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8AY2VzAIyIhQCxq6cAiIaDE5qYlFauq6exxsTA6dza
1//v7ev/+Pf1//r59//49vP/9vPv//Tw7P/y7+r/8u7p//Hu6P/x7ef/8e3n//Ht5//x7ef/8e3n//Hu
6P/y7uj/8O3n/+3p4//m4tz/2tbR/8bCvfauq6bGmJWQeICAeigAAAABiYeCAHh4cADJyLwAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADX1M8A6ebhALm2sACmpJ4AAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJSUjgCanJYAkI2KALy4swBqamkLjoyIN6OhnXSysKy3xsTA39bU
0ffi4d7/7Orn//Du7P/z8O3/8/Dt//Lw7P/x7ur/8Ozo/+/r5//u6uX/6OXg/+Lf2v/Z1dD/zMjD/b67
t+etqqbJn5yXko6MiExwb2sY////AI2MhQB+fHoAlpOPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAADAwMAP///wCEgoEAlJGPAP///wBcW1kJe3p2LJGPi1KjoZ13rKmmmrKv
rLq5trPRvLq33L27t+C6uLTlt7Wx4ra0sNuyr6vYqKaiwaGemqeal5OEjouHYHx6djhraGcSAAAAAZqY
kwB+fHgAXmBeAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD///8Axse9ADUzMQBqa2oAfHt4AJCOigD///8AOjs5BmJgXg1+fHoThYSAFYB/
eiF6eXUvenl2JoSDgBV8enYUZmVhDklHRQkAAAAClZKOAHx5dQBwbWwAeHd1AHJvbAD07OQABQUFAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBQUwB4eHUAenl3AIOBfwCUko8AmZeUAI+OigCGhYEAiIaDAJeV
kgCQjooAgn98AHRybwBwb2kAc3NsAP///wAgICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////////8AAAD///////////8A
AAD/////AH////8AAAD////AAAD///8AAAD///wAAAAf//8AAAD///gAAAAP//8AAAD//+AAAAAB//8A
AAD//4AAAAAA//8AAAD//wAAAAAAf/8AAAD//gAAAAAAP/8AAAD//AAAAAAAH/8AAAD/+AAAAAAAD/8A
AAD/8AAAAAAAB/8AAAD/8AAAAAAAB/8AAAD/8AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8A
AAD/4AAAAAAAA/8AAAD/4AAAAAAAA/8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAf8AAAD/4AAAAAAAAP8A
AAD/4AAAAAAAAP8AAAD/4AAAAAAAAP8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8AAAD/4AAAAAAAAH8A
AAD/4AAAAAAAAD8AAAD/4AAAAAAAAD8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAB8AAAD/4AAAAAAAAA8A
AAD/4AAAAAAAAA8AAAD/4AAAAAAAAA8AAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcAAAD/4AAAAAAAAAcA
AAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAMAAAD/4AAAAAAAAAEA
AAD/8AAAAAAABAEAAAD/8AAAAAAABgEAAAD/+AAAAAAABwAAAAD/+AAAAAAADwAAAAD//gAAAAAAH4AA
AAD//wAAAAAAP4AAAAD//wAAAAAAf4AAAAD//4AAAAAA/8EAAAD///AAAAAD//8AAAD///wAAAAP//8A
AAD///4AAAA///8AAAD////gAAP///8AAAD///////////8AAAD///////////8AAAD///////////8A
AAA=
</value>
</data>
</root>

240
DBChm/PDM/PdmReader.cs Normal file
View File

@ -0,0 +1,240 @@
using System;
using System.Linq;
using System.Xml;
using System.Collections.Generic;
using DBCHM.PdmModels;
namespace DBCHM.PDM
{
/// <summary>
/// PDM实体集合
/// </summary>
public class PdmModels
{
public PdmModels()
{
this.Tables = new List<TableInfo>();
}
/// <summary>
/// 表集合
/// </summary>
public IList<TableInfo> Tables { get; private set; }
}
public class PdmReader
{
/// <summary>
/// 读取指定Pdm文件的实体集合
/// </summary>
/// <param name="pdmFile">Pdm文件名(全路径名)</param>
/// <returns>实体集合</returns>
public PdmModels ReadFromFile(string pdmFile)
{
if (string.IsNullOrEmpty(pdmFile))
{
return null;
}
//加载文件.
var xmlDoc = new XmlDocument();
xmlDoc.Load(pdmFile);
//必须增加xml命名空间管理否则读取会报错.
var xmlnsManager = new XmlNamespaceManager(xmlDoc.NameTable);
xmlnsManager.AddNamespace("a", "attribute");
xmlnsManager.AddNamespace("c", "collection");
xmlnsManager.AddNamespace("o", "object");
var theModels = new PdmModels();
//读取所有表节点
var xnTablesList = xmlDoc.SelectNodes("//c:Tables", xmlnsManager);
if (xnTablesList != null)
foreach (var xnTable in from XmlNode xmlTables in xnTablesList from XmlNode xnTable in xmlTables.ChildNodes where xnTable.Name != "o:Shortcut" select xnTable)
{
theModels.Tables.Add(GetTable(xnTable));
}
return theModels;
}
//初始化"o:Table"的节点
private TableInfo GetTable(XmlNode xnTable)
{
var mTable = new TableInfo();
var xe = (XmlElement)xnTable;
mTable.TableId = xe.GetAttribute("Id");
var xnTProperty = xe.ChildNodes;
foreach (XmlNode xnP in xnTProperty)
{
switch (xnP.Name)
{
case "a:ObjectID": mTable.ObjectID = xnP.InnerText;
break;
case "a:Name": mTable.Name = xnP.InnerText;
break;
case "a:Code": mTable.Code = xnP.InnerText;
break;
case "a:CreationDate": mTable.CreationDate = String2DateTime(xnP.InnerText);
break;
case "a:Creator": mTable.Creator = xnP.InnerText;
break;
case "a:ModificationDate": mTable.ModificationDate = String2DateTime(xnP.InnerText);
break;
case "a:Modifier": mTable.Modifier = xnP.InnerText;
break;
case "a:Comment": mTable.Comment = xnP.InnerText;
break;
case "a:PhysicalOptions": mTable.PhysicalOptions = xnP.InnerText;
break;
case "c:Columns": InitColumns(xnP, mTable);
break;
case "c:Keys": InitKeys(xnP, mTable);
break;
case "c:PrimaryKey":
InitPrimaryKey(xnP, mTable);
break;
case "a:Description": mTable.Description = xnP.InnerText;
break;
}
}
return mTable;
}
//PDM文件中的日期格式采用的是当前日期与1970年1月1日8点之差的秒树来保存.
private DateTime _baseDateTime = new DateTime(1970, 1, 1, 8, 0, 0);
private DateTime String2DateTime(string dateString)
{
Int64 theTicker = Int64.Parse(dateString);
return _baseDateTime.AddSeconds(theTicker);
}
//初始化"c:Columns"的节点
private void InitColumns(XmlNode xnColumns, TableInfo pTable)
{
foreach (XmlNode xnColumn in xnColumns)
{
pTable.AddColumn(GetColumn(xnColumn, pTable));
}
}
//初始化c:Keys"的节点
private void InitKeys(XmlNode xnKeys, TableInfo pTable)
{
foreach (XmlNode xnKey in xnKeys)
{
pTable.AddKey(GetKey(xnKey, pTable));
}
}
//初始化c:PrimaryKey"的节点
private void InitPrimaryKey(XmlNode xnPrimaryKey, TableInfo pTable)
{
pTable.PrimaryKeyRefCode = GetPrimaryKey(xnPrimaryKey);
}
private static Boolean ConvertToBooleanPg(Object obj)
{
if (obj != null)
{
string mStr = obj.ToString();
mStr = mStr.ToLower();
if ((mStr.Equals("y") || mStr.Equals("1")) || mStr.Equals("true"))
{
return true;
}
}
return false;
}
private ColumnInfo GetColumn(XmlNode xnColumn, TableInfo ownerTable)
{
var mColumn = new ColumnInfo(ownerTable);
var xe = (XmlElement)xnColumn;
mColumn.ColumnId = xe.GetAttribute("Id");
var xnCProperty = xe.ChildNodes;
foreach (XmlNode xnP in xnCProperty)
{
switch (xnP.Name)
{
case "a:ObjectID": mColumn.ObjectID = xnP.InnerText;
break;
case "a:Name": mColumn.Name = xnP.InnerText;
break;
case "a:Code": mColumn.Code = xnP.InnerText;
break;
case "a:CreationDate": mColumn.CreationDate = String2DateTime(xnP.InnerText);
break;
case "a:Creator": mColumn.Creator = xnP.InnerText;
break;
case "a:ModificationDate": mColumn.ModificationDate = String2DateTime(xnP.InnerText);
break;
case "a:Modifier": mColumn.Modifier = xnP.InnerText;
break;
case "a:Comment": mColumn.Comment = xnP.InnerText;
break;
case "a:DataType": mColumn.DataType = xnP.InnerText;
break;
case "a:Length": mColumn.Length = xnP.InnerText;
break;
case "a:Identity": mColumn.Identity = ConvertToBooleanPg(xnP.InnerText);
break;
case "a:Mandatory": mColumn.Mandatory = ConvertToBooleanPg(xnP.InnerText);
break;
case "a:PhysicalOptions": mColumn.PhysicalOptions = xnP.InnerText;
break;
case "a:ExtendedAttributesText": mColumn.ExtendedAttributesText = xnP.InnerText;
break;
case "a:Precision":
mColumn.Precision = xnP.InnerText;
break;
}
}
return mColumn;
}
private string GetPrimaryKey(XmlNode xnKey)
{
var xe = (XmlElement)xnKey;
if (xe.ChildNodes.Count <= 0) return "";
var theKp = (XmlElement)xe.ChildNodes[0];
return theKp.GetAttribute("Ref");
}
private void InitKeyColumns(XmlNode xnKeyColumns, PdmKey Key)
{
var xe = (XmlElement)xnKeyColumns;
var xnKProperty = xe.ChildNodes;
foreach (var theRef in from XmlNode xnP in xnKProperty select ((XmlElement)xnP).GetAttribute("Ref"))
{
Key.AddColumnObjCode(theRef);
}
}
private PdmKey GetKey(XmlNode xnKey, TableInfo ownerTable)
{
var mKey = new PdmKey(ownerTable);
var xe = (XmlElement)xnKey;
mKey.KeyId = xe.GetAttribute("Id");
var xnKProperty = xe.ChildNodes;
foreach (XmlNode xnP in xnKProperty)
{
switch (xnP.Name)
{
case "a:ObjectID": mKey.ObjectID = xnP.InnerText;
break;
case "a:Name": mKey.Name = xnP.InnerText;
break;
case "a:Code": mKey.Code = xnP.InnerText;
break;
case "a:CreationDate": mKey.CreationDate = String2DateTime(xnP.InnerText);
break;
case "a:Creator": mKey.Creator = xnP.InnerText;
break;
case "a:ModificationDate": mKey.ModificationDate = String2DateTime(xnP.InnerText);
break;
case "a:Modifier": mKey.Modifier = xnP.InnerText;
break;
case "c:Key.Columns":
InitKeyColumns(xnP, mKey);
break;
}
}
return mKey;
}
}
}

View File

@ -0,0 +1,180 @@
using System;
namespace DBCHM.PdmModels
{
/// <summary>
/// 表列信息
/// </summary>
public class ColumnInfo
{
private TableInfo _OwnerTable;
/// <summary>
/// 所属表
/// </summary>
public TableInfo OwnerTable
{
get { return _OwnerTable; }
}
public ColumnInfo(TableInfo OwnerTable)
{
this._OwnerTable = OwnerTable;
}
/// <summary>
/// 是否主键
/// </summary>
public bool IsPrimaryKey
{
get
{
PdmKey theKey = _OwnerTable.PrimaryKey;
if (theKey != null)
{
if (theKey.ColumnObjCodes.Contains(columnId))
{
return true;
}
}
return false;
}
}
string columnId;
/// <summary>
/// 列标识
/// </summary>
public string ColumnId
{
get { return columnId; }
set { columnId = value; }
}
string objectID;
/// <summary>
/// 对象Id,全局唯一.
/// </summary>
public string ObjectID
{
get { return objectID; }
set { objectID = value; }
}
string name;
/// <summary>
/// 列名
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
string code;
/// <summary>
/// 列代码,对应数据库表字段名
/// </summary>
public string Code
{
get { return code; }
set { code = value; }
}
DateTime creationDate;
/// <summary>
/// 创建日期
/// </summary>
public DateTime CreationDate
{
get { return creationDate; }
set { creationDate = value; }
}
string creator;
/// <summary>
/// 创建人
/// </summary>
public string Creator
{
get { return creator; }
set { creator = value; }
}
DateTime modificationDate;
/// <summary>
/// 修改日期
/// </summary>
public DateTime ModificationDate
{
get { return modificationDate; }
set { modificationDate = value; }
}
string modifier;
/// <summary>
/// 修改人
/// </summary>
public string Modifier
{
get { return modifier; }
set { modifier = value; }
}
string comment;
/// <summary>
/// 注视
/// </summary>
public string Comment
{
get { return comment; }
set { comment = value; }
}
string dataType;
/// <summary>
/// 数据类型
/// </summary>
public string DataType
{
get { return dataType; }
set { dataType = value; }
}
string length;
/// <summary>
/// 数据长度
/// </summary>
public string Length
{
get { return length; }
set { length = value; }
}
bool identity;
/// <summary>
/// 是否自增量
/// </summary>
public bool Identity
{
get { return identity; }
set { identity = value; }
}
bool mandatory;
/// <summary>
/// 是否可空
/// </summary>
public bool Mandatory
{
get { return mandatory; }
set { mandatory = value; }
}
string extendedAttributesText;
/// <summary>
/// 扩展属性
/// </summary>
public string ExtendedAttributesText
{
get { return extendedAttributesText; }
set { extendedAttributesText = value; }
}
/// <summary>
/// 物理选项
/// </summary>
public string PhysicalOptions { get; set; }
/// <summary>
/// 精度
/// </summary>
public string Precision { get; set; }
/// <summary>
/// 描述
/// </summary>
public string Description { get; set; }
}
}

119
DBChm/PdmModels/PdmKey.cs Normal file
View File

@ -0,0 +1,119 @@
using System;
using System.Collections.Generic;
namespace DBCHM.PdmModels
{
public class PdmKey
{
string keyId;
/// <summary>
/// 关键字标识
/// </summary>
public string KeyId
{
get { return keyId; }
set { keyId = value; }
}
string objectID;
/// <summary>
/// 对象Id
/// </summary>
public string ObjectID
{
get { return objectID; }
set { objectID = value; }
}
string name;
/// <summary>
/// Key名
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
string code;
/// <summary>
/// Key代码,对应数据库中的Key.
/// </summary>
public string Code
{
get { return code; }
set { code = value; }
}
DateTime creationDate;
/// <summary>
/// 创建日期
/// </summary>
public DateTime CreationDate
{
get { return creationDate; }
set { creationDate = value; }
}
string creator;
/// <summary>
/// 创建人
/// </summary>
public string Creator
{
get { return creator; }
set { creator = value; }
}
DateTime modificationDate;
/// <summary>
/// 修改日期
/// </summary>
public DateTime ModificationDate
{
get { return modificationDate; }
set { modificationDate = value; }
}
string modifier;
/// <summary>
/// 修改人
/// </summary>
public string Modifier
{
get { return modifier; }
set { modifier = value; }
}
IList<ColumnInfo> columns;
/// <summary>
/// Key涉及的列
/// </summary>
public IList<ColumnInfo> Columns
{
get { return columns; }
}
public void AddColumn(ColumnInfo mColumn)
{
if (columns == null)
columns = new List<ColumnInfo>();
columns.Add(mColumn);
}
private List<string> _ColumnObjCodes = new List<string>();
/// <summary>
/// Key涉及的列代码根据辞可访问到列信息.对应列的ColumnId
/// </summary>
public List<string> ColumnObjCodes
{
get { return _ColumnObjCodes; }
}
public void AddColumnObjCode(string ObjCode)
{
_ColumnObjCodes.Add(ObjCode);
}
private TableInfo _OwnerTable = null;
public PdmKey(TableInfo table)
{
_OwnerTable = table;
}
}
}

View File

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace DBCHM.PdmModels
{
/// <summary>
/// PDM实体集合
/// </summary>
public class PdmModels
{
public PdmModels()
{
Tables = new List<TableInfo>();
}
/// <summary>
/// 表集合
/// </summary>
public IList<TableInfo> Tables { get; private set; }
}
}

View File

@ -0,0 +1,32 @@
using DocTools.Dtos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DBCHM.PdmModels
{
/// <summary>
/// 关键词过滤
/// </summary>
[Serializable]
public class SelectedTables
{
public List<TableDto> tables { get; set; } = new List<TableDto>();
//var viewDict = new NameValueCollection();
//var procDict = new NameValueCollection();
public Dictionary<string, string> viewDict { get; set; } = new Dictionary<string, string>();
public Dictionary<string, string> procDict { get; set; } = new Dictionary<string, string>();
public void Clear()
{
this.tables.Clear();
this.viewDict.Clear();
this.procDict.Clear();
}
}
}

View File

@ -0,0 +1,167 @@
using System;
using System.Collections.Generic;
namespace DBCHM.PdmModels
{
/// <summary>
/// 表信息
/// </summary>
public class TableInfo
{
public TableInfo()
{
keys = new List<PdmKey>();
columns = new List<ColumnInfo>();
}
string tableId;
/// <summary>
/// 表ID
/// </summary>
public string TableId
{
get { return tableId; }
set { tableId = value; }
}
string objectID;
/// <summary>
/// 对象ID
/// </summary>
public string ObjectID
{
get { return objectID; }
set { objectID = value; }
}
string name;
/// <summary>
/// 表名
/// </summary>
public string Name
{
get { return name; }
set { name = value; }
}
string code;
/// <summary>
/// 表代码,对应数据库表名
/// </summary>
public string Code
{
get { return code; }
set { code = value; }
}
DateTime creationDate;
/// <summary>
/// 创建日期
/// </summary>
public DateTime CreationDate
{
get { return creationDate; }
set { creationDate = value; }
}
string creator;
/// <summary>
/// 创建人
/// </summary>
public string Creator
{
get { return creator; }
set { creator = value; }
}
DateTime modificationDate;
/// <summary>
/// 修改日期
/// </summary>
public DateTime ModificationDate
{
get { return modificationDate; }
set { modificationDate = value; }
}
string modifier;
/// <summary>
/// 修改人
/// </summary>
public string Modifier
{
get { return modifier; }
set { modifier = value; }
}
string comment;
/// <summary>
/// 注释
/// </summary>
public string Comment
{
get { return comment; }
set { comment = value; }
}
string physicalOptions;
/// <summary>
/// 物理选项
/// </summary>
public string PhysicalOptions
{
get { return physicalOptions; }
set { physicalOptions = value; }
}
IList<ColumnInfo> columns;
/// <summary>
/// 表列集合
/// </summary>
public IList<ColumnInfo> Columns
{
get { return columns; }
}
IList<PdmKey> keys;
/// <summary>
/// 表Key集合
/// </summary>
public IList<PdmKey> Keys
{
get { return keys; }
}
public void AddColumn(ColumnInfo mColumn)
{
if (columns == null)
columns = new List<ColumnInfo>();
columns.Add(mColumn);
}
public void AddKey(PdmKey mKey)
{
if (keys == null)
keys = new List<PdmKey>();
keys.Add(mKey);
}
/// <summary>
/// 主键Key代码.=>KeyId
/// </summary>
public string PrimaryKeyRefCode { get; set; }
/// <summary>
/// 主关键字
/// </summary>
public PdmKey PrimaryKey
{
get
{
foreach (var key in keys)
{
if (key.KeyId == PrimaryKeyRefCode)
{
return key;
}
}
return null;
}
}
/// <summary>
/// 表的描述=>PDM Notes.
/// </summary>
public string Description { get; set; }
}
}

63
DBChm/Program.cs Normal file
View File

@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace DBCHM
{
static class Program
{
public static bool IsAdministrator()
{
System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
return principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator);
}
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += Application_ThreadException;
//判断当前登录用户是否为管理员
if (IsAdministrator())
{
//如果是管理员,则直接运行
Application.Run(new MainForm());
}
else
{
//创建启动对象
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.UseShellExecute = true;
startInfo.WorkingDirectory = Environment.CurrentDirectory;
startInfo.FileName = Application.ExecutablePath;
//设置启动动作,确保以管理员身份运行
startInfo.Verb = "runas";
try
{
System.Diagnostics.Process.Start(startInfo);
}
catch
{
return;
}
//退出
Application.Exit();
}
}
private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
LogUtils.LogError("Application_ThreadException", Developer. MJ, e.Exception);
}
}
}

View File

@ -0,0 +1,35 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("DBCHM - 51Try.Top")]
[assembly: AssemblyDescription("数据库CHM生成工具")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("51Try.Top")]
[assembly: AssemblyProduct("DBCHM")]
[assembly: AssemblyCopyright("Copyright ©2018-2021 lztkdr")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//将 ComVisible 设置为 false 将使此程序集中的类型
//对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("55b00db1-ba55-47b7-bd44-35c0fcd05fd5")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
[assembly: AssemblyVersion("1.8.0.3")]
[assembly: AssemblyFileVersion("1.8.0.3-beta")]

73
DBChm/Properties/Resources.Designer.cs generated Normal file
View File

@ -0,0 +1,73 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace DBCHM.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DBCHM.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal static System.Drawing.Bitmap loading {
get {
object obj = ResourceManager.GetObject("loading", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
}
}

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="loading" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\loading.gif;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root>

26
DBChm/Properties/Settings.Designer.cs generated Normal file
View File

@ -0,0 +1,26 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace DBCHM.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.2.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
}
}

View File

@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>

BIN
DBChm/Resources/loading.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

23
DBChm/TreeViewEnhanced.cs Normal file
View File

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace DBCHM
{
/// <summary>
/// 在使用treeview控件过程中会碰到
/// 当快速点击checkbox时checkbox选中状态和实际状态不符并且不会触发aftercheck事件
/// 造成此问题的原因是:快速点击识别为双击事件。
/// </summary>
public class TreeViewEnhanced : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x203) { m.Result = IntPtr.Zero; }
else base.WndProc(ref m);
}
}
}

28
DBChm/app.config Normal file
View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false" />
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Extensions" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.1" newVersion="4.2.0.1" />
</dependentAssembly>
<probing privatePath="lib;libs" xmlns="" />
<dependentAssembly>
<assemblyIdentity name="Esprima" publicKeyToken="2e92ba9c8d81157f" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.1.3.0" newVersion="2.1.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

BIN
DBChm/htmlhelp.exe Normal file

Binary file not shown.

BIN
DBChm/ico/DBCHM.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
DBChm/ico/about.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
DBChm/ico/connect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
DBChm/ico/empty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 626 B

BIN
DBChm/ico/excel.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

BIN
DBChm/ico/exp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
DBChm/ico/html.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
DBChm/ico/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
DBChm/ico/md.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
DBChm/ico/pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
DBChm/ico/upload.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
DBChm/ico/word.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
DBChm/ico/xml.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

5
DBChm/packages.config Normal file
View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="ICSharpCode.TextEditor.Extended" version="4.2.4" targetFramework="net47" />
<package id="ZetaLongPaths" version="1.0.0.38" targetFramework="net47" />
</packages>

30
DocTools/AppConst.cs Normal file
View File

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocTools
{
/// <summary>
/// dll库全局参数设置
/// </summary>
public static class AppConst
{
/// <summary>
/// 修订日志
/// </summary>
public const string LOG_CHAPTER_NAME = "修订日志";
/// <summary>
/// 数据库表目录
/// </summary>
public const string TABLE_CHAPTER_NAME = "数据库表目录";
/// <summary>
/// 数据库表结构
/// </summary>
public const string TABLE_STRUCTURE_CHAPTER_NAME = "数据库表结构";
}
}

352
DocTools/ConfigUtils.cs Normal file
View File

@ -0,0 +1,352 @@
using MJTop.Data;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.AccessControl;
namespace DocTools
{
/// <summary>
/// 管理 配置的连接字符串
/// </summary>
public static class ConfigUtils
{
/// <summary>
/// 当前应用程序的名称
/// </summary>
private static string ConfigFileName = Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName).Replace(".vshost", "");
/// <summary>
/// 定义配置存放的路径
/// </summary>
public static string AppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.Create), ConfigFileName);
/// <summary>
/// sqlite db文件的存放路径
/// </summary>
private static string ConfigFilePath = string.Empty;
/// <summary>
/// 针对配置的 数据库操作对象
/// </summary>
private static DB db = null;
/// <summary>
/// 初始化静态数据
/// 将sqlite数据库写入 C:\Users\用户名\AppData\Local\DBChm 目录中
/// </summary>
static ConfigUtils()
{
try
{
if (!ZetaLongPaths.ZlpIOHelper.DirectoryExists(AppPath))
{
ZetaLongPaths.ZlpIOHelper.CreateDirectory(AppPath);
}
AddSecurityControll2Folder(AppPath);
ConfigFilePath = Path.Combine(AppPath, ConfigFileName + ".db");
Init();
}
catch (Exception ex)
{
LogUtils.LogError("ConfigUtils初始化", Developer.SysDefault, ex);
}
}
/// <summary>
/// 初始化创建配置数据库
/// </summary>
private static void Init()
{
db = DBMgr.UseDB(DBType.SQLite, ConfigFilePath);
string strSql = @"create table DBCHMConfig
(
Id integer PRIMARY KEY autoincrement,
Name nvarchar(200) unique,
DBType varchar(30),
Server varchar(100),
Port integer,
DBName varchar(100),
Uid varchar(50),
Pwd varchar(100),
ConnTimeOut integer,
ConnString text,
Modified text
)";
//表不存在则创建 连接字符串 配置表
if (db.Info.TableNames == null || !db.Info.TableNames.Contains(nameof(DBCHMConfig), StringComparer.OrdinalIgnoreCase))
{
db.ExecSql(strSql);
//执行后,刷新实例 表结构信息
db.Info.Refresh();
}
else
{
// v1.7.3.7 版本 增加 连接超时 与 最后连接时间
var info = db.Info;
if(!info.IsExistColumn(nameof(DBCHMConfig), nameof(DBCHMConfig.Modified)))
{
var configs = db.GetListDictionary("select * from " + nameof(DBCHMConfig));
db.Info.DropTable(nameof(DBCHMConfig));
db.ExecSql(strSql);
//执行后,刷新实例 表结构信息
db.Info.Refresh();
if (configs != null && configs.Count > 0)
{
foreach (var config in configs)
{
try
{
db.Insert(config, nameof(DBCHMConfig));
}
catch (Exception ex)
{
LogUtils.LogError("Init", Developer.SysDefault, ex, config);
}
}
db.ExecSql("update " + nameof(DBCHMConfig) + " set ConnTimeOut = 120 ");
}
}
}
}
/// <summary>
/// 判断磁盘路径下是否安装存在某个文件,最后返回存在某个文件的路径
/// </summary>
/// <param name="installPaths"></param>
/// <param name="installPath"></param>
/// <returns></returns>
public static bool IsInstall(string[] installPaths, out string installPath)
{
installPath = string.Empty;
var driInfos = DriveInfo.GetDrives();
foreach (DriveInfo dInfo in driInfos)
{
if (dInfo.DriveType == DriveType.Fixed)
{
foreach (string ipath in installPaths)
{
string path = Path.Combine(dInfo.Name, ipath);
if (File.Exists(path))
{
installPath = path;
return true;
}
}
}
}
return false;
}
/// <summary>
/// 搜索获取软件安装目录
/// </summary>
/// <param name="orNames">软件名称 或 软件的主程序带exe的文件名</param>
/// <returns>获取安装目录</returns>
public static string SearchInstallDir(params string[] orNames)
{
//即时刷新注册表
SHChangeNotify(0x8000000, 0, IntPtr.Zero, IntPtr.Zero);
string installDir = null;
var or_install_addrs = new List<string>
{
@"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall",
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
};
var or_get_key_names = new List<string>
{
"InstallLocation",
"InstallPath",
"Install_Dir",
"UninstallString"
};
Microsoft.Win32.RegistryKey regKey = null;
try
{
regKey = Microsoft.Win32.Registry.LocalMachine;
var arr_exe = orNames.Where(t => t.EndsWith(".exe")).ToList();
var arr_name = orNames.Where(t => !t.EndsWith(".exe")).ToList();
if (arr_exe.Any())
{
foreach (var exe_name in arr_exe)
{
var name_node = regKey.OpenSubKey($@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\{exe_name}", false);
if (name_node != null)
{
var keyValue = name_node.GetValue("Path");
if (keyValue == null)
{
//取 (默认)
keyValue = name_node.GetValue("");
}
if (keyValue != null)
{
// 值 可能 带双引号,去除双引号
installDir = keyValue.ToString().Trim('"');
if (!Directory.Exists(installDir))
{
// 可能是文件路径,取目录
installDir = Path.GetDirectoryName(installDir);
}
return installDir;
}
}
}
}
else
{
foreach (var regAddr in or_install_addrs)
{
var regSubKey = regKey.OpenSubKey(regAddr, false);
foreach (var name in arr_name)
{
var name_node = regSubKey.OpenSubKey(name);
if (name_node != null)
{
foreach (var keyName in or_get_key_names)
{
var keyValue = name_node.GetValue(keyName);
if (keyValue != null)
{
// 值 可能 带双引号,去除双引号
installDir = keyValue.ToString().Trim('"');
if (!Directory.Exists(installDir))
{
// 可能是文件路径,取目录
installDir = Path.GetDirectoryName(installDir);
}
return installDir;
}
}
}
}
}
}
}
catch(Exception ex)
{
LogUtils.LogError(nameof(SearchInstallDir), Developer.SysDefault, ex);
}
finally
{
regKey?.Close();
}
return installDir;
}
[DllImport("shell32.dll")]
public static extern void SHChangeNotify(uint wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2);
/// <summary>
///为文件夹添加userseveryone用户组的完全控制权限
/// </summary>
/// <param name="dirPath"></param>
public static void AddSecurityControll2Folder(string dirPath)
{
//获取文件夹信息
DirectoryInfo dir = new DirectoryInfo(dirPath);
if (dir.Exists)
{
//获得该文件夹的所有访问权限
System.Security.AccessControl.DirectorySecurity dirSecurity = dir.GetAccessControl(AccessControlSections.All);
//设定文件ACL继承
InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;
//添加ereryone用户组的访问权限规则 完全控制权限
FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
//添加Users用户组的访问权限规则 完全控制权限
FileSystemAccessRule usersFileSystemAccessRule = new FileSystemAccessRule("Users", FileSystemRights.FullControl, inherits, PropagationFlags.None, AccessControlType.Allow);
bool isModified = false;
dirSecurity.ModifyAccessRule(AccessControlModification.Add, everyoneFileSystemAccessRule, out isModified);
dirSecurity.ModifyAccessRule(AccessControlModification.Add, usersFileSystemAccessRule, out isModified);
//设置访问权限
dir.SetAccessControl(dirSecurity);
}
}
/// <summary>
/// 添加或修改配置连接
/// </summary>
/// <param name="dbCHMConfig"></param>
public static void Save(NameValueCollection dbCHMConfig)
{
db.Save(dbCHMConfig, "DBCHMConfig");
}
public static void UpLastModified(int id)
{
db.ExecSql("update DBCHMConfig set Modified='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' where id=" + id);
}
/// <summary>
/// 删除连接
/// </summary>
/// <param name="id"></param>
public static void Delete(int id)
{
db.Delete("DBCHMConfig", "Id", id);
}
/// <summary>
/// 查询出所有配置的连接
/// </summary>
/// <returns></returns>
public static List<DBCHMConfig> SelectAll()
{
return db.GetDataTable("select * from DBCHMConfig order by Modified desc ").ConvertToListObject<DBCHMConfig>();
}
/// <summary>
/// 得到其中1个连接
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static DBCHMConfig Get(int id)
{
return db.GetDataTable("select * from DBCHMConfig where id = " + id).ConvertToListObject<DBCHMConfig>().FirstOrDefault();
}
/// <summary>
/// 判断配置表是否存在连接字符串
/// </summary>
/// <returns></returns>
public static bool HasValue()
{
string strSql = "select count(1) from DBCHMConfig";
return db.Single<int>(strSql, 0) > 0;
}
}
}

45
DocTools/DBCHMConfig.cs Normal file
View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocTools
{
public class DBCHMConfig
{
[DisplayName("ID")]
public int Id { get; set; }
[DisplayName("连接名")]
public string Name { get; set; }
[DisplayName("数据库类型")]
public string DBType { get; set; }
[DisplayName("主机")]
public string Server { get; set; }
[DisplayName("端口")]
public int? Port { get; set; }
[DisplayName("数据库")]
public string DBName { get; set; }
[DisplayName("用户名")]
public string Uid { get; set; }
[DisplayName("密码")]
public string Pwd { get; set; }
[DisplayName("连接超时")]
public int? ConnTimeOut { get; set; }
[DisplayName("连接字符串")]
public string ConnString { get; set; }
[DisplayName("最后使用时间")]
public DateTime Modified { get; set; }
}
}

183
DocTools/DBDoc/ChmDoc.cs Normal file
View File

@ -0,0 +1,183 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DocTools.Dtos;
using ZetaLongPaths;
namespace DocTools.DBDoc
{
public class ChmDoc : Doc
{
public ChmDoc(DBDto dto, string filter = "chm files (*.chm)|*.chm") : base(dto, filter)
{
}
private Encoding CurrEncoding
{
get
{
return Encoding.GetEncoding("gbk");
}
}
private string HHCPath
{
get
{
var hhcPath = string.Empty;
var hhwDir = ConfigUtils.SearchInstallDir("HTML Help Workshop", "hhw.exe");
if (!string.IsNullOrWhiteSpace(hhwDir) && ZlpIOHelper.DirectoryExists(hhwDir))
{
hhcPath = Path.Combine(hhwDir, "hhc.exe");
}
return hhcPath;
}
}
void InitDirFiles()
{
var dirNames = new string[] {
"表结构",
"视图",
"存储过程",
//"函数",
"resources\\js"
};
foreach (var name in dirNames)
{
var tmpDir = Path.Combine(this.WorkTmpDir, name);
if (ZlpIOHelper.DirectoryExists(tmpDir))
{
ZlpIOHelper.DeleteDirectory(tmpDir, true);
}
ZlpIOHelper.CreateDirectory(tmpDir);
}
var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TplFile\\chm\\");
var files = Directory.GetFiles(dir, "*.js", SearchOption.AllDirectories);
foreach (var filePath in files)
{
var fileName = Path.GetFileName(filePath);
ZlpIOHelper.CopyFile(filePath, Path.Combine(this.WorkTmpDir, "resources\\js\\", fileName), true);
}
}
public override void Build(string filePath)
{
#region 使 HTML Help Workshop hhc.exe , HTML Help Workshop
if (this.HHCPath.IsNullOrWhiteSpace())
{
string htmlhelpPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "htmlhelp.exe");
if (File.Exists(htmlhelpPath))
{
if (MessageBox.Show("导出CHM文档需安装 HTML Help Workshop ,是否现在安装?","提示",
MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk) == DialogResult.OK)
{
var proc = Process.Start(htmlhelpPath);
}
}
return;
}
#endregion
this.InitDirFiles();
var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TplFile\\chm");
var hhc_tpl = File.ReadAllText(Path.Combine(dir, "hhc.cshtml"), CurrEncoding);
var hhk_tpl = File.ReadAllText(Path.Combine(dir, "hhk.cshtml"), CurrEncoding);
var hhp_tpl = File.ReadAllText(Path.Combine(dir, "hhp.cshtml"), CurrEncoding);
var list_tpl = File.ReadAllText(Path.Combine(dir, "list.cshtml"), CurrEncoding);
var table_tpl = File.ReadAllText(Path.Combine(dir, "table.cshtml"), CurrEncoding);
var sqlcode_tpl = File.ReadAllText(Path.Combine(dir, "sqlcode.cshtml"), CurrEncoding);
var hhc = hhc_tpl.RazorRender(this.Dto).Replace("</LI>", "");
var hhk = hhk_tpl.RazorRender(this.Dto).Replace("</LI>", "");
ZlpIOHelper.WriteAllText(Path.Combine(this.WorkTmpDir, "chm.hhc"), hhc, CurrEncoding);
ZlpIOHelper.WriteAllText(Path.Combine(this.WorkTmpDir, "chm.hhk"), hhk, CurrEncoding);
ZlpIOHelper.WriteAllText(Path.Combine(this.WorkTmpDir, "数据库目录.html"), list_tpl.RazorRender(this.Dto), CurrEncoding);
foreach (var tab in this.Dto.Tables)
{
var tab_path = Path.Combine(this.WorkTmpDir, "表结构", $"{tab.TableName} {tab.Comment}.html");
var content = table_tpl.RazorRender(tab);
ZlpIOHelper.WriteAllText(tab_path, content, CurrEncoding);
}
foreach (var item in Dto.Views)
{
var vw_path = Path.Combine(this.WorkTmpDir, "视图", $"{item.Key}.html");
var content = sqlcode_tpl.RazorRender(
new SqlCode() { DBType = Dto.DBType, CodeName = item.Key, Content = item.Value.Trim() }
);
ZlpIOHelper.WriteAllText(vw_path, content, CurrEncoding);
}
foreach (var item in Dto.Procs)
{
var proc_path = Path.Combine(this.WorkTmpDir, "存储过程", $"{item.Key}.html");
var content = sqlcode_tpl.RazorRender(
new SqlCode() { DBType = Dto.DBType, CodeName = item.Key, Content = item.Value.Trim() }
);
ZlpIOHelper.WriteAllText(proc_path, content, CurrEncoding);
}
var hhp_Path = Path.Combine(this.WorkTmpDir, "chm.hhp");
ZlpIOHelper.WriteAllText(hhp_Path, hhp_tpl.RazorRender(new ChmHHP(filePath, this.WorkTmpDir)), CurrEncoding);
string res = StartRun(HHCPath, hhp_Path, Encoding.GetEncoding("gbk"));
ZlpIOHelper.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log", "chm.log"), res);
}
private string StartRun(string hhcPath, string arguments, Encoding encoding)
{
string str = "";
ProcessStartInfo startInfo = new ProcessStartInfo()
{
FileName = hhcPath, //调入HHC.EXE文件
Arguments = arguments,
WindowStyle = ProcessWindowStyle.Hidden,
RedirectStandardOutput = true,
UseShellExecute = false,
RedirectStandardError = true,
CreateNoWindow = true,
StandardErrorEncoding = encoding,
StandardOutputEncoding = encoding
};
using (Process process = Process.Start(startInfo))
{
using (StreamReader reader = process.StandardOutput)
{
str = reader.ReadToEnd();
}
process.WaitForExit();
}
return str.Trim();
}
}
}

64
DocTools/DBDoc/Doc.cs Normal file
View File

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DocTools.Dtos;
using ZetaLongPaths;
namespace DocTools.DBDoc
{
public abstract class Doc
{
/// <summary>
/// 当前应用程序的名称 => DBCHM
/// </summary>
private static string ConfigFileName = Path.GetFileNameWithoutExtension(AppDomain.CurrentDomain.FriendlyName).Replace(".vshost", "");
/// <summary>
/// 定义配置存放的路径 => C:\Users\用户名\AppData\Local\DBCHM
/// </summary>
public static string AppPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData, Environment.SpecialFolderOption.Create), ConfigFileName);
public Doc(DBDto dto, string filter)
{
this.Dto = dto;
this.Filter = filter;
this.WorkTmpDir = Path.Combine(AppPath, dto.DBType + "_" + dto.DBName);
if (ZlpIOHelper.DirectoryExists(this.WorkTmpDir))
{
ZlpIOHelper.DeleteDirectory(this.WorkTmpDir, true);
}
ZlpIOHelper.CreateDirectory(this.WorkTmpDir);
this.Ext = this.Filter.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault()?.Trim('*');
}
/// <summary>
/// 临时文件的存放目录
/// </summary>
public string WorkTmpDir { get; private set; }
/// <summary>
/// 文件扩展名
/// </summary>
public string Ext { get; set; }
/// <summary>
/// 数据库Dto
/// </summary>
public DBDto Dto { get; }
/// <summary>
/// 扩展名过滤字符串
/// </summary>
public string Filter { get; }
/// <summary>
/// 构建生成文档
/// </summary>
public abstract void Build(string filePath);
}
}

282
DocTools/DBDoc/ExcelDoc.cs Normal file
View File

@ -0,0 +1,282 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocTools.Dtos;
namespace DocTools.DBDoc
{
public class ExcelDoc : Doc
{
public ExcelDoc(DBDto dto, string filter = "excel files (.xlsx)|*.xlsx") : base(dto, filter)
{
}
public override void Build(string filePath)
{
ExcelUtils.ExportExcelByEpplus(filePath, this.Dto);
}
}
/// <summary>
/// Excel处理工具类
/// </summary>
internal static class ExcelUtils
{
/// <summary>
/// 引用EPPlus.dll导出excel数据库字典文档
/// </summary>
/// <param name="fileName"></param>
/// <param name="databaseName"></param>
/// <param name="tables"></param>
public static void ExportExcelByEpplus(string fileName, DBDto dto)
{
var tables = dto.Tables;
System.IO.FileInfo xlsFileInfo = new System.IO.FileInfo(fileName);
if (xlsFileInfo.Exists)
{
// 注意此处存在Excel文档即删除再创建一个
xlsFileInfo.Delete();
xlsFileInfo = new System.IO.FileInfo(fileName);
}
// 创建并添加Excel文档信息
using (OfficeOpenXml.ExcelPackage epck = new OfficeOpenXml.ExcelPackage(xlsFileInfo))
{
// 创建overview sheet
CreateLogSheet(epck, AppConst.LOG_CHAPTER_NAME, tables);
// 创建overview sheet
CreateOverviewSheet(epck, AppConst.TABLE_CHAPTER_NAME, tables);
// 创建tables sheet
CreateTableSheet(epck, AppConst.TABLE_STRUCTURE_CHAPTER_NAME, tables);
epck.Save(); // 保存excel
epck.Dispose();
}
}
/// <summary>
/// 创建修订日志sheet
/// </summary>
/// <param name="epck"></param>
/// <param name="sheetName"></param>
/// <param name="tables"></param>
private static void CreateLogSheet(OfficeOpenXml.ExcelPackage epck, string sheetName, List<TableDto> tables)
{
OfficeOpenXml.ExcelWorksheet overviewTbWorksheet = epck.Workbook.Worksheets.Add(sheetName);
int row = 1;
overviewTbWorksheet.Cells[row, 1, row, 5].Merge = true;
//overviewTbWorksheet.Cells[row, 1].Value = "总表数量";
//overviewTbWorksheet.Cells[row, 2].Value = tables.Count + "";
//overviewTbWorksheet.Cells[row, 4].Value = "密码等级";
//overviewTbWorksheet.Cells[row, 5].Value = "秘密";
row++; // 行号+1
overviewTbWorksheet.Cells[row, 1].Value = "版本号";
overviewTbWorksheet.Cells[row, 2].Value = "修订日期";
overviewTbWorksheet.Cells[row, 3].Value = "修订内容";
overviewTbWorksheet.Cells[row, 4].Value = "修订人";
overviewTbWorksheet.Cells[row, 5].Value = "审核人";
overviewTbWorksheet.Cells[row, 1, row, 5].Style.Font.Bold = true;
overviewTbWorksheet.Cells[row, 1, row, 5].Style.Font.Size = 10;
overviewTbWorksheet.Row(1).Height = 20; // 行高
// 循环日志记录
row++; // 行号+1
for (var i = 0; i < 16; i++)
{
// 添加列标题
overviewTbWorksheet.Cells[row, 1].Value = "";
overviewTbWorksheet.Cells[row, 2].Value = "";
overviewTbWorksheet.Cells[row, 3].Value = "";
overviewTbWorksheet.Cells[row, 4].Value = "";
overviewTbWorksheet.Cells[row, 5].Value = "";
overviewTbWorksheet.Row(row).Height = 20; // 行高
row++; // 行号+1
}
// 水平居中
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
// 垂直居中
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 上下左右边框线
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 5].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Column(1).Width = 25;
overviewTbWorksheet.Column(2).Width = 25;
overviewTbWorksheet.Column(3).Width = 50;
overviewTbWorksheet.Column(4).Width = 25;
overviewTbWorksheet.Column(5).Width = 25;
}
/// <summary>
/// 创建表目录sheet
/// </summary>
/// <param name="epck"></param>
/// <param name="sheetName"></param>
/// <param name="tables"></param>
private static void CreateOverviewSheet(OfficeOpenXml.ExcelPackage epck, string sheetName, List<TableDto> tables)
{
OfficeOpenXml.ExcelWorksheet overviewTbWorksheet = epck.Workbook.Worksheets.Add(sheetName);
int row = 1;
overviewTbWorksheet.Cells[row, 1].Value = "序号";
overviewTbWorksheet.Cells[row, 2].Value = "表名";
overviewTbWorksheet.Cells[row, 3].Value = "注释/说明";
overviewTbWorksheet.Cells[row, 1, row, 3].Style.Font.Bold = true;
overviewTbWorksheet.Cells[row, 1, row, 3].Style.Font.Size = 16;
overviewTbWorksheet.Row(1).Height = 30; // 行高
// 循环数据库表名
row++;
foreach (var table in tables)
{
// 数据库名称
// 添加列标题
overviewTbWorksheet.Cells[row, 1].Value = table.TableOrder;
overviewTbWorksheet.Cells[row, 2].Value = table.TableName;
overviewTbWorksheet.Cells[row, 3].Value = (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
overviewTbWorksheet.Row(row).Height = 30; // 行高
row++; // 行号+1
}
// 水平居中
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
// 垂直居中
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 上下左右边框线
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Cells[1, 1, row - 1, 3].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
overviewTbWorksheet.Column(1).Width = 10;
overviewTbWorksheet.Column(2).Width = 50;
overviewTbWorksheet.Column(3).Width = 50;
}
/// <summary>
/// 创建表结构sheet
/// </summary>
/// <param name="epck"></param>
/// <param name="sheetName"></param>
/// <param name="tables"></param>
private static void CreateTableSheet(OfficeOpenXml.ExcelPackage epck, string sheetName, List<TableDto> tables)
{
OfficeOpenXml.ExcelWorksheet tbWorksheet = epck.Workbook.Worksheets.Add(sheetName);
int rowNum = 1, fromRow = 0, count = 0; // 行号计数器
// 循环数据库表名
foreach (var table in tables)
{
var lstName = new List<string>
{
"序号","列名","数据类型","长度","小数位","主键","自增","允许空","默认值","列说明"
};
//oracle不显示 列是否自增
if (table.DBType.StartsWith("Oracle"))
{
lstName.Remove("自增");
}
var spColCount = lstName.Count;
// 数据库名称
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Merge = true;
tbWorksheet.Cells[rowNum, 1].Value = table.TableName + " " + (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Font.Bold = true;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Font.Size = 16;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 注意:保存起始行号
fromRow = rowNum;
rowNum++; // 行号+1
// tbWorksheet.Cells[int FromRow, int FromCol, int ToRow, int ToCol]
// 列标题字体为粗体
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Font.Bold = true;
// 添加列标题
for (int j = 0; j < lstName.Count; j++)
{
tbWorksheet.Cells[rowNum, j + 1].Value = lstName[j];
}
rowNum++; // 行号+1
// 添加数据行,遍历数据库表字段
foreach (var column in table.Columns)
{
tbWorksheet.Cells[rowNum, 1].Value = column.ColumnOrder;
tbWorksheet.Cells[rowNum, 2].Value = column.ColumnName;
tbWorksheet.Cells[rowNum, 3].Value = column.ColumnTypeName;
tbWorksheet.Cells[rowNum, 4].Value = column.Length;
tbWorksheet.Cells[rowNum, 5].Value = column.Scale;
tbWorksheet.Cells[rowNum, 6].Value = column.IsPK;
//oracle不显示 列是否自增
if (table.DBType.StartsWith("Oracle"))
{
tbWorksheet.Cells[rowNum, 7].Value = column.CanNull;
tbWorksheet.Cells[rowNum, 8].Value = column.DefaultVal;
tbWorksheet.Cells[rowNum, 9].Value = column.Comment;
}
else
{
tbWorksheet.Cells[rowNum, 7].Value = column.IsIdentity;
tbWorksheet.Cells[rowNum, 8].Value = column.CanNull;
tbWorksheet.Cells[rowNum, 9].Value = column.DefaultVal;
tbWorksheet.Cells[rowNum, 10].Value = column.Comment;
}
rowNum++; // 行号+1
}
// 水平居中
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
// 垂直居中
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center;
// 上下左右边框线
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[fromRow, 1, rowNum - 1, spColCount].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
// 处理空白行,分割用
if (count < tables.Count - 1)
{
//tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
//tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;
tbWorksheet.Cells[rowNum, 1, rowNum, spColCount].Merge = true;
tbWorksheet.Cells[rowNum, 1, rowNum, 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
tbWorksheet.Cells[rowNum, 1, rowNum, 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.DodgerBlue);
}
rowNum++; // 行号+1
count++; // 计数器+1
}
// 设置表格样式
tbWorksheet.Cells.Style.WrapText = true; // 自动换行
tbWorksheet.Cells.Style.ShrinkToFit = true; // 单元格自动适应大小
}
}
}

26
DocTools/DBDoc/HtmlDoc.cs Normal file
View File

@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocTools.Dtos;
using ZetaLongPaths;
namespace DocTools.DBDoc
{
public class HtmlDoc : Doc
{
public HtmlDoc(DBDto dto, string filter = "html files (*.html)|*.html") : base(dto, filter)
{
}
public override void Build(string filePath)
{
var dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TplFile\\html");
var html_tpl = File.ReadAllText(Path.Combine(dir, "html.cshtml"), Encoding.UTF8);
var html_doc = html_tpl.RazorRender(this.Dto);
ZlpIOHelper.WriteAllText(filePath, html_doc, Encoding.UTF8);
}
}
}

View File

@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using DocTools.Dtos;
using ZetaLongPaths;
namespace DocTools.DBDoc
{
public class MarkDownDoc : Doc
{
public MarkDownDoc(DBDto dto, string filter = "markdown files (.md)|*.md") : base(dto, filter)
{
}
public override void Build(string filePath)
{
var sb = new StringBuilder();
sb.AppendLine("# 数据库表目录");
var dirMD = this.Dto.Tables.MarkDown("Columns", "DBType");
dirMD = Regex.Replace(dirMD, @"(.+?\|\s+)([a-zA-Z][a-zA-Z0-9_]+)(\s+\|.+\n?)", $"$1[$2](#$2)$3", RegexOptions.IgnoreCase | RegexOptions.Compiled);
sb.Append(dirMD);
sb.AppendLine();
if (this.Dto.Tables.Any())
{
sb.Append("## 表结构");
foreach (var dto in this.Dto.Tables)
{
sb.AppendLine();
sb.AppendLine($"### <a name=\"{dto.TableName}\">{dto.TableName} {dto.Comment}</a>");
if (dto.DBType.StartsWith("Oracle"))
{
sb.Append(dto.Columns.MarkDown("IsIdentity"));
}
else
{
sb.Append(dto.Columns.MarkDown());
}
sb.AppendLine();
}
}
if (this.Dto.Views.Any())
{
sb.Append("## 视图");
foreach (var item in this.Dto.Views)
{
sb.AppendLine();
sb.AppendLine($"### {item.Key}");
sb.AppendLine("``` sql");
var fmtSql = JS.RunFmtSql(item.Value, this.Dto.DBType);
sb.Append(fmtSql);
sb.AppendLine("```");
sb.AppendLine();
}
}
if (this.Dto.Procs.Any())
{
sb.Append("## 存储过程");
foreach (var item in this.Dto.Procs)
{
sb.AppendLine();
sb.AppendLine($"### {item.Key}");
sb.AppendLine("``` sql");
var fmtSql = JS.RunFmtSql(item.Value, this.Dto.DBType);
sb.Append(fmtSql);
sb.AppendLine("```");
sb.AppendLine();
}
}
var md = sb.ToString();
ZlpIOHelper.WriteAllText(filePath, md, Encoding.UTF8);
}
}
}

327
DocTools/DBDoc/PdfDoc.cs Normal file
View File

@ -0,0 +1,327 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocTools.Dtos;
using iTextSharp.text;
using iTextSharp.text.pdf;
using ZetaLongPaths;
namespace DocTools.DBDoc
{
public class PdfDoc : Doc
{
public PdfDoc(DBDto dto, string filter = "html files (.pdf)|*.pdf") : base(dto, filter)
{
}
private static string TTF_Path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TplFile\\pdf\\msyh.ttf");
public override void Build(string filePath)
{
PdfUtils.ExportPdfByITextSharp(filePath, TTF_Path, this.Dto);
}
}
/// <summary>
/// Pdf处理工具类
/// </summary>
internal static class PdfUtils
{
/// <summary>
/// 引用iTextSharp.dll导出pdf数据库字典文档
/// </summary>
/// <param name="databaseName"></param>
/// <param name="tables"></param>
public static void ExportPdfByITextSharp(string fileName, string fontPath, DBDto dto)
{
var databaseName = dto.DBName;
var tables = dto.Tables;
// 创建并添加文档信息
Document pdfDocument = new Document();
pdfDocument.AddTitle(fileName);
PdfWriter pdfWriter = PdfWriter.GetInstance(pdfDocument,
new System.IO.FileStream(fileName, System.IO.FileMode.Create));
pdfDocument.Open(); // 打开文档
// 标题
Paragraph title = new Paragraph("数据库字典文档\n\n", BaseFont(fontPath, 30, Font.BOLD));
title.Alignment = Element.ALIGN_CENTER;
pdfDocument.Add(title);
Paragraph subTitle = new Paragraph(" —— " + databaseName, BaseFont(fontPath, 20, Font.NORMAL));
subTitle.Alignment = Element.ALIGN_CENTER;
pdfDocument.Add(subTitle);
// PDF换页
pdfDocument.NewPage();
// 创建添加书签章节
int chapterNum = 1;
// 全局字体设置处理iTextSharp中文不识别显示问题
Font pdfFont = BaseFont(fontPath, 12, Font.NORMAL);
// log table
Chapter logChapter = new Chapter(new Paragraph(AppConst.LOG_CHAPTER_NAME, pdfFont), chapterNum);
pdfDocument.Add(logChapter);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
CreateLogTable(pdfDocument, pdfFont, tables);
// PDF换页
pdfDocument.NewPage();
// overview table
Chapter dirChapter = new Chapter(new Paragraph(AppConst.TABLE_CHAPTER_NAME, pdfFont), (++chapterNum));
pdfDocument.Add(dirChapter);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
CreateOverviewTable(pdfDocument, pdfFont, tables);
// PDF换页
pdfDocument.NewPage();
// table structure
// 添加书签章节
Chapter tableChapter = new Chapter(new Paragraph(AppConst.TABLE_STRUCTURE_CHAPTER_NAME, pdfFont), (++chapterNum));
tableChapter.BookmarkOpen = true;
pdfDocument.Add(tableChapter);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
foreach (var table in tables)
{
string docTableName = table.TableName + " " + (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
// 添加书签章节
Section selection = tableChapter.AddSection(20f, new Paragraph(docTableName, pdfFont), chapterNum);
pdfDocument.Add(selection);
pdfDocument.Add(new Paragraph("\n", pdfFont)); // 换行
// 遍历数据库表
// 创建表格
PdfPTable pdfTable = null;
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable = new PdfPTable(10);
}
else
{
pdfTable = new PdfPTable(9);
}
// 添加列标题
pdfTable.AddCell(CreatePdfPCell("序号", pdfFont));
pdfTable.AddCell(CreatePdfPCell("列名", pdfFont));
pdfTable.AddCell(CreatePdfPCell("数据类型", pdfFont));
pdfTable.AddCell(CreatePdfPCell("长度", pdfFont));
pdfTable.AddCell(CreatePdfPCell("小数位", pdfFont));
pdfTable.AddCell(CreatePdfPCell("主键", pdfFont));
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable.AddCell(CreatePdfPCell("自增", pdfFont));
}
pdfTable.AddCell(CreatePdfPCell("允许空", pdfFont));
pdfTable.AddCell(CreatePdfPCell("默认值", pdfFont));
pdfTable.AddCell(CreatePdfPCell("列说明", pdfFont));
// 添加数据行,循环数据库表字段
foreach (var column in table.Columns)
{
pdfTable.AddCell(CreatePdfPCell(column.ColumnOrder, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.ColumnName, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.ColumnTypeName, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.Length, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.Scale, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.IsPK, pdfFont));
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable.AddCell(CreatePdfPCell(column.IsIdentity, pdfFont));
}
pdfTable.AddCell(CreatePdfPCell(column.CanNull, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.DefaultVal, pdfFont));
pdfTable.AddCell(CreatePdfPCell(column.Comment, pdfFont));
}
// 设置表格居中
pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
pdfTable.TotalWidth = 520F;
pdfTable.LockedWidth = true;
if (!table.DBType.StartsWith("Oracle"))
{
pdfTable.SetWidths(new float[] { 50F, 60F, 60F, 50F, 50F, 50F, 50F, 50F, 50F, 50F });
}
else
{
pdfTable.SetWidths(new float[] { 50F, 80F, 70F, 50F, 50F, 50F, 50F, 50F, 70F });
}
// 添加表格
pdfDocument.Add(pdfTable);
// PDF换页
pdfDocument.NewPage();
}
if (dto.Views.Count > 0)
{
Chapter viewChapter = new Chapter(new Paragraph("视图", pdfFont), (++chapterNum));
viewChapter.BookmarkOpen = true;
pdfDocument.Add(viewChapter);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
foreach (var item in dto.Views)
{
Section selection = viewChapter.AddSection(20f, new Paragraph(item.Key, pdfFont), chapterNum);
pdfDocument.Add(selection);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
Paragraph pgh = new Paragraph(item.Value.Replace("`", ""), pdfFont);
pdfDocument.Add(pgh);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
}
pdfDocument.NewPage();
}
if (dto.Procs.Count > 0)
{
Chapter procChapter = new Chapter(new Paragraph("存储过程", pdfFont), (++chapterNum));
procChapter.BookmarkOpen = true;
pdfDocument.Add(procChapter);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
foreach (var item in dto.Procs)
{
Section selection = procChapter.AddSection(20f, new Paragraph(item.Key, pdfFont), chapterNum);
pdfDocument.Add(selection);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
Paragraph pgh = new Paragraph(item.Value.Replace("`",""), pdfFont);
pdfDocument.Add(pgh);
// 换行
pdfDocument.Add(new Paragraph("\n", pdfFont));
}
pdfDocument.NewPage();
}
// 关闭释放PDF文档资源
pdfDocument.Close();
}
/// <summary>
/// create log table
/// </summary>
/// <param name="pdfDocument"></param>
/// <param name="pdfFont"></param>
/// <param name="tables"></param>
private static void CreateLogTable(Document pdfDocument, Font pdfFont, List<TableDto> tables)
{
// 创建表格
PdfPTable pdfTable = new PdfPTable(5);
// 添加列标题
pdfTable.AddCell(CreatePdfPCell("版本号", pdfFont));
pdfTable.AddCell(CreatePdfPCell("修订日期", pdfFont));
pdfTable.AddCell(CreatePdfPCell("修订内容", pdfFont));
pdfTable.AddCell(CreatePdfPCell("修订人", pdfFont));
pdfTable.AddCell(CreatePdfPCell("审核人", pdfFont));
for (var i = 0; i < 16; i++)
{
// 添加数据行,循环数据库表字段
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
pdfTable.AddCell(CreatePdfPCell("", pdfFont));
}
// 设置表格居中
pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
pdfTable.TotalWidth = 540F;
pdfTable.LockedWidth = true;
pdfTable.SetWidths(new float[] { 80F, 100F, 200F, 80F, 80F });
// 添加表格
pdfDocument.Add(pdfTable);
}
/// <summary>
/// create overview table
/// </summary>
/// <param name="pdfDocument"></param>
/// <param name="pdfFont"></param>
/// <param name="tables"></param>
private static void CreateOverviewTable(Document pdfDocument, Font pdfFont, List<TableDto> tables)
{
// 创建表格
PdfPTable pdfTable = new PdfPTable(3);
// 添加列标题
pdfTable.AddCell(CreatePdfPCell("序号", pdfFont));
pdfTable.AddCell(CreatePdfPCell("表名", pdfFont));
pdfTable.AddCell(CreatePdfPCell("注释/说明", pdfFont));
foreach (var table in tables)
{
// 添加数据行,循环数据库表字段
pdfTable.AddCell(CreatePdfPCell(table.TableOrder, pdfFont));
pdfTable.AddCell(CreatePdfPCell(table.TableName, pdfFont));
pdfTable.AddCell(CreatePdfPCell((!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : ""), pdfFont));
}
// 设置表格居中
pdfTable.HorizontalAlignment = Element.ALIGN_CENTER;
pdfTable.TotalWidth = 330F;
pdfTable.LockedWidth = true;
pdfTable.SetWidths(new float[] { 60F, 120F, 150F });
// 添加表格
pdfDocument.Add(pdfTable);
}
/// <summary>
/// 创建pdf表格单元格
/// </summary>
/// <param name="text"></param>
/// <param name="pdfFont"></param>
/// <returns></returns>
private static PdfPCell CreatePdfPCell(string text, Font pdfFont)
{
Phrase phrase = new Phrase(text, pdfFont);
PdfPCell pdfPCell = new PdfPCell(phrase);
// 单元格垂直居中显示
pdfPCell.HorizontalAlignment = Element.ALIGN_CENTER;
pdfPCell.VerticalAlignment = Element.ALIGN_MIDDLE;
pdfPCell.MinimumHeight = 30;
return pdfPCell;
}
/// <summary>
/// iTextSharp字体设置
/// </summary>
/// <param name="fontPath"></param>
/// <param name="fontSize"></param>
/// <param name="fontStyle"></param>
private static Font BaseFont(string fontPath, float fontSize, int fontStyle)
{
BaseFont chinese = iTextSharp.text.pdf.BaseFont.CreateFont(fontPath, iTextSharp.text.pdf.BaseFont.IDENTITY_H, true);
Font pdfFont = new Font(chinese, fontSize, fontStyle);
return pdfFont;
}
}
}

511
DocTools/DBDoc/WordDoc.cs Normal file
View File

@ -0,0 +1,511 @@
using System.Collections.Generic;
using Aspose.Words.Tables;
using DocTools.Dtos;
namespace DocTools.DBDoc
{
public class WordDoc : Doc
{
public WordDoc(DBDto dto, string filter = "word files (.doc)|*.doc") : base(dto, filter)
{
}
public override void Build(string filePath)
{
WordUtils.ExportWordByAsposeWords(filePath, this.Dto);
}
}
/// <summary>
/// Word处理工具类
/// </summary>
internal static class WordUtils
{
private static string asposeBookmark_prefix = "AsposeBookmark";
private static string asposeBookmarkLog = "asposeBookmarkLog";
private static string asposeBookmarkOverview = "asposeBookmarkOverview";
/// <summary>
/// 引用Aspose.Words.dll导出word数据库字典文档
/// 注意不依赖微软office办公软件
/// </summary>
/// <param name="databaseName"></param>
/// <param name="tables"></param>
public static void ExportWordByAsposeWords(string fileName, DBDto dto)
{
var databaseName = dto.DBName;
var tables = dto.Tables;
Aspose.Words.Document doc = new Aspose.Words.Document();
// TODO document properties
doc.BuiltInDocumentProperties.Subject = "设计文档";
doc.BuiltInDocumentProperties.ContentType = "数据库字典";
doc.BuiltInDocumentProperties.Title = "数据库字典文档";
doc.BuiltInDocumentProperties.Author = doc.BuiltInDocumentProperties.LastSavedBy = doc.BuiltInDocumentProperties.Manager = "trycache";
doc.BuiltInDocumentProperties.Company = "51Try.Top";
doc.BuiltInDocumentProperties.Version = doc.BuiltInDocumentProperties.RevisionNumber = 1;
doc.BuiltInDocumentProperties.ContentStatus = "初稿";
doc.BuiltInDocumentProperties.NameOfApplication = "DBCHM";
doc.BuiltInDocumentProperties.LastSavedTime = doc.BuiltInDocumentProperties.CreatedTime = System.DateTime.Now;
// TODO header and footer setting
Aspose.Words.HeaderFooter header = new Aspose.Words.HeaderFooter(doc, Aspose.Words.HeaderFooterType.HeaderPrimary);
doc.FirstSection.HeadersFooters.Add(header);
// Add a paragraph with text to the header.
header.AppendParagraph("数智化合规系统字典").ParagraphFormat.Alignment =
Aspose.Words.ParagraphAlignment.Right;
Aspose.Words.DocumentBuilder builder = new Aspose.Words.DocumentBuilder(doc);
// TODO 创建文档标题书签
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Center, Aspose.Words.OutlineLevel.Level1, 25,
asposeBookmark_prefix + "0", "数据库字典文档");
builder.ParagraphFormat.OutlineLevel = Aspose.Words.OutlineLevel.BodyText;
builder.Writeln("—— " + databaseName);
// TODO 换行
builder.InsertBreak(Aspose.Words.BreakType.ParagraphBreak);
builder.InsertBreak(Aspose.Words.BreakType.ParagraphBreak);
builder.InsertBreak(Aspose.Words.BreakType.ParagraphBreak);
// TODO 数据库字典文档修订日志表
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Center, Aspose.Words.OutlineLevel.Level2, 16,
asposeBookmarkLog, AppConst.LOG_CHAPTER_NAME);
CreateLogTable(builder);
builder.InsertBreak(Aspose.Words.BreakType.PageBreak);
// TODO 创建数据库字典文档数据库概况一览表
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Center, Aspose.Words.OutlineLevel.Level2, 16,
asposeBookmarkOverview, AppConst.TABLE_CHAPTER_NAME);
CreateOverviewTable(builder, tables);
builder.InsertBreak(Aspose.Words.BreakType.PageBreak);
// TODO 创建书签
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Left, Aspose.Words.OutlineLevel.Level2, 16,
asposeBookmark_prefix + 1, AppConst.TABLE_STRUCTURE_CHAPTER_NAME);
int i = 1; // 计数器
// TODO 遍历数据库表集合
foreach (var table in tables)
{
string bookmarkName = table.TableName + " " + (!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "");
// TODO 创建书签
CreateBookmark(builder, Aspose.Words.ParagraphAlignment.Left, Aspose.Words.OutlineLevel.Level3, 16,
asposeBookmark_prefix + i, table.TableOrder + "、" + bookmarkName);
// TODO 遍历数据库表字段集合
// TODO 创建表格
Aspose.Words.Tables.Table asposeTable = builder.StartTable();
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
#region
// Make the header row.
builder.InsertCell();
// Set the left indent for the table. Table wide formatting must be applied after
// at least one row is present in the table.
asposeTable.Alignment = Aspose.Words.Tables.TableAlignment.Center;
asposeTable.PreferredWidth = PreferredWidth.FromPercent(100);
asposeTable.AllowAutoFit = false;
// Set height and define the height rule for the header row.
builder.RowFormat.Height = 25.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
// Some special features for the header row.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.FromArgb(198, 217, 241);
builder.ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
builder.Font.Size = 10;
builder.Font.Name = "宋体";
builder.Font.Bold = true;
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(8);
builder.Write("序号");
// We don't need to specify the width of this cell because it's inherited from the previous cell.
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(15);
builder.Write("字段名称");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(25);
builder.Write("字段描述");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(12);
builder.Write("数据类型");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(10);
builder.Write("长度");
//builder.InsertCell();
//builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(8);
//builder.Write("小数位");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(10);
builder.Write("主键");
//if (!table.DBType.StartsWith("Oracle"))
//{
// builder.InsertCell();
// builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(7);
// builder.Write("自增");
//}
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(10);
builder.Write("允许空");
builder.InsertCell();
builder.CellFormat.PreferredWidth = PreferredWidth.FromPercent(8);
builder.Write("默认值");
builder.EndRow();
#endregion
foreach (var column in table.Columns)
{
#region
// Set features for the other rows and cells.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.White;
builder.CellFormat.Width = 100.0;
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
//builder.CellFormat.FitText = true;
// Reset height and define a different height rule for table body
builder.RowFormat.Height = 20.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
builder.InsertCell();
// Reset font formatting.
builder.Font.Size = 9;
builder.Font.Bold = false;
builder.Write(column.ColumnOrder); // 序号
builder.InsertCell();
builder.Write(column.ColumnName); // 列名
builder.InsertCell();
builder.Font.Size = 9;
builder.Write(column.Comment); // 列说明
builder.InsertCell();
builder.Write(column.ColumnTypeName); // 数据类型
builder.InsertCell();
builder.Write(column.Length); // 长度
//builder.InsertCell();
//builder.Write(column.Scale); // 小数位
builder.InsertCell();
builder.Write(column.IsPK); // 主键
//if (!table.DBType.StartsWith("Oracle"))
//{
// builder.InsertCell();
// builder.Write(column.IsIdentity); // 自增
//}
builder.InsertCell();
builder.Write(column.CanNull); // 是否为空
builder.InsertCell();
builder.Font.Size = 9;
builder.Write(column.DefaultVal); // 默认值
builder.EndRow();
#endregion
}
// TODO 表格创建完成,结束
//asposeTable.PreferredWidth = Aspose.Words.Tables.PreferredWidth.Auto;
//asposeTable.AutoFit(Aspose.Words.Tables.AutoFitBehavior.AutoFitToContents);
builder.EndTable();
i++;
// TODO page breaks
if (i < tables.Count)
{
builder.InsertBreak(Aspose.Words.BreakType.PageBreak);
}
}
// TODO 生成页码
AutoGenPageNum(doc, builder);
// TODO 添加水印
//InsertWatermarkText(doc, "DBCHM-51Try.Top");
doc.Save(fileName);
}
/// <summary>
/// 生成页码
/// </summary>
/// <param name="builder"></param>
public static void AutoGenPageNum(Aspose.Words.Document doc, Aspose.Words.DocumentBuilder builder)
{
Aspose.Words.HeaderFooter footer = new Aspose.Words.HeaderFooter(doc, Aspose.Words.HeaderFooterType.FooterPrimary);
doc.FirstSection.HeadersFooters.Add(footer);
// Add a paragraph with text to the footer.
footer.AppendParagraph("").ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
// We want to insert a field like this: {PAGE} / {NUMPAGES}
// TODO Go to the primary footer
builder.MoveToHeaderFooter(Aspose.Words.HeaderFooterType.FooterPrimary);
// TODO Add fields for current page number
builder.InsertField("PAGE");
// TODO Add any custom text formatter
builder.Write(" / ");
// TODO Add field for total page numbers in document
builder.InsertField("NUMPAGES");
// Finally update the outer field to recalcaluate the final value.
// Doing this will automatically update the inner fields at the same time.
// field.Update();
}
/// <summary>
/// 创建数据库字典文档修订日志表
/// </summary>
/// <param name="builder"></param>
private static void CreateLogTable(Aspose.Words.DocumentBuilder builder)
{
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
// TODO 创建表格
Aspose.Words.Tables.Table logTable = builder.StartTable();
#region
// Make the header row.
builder.InsertCell();
// Set the left indent for the table. Table wide formatting must be applied after
// at least one row is present in the table.
logTable.Alignment = Aspose.Words.Tables.TableAlignment.Center;
logTable.AllowAutoFit = true;
// Set height and define the height rule for the header row.
builder.RowFormat.Height = 40.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
// Some special features for the header row.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.FromArgb(198, 217, 241);
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
builder.ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
builder.Font.Size = 14;
builder.Font.Name = "Arial";
builder.Font.Bold = true;
builder.CellFormat.Width = 100.0;
builder.Write("版本号");
// We don't need to specify the width of this cell because it's inherited from the previous cell.
builder.InsertCell();
builder.Write("修订日期");
builder.InsertCell();
builder.Write("修订内容");
builder.InsertCell();
builder.Write("修订人");
builder.InsertCell();
builder.Write("审核人");
builder.EndRow();
#endregion
for (var i = 0; i < 5; i++)
{
#region
// Set features for the other rows and cells.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.White;
builder.CellFormat.Width = 100.0;
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
// Reset height and define a different height rule for table body
builder.RowFormat.Height = 40.0;
builder.InsertCell();
// Reset font formatting.
builder.Font.Size = 12;
builder.Font.Bold = false;
builder.Write(""); // 版本号
builder.InsertCell();
builder.Write(""); // 修订日期
builder.InsertCell();
builder.Write(""); // 修订内容
builder.InsertCell();
builder.Write(""); // 修订人
builder.InsertCell();
builder.Write(""); // 审核人
builder.EndRow();
#endregion
}
// TODO 表格创建完成,结束
builder.EndTable();
}
/// <summary>
/// 创建数据库字典文档数据库概况一览表
/// </summary>
/// <param name="builder"></param>
/// <param name="tables"></param>
private static void CreateOverviewTable(Aspose.Words.DocumentBuilder builder, List<TableDto> tables)
{
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
// TODO 创建表格
Aspose.Words.Tables.Table overviewTable = builder.StartTable();
#region
// Make the header row.
builder.InsertCell();
// Set the left indent for the table. Table wide formatting must be applied after
// at least one row is present in the table.
overviewTable.Alignment = Aspose.Words.Tables.TableAlignment.Center;
overviewTable.AllowAutoFit = true;
// Set height and define the height rule for the header row.
builder.RowFormat.Height = 40.0;
builder.RowFormat.HeightRule = Aspose.Words.HeightRule.AtLeast;
// Some special features for the header row.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.FromArgb(198, 217, 241);
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
builder.ParagraphFormat.Alignment = Aspose.Words.ParagraphAlignment.Center;
builder.Font.Size = 14;
builder.Font.Name = "Arial";
builder.Font.Bold = true;
builder.CellFormat.Width = 100.0;
builder.Write("序号");
builder.InsertCell();
builder.Write("表名");
builder.InsertCell();
builder.Write("注释/说明");
builder.EndRow();
#endregion
// TODO 遍历数据库表集合
foreach (var table in tables)
{
#region
// Set features for the other rows and cells.
builder.CellFormat.Shading.BackgroundPatternColor = System.Drawing.Color.White;
builder.CellFormat.Width = 100.0;
builder.CellFormat.VerticalAlignment = Aspose.Words.Tables.CellVerticalAlignment.Center;
// Reset height and define a different height rule for table body
builder.RowFormat.Height = 40.0;
builder.InsertCell();
// Reset font formatting.
builder.Font.Size = 12;
builder.Font.Bold = false;
builder.Write(table.TableOrder); // 序号
builder.InsertCell();
builder.Write(table.TableName); // 表名
builder.InsertCell();
builder.Write((!string.IsNullOrWhiteSpace(table.Comment) ? table.Comment : "")); // 说明
#endregion
builder.EndRow();
}
// TODO 表格创建完成,结束
builder.EndTable();
}
/// <summary>
/// 创建书签
/// </summary>
/// <param name="builder"></param>
/// <param name="alignment"></param>
/// <param name="outlineLevel"></param>
/// <param name="fontSize"></param>
/// <param name="bookmarkName"></param>
/// <param name="bookmarkText"></param>
private static void CreateBookmark(Aspose.Words.DocumentBuilder builder, Aspose.Words.ParagraphAlignment alignment,
Aspose.Words.OutlineLevel outlineLevel, double fontSize, string bookmarkName, string bookmarkText)
{
// 清除段落样式
builder.ParagraphFormat.ClearFormatting();
// TODO 创建书签
builder.StartBookmark(bookmarkName);
builder.ParagraphFormat.Alignment = alignment;
builder.ParagraphFormat.OutlineLevel = outlineLevel;
builder.ParagraphFormat.SpaceBefore = builder.ParagraphFormat.SpaceAfter = 15;
builder.Font.Size = fontSize;
builder.Font.Name = "Arial";
builder.Font.Bold = true;
builder.Writeln(bookmarkText);
builder.EndBookmark(bookmarkName);
}
/// <summary>
/// Inserts a watermark into a document.
/// </summary>
/// <param name="doc">The input document.</param>
/// <param name="watermarkText">Text of the watermark.</param>
public static void InsertWatermarkText(Aspose.Words.Document doc, string watermarkText)
{
// Create a watermark shape. This will be a WordArt shape.
// You are free to try other shape types as watermarks.
Aspose.Words.Drawing.Shape watermark = new Aspose.Words.Drawing.Shape(doc, Aspose.Words.Drawing.ShapeType.TextPlainText);
// Set up the text of the watermark.
watermark.TextPath.Text = watermarkText;
watermark.TextPath.FontFamily = "Arial";
watermark.Width = 500;
watermark.Height = 100;
// Text will be directed from the bottom-left to the top-right corner.
watermark.Rotation = -40;
// Remove the following two lines if you need a solid black text.
watermark.Fill.Color = System.Drawing.Color.Gray; // Try LightGray to get more Word-style watermark
watermark.StrokeColor = System.Drawing.Color.Gray; // Try LightGray to get more Word-style watermark
// Place the watermark in the page center.
watermark.RelativeHorizontalPosition = Aspose.Words.Drawing.RelativeHorizontalPosition.Page;
watermark.RelativeVerticalPosition = Aspose.Words.Drawing.RelativeVerticalPosition.Page;
watermark.WrapType = Aspose.Words.Drawing.WrapType.None;
watermark.VerticalAlignment = Aspose.Words.Drawing.VerticalAlignment.Center;
watermark.HorizontalAlignment = Aspose.Words.Drawing.HorizontalAlignment.Center;
// Create a new paragraph and append the watermark to this paragraph.
Aspose.Words.Paragraph watermarkPara = new Aspose.Words.Paragraph(doc);
watermarkPara.AppendChild(watermark);
// Insert the watermark into all headers of each document section.
foreach (Aspose.Words.Section sect in doc.Sections)
{
// There could be up to three different headers in each section, since we want
// the watermark to appear on all pages, insert into all headers.
InsertWatermarkIntoHeader(watermarkPara, sect, Aspose.Words.HeaderFooterType.HeaderPrimary);
InsertWatermarkIntoHeader(watermarkPara, sect, Aspose.Words.HeaderFooterType.HeaderFirst);
InsertWatermarkIntoHeader(watermarkPara, sect, Aspose.Words.HeaderFooterType.HeaderEven);
}
}
/// <summary>
/// Inserts a watermark into a document header.
/// </summary>
/// <param name="watermarkPara"></param>
/// <param name="sect"></param>
/// <param name="headerType"></param>
public static void InsertWatermarkIntoHeader(Aspose.Words.Paragraph watermarkPara, Aspose.Words.Section sect, Aspose.Words.HeaderFooterType headerType)
{
Aspose.Words.HeaderFooter header = sect.HeadersFooters[headerType];
if (null == header)
{
// There is no header of the specified type in the current section, create it.
header = new Aspose.Words.HeaderFooter(sect.Document, headerType);
sect.HeadersFooters.Add(header);
}
// Insert a clone of the watermark into the header.
header.AppendChild(watermarkPara.Clone(true));
}
}
}

29
DocTools/DBDoc/XmlDoc.cs Normal file
View File

@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using DocTools.Dtos;
namespace DocTools.DBDoc
{
public class XmlDoc : Doc
{
public XmlDoc(DBDto dto, string filter = "xml files (.xml)|*.xml") : base(dto, filter)
{
}
public override void Build(string filePath)
{
string xmlContent = this.Dto.Tables.SerializeXml();
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlContent);
var root = xmlDoc.DocumentElement;
root.SetAttribute("databaseName", this.Dto.DBName);
root.SetAttribute("tableNum", this.Dto.Tables.Count + "");
xmlDoc.Save(filePath);
}
}
}

36
DocTools/DocFactory.cs Normal file
View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocTools.DBDoc;
using DocTools.Dtos;
namespace DocTools
{
public class DocFactory
{
public static Doc CreateInstance(DocType type, DBDto dto)
{
switch (type)
{
case DocType.chm:
return new ChmDoc(dto);
case DocType.html:
return new HtmlDoc(dto);
case DocType.word:
return new WordDoc(dto);
case DocType.excel:
return new ExcelDoc(dto);
case DocType.pdf:
return new PdfDoc(dto);
case DocType.markdown:
return new MarkDownDoc(dto);
case DocType.xml:
return new XmlDoc(dto);
default:
return new ChmDoc(dto);
}
}
}
}

171
DocTools/DocTools.csproj Normal file
View File

@ -0,0 +1,171 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{130A8861-0C39-4933-9DE8-AA9525488211}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>DocTools</RootNamespace>
<AssemblyName>DocTools</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Aspose.Words, Version=18.7.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>lib\Aspose.Words.dll</HintPath>
</Reference>
<Reference Include="BouncyCastle.Crypto, Version=1.8.6.0, Culture=neutral, PublicKeyToken=0e99375e54769942">
<HintPath>..\packages\BouncyCastle.1.8.6.1\lib\BouncyCastle.Crypto.dll</HintPath>
</Reference>
<Reference Include="EPPlus, Version=4.0.5.0, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>lib\EPPlus.dll</HintPath>
</Reference>
<Reference Include="Esprima, Version=2.1.3.0, Culture=neutral, PublicKeyToken=2e92ba9c8d81157f, processorArchitecture=MSIL">
<HintPath>..\packages\Esprima.2.1.3\lib\net461\Esprima.dll</HintPath>
</Reference>
<Reference Include="itextsharp, Version=5.5.13.2, Culture=neutral, PublicKeyToken=8354ae6d2174ddca, processorArchitecture=MSIL">
<HintPath>..\packages\iTextSharp.5.5.13.2\lib\itextsharp.dll</HintPath>
</Reference>
<Reference Include="Jint, Version=3.0.0.0, Culture=neutral, PublicKeyToken=2e92ba9c8d81157f, processorArchitecture=MSIL">
<HintPath>..\packages\Jint.3.0.0-beta-2038\lib\net461\Jint.dll</HintPath>
</Reference>
<Reference Include="Microsoft.IO.RecyclableMemoryStream, Version=1.4.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.IO.RecyclableMemoryStream.1.4.1\lib\net46\Microsoft.IO.RecyclableMemoryStream.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="PresentationCore" />
<Reference Include="RazorEngine, Version=3.10.0.0, Culture=neutral, PublicKeyToken=9ee697374c7e744a, processorArchitecture=MSIL">
<HintPath>..\packages\RazorEngine.3.10.0\lib\net45\RazorEngine.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.Annotations, Version=4.2.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.ComponentModel.Annotations.4.7.0\lib\net461\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Memory, Version=4.0.1.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.4.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Security" />
<Reference Include="System.Threading.Tasks" />
<Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath>
</Reference>
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="ZetaLongPaths, Version=1.0.0.38, Culture=neutral, PublicKeyToken=b764f59068f31f38, processorArchitecture=MSIL">
<HintPath>..\packages\ZetaLongPaths.1.0.0.38\lib\net452-full\ZetaLongPaths.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AppConst.cs" />
<Compile Include="ConfigUtils.cs" />
<Compile Include="DBCHMConfig.cs" />
<Compile Include="DBDoc\ExcelDoc.cs" />
<Compile Include="DBDoc\WordDoc.cs" />
<Compile Include="DBDoc\XmlDoc.cs" />
<Compile Include="DBDoc\MarkDownDoc.cs" />
<Compile Include="DBDoc\HtmlDoc.cs" />
<Compile Include="DBDoc\PdfDoc.cs" />
<Compile Include="DBDoc\ChmDoc.cs" />
<Compile Include="DBDoc\Doc.cs" />
<Compile Include="DocFactory.cs" />
<Compile Include="Dtos\ChmHHP.cs" />
<Compile Include="Dtos\ColumnDto.cs" />
<Compile Include="Dtos\DBDto.cs" />
<Compile Include="Dtos\SqlCode.cs" />
<Compile Include="Dtos\TableDto.cs" />
<Compile Include="Enums.cs" />
<Compile Include="Extensions.cs" />
<Compile Include="JS.cs" />
<Compile Include="LogUtils.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RazorTpl.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="TplFile\chm\hhc.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TplFile\chm\hhk.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TplFile\chm\hhp.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TplFile\chm\list.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
<None Include="TplFile\chm\sqlcode.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TplFile\chm\table.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="TplFile\pdf\msyh.ttf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\MJTop.Data\MJTop.Data.csproj">
<Project>{3d36cdc9-e989-465b-a9f1-ad85dc42f242}</Project>
<Name>MJTop.Data</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="TplFile\html\html.cshtml">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<EmbeddedResource Include="TplFile\chm\embed\highlight.js" />
<Content Include="lib\Aspose.Words.dll" />
<Content Include="lib\EPPlus.dll" />
<Content Include="TplFile\chm\js\jQuery.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<EmbeddedResource Include="TplFile\chm\embed\sql-formatter.js" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

45
DocTools/Dtos/ChmHHP.cs Normal file
View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocTools.Dtos
{
public class ChmHHP
{
public ChmHHP() { }
public ChmHHP(string chmFile, string workTmpDir)
{
this.ChmFile = chmFile;
this.WorkTmpDir = workTmpDir;
if (!string.IsNullOrWhiteSpace(this.WorkTmpDir))
{
this.Files = Directory.GetFiles(this.WorkTmpDir, "*.html", SearchOption.AllDirectories).ToList();
}
}
public string ChmFile { get; set; }
public string WorkTmpDir { get; set; }
public string DefaultFile { get; set; } = "数据库目录.html";
public string Title
{
get
{
if (string.IsNullOrWhiteSpace(this.ChmFile))
{
return string.Empty;
}
return Path.GetFileName(this.ChmFile);
}
}
public List<string> Files { get; private set; }
}
}

View File

@ -0,0 +1,74 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace DocTools.Dtos
{
/// <summary>
/// 数据库表字段dto
/// </summary>
[Serializable]
public class ColumnDto
{
/// <summary>
/// 序号
/// </summary>
[Display(Name = "序号")]
public string ColumnOrder { get; set; }
/// <summary>
/// 列名
/// </summary>
[Display(Name = "列名")]
public string ColumnName { get; set; }
/// <summary>
/// 数据类型
/// </summary>
[Display(Name = "数据类型")]
public string ColumnTypeName { get; set; }
/// <summary>
/// 长度
/// </summary>
[Display(Name = "长度")]
public string Length { get; set; }
/// <summary>
/// 小数位
/// </summary>
[Display(Name = "小数位数")]
public string Scale { get; set; }
/// <summary>
/// 主键
/// </summary>
[Display(Name = "主键")]
public string IsPK { get; set; }
/// <summary>
/// 自增
/// </summary>
[Display(Name = "自增")]
public string IsIdentity { get; set; }
/// <summary>
/// 允许空
/// </summary>
[Display(Name = "允许空")]
public string CanNull { get; set; }
/// <summary>
/// 默认值
/// </summary>
[Display(Name = "默认值")]
public string DefaultVal { get; set; }
/// <summary>
/// 注释
/// </summary>
[Display(Name = "列说明")]
public string Comment { get; set; }
}
}

92
DocTools/Dtos/DBDto.cs Normal file
View File

@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;
namespace DocTools.Dtos
{
/// <summary>
/// 数据库Dto
/// </summary>
public class DBDto
{
public DBDto() { }
public DBDto(string dbName, object tag = null)
{
this.DBName = dbName;
this.Tag = tag;
}
/// <summary>
/// 数据库名称
/// </summary>
public string DBName { get; set; }
/// <summary>
/// 数据库类型
/// </summary>
public string DBType { get; set; }
private List<TableDto> _Tables = null;
/// <summary>
/// 表结构信息
/// </summary>
public List<TableDto> Tables
{
get
{
if (_Tables == null)
{
return new List<TableDto>();
}
else
{
_Tables.ForEach(t =>
{
t.Comment = FilterIllegalDir(t.Comment);
});
return _Tables;
}
}
set
{
_Tables = value;
}
}
/// <summary>
/// 数据库视图
/// </summary>
public Dictionary<string,string> Views { get; set; }
/// <summary>
/// 数据库存储过程
/// </summary>
public Dictionary<string, string> Procs { get; set; }
/// <summary>
/// 其他一些参数数据,用法如 winform 控件的 Tag属性
/// </summary>
public object Tag { get; set; }
/// <summary>
/// 处理非法字符路径
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private string FilterIllegalDir(string str)
{
if (str.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
{
str = string.Join(" ", str.Split(Path.GetInvalidFileNameChars()));
}
return str;
}
}
}

25
DocTools/Dtos/SqlCode.cs Normal file
View File

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocTools.Dtos
{
public class SqlCode
{
public string DBType { get; set; }
public string CodeName { get; set; }
public string Content { get; set; }
public string StyleContent
{
get
{
return JS.RunStyleSql(Content?.Trim(), DBType);
}
}
}
}

45
DocTools/Dtos/TableDto.cs Normal file
View File

@ -0,0 +1,45 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace DocTools.Dtos
{
/// <summary>
/// 数据库表dto
/// </summary>
[Serializable]
public class TableDto
{
/// <summary>
/// 序号
/// </summary>
[Display(Name = "序号")]
public string TableOrder { get; set; }
/// <summary>
/// 表名
/// </summary>
[Display(Name = "表名")]
public string TableName { get; set; }
/// <summary>
/// 注释
/// </summary>
[Display(Name = "表说明")]
public string Comment { get; set; }
/// <summary>
/// 数据库类型
/// </summary>
[Display(Name = "数据库类型")]
public string DBType { get; set; }
/// <summary>
/// 表格列集合
/// </summary>
[Display(Name = "列数据")]
public List<ColumnDto> Columns { get; set; }
}
}

19
DocTools/Enums.cs Normal file
View File

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocTools
{
public enum DocType
{
chm,
html,
word,
excel,
pdf,
markdown,
xml
}
}

238
DocTools/Extensions.cs Normal file
View File

@ -0,0 +1,238 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
using ZetaLongPaths;
using System.ComponentModel.DataAnnotations;
using System.Collections.Specialized;
namespace DocTools
{
public static class Extensions
{
public static void WriteAllText(StringBuilder builder, string filePath, string enc = "gbk")
{
ZlpIOHelper.WriteAllText(filePath, builder.ToString(), Encoding.GetEncoding(enc));
}
public static void WriteAllText(StringBuilder builder, string filePath, Encoding encoding)
{
ZlpIOHelper.WriteAllText(filePath, builder.ToString(), encoding);
}
public static string GetResourceContent(this Assembly assembly, string name)
{
var buffer = assembly.GetResourceBuffer(name);
return System.Text.Encoding.UTF8.GetString(buffer);
}
public static byte[] GetResourceBuffer(this Assembly assembly, string name)
{
var stream = assembly.GetManifestResourceStream(name);
var buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Dispose();
return buffer;
}
public static EM GetEnum<EM>(this string enumName)
where EM : struct, Enum
{
if (!Enum.TryParse<EM>(enumName, out EM em))
{
throw new ArgumentException("枚举转换失败!", nameof(enumName));
}
return em;
}
public static Dictionary<string, string> ToDictionary(this NameValueCollection nvc)
{
var dict = new Dictionary<string, string>();
foreach (var key in nvc.AllKeys)
{
dict.Add(key, nvc[key]);
}
return dict;
}
#region MarkDown
public static string MarkDown<T>(this IEnumerable<T> objs, params string[] excludePropNames)
{
if (objs == null)
{
return string.Empty;
}
StringBuilder sb = new StringBuilder();
var minus = 0;
var type = typeof(T);
var props = type.GetProperties();
var lstTmp = new List<string>();
sb.Append(" | ");
foreach (var prop in props)
{
if (excludePropNames != null && excludePropNames.Contains(prop.Name, StringComparer.OrdinalIgnoreCase))
{
minus++;
continue;
}
var headName = ((prop.GetCustomAttributes(typeof(DisplayAttribute), false)?.FirstOrDefault() as DisplayAttribute)?.Name) ?? prop.Name;
lstTmp.Add(headName);
}
sb.Append(string.Join(" | ", lstTmp));
sb.Append(" | ");
sb.AppendLine();
lstTmp = new List<string>();
sb.Append(" | ");
for (int j = 0; j < props.Length - minus; j++)
{
lstTmp.Add(":---:");
}
sb.Append(string.Join(" | ", lstTmp));
sb.Append(" | ");
foreach (var obj in objs)
{
if (obj == null)
{
continue;
}
sb.AppendLine();
sb.Append(" | ");
lstTmp = new List<string>();
foreach (var prop in props)
{
if (excludePropNames != null && excludePropNames.Contains(prop.Name, StringComparer.OrdinalIgnoreCase))
{
continue;
}
var value = (prop.GetValue(obj, null) ?? string.Empty).ToString();
lstTmp.Add(value);
}
sb.Append(string.Join(" | ", lstTmp));
sb.Append(" | ");
}
var md = sb.ToString();
return md;
}
public static string MarkDown(this DataTable data, params string[] excludeColNames)
{
if (data == null)
{
return string.Empty;
}
StringBuilder sb = new StringBuilder();
var minus = 0;
var lstTmp = new List<string>();
sb.Append(" | ");
foreach (DataColumn dc in data.Columns)
{
if (excludeColNames != null && excludeColNames.Contains(dc.ColumnName, StringComparer.OrdinalIgnoreCase))
{
minus++;
continue;
}
lstTmp.Add(dc.ColumnName);
}
sb.Append(string.Join(" | ", lstTmp));
sb.Append(" | ");
sb.AppendLine();
lstTmp = new List<string>();
sb.Append(" | ");
for (int j = 0; j < data.Columns.Count - minus; j++)
{
lstTmp.Add(":---:");
}
sb.Append(string.Join(" | ", lstTmp));
sb.Append(" | ");
foreach (DataRow dr in data.Rows)
{
sb.AppendLine();
sb.Append(" | ");
lstTmp = new List<string>();
foreach (DataColumn dc in data.Columns)
{
if (excludeColNames != null && excludeColNames.Contains(dc.ColumnName, StringComparer.OrdinalIgnoreCase))
{
continue;
}
var value = (dr[dc] ?? string.Empty).ToString();
lstTmp.Add(value);
}
sb.Append(string.Join(" | ", lstTmp));
sb.Append(" | ");
}
var md = sb.ToString();
return md;
}
#endregion
#region Xml序列化/
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type">类型</param>
/// <param name="xml">XML字符串</param>
/// <returns></returns>
public static object DeserializeXml(this Type type, string xml)
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(sr);
}
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type"></param>
/// <param name="xml"></param>
/// <returns></returns>
public static object DeserializeXml(this Type type, Stream stream)
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(stream);
}
/// <summary>
/// 序列化
/// </summary>
/// <param name="type">类型</param>
/// <param name="obj">对象</param>
/// <returns></returns>
public static string SerializeXml<T>(this T obj)
where T : new()
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(obj.GetType());
//序列化对象
xml.Serialize(Stream, obj);
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd();
sr.Dispose();
Stream.Dispose();
return str;
}
#endregion
}
}

146
DocTools/JS.cs Normal file
View File

@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DocTools
{
public class JS
{
private static Jint.Engine jt = null;
static JS()
{
//jt = new Jint.Engine(cfg =>
//{
// //cfg.LimitRecursion();
// cfg.Strict();
//});
jt = new Jint.Engine();
jt.SetValue("log", new Action<object>(Console.WriteLine));
var text = string.Empty;
var names = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
foreach (var name in names)
{
if (Path.GetExtension(name) == ".js")
{
text = System.Reflection.Assembly.GetExecutingAssembly().GetResourceContent(name);
try
{
jt.Execute(text);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
/// summary>
/// https://zeroturnaround.github.io/sql-formatter/
/// 格式化SQL语句
/// </summary>
/// <param name="sql">SQL语句</param>
/// <param name="dbtype">数据库类型</param>
/// <returns>格式化后的SQL语句</returns>
public static string RunFmtSql(string sql, string dbtype)
{
var supportLang = new List<string>()
{
"sql",
"redshift",
"db2",
"mariadb",
"mysql",
"n1ql",
"plsql",
"postgresql",
"spark",
"tsql"
};
var lang = dbtype.ToLower();
if (!supportLang.Contains(lang))
{
if (lang.StartsWith("oracle"))
{
lang = "plsql";
}
else if (lang == "sqlserver")
{
lang = "tsql";
}
else
{
lang = "sql";
}
}
sql = sql.Replace("`", "");
var code = $@"var fmtSql = sqlFormatter.format(`{ sql }`, {{language: ""{ lang }"",uppercase: true }});";
var res = sql;
try
{
jt.Execute(code);
res = jt.GetValue("fmtSql").ToString();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return res;
}
/// <summary>
/// https://highlightjs.org/static/demo/
/// 9.9版本
/// 返回带有css样式的高亮SQL代码
/// </summary>
/// <param name="sql">格式化后的SQL代码</param>
/// <param name="dbtype">数据库类型</param>
/// <returns></returns>
public static string RunHighlightHtml(string sql, string dbtype)
{
dbtype = dbtype.ToLower();
var lang = "sql";
//if (dbtype.StartsWith("oracle"))
//{
// lang = "ruleslanguage";
//}
//else if (dbtype == "postgresql")
//{
// lang = "pgsql";
//}
sql = sql.Replace("`", "");
var code = $@"var hlhtml = hljs.highlight(""{ lang }"",`{ sql }`,true).value;";
var res = sql;
try
{
jt.Execute(code);
res = jt.GetValue("hlhtml").ToString();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return res;
}
public static string RunStyleSql(string sql, string dbtype)
{
var fmtSql = RunFmtSql(sql, dbtype);
var reSql = RunHighlightHtml(fmtSql, dbtype);
return reSql;
}
}
}

266
DocTools/LogUtils.cs Normal file
View File

@ -0,0 +1,266 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Web;
using System.Text.RegularExpressions;
using System.Linq;
using System.Collections;
using System.Reflection;
using System.Collections.Specialized;
using ZetaLongPaths;
/// <summary>
/// 日志操作类
/// </summary>
public class LogUtils
{
private static object locker = new object();
/// <summary>
/// 写入日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="level">日志级别</param>
/// <param name="details">日志详情</param>
/// <param name="createtime">记录时间</param>
public static void Write(string logName, Developer developer, LogLevel level, List<object> details, DateTime createtime)
{
Log log = new Log();
log.LogName = logName;
log.Level = level;
log.Developer = developer;
log.Added = createtime;
log.Details = details;
string logText = log.ToString() + "\r\n----------------------------------------------------------------------------------------------------\r\n";
string fileName = DateTime.Now.ToString("yyyyMMdd") + ".log";
string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log");
if (!ZetaLongPaths.ZlpIOHelper.DirectoryExists(dir))
{
ZetaLongPaths.ZlpIOHelper.CreateDirectory(dir);
}
fileName = Path.Combine(dir, fileName);
ZlpIOHelper.AppendText(fileName, logText, Encoding.GetEncoding("GBK"));
}
/// <summary>
/// 写入Info 日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="Info_objs">日志内容</param>
public static void LogInfo(string logName, Developer developer, params object[] Info_objs)
{
lock (locker)
{
Write(logName, developer, LogLevel.Info, Info_objs?.ToList(), DateTime.Now);
}
}
/// <summary>s
/// 写入带 堆栈执行 的Info 日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="Info_objs">日志内容</param>
public static void LogWrite(string logName, Developer developer, params object[] Info_objs)
{
lock (locker)
{
List<object> lstDetails = new List<object>();
System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(1, true);
System.Diagnostics.StackFrame frame = stack.GetFrame(0);
string execFile = frame.GetFileName();
string fullName = frame.GetMethod().DeclaringType.FullName;
string methodName = frame.GetMethod().Name;
int execLine = frame.GetFileLineNumber();
lstDetails.Add("文件路径:" + execFile + "\r\n");
lstDetails.Add("类全命名:" + fullName + "\r\n");
lstDetails.Add("执行方法:" + methodName + "\r\n");
lstDetails.Add("当前行号:" + execLine + "\r\n");
if (Info_objs != null && Info_objs.Length > 0)
{
lstDetails.AddRange(Info_objs);
}
Write(logName, developer, LogLevel.Info, lstDetails, DateTime.Now);
}
}
/// <summary>
/// 写入Warn 日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="Info_objs">日志内容</param>
public static void LogWarn(string logName, Developer developer, params object[] Info_objs)
{
lock (locker)
{
List<object> lstDetails = new List<object>();
System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(1, true);
System.Diagnostics.StackFrame frame = stack.GetFrame(0);
string execFile = frame.GetFileName();
string fullName = frame.GetMethod().DeclaringType.FullName;
string methodName = frame.GetMethod().Name;
int execLine = frame.GetFileLineNumber();
lstDetails.Add("文件路径:" + execFile + "\r\n");
lstDetails.Add("类全命名:" + fullName + "\r\n");
lstDetails.Add("执行方法:" + methodName + "\r\n");
lstDetails.Add("当前行号:" + execLine + "\r\n");
if (Info_objs != null && Info_objs.Length > 0)
{
lstDetails.AddRange(Info_objs);
}
Write(logName, developer, LogLevel.Warn, lstDetails, DateTime.Now);
}
}
/// <summary>
/// 写入 Errorr日志
/// </summary>
/// <param name="logName">日志名称</param>
/// <param name="developer">开发记录者</param>
/// <param name="ex">异常对象(可为null)</param>
/// <param name="Info_objs">日志内容</param>
public static void LogError(string logName, Developer developer, Exception ex, params object[] Info_objs)
{
lock (locker)
{
List<object> lstDetails = new List<object>();
System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace(1, true);
System.Diagnostics.StackFrame frame = stack.GetFrame(0);
string execFile = frame.GetFileName();
string fullName = frame.GetMethod().DeclaringType.FullName;
string methodName = frame.GetMethod().Name;
int execLine = frame.GetFileLineNumber();
lstDetails.Add("文件路径:" + execFile + "\r\n");
lstDetails.Add("类全命名:" + fullName + "\r\n");
lstDetails.Add("执行方法:" + methodName + "\r\n");
lstDetails.Add("当前行号:" + execLine + "\r\n");
lstDetails.Add(ex);
if (ex.InnerException != null)
{
lstDetails.Add(ex.InnerException);
}
if (Info_objs != null && Info_objs.Length > 0)
{
lstDetails.AddRange(Info_objs);
}
Write(logName, developer, LogLevel.Error, lstDetails, DateTime.Now);
}
}
}
/// <summary>
/// 程序日志
/// </summary>
public class Log
{
public Guid Id { get { return Guid.NewGuid(); } }
/// <summary>
/// 日志名称
/// </summary>
public string LogName { get; set; }
/// <summary>
/// 日志级别
/// </summary>
public LogLevel Level { get; set; }
/// <summary>
/// 当前记录日志者
/// </summary>
public Developer Developer { get; set; }
/// <summary>
/// 日志详细内容
/// </summary>
public List<object> Details { get; set; }
/// <summary>
/// 日志时间
/// </summary>
public DateTime Added { get; set; }
public override string ToString()
{
return Newtonsoft.Json.JsonConvert.SerializeObject(this ?? default(Log));
}
#region
/// <summary>
/// 根据枚举对象得到 枚举键值对
/// </summary>
/// <typeparam name="T">枚举</typeparam>
/// <returns></returns>
public static Dictionary<string, string> GetAllEnums<T>()
{
Dictionary<string, string> dict = null;
Type type = typeof(T);
string[] enums = Enum.GetNames(type);
if (enums != null && enums.Length > 0)
{
dict = new Dictionary<string, string>();
foreach (string item in enums)
{
string str = Enum.Parse(typeof(T), item).ToString();
T deve = (T)Enum.Parse(typeof(T), item);
string uid = Convert.ToInt32(deve).ToString();
dict.Add(str, uid);
}
}
return dict;
}
/// <summary>
/// 根据枚举val获取枚举name
/// </summary>
/// <typeparam name="T">枚举类型</typeparam>
/// <param name="enumVal">枚举val</param>
/// <returns>枚举name</returns>
public static T GetEnumName<T>(int enumVal)
{
T t = (T)Enum.Parse(typeof(T), enumVal.ToString());
return t;
}
#endregion
}
/// <summary>
/// 日志级别
/// </summary>
public enum LogLevel
{
Info = 0,
Warn = 1,
Error = 2
}
/// <summary>
/// 日志记录开发者
/// </summary>
public enum Developer
{
/// <summary>
/// 系统默认
/// </summary>
SysDefault = 0,
/// <summary>
/// 其他用户
/// </summary>
MJ = 1,
}

View File

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("DocTools")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DocTools")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("130a8861-0c39-4933-9de8-aa9525488211")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

71
DocTools/RazorTpl.cs Normal file
View File

@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using RazorEngine;
using RazorEngine.Configuration;
using RazorEngine.Templating;
using RazorEngine.Text;
namespace DocTools
{
public static class RazorTpl
{
static RazorTpl()
{
var config = new TemplateServiceConfiguration();
config.Language = Language.CSharp;
config.EncodedStringFactory = new RawStringFactory();
config.DisableTempFileLocking = true;
//config.EncodedStringFactory = new HtmlEncodedStringFactory();
var service = RazorEngineService.Create(config);
Engine.Razor = service;
}
public static string RazorRender(this FileInfo tpl_file, object model, string encoding = "utf-8")
{
try
{
var tpl_text = File.ReadAllText(tpl_file.FullName, System.Text.Encoding.GetEncoding(encoding));
return Engine.Razor.RunCompile(tpl_text, Md5(tpl_text), null, model);
}
catch (Exception ex)
{
throw ex;
}
}
public static string RazorRender(this string tpl_text, object model)
{
try
{
return Engine.Razor.RunCompile(tpl_text, Md5(tpl_text), null, model);
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 字符串的Md5值
/// </summary>
private static string Md5(string value)
{
if (value == null)
return null;
MD5 md5Hash = MD5.Create();
byte[] data = md5Hash.ComputeHash(System.Text.Encoding.UTF8.GetBytes(value));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
}
}

View File

@ -0,0 +1,964 @@

var hljs = {};
// Convenience variables for build-in objects
var ArrayProto = [],
objectKeys = Object.keys;
// Global internal variables used within the highlight.js library.
var languages = {},
aliases = {};
// Regular expressions used throughout the highlight.js library.
var noHighlightRe = /^(no-?highlight|plain|text)$/i,
languagePrefixRe = /\blang(?:uage)?-([\w-]+)\b/i,
fixMarkupRe = /((^(<[^>]+>|\t|)+|(?:\n)))/gm;
var spanEndTag = '</span>';
// Global options used when within external APIs. This is modified when
// calling the `hljs.configure` function.
var options = {
classPrefix: 'hljs-',
tabReplace: null,
useBR: false,
languages: undefined
};
// Object map that is used to escape some common HTML characters.
var escapeRegexMap = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;'
};
/* Utility functions */
function escape(value) {
return value.replace(/[&<>]/gm, function (character) {
return escapeRegexMap[character];
});
}
function tag(node) {
return node.nodeName.toLowerCase();
}
function testRe(re, lexeme) {
var match = re && re.exec(lexeme);
return match && match.index === 0;
}
function isNotHighlighted(language) {
return noHighlightRe.test(language);
}
function blockLanguage(block) {
var i, match, length, _class;
var classes = block.className + ' ';
classes += block.parentNode ? block.parentNode.className : '';
// language-* takes precedence over non-prefixed class names.
match = languagePrefixRe.exec(classes);
if (match) {
return getLanguage(match[1]) ? match[1] : 'no-highlight';
}
classes = classes.split(/\s+/);
for (i = 0, length = classes.length; i < length; i++) {
_class = classes[i]
if (isNotHighlighted(_class) || getLanguage(_class)) {
return _class;
}
}
}
function inherit(parent, obj) {
var key;
var result = {};
for (key in parent)
result[key] = parent[key];
if (obj)
for (key in obj)
result[key] = obj[key];
return result;
}
/* Stream merging */
function nodeStream(node) {
var result = [];
(function _nodeStream(node, offset) {
for (var child = node.firstChild; child; child = child.nextSibling) {
if (child.nodeType === 3)
offset += child.nodeValue.length;
else if (child.nodeType === 1) {
result.push({
event: 'start',
offset: offset,
node: child
});
offset = _nodeStream(child, offset);
// Prevent void elements from having an end tag that would actually
// double them in the output. There are more void elements in HTML
// but we list only those realistically expected in code display.
if (!tag(child).match(/br|hr|img|input/)) {
result.push({
event: 'stop',
offset: offset,
node: child
});
}
}
}
return offset;
})(node, 0);
return result;
}
function mergeStreams(original, highlighted, value) {
var processed = 0;
var result = '';
var nodeStack = [];
function selectStream() {
if (!original.length || !highlighted.length) {
return original.length ? original : highlighted;
}
if (original[0].offset !== highlighted[0].offset) {
return (original[0].offset < highlighted[0].offset) ? original : highlighted;
}
/*
To avoid starting the stream just before it should stop the order is
ensured that original always starts first and closes last:
if (event1 == 'start' && event2 == 'start')
return original;
if (event1 == 'start' && event2 == 'stop')
return highlighted;
if (event1 == 'stop' && event2 == 'start')
return original;
if (event1 == 'stop' && event2 == 'stop')
return highlighted;
... which is collapsed to:
*/
return highlighted[0].event === 'start' ? original : highlighted;
}
function open(node) {
function attr_str(a) { return ' ' + a.nodeName + '="' + escape(a.value) + '"'; }
result += '<' + tag(node) + ArrayProto.map.call(node.attributes, attr_str).join('') + '>';
}
function close(node) {
result += '</' + tag(node) + '>';
}
function render(event) {
(event.event === 'start' ? open : close)(event.node);
}
while (original.length || highlighted.length) {
var stream = selectStream();
result += escape(value.substring(processed, stream[0].offset));
processed = stream[0].offset;
if (stream === original) {
/*
On any opening or closing tag of the original markup we first close
the entire highlighted node stack, then render the original tag along
with all the following original tags at the same offset and then
reopen all the tags on the highlighted stack.
*/
nodeStack.reverse().forEach(close);
do {
render(stream.splice(0, 1)[0]);
stream = selectStream();
} while (stream === original && stream.length && stream[0].offset === processed);
nodeStack.reverse().forEach(open);
} else {
if (stream[0].event === 'start') {
nodeStack.push(stream[0].node);
} else {
nodeStack.pop();
}
render(stream.splice(0, 1)[0]);
}
}
return result + escape(value.substr(processed));
}
/* Initialization */
function compileLanguage(language) {
function reStr(re) {
return (re && re.source) || re;
}
function langRe(value, global) {
return new RegExp(
reStr(value),
'm' + (language.case_insensitive ? 'i' : '') + (global ? 'g' : '')
);
}
let cnt = 0;
function compileMode(mode, parent) {
cnt++;
if (cnt > 5) {
return;
}
if (mode.compiled)
return;
mode.compiled = true;
mode.keywords = mode.keywords || mode.beginKeywords;
if (mode.keywords) {
var compiled_keywords = {};
var flatten = function (className, str) {
if (language.case_insensitive) {
str = str.toLowerCase();
}
str.split(' ').forEach(function (kw) {
var pair = kw.split('|');
compiled_keywords[pair[0]] = [className, pair[1] ? Number(pair[1]) : 1];
});
};
if (typeof mode.keywords === 'string') { // string
flatten('keyword', mode.keywords);
} else {
objectKeys(mode.keywords).forEach(function (className) {
flatten(className, mode.keywords[className]);
});
}
mode.keywords = compiled_keywords;
}
mode.lexemesRe = langRe(mode.lexemes || /\w+/, true);
if (parent) {
if (mode.beginKeywords) {
mode.begin = '\\b(' + mode.beginKeywords.split(' ').join('|') + ')\\b';
}
if (!mode.begin)
mode.begin = /\B|\b/;
mode.beginRe = langRe(mode.begin);
if (!mode.end && !mode.endsWithParent)
mode.end = /\B|\b/;
if (mode.end)
mode.endRe = langRe(mode.end);
mode.terminator_end = reStr(mode.end) || '';
if (mode.endsWithParent && parent.terminator_end)
mode.terminator_end += (mode.end ? '|' : '') + parent.terminator_end;
}
if (mode.illegal)
mode.illegalRe = langRe(mode.illegal);
if (mode.relevance == null)
mode.relevance = 1;
if (!mode.contains) {
mode.contains = [];
}
var expanded_contains = [];
log("mode.contains.length:" + mode.contains.length);
mode.contains.forEach(function (c) {
if (c.variants) {
c.variants.forEach(function (v) { expanded_contains.push(inherit(c, v)); });
} else {
expanded_contains.push(c === 'self' ? mode : c);
}
});
mode.contains = expanded_contains;
mode.contains.forEach(function (c) {
compileMode(c, mode);
});
if (mode.starts) {
compileMode(mode.starts, parent);
}
var terminators =
mode.contains.map(function (c) {
return c.beginKeywords ? '\\.?(' + c.begin + ')\\.?' : c.begin;
})
.concat([mode.terminator_end, mode.illegal])
.map(reStr)
.filter(Boolean);
mode.terminators = terminators.length ? langRe(terminators.join('|'), true) : { exec: function (/*s*/) { return null; } };
}
compileMode(language);
}
/*
Core highlighting function. Accepts a language name, or an alias, and a
string with the code to highlight. Returns an object with the following
properties:
- relevance (int)
- value (an HTML string with highlighting markup)
*/
function highlight(name, value, ignore_illegals, continuation) {
function subMode(lexeme, mode) {
var i, length;
for (i = 0, length = mode.contains.length; i < length; i++) {
if (testRe(mode.contains[i].beginRe, lexeme)) {
return mode.contains[i];
}
}
}
function endOfMode(mode, lexeme) {
if (testRe(mode.endRe, lexeme)) {
while (mode.endsParent && mode.parent) {
mode = mode.parent;
}
return mode;
}
if (mode.endsWithParent) {
return endOfMode(mode.parent, lexeme);
}
}
function isIllegal(lexeme, mode) {
return !ignore_illegals && testRe(mode.illegalRe, lexeme);
}
function keywordMatch(mode, match) {
var match_str = language.case_insensitive ? match[0].toLowerCase() : match[0];
return mode.keywords.hasOwnProperty(match_str) && mode.keywords[match_str];
}
function buildSpan(classname, insideSpan, leaveOpen, noPrefix) {
var classPrefix = noPrefix ? '' : options.classPrefix,
openSpan = '<span class="' + classPrefix,
closeSpan = leaveOpen ? '' : spanEndTag
openSpan += classname + '">';
return openSpan + insideSpan + closeSpan;
}
function processKeywords() {
var keyword_match, last_index, match, result;
if (!top.keywords)
return escape(mode_buffer);
result = '';
last_index = 0;
top.lexemesRe.lastIndex = 0;
match = top.lexemesRe.exec(mode_buffer);
while (match) {
result += escape(mode_buffer.substring(last_index, match.index));
keyword_match = keywordMatch(top, match);
if (keyword_match) {
relevance += keyword_match[1];
result += buildSpan(keyword_match[0], escape(match[0]));
} else {
result += escape(match[0]);
}
last_index = top.lexemesRe.lastIndex;
match = top.lexemesRe.exec(mode_buffer);
}
return result + escape(mode_buffer.substr(last_index));
}
function processSubLanguage() {
var explicit = typeof top.subLanguage === 'string';
if (explicit && !languages[top.subLanguage]) {
return escape(mode_buffer);
}
var result = explicit ?
highlight(top.subLanguage, mode_buffer, true, continuations[top.subLanguage]) :
highlightAuto(mode_buffer, top.subLanguage.length ? top.subLanguage : undefined);
// Counting embedded language score towards the host language may be disabled
// with zeroing the containing mode relevance. Usecase in point is Markdown that
// allows XML everywhere and makes every XML snippet to have a much larger Markdown
// score.
if (top.relevance > 0) {
relevance += result.relevance;
}
if (explicit) {
continuations[top.subLanguage] = result.top;
}
return buildSpan(result.language, result.value, false, true);
}
function processBuffer() {
result += (top.subLanguage != null ? processSubLanguage() : processKeywords());
mode_buffer = '';
}
function startNewMode(mode) {
result += mode.className ? buildSpan(mode.className, '', true) : '';
top = Object.create(mode, { parent: { value: top } });
}
function processLexeme(buffer, lexeme) {
mode_buffer += buffer;
if (lexeme == null) {
processBuffer();
return 0;
}
var new_mode = subMode(lexeme, top);
if (new_mode) {
if (new_mode.skip) {
mode_buffer += lexeme;
} else {
if (new_mode.excludeBegin) {
mode_buffer += lexeme;
}
processBuffer();
if (!new_mode.returnBegin && !new_mode.excludeBegin) {
mode_buffer = lexeme;
}
}
startNewMode(new_mode, lexeme);
return new_mode.returnBegin ? 0 : lexeme.length;
}
var end_mode = endOfMode(top, lexeme);
if (end_mode) {
var origin = top;
if (origin.skip) {
mode_buffer += lexeme;
} else {
if (!(origin.returnEnd || origin.excludeEnd)) {
mode_buffer += lexeme;
}
processBuffer();
if (origin.excludeEnd) {
mode_buffer = lexeme;
}
}
do {
if (top.className) {
result += spanEndTag;
}
if (!top.skip) {
relevance += top.relevance;
}
top = top.parent;
} while (top !== end_mode.parent);
if (end_mode.starts) {
startNewMode(end_mode.starts, '');
}
return origin.returnEnd ? 0 : lexeme.length;
}
if (isIllegal(lexeme, top))
throw new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.className || '<unnamed>') + '"');
/*
Parser should not reach this point as all types of lexemes should be caught
earlier, but if it does due to some bug make sure it advances at least one
character forward to prevent infinite looping.
*/
mode_buffer += lexeme;
return lexeme.length || 1;
}
var language = getLanguage(name);
log(name + " " + language);
if (!language) {
throw new Error('Unknown language: "' + name + '"');
}
log("language" + language);
compileLanguage(language);
var top = continuation || language;
var continuations = {}; // keep continuations for sub-languages
var result = '', current;
for (current = top; current !== language; current = current.parent) {
if (current.className) {
result = buildSpan(current.className, '', true) + result;
}
}
log("name" + name);
var mode_buffer = '';
var relevance = 0;
try {
var match, count, index = 0;
while (true) {
log("index"+index);
top.terminators.lastIndex = index;
match = top.terminators.exec(value);
if (!match)
break;
count = processLexeme(value.substring(index, match.index), match[0]);
index = match.index + count;
}
processLexeme(value.substr(index));
for (current = top; current.parent; current = current.parent) { // close dangling modes
if (current.className) {
result += spanEndTag;
}
}
return {
relevance: relevance,
value: result,
language: name,
top: top
};
} catch (e) {
if (e.message && e.message.indexOf('Illegal') !== -1) {
return {
relevance: 0,
value: escape(value)
};
} else {
throw e;
}
}
}
/*
Highlighting with language detection. Accepts a string with the code to
highlight. Returns an object with the following properties:
- language (detected language)
- relevance (int)
- value (an HTML string with highlighting markup)
- second_best (object with the same structure for second-best heuristically
detected language, may be absent)
*/
function highlightAuto(text, languageSubset) {
languageSubset = languageSubset || options.languages || objectKeys(languages);
var result = {
relevance: 0,
value: escape(text)
};
var second_best = result;
languageSubset.filter(getLanguage).forEach(function (name) {
var current = highlight(name, text, false);
current.language = name;
if (current.relevance > second_best.relevance) {
second_best = current;
}
if (current.relevance > result.relevance) {
second_best = result;
result = current;
}
});
if (second_best.language) {
result.second_best = second_best;
}
return result;
}
/*
Post-processing of the highlighted markup:
- replace TABs with something more useful
- replace real line-breaks with '<br>' for non-pre containers
*/
function fixMarkup(value) {
return !(options.tabReplace || options.useBR)
? value
: value.replace(fixMarkupRe, function (match, p1) {
if (options.useBR && match === '\n') {
return '<br>';
} else if (options.tabReplace) {
return p1.replace(/\t/g, options.tabReplace);
}
});
}
function buildClassName(prevClassName, currentLang, resultLang) {
var language = currentLang ? aliases[currentLang] : resultLang,
result = [prevClassName.trim()];
if (!prevClassName.match(/\bhljs\b/)) {
result.push('hljs');
}
if (prevClassName.indexOf(language) === -1) {
result.push(language);
}
return result.join(' ').trim();
}
/*
Applies highlighting to a DOM node containing code. Accepts a DOM node and
two optional parameters for fixMarkup.
*/
function highlightBlock(block) {
var node, originalStream, result, resultNode, text;
var language = blockLanguage(block);
if (isNotHighlighted(language))
return;
if (options.useBR) {
node = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
node.innerHTML = block.innerHTML.replace(/\n/g, '').replace(/<br[ \/]*>/g, '\n');
} else {
node = block;
}
text = node.textContent;
result = language ? highlight(language, text, true) : highlightAuto(text);
originalStream = nodeStream(node);
if (originalStream.length) {
resultNode = document.createElementNS('http://www.w3.org/1999/xhtml', 'div');
resultNode.innerHTML = result.value;
result.value = mergeStreams(originalStream, nodeStream(resultNode), text);
}
result.value = fixMarkup(result.value);
block.innerHTML = result.value;
block.className = buildClassName(block.className, language, result.language);
block.result = {
language: result.language,
re: result.relevance
};
if (result.second_best) {
block.second_best = {
language: result.second_best.language,
re: result.second_best.relevance
};
}
}
/*
Updates highlight.js global options with values passed in the form of an object.
*/
function configure(user_options) {
options = inherit(options, user_options);
}
/*
Applies highlighting to all <pre><code>..</code></pre> blocks on a page.
*/
function initHighlighting() {
if (initHighlighting.called)
return;
initHighlighting.called = true;
var blocks = document.querySelectorAll('pre code');
ArrayProto.forEach.call(blocks, highlightBlock);
}
/*
Attaches highlighting to the page load event.
*/
function initHighlightingOnLoad() {
addEventListener('DOMContentLoaded', initHighlighting, false);
addEventListener('load', initHighlighting, false);
}
function registerLanguage(name, language) {
//log(name + " " + language);
var lang = languages[name] = language(hljs);
if (lang.aliases) {
lang.aliases.forEach(function (alias) { aliases[alias] = name; });
}
}
function listLanguages() {
return objectKeys(languages);
}
function getLanguage(name) {
name = (name || '').toLowerCase();
return languages[name] || languages[aliases[name]];
}
/* Interface definition */
hljs.highlight = highlight;
hljs.highlightAuto = highlightAuto;
hljs.fixMarkup = fixMarkup;
hljs.highlightBlock = highlightBlock;
hljs.configure = configure;
hljs.initHighlighting = initHighlighting;
hljs.initHighlightingOnLoad = initHighlightingOnLoad;
hljs.registerLanguage = registerLanguage;
hljs.listLanguages = listLanguages;
hljs.getLanguage = getLanguage;
hljs.inherit = inherit;
// Common regexps
hljs.IDENT_RE = '[a-zA-Z]\\w*';
hljs.UNDERSCORE_IDENT_RE = '[a-zA-Z_]\\w*';
hljs.NUMBER_RE = '\\b\\d+(\\.\\d+)?';
hljs.C_NUMBER_RE = '(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)'; // 0x..., 0..., decimal, float
hljs.BINARY_NUMBER_RE = '\\b(0b[01]+)'; // 0b...
hljs.RE_STARTERS_RE = '!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~';
// Common modes
hljs.BACKSLASH_ESCAPE = {
begin: '\\\\[\\s\\S]', relevance: 0
};
hljs.APOS_STRING_MODE = {
className: 'string',
begin: '\'', end: '\'',
illegal: '\\n',
contains: [hljs.BACKSLASH_ESCAPE]
};
hljs.QUOTE_STRING_MODE = {
className: 'string',
begin: '"', end: '"',
illegal: '\\n',
contains: [hljs.BACKSLASH_ESCAPE]
};
hljs.PHRASAL_WORDS_MODE = {
begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/
};
hljs.COMMENT = function (begin, end, inherits) {
var mode = hljs.inherit(
{
className: 'comment',
begin: begin, end: end,
contains: []
},
inherits || {}
);
mode.contains.push(hljs.PHRASAL_WORDS_MODE);
mode.contains.push({
className: 'doctag',
begin: '(?:TODO|FIXME|NOTE|BUG|XXX):',
relevance: 0
});
return mode;
};
hljs.C_LINE_COMMENT_MODE = hljs.COMMENT('//', '$');
hljs.C_BLOCK_COMMENT_MODE = hljs.COMMENT('/\\*', '\\*/');
hljs.HASH_COMMENT_MODE = hljs.COMMENT('#', '$');
hljs.NUMBER_MODE = {
className: 'number',
begin: hljs.NUMBER_RE,
relevance: 0
};
hljs.C_NUMBER_MODE = {
className: 'number',
begin: hljs.C_NUMBER_RE,
relevance: 0
};
hljs.BINARY_NUMBER_MODE = {
className: 'number',
begin: hljs.BINARY_NUMBER_RE,
relevance: 0
};
hljs.CSS_NUMBER_MODE = {
className: 'number',
begin: hljs.NUMBER_RE + '(' +
'%|em|ex|ch|rem' +
'|vw|vh|vmin|vmax' +
'|cm|mm|in|pt|pc|px' +
'|deg|grad|rad|turn' +
'|s|ms' +
'|Hz|kHz' +
'|dpi|dpcm|dppx' +
')?',
relevance: 0
};
hljs.REGEXP_MODE = {
className: 'regexp',
begin: /\//, end: /\/[gimuy]*/,
illegal: /\n/,
contains: [
hljs.BACKSLASH_ESCAPE,
{
begin: /\[/, end: /\]/,
relevance: 0,
contains: [hljs.BACKSLASH_ESCAPE]
}
]
};
hljs.TITLE_MODE = {
className: 'title',
begin: hljs.IDENT_RE,
relevance: 0
};
hljs.UNDERSCORE_TITLE_MODE = {
className: 'title',
begin: hljs.UNDERSCORE_IDENT_RE,
relevance: 0
};
hljs.METHOD_GUARD = {
// excludes method names from keyword processing
begin: '\\.\\s*' + hljs.UNDERSCORE_IDENT_RE,
relevance: 0
};
hljs.registerLanguage("sql", function (hljs) {
var COMMENT_MODE = hljs.COMMENT('--', '$');
return {
case_insensitive: true,
illegal: /[<>{}*#]/,
contains: [
{
beginKeywords:
'begin end start commit rollback savepoint lock alter create drop rename call ' +
'delete do handler insert load replace select truncate update set show pragma grant ' +
'merge describe use explain help declare prepare execute deallocate release ' +
'unlock purge reset change stop analyze cache flush optimize repair kill ' +
'install uninstall checksum restore check backup revoke comment',
end: /;/, endsWithParent: true,
lexemes: /[\w\.]+/,
keywords: {
keyword:
'abort abs absolute acc acce accep accept access accessed accessible account acos action activate add ' +
'addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias ' +
'allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply ' +
'archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan ' +
'atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid ' +
'authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile ' +
'before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float ' +
'binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound ' +
'buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel ' +
'capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base ' +
'char_length character_length characters characterset charindex charset charsetform charsetid check ' +
'checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close ' +
'cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation ' +
'collect colu colum column column_value columns columns_updated comment commit compact compatibility ' +
'compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn ' +
'connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection ' +
'consider consistent constant constraint constraints constructor container content contents context ' +
'contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost ' +
'count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation ' +
'critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user ' +
'cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add ' +
'date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts ' +
'day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate ' +
'declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults ' +
'deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank ' +
'depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor ' +
'deterministic diagnostics difference dimension direct_load directory disable disable_all ' +
'disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div ' +
'do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable ' +
'editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt ' +
'end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors ' +
'escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding ' +
'execu execut execute exempt exists exit exp expire explain export export_set extended extent external ' +
'external_1 external_2 externally extract failed failed_login_attempts failover failure far fast ' +
'feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final ' +
'finish first first_value fixed flash_cache flashback floor flush following follows for forall force ' +
'form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ' +
'ftp full function general generated get get_format get_lock getdate getutcdate global global_name ' +
'globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups ' +
'gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex ' +
'hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified ' +
'identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment ' +
'index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile ' +
'initial initialized initially initrans inmemory inner innodb input insert install instance instantiable ' +
'instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat ' +
'is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists ' +
'keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase ' +
'lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit ' +
'lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate ' +
'locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call ' +
'logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime ' +
'managed management manual map mapping mask master master_pos_wait match matched materialized max ' +
'maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans ' +
'md5 measures median medium member memcompress memory merge microsecond mid migration min minextents ' +
'minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month ' +
'months mount move movement multiset mutex name name_const names nan national native natural nav nchar ' +
'nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile ' +
'nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile ' +
'nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder ' +
'nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck ' +
'noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe ' +
'nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ' +
'ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old ' +
'on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date ' +
'oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary ' +
'out outer outfile outline output over overflow overriding package pad parallel parallel_enable ' +
'parameters parent parse partial partition partitions pascal passing password password_grace_time ' +
'password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex ' +
'pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc ' +
'performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin ' +
'policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction ' +
'prediction_cost prediction_details prediction_probability prediction_set prepare present preserve ' +
'prior priority private private_sga privileges procedural procedure procedure_analyze processlist ' +
'profiles project prompt protection public publishingservername purge quarter query quick quiesce quota ' +
'quotename radians raise rand range rank raw read reads readsize rebuild record records ' +
'recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh ' +
'regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy ' +
'reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename ' +
'repair repeat replace replicate replication required reset resetlogs resize resource respect restore ' +
'restricted result result_cache resumable resume retention return returning returns reuse reverse revoke ' +
'right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows ' +
'rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll ' +
'sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select ' +
'self sequence sequential serializable server servererror session session_user sessions_per_user set ' +
'sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor ' +
'si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin ' +
'size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex ' +
'source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows ' +
'sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone ' +
'standby start starting startup statement static statistics stats_binomial_test stats_crosstab ' +
'stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep ' +
'stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev ' +
'stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate ' +
'subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum ' +
'suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate ' +
'sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo ' +
'template temporary terminated tertiary_weights test than then thread through tier ties time time_format ' +
'time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr ' +
'timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking ' +
'transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate ' +
'try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress ' +
'under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot ' +
'unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert ' +
'url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date ' +
'utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var ' +
'var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray ' +
'verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear ' +
'wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped ' +
'xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces ' +
'xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek',
literal:
'true false null',
built_in:
'array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number ' +
'numeric real record serial serial8 smallint text varchar varying void'
},
contains: [
{
className: 'string',
begin: '\'', end: '\'',
contains: [hljs.BACKSLASH_ESCAPE, { begin: '\'\'' }]
},
{
className: 'string',
begin: '"', end: '"',
contains: [hljs.BACKSLASH_ESCAPE, { begin: '""' }]
},
{
className: 'string',
begin: '`', end: '`',
contains: [hljs.BACKSLASH_ESCAPE]
},
hljs.C_NUMBER_MODE,
hljs.C_BLOCK_COMMENT_MODE,
COMMENT_MODE
]
},
hljs.C_BLOCK_COMMENT_MODE,
COMMENT_MODE
]
};
});

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,84 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="DBCHM.exe by lztkdr">
<!-- Sitemap 1.0 -->
<!-- hhk文件渲染后需 Replace("</LI>", "") -->
</HEAD>
<BODY>
<OBJECT type="text/site properties">
<param name="ExWindow Styles" value="0x200">
<param name="Window Styles" value="0x800025">
<param name="Font" value="MS Sans Serif,9,0">
</OBJECT>
<UL>
<LI><OBJECT type="text/sitemap">
<param name="Name" value="数据库目录">
<param name="Local" value="数据库目录.html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
@if (Model.Tables != null && Model.Tables.Count > 0)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="表结构">
<param name="ImageNumber" value="1">
</OBJECT>
<UL>
@foreach (var table in Model.Tables)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@(table.TableName+" "+table.Comment)">
<param name="Local" value="表结构\@(table.TableName+" "+table.Comment).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
}
</UL>
</LI>
}
@if (Model.Views != null && Model.Views.Count > 0)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="视图">
<param name="ImageNumber" value="1">
</OBJECT>
<UL>
@foreach (var item in Model.Views)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@(item.Key)">
<param name="Local" value="视图\@(item.Key).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
}
</UL>
</LI>
}
@if (Model.Procs != null && Model.Procs.Count > 0)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="存储过程">
<param name="ImageNumber" value="1">
</OBJECT>
<UL>
@foreach (var item in Model.Procs)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@(item.Key)">
<param name="Local" value="存储过程\@(item.Key).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
}
</UL>
</LI>
}
</UL>
</BODY>
</HTML>

View File

@ -0,0 +1,74 @@
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<HTML>
<HEAD>
<meta name="GENERATOR" content="DBCHM.exe by lztkdr">
<!-- Sitemap 1.0 -->
<!-- hhk文件渲染后需 Replace("</LI>", "") -->
</HEAD>
<BODY>
<OBJECT type="text/site properties">
<param name="ExWindow Styles" value="0x200">
<param name="Window Styles" value="0x800025">
<param name="Font" value="MS Sans Serif,9,0">
</OBJECT>
<UL>
<LI><OBJECT type="text/sitemap">
<param name="Name" value="数据库目录">
<param name="Local" value="数据库目录.html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
@if (Model.Tables != null && Model.Tables.Count > 0)
{
foreach (var tab in Model.Tables)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@tab.TableName">
<param name="Local" value="表结构\@(tab.TableName + " " + tab.Comment).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
//hhk文件不能太大不然hhc编译时会报提示 An internal error has occurred.An error record has been saved to ..
//https://documentation.red-gate.com/sdoc5/troubleshooting/error-messages/assertion-failure-outputting-in-chm-format
@*foreach (var column in tab.Columns)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@column.ColumnName">
<param name="Local" value="表结构\@(tab.TableName + " " + tab.Comment).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
}*@
}
}
@if (Model.Views != null && Model.Views.Count > 0)
{
foreach (var item in Model.Views)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@item.Key">
<param name="Local" value="视图\@(item.Key).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
}
}
@if (Model.Procs != null && Model.Procs.Count > 0)
{
foreach (var item in Model.Procs)
{
<LI><OBJECT type="text/sitemap">
<param name="Name" value="@item.Key">
<param name="Local" value="存储过程\@(item.Key).html">
<param name="ImageNumber" value="11">
</OBJECT>
</LI>
}
}
</UL>
</BODY>
</HTML>

View File

@ -0,0 +1,30 @@
[OPTIONS]
Auto Index=Yes
CITATION=Made by lztkdr
Compatibility=1.1 or later
Compiled file=@Model.ChmFile
Contents file=chm.HHC
COPYRIGHT=www.51try.top
Default topic=@Model.DefaultFile
Default Window=Main
Display compile notes=Yes
Display compile progress=Yes
Full-text search=Yes
Language=0x804 ÖÐÎÄ(Öйú)
Index file=chm.HHK
Title=@Model.Title
Enhanced decompilation=yes
[WINDOWS]
Main="@Model.Title","chm.hhc","chm.hhk","@Model.DefaultFile","@Model.DefaultFile",,,,20000,0x63520,180,0x104E, [0,0,745,509],0x0,0x0,,,,,0
[MERGE FILES]
[FILES]
@if (Model.Files != null && Model.Files.Count > 0)
{
foreach (var filePath in Model.Files)
{
@(filePath + "\r\n")
}
}

Some files were not shown because too many files have changed in this diff Show More