Repository: lulianqi/FreeHttp
Branch: master
Commit: 51bd3d665887
Files: 168
Total size: 2.6 MB
Directory structure:
gitextract_sk9eg1ll/
├── .dockerignore
├── .gitattributes
├── .gitignore
├── AutoTest/
│ ├── CsvFileHelper.cs
│ ├── MyBytesHelper.cs
│ ├── MyCommonTool.cs
│ ├── MyExtensionMethods.cs
│ ├── ParameterizationContent/
│ │ ├── CaseParameterizationContent.cs
│ │ ├── ParameterizationContentEncodingType.cs
│ │ └── ParameterizationContentHelper.cs
│ ├── ParameterizationPick/
│ │ ├── ParameterPick.cs
│ │ ├── ParameterPickHelper.cs
│ │ └── ParameterPickType.cs
│ └── RunTimeStaticData/
│ ├── ActuatorStaticDataCollection.cs
│ ├── CaseRunTimeDataTypeEngine.cs
│ ├── CaseStaticDataType.cs
│ ├── IRunTimeDataSource.cs
│ ├── IRunTimeStaticData.cs
│ ├── MyStaticData/
│ │ ├── MyStaticDataIndex.cs
│ │ ├── MyStaticDataList.cs
│ │ ├── MyStaticDataLong.cs
│ │ ├── MyStaticDataNowTime.cs
│ │ ├── MyStaticDataRandomStr.cs
│ │ ├── MyStaticDataSourceCsv.cs
│ │ ├── MyStaticDataStrIndex.cs
│ │ └── MyStaticDataValue.cs
│ └── RunTimeStaticDataHelper.cs
├── FiddlerFreeHttp.cs
├── FiddlerHelper/
│ ├── FiddlerActuatorStaticDataCollectionController.cs
│ ├── FiddlerHttpFilter.cs
│ ├── FiddlerModificHttpRuleCollection.cs
│ ├── FiddlerModificSettingInfo.cs
│ ├── FiddlerRequsetChange.cs
│ ├── FiddlerResponseChange.cs
│ ├── FiddlerRuleGroup.cs
│ ├── FiddlerSessionHelper.cs
│ ├── IFiddlerHttpTamper.cs
│ ├── TamperProtocalType.cs
│ └── VersionControl/
│ └── FiddlerModificHttpRuleCollectionV1.cs
├── FiddlerSessionTamper.cs
├── FreeHttp.csproj
├── FreeHttp.sln
├── FreeHttpControl/
│ ├── ChangeEncodeForm.Designer.cs
│ ├── ChangeEncodeForm.cs
│ ├── ChangeEncodeForm.resx
│ ├── ControlHelper/
│ │ ├── LoadBitmap.cs
│ │ ├── LoadWindowService.cs
│ │ ├── MarkControlService.cs
│ │ └── MyControlHelper.cs
│ ├── EditCookieForm.Designer.cs
│ ├── EditCookieForm.cs
│ ├── EditCookieForm.resx
│ ├── EditKeyVaule.Designer.cs
│ ├── EditKeyVaule.cs
│ ├── EditKeyVaule.resx
│ ├── EditParameterPickWindow.Designer.cs
│ ├── EditParameterPickWindow.cs
│ ├── EditParameterPickWindow.resx
│ ├── EditSheetForm.Designer.cs
│ ├── EditSheetForm.cs
│ ├── EditSheetForm.resx
│ ├── FreeHttpWindow.Designer.cs
│ ├── FreeHttpWindow.cs
│ ├── FreeHttpWindow.resx
│ ├── FreeHttpWindowFunction.cs
│ ├── GetRemoteRuleWindow.Designer.cs
│ ├── GetRemoteRuleWindow.cs
│ ├── GetRemoteRuleWindow.resx
│ ├── HttpFilterWindow.Designer.cs
│ ├── HttpFilterWindow.cs
│ ├── HttpFilterWindow.resx
│ ├── MyBaseInfoWindow.cs
│ ├── MyBaseInfoWindow.resx
│ ├── MyControl/
│ │ ├── AddParameterPickBox.Designer.cs
│ │ ├── AddParameterPickBox.cs
│ │ ├── AddParameterPickBox.resx
│ │ ├── CBalloonBase.cs
│ │ ├── CBalloonBase.resx
│ │ ├── EditListView.Designer.cs
│ │ ├── EditListView.cs
│ │ ├── EditListView.resx
│ │ ├── ListViewExtended.cs
│ │ ├── MyEnableSwitch.Designer.cs
│ │ ├── MyEnableSwitch.cs
│ │ ├── MyEnableSwitch.resx
│ │ ├── MyEnabledPictureButton.cs
│ │ ├── MyListView.cs
│ │ ├── MyListView.resx
│ │ ├── MyPanel.cs
│ │ ├── MySwitchPictureButton.cs
│ │ ├── RawRequestEdit.Designer.cs
│ │ ├── RawRequestEdit.cs
│ │ ├── RawRequestEdit.resx
│ │ ├── RawResponseEdit.cs
│ │ ├── RawResponseEdit.designer.cs
│ │ ├── RawResponseEdit.resx
│ │ ├── TextBoxEditer.Designer.cs
│ │ ├── TextBoxEditer.cs
│ │ ├── TextBoxEditer.resx
│ │ └── WatermakTextBox.cs
│ ├── RemoveHead.Designer.cs
│ ├── RemoveHead.cs
│ ├── RemoveHead.resx
│ ├── RuleInfoWindow.cs
│ ├── RuleInfoWindow.designer.cs
│ ├── RuleInfoWindow.resx
│ ├── SaveShareRule.Designer.cs
│ ├── SaveShareRule.cs
│ ├── SaveShareRule.resx
│ ├── SetVaule.Designer.cs
│ ├── SetVaule.cs
│ ├── SetVaule.resx
│ ├── SettingWindow.Designer.cs
│ ├── SettingWindow.cs
│ ├── SettingWindow.resx
│ ├── ShowSheetForm.Designer.cs
│ ├── ShowSheetForm.cs
│ ├── ShowSheetForm.resx
│ ├── ShowTextForm.Designer.cs
│ ├── ShowTextForm.cs
│ ├── ShowTextForm.resx
│ ├── SortRule.Designer.cs
│ ├── SortRule.cs
│ ├── SortRule.resx
│ ├── StaticDataAddWindow.Designer.cs
│ ├── StaticDataAddWindow.cs
│ ├── StaticDataAddWindow.resx
│ ├── StaticDataManageWindow.Designer.cs
│ ├── StaticDataManageWindow.cs
│ ├── StaticDataManageWindow.resx
│ ├── UserFeedbackWindow.Designer.cs
│ ├── UserFeedbackWindow.cs
│ └── UserFeedbackWindow.resx
├── HttpHelper/
│ ├── ContentModific.cs
│ ├── HttpRequest.cs
│ ├── HttpResponse.cs
│ ├── ParameterContentModific.cs
│ ├── ParameterHttpRequest.cs
│ └── ParameterHttpResponse.cs
├── LICENSE
├── MyHelper/
│ ├── MyExtensionMethods.cs
│ ├── MyGlobalHelper.cs
│ ├── MyJsonHelper.cs
│ ├── MyKeyValuePair.cs
│ ├── SelfUpgradeHelp.cs
│ └── SerializableHelper.cs
├── Properties/
│ ├── AssemblyInfo.cs
│ ├── Resources.Designer.cs
│ └── Resources.resx
├── Resources/
│ ├── MyResource.Designer.cs
│ └── MyResource.resx
├── WebService/
│ ├── ConfigurationData.cs
│ ├── DataModel/
│ │ ├── BaseResultModel.cs
│ │ ├── RuleDetails.cs
│ │ └── ShareRuleSummary.cs
│ ├── FeedbackService.cs
│ ├── HttpServer/
│ │ ├── CertificatesHelper.cs
│ │ ├── MyHttpListener.cs
│ │ └── MySocketHelper.cs
│ ├── MyWebTool.cs
│ ├── OperationReportService.cs
│ ├── RemoteLogService.cs
│ ├── RemoteRuleService.cs
│ ├── ShareRuleService.cs
│ ├── UpgradeService.cs
│ └── UserComputerInfo.cs
├── packages.config
└── readme.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.vs
**/.vscode
**/*.*proj.user
**/azds.yaml
**/charts
**/bin
**/obj
**/Dockerfile
**/Dockerfile.develop
**/docker-compose.yml
**/docker-compose.*.yml
**/*.dbmdl
**/*.jfm
**/secrets.dev.yaml
**/values.dev.yaml
**/.toolstarget
================================================
FILE: .gitattributes
================================================
# Auto detect text files and perform LF normalization
* text=auto
# Custom for Visual Studio
*.cs diff=csharp
# Standard to msysgit
*.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
================================================
FILE: .gitignore
================================================
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# 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
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# 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
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# 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
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# 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/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# 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
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- Backup*.rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
#add by lulianqi
================================================
FILE: AutoTest/CsvFileHelper.cs
================================================
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
/*******************************************************************************
* Copyright (c) 2016 lijie
* All rights reserved.
*
* 文件名称:
* 内容摘要: mycllq@hotmail.com
*
* 历史记录:
* 日 期: 201601010 创建人: lulianqi
* 描 述: 创建
*******************************************************************************/
namespace FreeHttp.AutoTest.MyCommonHelper.FileHelper
{
///
/// 单个元素支持包括tab,换行回车(\r\n),空内容等在内的所有文本字符 (在使用时请确定文件的编码方式)
/// 可指定元素分割符,行非官方必须为\r\n(\r\n可以作为内容出现在元素中),转义字符必须为".
/// 转义所有的引号必须出现在首尾(如果不在首尾,则不会按转义符处理,直接作为引号处理)[excel可以读取转义出现在中间的情况,而本身存储不会使用这种方式,保存时并会强制修复这种异常,所以这里遇到中间转义的情况直接抛出指定异常]
/// 如果在被转义的情况下需要出现引号,则使用2个引号代替(如果需要在首部使用双引号,则需要转义该元素,其他地方可直接使用)(excel对所有双引号都进行转义,无论其出现位置,对于保存方式可以选择是否按excel的方式进行保存)
/// 每一行的结尾是不需要逗号结束的,如果多加一个逗号则标识该行会多一个空元素
/// 空行也是一个空元素,一个逗号是2个空元素,所以不可能出现有的行元素为空
/// 使用问题或疑问可通过mycllq@hotmail.com进行联系
///
public sealed class CsvFileHelper : IDisposable
{
#region Members
//private FileStream _fileStream;
private Stream _stream;
private StreamReader _streamReader;
//private StreamWriter _streamWriter;
//private Stream _memoryStream;
private Encoding _encoding;
//private readonly StringBuilder _columnBuilder = new StringBuilder(100);
private Type _type = Type.File;
private bool _trimColumns = false;
private char _csvSeparator = ',';
#endregion Members
#region Properties
///
/// Gets or sets whether column values should be trimmed
///
public bool TrimColumns
{
get { return _trimColumns; }
set { _trimColumns = value; }
}
public Type DataSouceType
{
get{ return _type;}
}
///
/// get or set Csv Separator (Default Values is ,)
///
public char CsvSeparator
{
get { return _csvSeparator; }
set { _csvSeparator = value; }
}
#endregion Properties
#region Enums
///
/// Type enum
///
public enum Type
{
File,
Stream
}
#endregion Enums
#region Methods
///
/// Initialises the reader to work from a file
///
/// File path
public CsvFileHelper(string filePath):this(filePath, Encoding.Default)
{
}
///
/// Initialises the reader to work from a file
///
/// File path
/// Encoding
public CsvFileHelper(string filePath, Encoding encoding)
{
_type = Type.File;
if (!File.Exists(filePath))
{
throw new FileNotFoundException(string.Format("The file '{0}' does not exist.", filePath));
}
//_stream = File.OpenRead(filePath); //return a FileStream (OpenRead 源码就是 return new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);)
_stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
_stream.Position = 0;
_encoding = (encoding ?? Encoding.Default);
_streamReader = new StreamReader(_stream, _encoding);
}
///
/// Initialises the reader to work from an existing stream
///
/// Stream
public CsvFileHelper(Stream stream):this(stream, Encoding.Default)
{
}
///
/// Initialises the reader to work from an existing stream
///
/// Stream
/// Encoding
public CsvFileHelper(Stream stream, Encoding encoding)
{
_type = Type.Stream;
if (stream == null)
{
throw new ArgumentNullException("The supplied stream is null.");
}
_stream = stream;
_stream.Position = 0;
_encoding = (encoding ?? Encoding.Default);
_streamReader = new StreamReader(_stream, _encoding);
}
///
/// Initialises the reader to work from an existing stream (with the Separator char)
///
/// Stream
/// Encoding
/// the Separator char
public CsvFileHelper(Stream stream, Encoding encoding, char yourSeparator): this(stream, encoding)
{
CsvSeparator = yourSeparator;
}
private List ParseLine(string line)
{
StringBuilder _columnBuilder = new StringBuilder();
List Fields = new List();
bool inColumn = false; //是否是在一个列元素里
bool inQuotes = false; //是否需要转义
bool isNotEnd = false; //读取完毕未结束转义
_columnBuilder.Remove(0, _columnBuilder.Length);
// Iterate through every character in the line
for (int i = 0; i < line.Length; i++)
{
char character = line[i];
// If we are not currently inside a column
if (!inColumn)
{
// If the current character is a double quote then the column value is contained within
// double quotes, otherwise append the next character
inColumn = true;
if (character == '"')
{
inQuotes = true;
continue;
}
}
// If we are in between double quotes
if (inQuotes)
{
if ((i + 1) == line.Length)//这个字符已经结束了整行
{
if (character == '"') //正常转义结束,且该行已经结束
{
inQuotes = false;
continue; //当前字符不用添加,跳出后直结束后会添加该元素
}
else //异常结束,转义未收尾
{
isNotEnd = true;
}
}
else if (character == '"' && line[i + 1] == _csvSeparator) //结束转义,且后面有可能还有数据
{
inQuotes = false;
inColumn = false;
i++; //跳过下一个字符
}
else if (character == '"' && line[i + 1] == '"') //双引号转义
{
i++; //跳过下一个字符
}
else if (character == '"') //双引号单独出现(这种情况实际上已经是格式错误,为了兼容可暂时不处理)
{
throw new Exception(string.Format("[{0}]:格式错误,错误的双引号转义 near [{1}] ","ParseLine", line));
}
//其他情况直接跳出,后面正常添加
}
else if (character == _csvSeparator)
inColumn = false;
// If we are no longer in the column clear the builder and add the columns to the list
if (!inColumn) //结束该元素时inColumn置为false,并且不处理当前字符,直接进行Add
{
Fields.Add(TrimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());
_columnBuilder.Remove(0, _columnBuilder.Length);
}
else // append the current column
_columnBuilder.Append(character);
}
// If we are still inside a column add a new one (标准格式一行结尾不需要逗号结尾,而上面for是遇到逗号才添加的,为了兼容最后还要添加一次)
if (inColumn)
{
if (isNotEnd)
{
_columnBuilder.Append("\r\n");
}
Fields.Add(TrimColumns ? _columnBuilder.ToString().Trim() : _columnBuilder.ToString());
}
//如果inColumn为false,说明已经添加,因为最后一个字符为分隔符,所以后面要加上一个空元素
//另外一种情况是line为""空行,(空行也是一个空元素,一个逗号是2个空元素),正好inColumn为默认值false,在此处添加一空元素
else
{
Fields.Add("");
}
return Fields;
}
///
/// 处理未完成的Csv单行
///
/// 数据源
/// 元素列表
private List ParseContinueLine(string line)
{
StringBuilder _columnBuilder = new StringBuilder();
List Fields = new List();
_columnBuilder.Remove(0, _columnBuilder.Length);
if (line == "")
{
Fields.Add("\r\n");
return Fields;
}
for (int i = 0; i < line.Length; i++)
{
char character = line[i];
if ((i + 1) == line.Length)//这个字符已经结束了整行
{
if (character == '"') //正常转义结束,且该行已经结束
{
Fields.Add(TrimColumns ? _columnBuilder.ToString().TrimEnd() : _columnBuilder.ToString());
return Fields;
}
else //异常结束,转义未收尾
{
_columnBuilder.Append("\r\n");
Fields.Add(_columnBuilder.ToString());
return Fields;
}
}
else if (character == '"' && line[i + 1] == _csvSeparator) //结束转义,且后面有可能还有数据
{
Fields.Add(TrimColumns ? _columnBuilder.ToString().TrimEnd() : _columnBuilder.ToString());
i++; //跳过下一个字符
Fields.AddRange(ParseLine(line.Remove(0, i+1)));
break;
}
else if (character == '"' && line[i + 1] == '"') //双引号转义
{
i++; //跳过下一个字符
}
else if (character == '"') //双引号单独出现(这种情况实际上已经是格式错误,转义用双引号一定是【,"】【",】形式,包含在里面的双引号需要使用一对双引号进行转义)
{
throw new Exception(string.Format("[{0}]:格式错误,错误的双引号转义 near [{1}]", "ParseContinueLine", line));
}
_columnBuilder.Append(character);
}
return Fields;
}
public List> GetListCsvData()
{
_stream.Position = 0;
List> tempListCsvData = new List>();
bool isNotEndLine = false;
//这里的ReadLine可能把转义的/r/n分割,需要后面单独处理
string tempCsvRowString = _streamReader.ReadLine();
while (tempCsvRowString!=null)
{
List tempCsvRowList;
if (isNotEndLine)
{
tempCsvRowList = ParseContinueLine(tempCsvRowString);
isNotEndLine = (tempCsvRowList.Count > 0 && tempCsvRowList[tempCsvRowList.Count - 1].EndsWith("\r\n"));
List myNowContinueList = tempListCsvData[tempListCsvData.Count - 1];
myNowContinueList[myNowContinueList.Count - 1] += tempCsvRowList[0];
tempCsvRowList.RemoveAt(0);
myNowContinueList.AddRange(tempCsvRowList);
}
else
{
tempCsvRowList = ParseLine(tempCsvRowString);
isNotEndLine = (tempCsvRowList.Count > 0 && tempCsvRowList[tempCsvRowList.Count - 1].EndsWith("\r\n"));
tempListCsvData.Add(tempCsvRowList);
}
tempCsvRowString = _streamReader.ReadLine();
}
return tempListCsvData;
}
public void Dispose()
{
if(_streamReader!=null)
{
_streamReader.Dispose();
}
if(_stream!=null)
{
_stream.Dispose();
}
}
#endregion
#region StaticTool
#region 编码方式可接受值
//请考虑让应用程序使用 UTF-8 或 Unicode (UTF-16) 作为默认编码。大多数其他编码要么不完整并将许多字符转换为“?”,要么在不同的平台上具有稍有不同的行为。非 Unicode 编码通常具有多义性,应用程序则不再试图确定合适的编码,也不再提供用户用来修复文本语言或编码的更正下拉菜单。
/*
This code produces the following output.
CodePage identifier and name BrDisp BrSave MNDisp MNSave 1-Byte ReadOnly
37 IBM037 False False False False True True
437 IBM437 False False False False True True
500 IBM500 False False False False True True
708 ASMO-708 True True False False True True
720 DOS-720 True True False False True True
737 ibm737 False False False False True True
775 ibm775 False False False False True True
850 ibm850 False False False False True True
852 ibm852 True True False False True True
855 IBM855 False False False False True True
857 ibm857 False False False False True True
858 IBM00858 False False False False True True
860 IBM860 False False False False True True
861 ibm861 False False False False True True
862 DOS-862 True True False False True True
863 IBM863 False False False False True True
864 IBM864 False False False False True True
865 IBM865 False False False False True True
866 cp866 True True False False True True
869 ibm869 False False False False True True
870 IBM870 False False False False True True
874 windows-874 True True True True True True
875 cp875 False False False False True True
932 shift_jis True True True True False True
936 gb2312 True True True True False True
949 ks_c_5601-1987 True True True True False True
950 big5 True True True True False True
1026 IBM1026 False False False False True True
1047 IBM01047 False False False False True True
1140 IBM01140 False False False False True True
1141 IBM01141 False False False False True True
1142 IBM01142 False False False False True True
1143 IBM01143 False False False False True True
1144 IBM01144 False False False False True True
1145 IBM01145 False False False False True True
1146 IBM01146 False False False False True True
1147 IBM01147 False False False False True True
1148 IBM01148 False False False False True True
1149 IBM01149 False False False False True True
1200 utf-16 False True False False False True
1201 unicodeFFFE False False False False False True
1250 windows-1250 True True True True True True
1251 windows-1251 True True True True True True
1252 Windows-1252 True True True True True True
1253 windows-1253 True True True True True True
1254 windows-1254 True True True True True True
1255 windows-1255 True True True True True True
1256 windows-1256 True True True True True True
1257 windows-1257 True True True True True True
1258 windows-1258 True True True True True True
1361 Johab False False False False False True
10000 macintosh False False False False True True
10001 x-mac-japanese False False False False False True
10002 x-mac-chinesetrad False False False False False True
10003 x-mac-korean False False False False False True
10004 x-mac-arabic False False False False True True
10005 x-mac-hebrew False False False False True True
10006 x-mac-greek False False False False True True
10007 x-mac-cyrillic False False False False True True
10008 x-mac-chinesesimp False False False False False True
10010 x-mac-romanian False False False False True True
10017 x-mac-ukrainian False False False False True True
10021 x-mac-thai False False False False True True
10029 x-mac-ce False False False False True True
10079 x-mac-icelandic False False False False True True
10081 x-mac-turkish False False False False True True
10082 x-mac-croatian False False False False True True
20000 x-Chinese-CNS False False False False False True
20001 x-cp20001 False False False False False True
20002 x-Chinese-Eten False False False False False True
20003 x-cp20003 False False False False False True
20004 x-cp20004 False False False False False True
20005 x-cp20005 False False False False False True
20105 x-IA5 False False False False True True
20106 x-IA5-German False False False False True True
20107 x-IA5-Swedish False False False False True True
20108 x-IA5-Norwegian False False False False True True
20127 us-ascii False False True True True True
20261 x-cp20261 False False False False False True
20269 x-cp20269 False False False False True True
20273 IBM273 False False False False True True
20277 IBM277 False False False False True True
20278 IBM278 False False False False True True
20280 IBM280 False False False False True True
20284 IBM284 False False False False True True
20285 IBM285 False False False False True True
20290 IBM290 False False False False True True
20297 IBM297 False False False False True True
20420 IBM420 False False False False True True
20423 IBM423 False False False False True True
20424 IBM424 False False False False True True
20833 x-EBCDIC-KoreanExtended False False False False True True
20838 IBM-Thai False False False False True True
20866 koi8-r True True True True True True
20871 IBM871 False False False False True True
20880 IBM880 False False False False True True
20905 IBM905 False False False False True True
20924 IBM00924 False False False False True True
20932 EUC-JP False False False False False True
20936 x-cp20936 False False False False False True
20949 x-cp20949 False False False False False True
21025 cp1025 False False False False True True
21866 koi8-u True True True True True True
28591 iso-8859-1 True True True True True True
28592 iso-8859-2 True True True True True True
28593 iso-8859-3 False False True True True True
28594 iso-8859-4 True True True True True True
28595 iso-8859-5 True True True True True True
28596 iso-8859-6 True True True True True True
28597 iso-8859-7 True True True True True True
28598 iso-8859-8 True True False False True True
28599 iso-8859-9 True True True True True True
28603 iso-8859-13 False False False False True True
28605 iso-8859-15 False True True True True True
29001 x-Europa False False False False True True
38598 iso-8859-8-i True True True True True True
50220 iso-2022-jp False False True True False True
50221 csISO2022JP False True True True False True
50222 iso-2022-jp False False False False False True
50225 iso-2022-kr False False True False False True
50227 x-cp50227 False False False False False True
51932 euc-jp True True True True False True
51936 EUC-CN False False False False False True
51949 euc-kr False False True True False True
52936 hz-gb-2312 True True True True False True
54936 GB18030 True True True True False True
57002 x-iscii-de False False False False False True
57003 x-iscii-be False False False False False True
57004 x-iscii-ta False False False False False True
57005 x-iscii-te False False False False False True
57006 x-iscii-as False False False False False True
57007 x-iscii-or False False False False False True
57008 x-iscii-ka False False False False False True
57009 x-iscii-ma False False False False False True
57010 x-iscii-gu False False False False False True
57011 x-iscii-pa False False False False False True
65000 utf-7 False False True True False True
65001 utf-8 True True True True False True
65005 utf-32 False False False False False True
65006 utf-32BE False False False False False True
*/
#endregion
///
/// 静态构造函数只有在静态方法将要使用的时候才进行调用(静态成员同理)
///
static CsvFileHelper()
{
isSaveAsExcel = true;
defaultEncoding = new System.Text.UTF8Encoding(false);
}
private static bool isSaveAsExcel ;
private static Encoding defaultEncoding;
private static char csvSeparator = ',';
//private static Encoding utfBom = System.Text.Encoding.GetEncoding("GB2312");
///
/// get or set Csv Separator (Default Values is ,)
///
public static char DefaultCsvSeparator
{
get { return csvSeparator; }
set { csvSeparator = value; }
}
///
/// get or set if save as Excel type (出现在首部的“是必须转义的,而出现在中间的不可以不用专门转义,而excel对所有双引号都进行转义,无论其出现位置)
///
public static bool IsSaveAsExcel
{
get { return isSaveAsExcel; }
set { isSaveAsExcel = value; }
}
///
/// get or set Default Encoding (notice : if your want the System not with bom ,you should use the relevant Encoding)
///
public static Encoding DefaultEncoding
{
get { return defaultEncoding; }
set { defaultEncoding = value; }
}
private static void WriteCsvVeiw(List> yourListCsvData, TextWriter writer)
{
foreach(List tempField in yourListCsvData)
{
if (tempField == null || tempField.Count==0)
{
continue;
}
WriteCsvLine(tempField, writer);
}
}
private static void WriteCsvLine(List fields, TextWriter writer)
{
if (fields == null || fields.Count == 0)
{
return;
}
StringBuilder myStrBld = new StringBuilder();
//对于CSV数据来说不可能出现一行的数据元素的数量是0的情况,所以不用考虑fields.Count为0的情况(如果为0则为错误数据直接忽略)
//foreach(string tempField in fields) //使用foreach会产生许多不必要的string拷贝
for (int i = 0; i < fields.Count; i++)
{
//通过文件转换出来的fields是不会为null的,为了兼容外部构建数据源,可能出现null的情况,这里强制转换为""
if (fields[i] == null)
{
myStrBld.Append("");
}
else
{
bool quotesRequired = (isSaveAsExcel ? (fields[i].Contains(csvSeparator) || fields[i].Contains("\r\n") || fields[i].Contains("\"")) : (fields[i].Contains(csvSeparator) || fields[i].Contains("\r\n") || fields[i].StartsWith("\"")));
if (quotesRequired)
{
if (fields[i].Contains("\""))
{
myStrBld.Append(String.Format("\"{0}\"", fields[i].Replace("\"", "\"\"")));
}
else
{
myStrBld.Append(String.Format("\"{0}\"", fields[i]));
}
}
else
{
myStrBld.Append(fields[i]);
}
}
if (i < fields.Count - 1)
{
myStrBld.Append(csvSeparator);
}
}
writer.WriteLine(myStrBld.ToString());
}
public static void SaveCsvFile(string yourFilePath,List> yourDataSouse,bool isAppend,Encoding yourEncode)
{
//FileStream myCsvStream = new FileStream(yourFilePath, FileMode.Create, FileAccess.ReadWrite);
if (isAppend && !File.Exists(yourFilePath))
{
throw new Exception("in Append mode the FilePath must exist");
}
if(!isAppend && !File.Exists(yourFilePath))
{
if (yourFilePath.Contains('\\'))
{
if (!Directory.Exists(yourFilePath.Remove(yourFilePath.LastIndexOf('\\'))))
{
throw new Exception("the FilePath or the Directory it not exist");
}
}
else
{
throw new Exception("find error in your FilePath");
}
}
//StreamWriter myCsvSw = new StreamWriter(yourFilePath, isAppend, yourEncode); //isAppend对应的Stream的FileMode 为 append ? FileMode.Append : FileMode.Create
//文件如果被其他任务打开并处于Write模式,此处会抛出异常(该工具也含多处异常抛出,使用时务必考虑接收这些异常)
StreamWriter myCsvSw = new StreamWriter(new FileStream(yourFilePath, isAppend ? FileMode.Append : FileMode.Create, FileAccess.Write, FileShare.ReadWrite), yourEncode);
if (yourDataSouse == null)
{
throw new Exception("your DataSouse is null");
}
WriteCsvVeiw(yourDataSouse, myCsvSw);
myCsvSw.Dispose();
}
public static void SaveCsvFile(string yourFilePath, List> yourDataSouse)
{
SaveCsvFile(yourFilePath, yourDataSouse, false, defaultEncoding);
}
public static Stream OpenFile(string filePath)
{
Stream myStream;
try
{
myStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
}
catch (Exception)
{
return null;
}
return myStream;
}
#endregion
}
}
================================================
FILE: AutoTest/MyBytesHelper.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest
{
///
/// hex 字符串显示时的分割方式
///
public enum ShowHexMode
{
@null = 0, //不分格每个字节
space = 1, //以分格分割
spit0x = 2, //以0x分割 (用于显示16进制)
spitSpace0x = 3, //以 0x分割 (用于显示16进制)
spit0b = 4, //以0b分割 (用于显示2进制)
spitSpace0b = 5, //以 0b分割 (用于显示2进制)
spit0d = 6, //以0d分割 (用于显示10进制)
spitSpace0d = 7, //以 0d分割 (用于显示10进制)
spit_ = 8, //以下划线分割
spitM_ = 9 //以中划线分割
}
///
/// 表示要代表数据的进制
///
public enum HexDecimal
{
hex2 = 2,
hex10 = 10, //001 224 023 表示显示需要补0
hex16 = 16
}
public class MyBytes
{
#region ByteSring
private static Dictionary DictionaryHexDecimal = new Dictionary() { { HexDecimal.hex2, 8 }, { HexDecimal.hex10, 3 }, { HexDecimal.hex16, 2 } };
private static Dictionary DictionaryShowHexMode = new Dictionary() { { ShowHexMode.spitSpace0x, " 0x" }, { ShowHexMode.spit0x, "0x" }, { ShowHexMode.spitSpace0d, " 0d" }, { ShowHexMode.spit0d, "0d" }, { ShowHexMode.spitSpace0b, " 0b" }, { ShowHexMode.spit0b, "0b" }, { ShowHexMode.spitM_, "-" }, { ShowHexMode.spit_, "_" }, { ShowHexMode.space, " " }, { ShowHexMode.@null, "" } };
///
/// 将字符串转换成16进制的可读字符串(使用默认UTF8编码)
///
/// 用户字符串
/// 返回结果
public static string StringToHexString(string yourStr)
{
return StringToHexString(yourStr, Encoding.UTF8, HexDecimal.hex16, ShowHexMode.space);
}
///
/// 将字符串转换成指定进制的可读字符串 (使用指定编码指定进制及指定格式)
///
/// 用户字符串
/// 指定编码
/// 指定进制
/// 指定格式
/// 返回结果
public static string StringToHexString(string yourStr, Encoding encode, HexDecimal hexaDecimal, ShowHexMode stringMode)
{
byte[] tempBytes = encode.GetBytes(yourStr);
return ByteToHexString(tempBytes, hexaDecimal, stringMode);
}
///
/// 将字节数组转换为指定进制的可读字符串
///
/// 需要转换的字节数组
/// 指定进制
/// 指定格式
/// 返回结果
public static string ByteToHexString(byte[] yourBytes, HexDecimal hexDecimal, ShowHexMode stringMode)
{
// 如果只考虑16进制对格式没有特殊要求 可以直接使用 ((byte)233).ToString("X2"); 或 BitConverter.ToString(new byte[]{1,2,3,10,12,233})
if (yourBytes == null)
{
return null;
}
StringBuilder result = new StringBuilder(DictionaryHexDecimal[hexDecimal] + DictionaryShowHexMode[stringMode].Length);
for (int i = 0; i < yourBytes.Length; i++)
{
result.Append(DictionaryShowHexMode[stringMode]);
result.Append(Convert.ToString(yourBytes[i], (int)hexDecimal).PadLeft(DictionaryHexDecimal[hexDecimal], '0'));
}
return result.ToString().Trim();
}
///
/// 将可读指定进制的数据转换为字节数组(因为用户数据可能会是非法数据,遇到非法数据非法会抛出异常)
///
/// 需要转换的字符串
/// 指定进制
/// 指定格式
/// 返回结果(如果yourStr为""返回长度为0的byte[])
public static byte[] HexStringToByte(string yourStr, HexDecimal hexDecimal, ShowHexMode stringMode)
{
if (hexDecimal == HexDecimal.hex16 && (stringMode == ShowHexMode.spit0b || stringMode == ShowHexMode.spit0d || stringMode == ShowHexMode.spitSpace0b || stringMode == ShowHexMode.spitSpace0d))
{
throw new Exception("your HexaDecimal and ShowHexMode is conflict");
}
string[] hexStrs;
byte[] resultBytes;
string modeStr = string.Empty; //string.Empty 不等于 null
if (stringMode != ShowHexMode.@null)
{
modeStr = DictionaryShowHexMode[stringMode];
}
if (modeStr == string.Empty)
{
if (yourStr.Length % DictionaryHexDecimal[hexDecimal] != 0)
{
throw new Exception("error leng of your data");
}
long tempHexNum = yourStr.Length / DictionaryHexDecimal[hexDecimal];
hexStrs = new string[tempHexNum];
for (int startIndex = 0; startIndex < tempHexNum; startIndex++)
{
hexStrs[startIndex] = yourStr.Substring(startIndex * DictionaryHexDecimal[hexDecimal], DictionaryHexDecimal[hexDecimal]);
}
}
else
{
//使用StringSplitOptions.RemoveEmptyEntries去除空值因为0xFF0xFF可能会有第一个值为空的情况
//对于0xFF 0xFF使用 0x分割,第一个值可能会带0x,不过 Convert.ToByte可以兼容这种情况(不过还是可能带来第一个字节允许使用不应用的分割的情况)
hexStrs = yourStr.Split(new string[] { modeStr }, StringSplitOptions.RemoveEmptyEntries);
}
try
{
resultBytes = new byte[hexStrs.Length];
for (int i = 0; i < hexStrs.Length; i++)
{
resultBytes[i] = Convert.ToByte(hexStrs[i], (int)hexDecimal);
}
}
catch (Exception ex)
{
throw new Exception(string.Format("error data ,can not change your hex string to your hex, hexDecimal[{0}] ShowHexMode[{1}]", hexDecimal, stringMode), ex);
}
return resultBytes;
}
///
/// 将可读指定进制的数据转换为字节数组(因为用户数据可能会是非法数据,遇到非法数据非法会抛出异常)(使用猜测的方式发现分割字符串)
///
/// 需要转换的字符串
/// 指定进制
/// 返回结果(如果yourStr为""返回长度为0的byte[])
public static byte[] HexStringToByte(string yourStr, HexDecimal hexDecimal)
{
if (yourStr == null) throw new Exception("your source string is null");
foreach(var tryStringSpitMode in DictionaryShowHexMode)
{
if (hexDecimal == HexDecimal.hex16 && (tryStringSpitMode.Key == ShowHexMode.spit0b || tryStringSpitMode.Key == ShowHexMode.spit0d || tryStringSpitMode.Key == ShowHexMode.spitSpace0b || tryStringSpitMode.Key == ShowHexMode.spitSpace0d)) continue;
if (yourStr.Contains(tryStringSpitMode.Value)) return HexStringToByte(yourStr, hexDecimal, tryStringSpitMode.Key);
}
throw new Exception("unknown exception with HexStringToByte");
}
public static bool ByteToSring(byte[] yourBytes, Encoding yourEncoding, ref string outStr)
{
try
{
outStr = yourEncoding.GetString(yourBytes);
return true;
}
catch
{
return false;
}
}
public static bool StringToByte(string yourStr, Encoding yourEncoding, ref byte[] outBytes)
{
try
{
outBytes = yourEncoding.GetBytes(yourStr);
return true;
}
catch
{
return false;
}
}
#endregion
///
/// 比较两个字节数组
///
///
///
///
public static bool IsBytesSame(byte[] bytesA, byte[] bytesB)
{
if (bytesA == null || bytesB == null)
{
return false;
}
if (bytesA.Length == bytesB.Length)
{
for (int i = 0; i < bytesB.Length; i++)
{
if (bytesA[i] != bytesB[i])
{
return false;
}
}
return true;
}
else
{
return false;
}
}
///
/// 去除bytes尾部空值
///
///
///
public static byte[] RmBytesEnd(byte[] yourBytes)
{
if (yourBytes == null)
{
return null;
}
int tempLen = yourBytes.Length;
for (int i = yourBytes.Length - 1; i > 0; i--)
{
if (yourBytes[i] == 0x00)
{
tempLen--;
}
else
{
break;
}
}
byte[] tempBytes = new byte[tempLen];
for (int i = 0; i < tempLen; i++)
{
tempBytes[i] = yourBytes[i];
}
return tempBytes;
}
///
/// 生成随机字节数组
///
/// 数组长度
/// 随机字节数组
public static byte[] CreatRandomBytes(int byteLen)
{
byte[] tempBytes = new byte[byteLen];
for (int i = 0; i < byteLen; i++)
{
Random ran = new Random(Guid.NewGuid().GetHashCode());
{
tempBytes[i] = (byte)ran.Next(0x00, 0xff);
}
}
return tempBytes;
}
///
/// i will change your bytes to IP by vanelife way
/// 3
/// your bytes
/// your IP
public static string GetIpByBytes(byte[] yourData)
{
if (yourData == null)
{
return "null data";
}
if (yourData.Length > 6)
{
return "length error";
}
else
{
string tempIp = "";
for (int i = 0; i < yourData.Length; i++)
{
tempIp += (int)yourData[i] + ".";
}
tempIp = tempIp.TrimEnd(new char[] { '.' });
return tempIp;
}
}
///
/// i will change your bytes to int,and bytes can not more than 4 byte(默认 小端序,低位在前,这里使用大端序列,并仅取2字节)
///
/// your bytes
/// your len
public static int GetByteLen(byte[] yourLen)
{
//return BitConverter.ToUInt16(yourLen,0);
if (yourLen.Length > 4)
{
return -1;
}
else
{
int tempLen = 0;
for (int i = 0; i < yourLen.Length; i++)
{
tempLen += (int)Math.Pow(256, yourLen.Length - i - 1) * yourLen[i];
}
return tempLen;
}
}
///
/// i will change a int to byte and change the 1,2(默认 小端序,低位在前,这里使用大端序列,并仅取2字节)
///
/// your Len
/// your bytes
public static byte[] CreateInt16Bytes(int yourLen)
{
byte[] tempData = BitConverter.GetBytes(yourLen);
byte[] dataToBack = new byte[2];
dataToBack[0] = tempData[1];
dataToBack[1] = tempData[0];
return dataToBack;
//int c = 97;
//byte[] cb = BitConverter.GetBytes(c);//小端
//Array.Reverse(cb);//反转成大端 Reverse() 无返回值直接反转目标
//也可以先把数值转换再转成字节数组
//int c2 = IPAddress.HostToNetworkOrder(c);//大端字节数
//byte[] bb = System.BitConverter.GetBytes(c2);//字节数组
//string s = "code";
//byte[] sbb = Encoding.BigEndianUnicode.GetBytes(s);//大端
//byte[] sbs = Encoding.Unicode.GetBytes(s);//小端
//.NET short 网络大小端转换 一般操作系统文件都是小端,网络传输一般使用大端
//System.Net.IPAddress.HostToNetworkOrder(本机到网络转换)
//System.Net.IPAddress.NetworkToHostOrder(网络字节转成本机)
}
///
/// 拼接一组byte[]
///
/// byte[] List
/// 拼接完成的的byte[]
public static byte[] GroupByteList(List yourByteList)
{
if (yourByteList == null)
{
throw new Exception("yourByteList is null");
}
int byteLen = 0;
int nowCopyIndex = 0;
byte[] outBytes;
foreach (byte[] tempBytes in yourByteList)
{
byteLen += tempBytes.Length;
}
outBytes = new byte[byteLen];
foreach (byte[] tempBytes in yourByteList)
{
Array.Copy(tempBytes, 0, outBytes, nowCopyIndex, tempBytes.Length);
nowCopyIndex += tempBytes.Length;
}
return outBytes;
}
///
/// byte[]替换 (如果 搜索目标或替换目标为null,直接返回源数组)
///
/// 替换源数组
/// 需要被替换目标数组
/// 替换进入的数组
/// 完成替换的byte[]
public static byte[] ReplaceBytes(byte[] src, byte[] search, byte[] repl)
{
if (repl == null) return src;
int index = FindBytes(src, search);
if (index < 0) return src;
byte[] dst = new byte[src.Length - search.Length + repl.Length];
Buffer.BlockCopy(src, 0, dst, 0, index);
Buffer.BlockCopy(repl, 0, dst, index, repl.Length);
Buffer.BlockCopy(src, index + search.Length, dst, index + repl.Length,src.Length - (index + search.Length));
return dst;
}
///
/// 在目标数组中查找指定目标第一次出现的索引(没有指定目标返回-1)
///
/// 查找源
/// 需要查找的目标
/// 第一次出现的索引(没有指定目标返回-1)
public static int FindBytes(byte[] src, byte[] find)
{
if(src==null|| find==null|| src.Length==0|| find.Length == 0 || find.Length> src.Length) return -1;
for (int i = 0; i < src.Length - find.Length +1 ; i++)
{
if (src[i] == find[0])
{
if (find.Length == 1) return i;
for(int m=1;m< find.Length;m++)
{
if (src[i + m] != find[m]) break;
if (m == find.Length - 1) return i;
}
}
}
return -1;
}
}
}
================================================
FILE: AutoTest/MyCommonTool.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest
{
public static class MyCommonTool
{
public static string rootPath = System.Environment.CurrentDirectory;
///
/// seed for GenerateRandomStr
///
private static int externRandomSeed = 0;
///
/// 生成随机字符串
///
/// 字符串长度
/// 生成模式: 0-是有可见ASCII / 1-数字 / 2-大写字母 / 3-小写字母 / 4-特殊字符 / 5-大小写字母 / 6-字母和数字
/// 随机字符串
public static string GenerateRandomStr(int strCount, int GenerateType)
{
externRandomSeed++;
StringBuilder myRandomStr = new StringBuilder(strCount);
long mySeed = DateTime.Now.Ticks + externRandomSeed;
Random random = new Random((int)(mySeed & 0x0000ffff));
for (int i = 0; i < strCount; i++)
{
char tempCh;
int num = random.Next();
switch (GenerateType)
{
case 1:
tempCh = (char)(0x30 + (num % 10));
break;
case 2:
tempCh = (char)(0x41 + (num % 26));
break;
case 3:
tempCh = (char)(0x61 + (num % 26));
break;
case 4:
int tempValue = 0x20 + ((num % 95));
if ((tempValue >= 0x30 && tempValue <= 0x39) || (tempValue >= 0x41 && tempValue <= 0x5a) || (tempValue >= 0x61 && tempValue <= 0x7a))
{
i--;
continue;
}
else
{
tempCh = (char)tempValue;
}
break;
case 5:
tempValue = 0x20 + ((num % 95));
if ((tempValue >= 0x41 && tempValue <= 0x5a) || (tempValue >= 0x61 && tempValue <= 0x7a))
{
tempCh = (char)tempValue;
}
else
{
i--;
continue;
}
break;
case 6:
tempValue = 0x20 + ((num % 95));
if ((tempValue >= 0x30 && tempValue <= 0x39) || (tempValue >= 0x41 && tempValue <= 0x5a) || (tempValue >= 0x61 && tempValue <= 0x7a))
{
tempCh = (char)tempValue;
}
else
{
i--;
continue;
}
break;
default:
tempCh = (char)(0x20 + (num % 95));
break;
}
myRandomStr.Append(tempCh);
}
return myRandomStr.ToString();
}
}
}
================================================
FILE: AutoTest/MyExtensionMethods.cs
================================================
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest
{
public static class MyExtensionMethods
{
///
/// 以指定字符将字符串分割并转换为int(eg: "10-11-12-13")
///
/// 指定字符串
/// 分割字符
/// 转换结果
/// 是否成功(任意一个转换失败都会返回False)
public static bool MySplitToIntArray(this string str, char yourSplitChar, out int[] yourIntArray)
{
yourIntArray = null;
if (str == null)
{
return false;
}
string[] strArray = str.Split(new char[] { yourSplitChar }, StringSplitOptions.None);
yourIntArray = new int[strArray.Length];
for (int i = 0; i < strArray.Length; i++)
{
if (!int.TryParse(strArray[i], out yourIntArray[i]))
{
return false;
}
}
return true;
}
///
/// 以指定字符将字符串中末尾int数据提取出来(eg: "testdata-10")
///
/// 指定字符串
/// 分割字符
/// 提取后的前半截字符串
/// 提取后的int
/// 是否成功 int转换失败后也返回错误
public static bool MySplitIntEnd(this string str, char yourSplitChar, out string yourStr, out int yourInt)
{
yourStr = null;
yourInt = 0;
if (str == null)
{
return false;
}
if (str.Contains(yourSplitChar))
{
int lastSplitCharIndex = str.LastIndexOf(yourSplitChar);
if (lastSplitCharIndex == str.Length - 1) // 如果使用endwith会产生多余的string对象
{
return false;
}
if (int.TryParse(str.Substring(lastSplitCharIndex + 1, str.Length - lastSplitCharIndex - 1), out yourInt))
{
yourStr = str.Substring(0, lastSplitCharIndex);
return true;
}
}
return false;
}
///
/// 添加键值,若遇到已有key则覆盖
///
/// Dictionary
/// Key
/// Value
public static void MyAdd(this Dictionary dc, string yourKey, string yourValue)
{
if (dc.ContainsKey(yourKey))
{
dc[yourKey] = yourValue;
}
else
{
dc.Add(yourKey, yourValue);
}
}
///
/// 添加键值,若遇到已有key则覆盖
///
/// T Type
/// Dictionary
/// yourKey
/// yourValue
public static void MyAdd(this Dictionary dc, string yourKey, T yourValue)
{
if (dc.ContainsKey(yourKey))
{
dc[yourKey] = yourValue;
}
else
{
dc.Add(yourKey, yourValue);
}
}
///
/// 【NameValueCollection】添加键值,检查NameValueCollection是否为null
///
/// NameValueCollection
/// Key
/// Value
public static void MyAdd(this NameValueCollection nvc, string yourName, string yourValue)
{
if (nvc != null)
{
nvc.Add(yourName, yourValue);
}
}
///
/// 转换为{[key:value][key:value].......}
///
/// NameValueCollection
/// {[key:value][key:value].......}
public static string MyToFormatString(this NameValueCollection nvc)
{
if (nvc != null)
{
if (nvc.Count > 0)
{
if (nvc.Count < 2)
{
return string.Format("{{ [{0}:{1}] }}", nvc.Keys[0], nvc[nvc.Keys[0]]);
}
else
{
StringBuilder tempStrBld = new StringBuilder("{ ", nvc.Count * 32);
foreach (string tempKey in nvc.Keys)
{
tempStrBld.AppendFormat("[{0}:{1}] ", tempKey, nvc[tempKey]);
}
tempStrBld.Append("}");
return tempStrBld.ToString();
}
}
}
return "";
}
///
/// 返回对象的深度克隆(泛型数据,要求T必须为值类型,或类似string的特殊引用类型[因为虽然使用string的克隆会有相同的引用,但对string进行修改的时都会创建新的对象])
///
/// TKey
/// TKey
/// 目标Dictionary
/// 对象的深度克隆
public static Dictionary MyClone(this Dictionary dc)
{
Dictionary cloneDc = new Dictionary();
foreach (KeyValuePair tempKvp in dc)
{
cloneDc.Add(tempKvp.Key, tempKvp.Value);
}
return cloneDc;
}
///
/// 返回对象的深度克隆(泛型数据,要求T必须为值类型,或类似string的特殊引用类型[因为虽然使用string的克隆会有相同的引用,但对string进行修改的时都会创建新的对象](该重载可以约束支持clone的TValue))
///
/// TKey
/// TKey
/// 目标Dictionary
/// 对象的深度克隆
public static Dictionary MyDeepClone(this Dictionary dc) where TValue : ICloneable
{
Dictionary cloneDc = new Dictionary();
foreach (KeyValuePair tempKvp in dc)
{
cloneDc.Add(tempKvp.Key, (TValue)tempKvp.Value.Clone());
}
return cloneDc;
}
public static Dictionary ToChangeType(this Dictionary dc) where TValue : TTargetValue
{
if(dc!=null)
{
Dictionary newDc = new Dictionary();
foreach(var item in dc)
{
newDc.Add(item.Key, item.Value);
}
return newDc;
}
return null;
}
public static void Add(this List> myList, object[] yourValue)
{
if(yourValue!=null)
{
List tempAddList = new List(yourValue.Length);
for(int i =0 ; i
/// 描述可参数化数据结构 (请尽量不要自行解析数据,建议使用getXmlParametContent解析xml数据)
///
[Serializable]
public class CaseParameterizationContent
{
public string contentData;
public bool hasParameter;
public ParameterizationContentEncodingType encodetype;
public CaseParameterizationContent()
{
contentData=null;
hasParameter = false;
encodetype = ParameterizationContentEncodingType.encode_default;
}
public CaseParameterizationContent(string yourContentData, bool isParameter)
{
contentData = yourContentData;
hasParameter = isParameter;
encodetype = ParameterizationContentEncodingType.encode_default;
}
public CaseParameterizationContent(string yourContentData)
{
contentData = yourContentData;
hasParameter = false;
encodetype = ParameterizationContentEncodingType.encode_default;
}
///
///返回一个值指示该caseParameterizationContent是否有被任何数据填充过
///
///
public bool IsFilled()
{
if (contentData != null)
{
if (contentData != "")
{
return true;
}
}
return false;
}
///
/// 获取运算后的值,掉用此法的该版本的重载将会改变涉及到的staticData数据的游标
///
/// 可用staticData集合
/// 返回对所有staticData数据运算后的结果列表
/// 错误消息(如果没有错误则为null)(在获取参数化数据产生错误后因对当前case设置警示)
/// 运算结果
public string GetTargetContentData(ActuatorStaticDataCollection yourActuatorStaticDataCollection, NameValueCollection yourDataResultCollection, out string errorMessage)
{
string myTargetContentData = contentData;
errorMessage = null;
if (hasParameter)
{
myTargetContentData = ParameterizationContentHelper.GetCurrentParametersData(contentData, MyConfiguration.ParametersDataSplitStr, yourActuatorStaticDataCollection, yourDataResultCollection, out errorMessage);
}
if (encodetype != ParameterizationContentEncodingType.encode_default)
{
switch (encodetype)
{
//base64
case ParameterizationContentEncodingType.encode_base64:
myTargetContentData = Convert.ToBase64String(Encoding.UTF8.GetBytes(myTargetContentData));
break;
case ParameterizationContentEncodingType.decode_base64:
try
{
myTargetContentData = Encoding.UTF8.GetString(Convert.FromBase64String(myTargetContentData));
}
catch (Exception ex)
{
myTargetContentData = "ContentEncoding Error:" + ex.Message;
}
break;
//hex 16
case ParameterizationContentEncodingType.encode_hex16:
myTargetContentData = MyBytes.StringToHexString(myTargetContentData);
break;
case ParameterizationContentEncodingType.decode_hex16:
try
{
byte[] nowBytes = MyBytes.HexStringToByte(myTargetContentData, HexDecimal.hex16, ShowHexMode.space);
myTargetContentData = Encoding.UTF8.GetString(nowBytes);
}
catch (Exception ex)
{
myTargetContentData = "ContentEncoding Error:" + ex.Message;
}
break;
//hex 2
case ParameterizationContentEncodingType.encode_hex2:
myTargetContentData = MyBytes.StringToHexString(myTargetContentData, Encoding.UTF8, HexDecimal.hex2, ShowHexMode.space);
break;
case ParameterizationContentEncodingType.decode_hex2:
try
{
byte[] nowBytes = MyBytes.HexStringToByte(myTargetContentData, HexDecimal.hex2, ShowHexMode.space);
myTargetContentData = Encoding.UTF8.GetString(nowBytes);
}
catch (Exception ex)
{
myTargetContentData = "ContentEncoding Error:" + ex.Message;
}
break;
default:
errorMessage = "[getTargetContentData] unknow or not supported this encodetype";
break;
}
}
return myTargetContentData;
}
///
/// 获取原始数据,掉用此法的该版本的重载将不会会改变涉及到的staticData数据的游标,也不会对其进行运算
///
/// 原始数据数据
public string GetTargetContentData()
{
return contentData;
}
public override string ToString()
{
return contentData;
}
}
}
================================================
FILE: AutoTest/ParameterizationContent/ParameterizationContentEncodingType.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.ParameterizationContent
{
///
/// 描述[caseParameterizationContent]使用的数据附加编码类型,0标识不进行操作,基数encode偶数decode
///
[Serializable]
public enum ParameterizationContentEncodingType
{
encode_default = 0,
encode_base64 = 1,
decode_base64 = 2,
encode_hex16 = 3,
decode_hex16 = 4,
encode_hex2 = 5,
decode_hex2 = 6
}
}
================================================
FILE: AutoTest/ParameterizationContent/ParameterizationContentHelper.cs
================================================
using FreeHttp.AutoTest.RunTimeStaticData;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.ParameterizationContent
{
public static class ParameterizationContentHelper
{
//仅用于【caseParameterizationContent】内部
//如果没有任何valid identification,直接返回原始数据,不报错(为实现最大兼容)
///
/// get the getTargetContentData in caseParameterizationContent
///
/// Source Data
/// ParameterList
/// StaticDataList
/// error Message
///
public static string GetCurrentParametersData(string yourSourceData, string splitStr, ActuatorStaticDataCollection yourActuatorStaticDataCollection, NameValueCollection yourDataResultCollection, out string errorMessage)
{
errorMessage = null;
if (yourSourceData.Contains(splitStr))
{
var yourParameterList = yourActuatorStaticDataCollection.RunActuatorStaticDataKeyList;
var yourStaticDataList = yourActuatorStaticDataCollection.RunActuatorStaticDataParameterList;
var yourStaticDataSourceList = yourActuatorStaticDataCollection.RunActuatorStaticDataSouceList;
int tempStart, tempEnd = 0;
string tempKeyVaule = null;
string keyParameter = null;
string keyAdditionData = null;
string tempVaule = null;
while (yourSourceData.Contains(splitStr))
{
tempStart = yourSourceData.IndexOf(splitStr);
tempEnd = yourSourceData.IndexOf(splitStr, tempStart + splitStr.Length);
if (tempEnd == -1)
{
errorMessage = string.Format("the identification not enough in Source[{0}]", yourSourceData);
return yourSourceData;
}
tempKeyVaule = yourSourceData.Substring(tempStart + splitStr.Length, tempEnd - (tempStart + splitStr.Length));
keyParameter = TryGetParametersAdditionData(tempKeyVaule, out keyAdditionData);
if (keyAdditionData != null)
{
keyAdditionData = GetCurrentParametersData(keyAdditionData, MyConfiguration.ParametersExecuteSplitStr, yourActuatorStaticDataCollection, yourDataResultCollection, out errorMessage);
}
Func DealErrorAdditionData = () =>
{
tempVaule = "[ErrorData]";
return string.Format("ParametersAdditionData error find in the runTime data with keyParameter:[{0}] keyAdditionData:[{1}]", keyParameter, keyAdditionData);
};
#region RunTimeStaticKey
if (yourParameterList.Keys.Contains(keyParameter))
{
//RunTimeParameter 不含有参数信息,所以不处理keyParameter
tempVaule = yourParameterList[keyParameter].DataCurrent();
yourSourceData = yourSourceData.Replace(splitStr + tempKeyVaule + splitStr, tempVaule);
yourDataResultCollection.MyAdd(tempKeyVaule, tempVaule);
}
#endregion
#region RunTimeStaticParameter
else if (yourStaticDataList.Keys.Contains(keyParameter))
{
if (keyAdditionData == null)
{
tempVaule = yourStaticDataList[keyParameter].DataCurrent();
}
else if (keyAdditionData == "=")
{
tempVaule = yourStaticDataList[keyParameter].DataCurrent();
}
else if (keyAdditionData == "+")
{
tempVaule = yourStaticDataList[keyParameter].DataMoveNext();
}
else if (keyAdditionData.StartsWith("+")) //+10 前移10
{
int tempTimes;
if (int.TryParse(keyAdditionData.Remove(0, 1), out tempTimes))
{
if (tempTimes > 0)
{
for (int i = 0; i < tempTimes; i++)
{
yourStaticDataList[keyParameter].DataMoveNext();
}
tempVaule = yourStaticDataList[keyParameter].DataCurrent();
}
else
{
errorMessage = DealErrorAdditionData();
}
}
else
{
errorMessage = DealErrorAdditionData();
}
}
else
{
errorMessage = DealErrorAdditionData();
}
yourSourceData = yourSourceData.Replace(splitStr + tempKeyVaule + splitStr, tempVaule);
yourDataResultCollection.MyAdd(tempKeyVaule, tempVaule);
}
#endregion
#region RunTimeStaticDataSource
else if (yourStaticDataSourceList.Keys.Contains(keyParameter))
{
if (keyAdditionData == null)
{
tempVaule = yourStaticDataSourceList[tempKeyVaule].DataCurrent();
}
else if (keyAdditionData == "=")
{
tempVaule = yourStaticDataSourceList[keyParameter].DataCurrent();
}
else if (keyAdditionData == "+")
{
tempVaule = yourStaticDataSourceList[keyParameter].DataMoveNext();
}
else if (keyAdditionData.StartsWith("+")) //+10 前移10
{
int tempTimes;
if (int.TryParse(keyAdditionData.Remove(0, 1), out tempTimes))
{
if (tempTimes > 0)
{
for (int i = 0; i < tempTimes; i++)
{
yourStaticDataSourceList[keyParameter].DataMoveNext();
}
tempVaule = yourStaticDataSourceList[keyParameter].DataCurrent();
}
else
{
errorMessage = DealErrorAdditionData();
}
}
else
{
errorMessage = DealErrorAdditionData();
}
}
else
{
tempVaule = yourStaticDataSourceList[keyParameter].GetDataVaule(keyAdditionData);
if (tempVaule == null)
{
errorMessage = DealErrorAdditionData();
}
}
yourSourceData = yourSourceData.Replace(splitStr + tempKeyVaule + splitStr, tempVaule);
yourDataResultCollection.MyAdd(tempKeyVaule, tempVaule);
}
#endregion
else
{
tempVaule = "[ErrorData]";
errorMessage = string.Format("can not find your key [{0}] in StaticDataList", keyParameter);
yourSourceData = yourSourceData.Replace(splitStr + tempKeyVaule + splitStr, tempVaule);
yourDataResultCollection.MyAdd(tempKeyVaule, tempVaule);
}
}
}
return yourSourceData;
}
///
/// 处理ParametersData,解析静态数据名及其参数
///
/// souce parameter data 原数据
/// 返回辅助参数数据,若没有或无法解析返回null
///
private static string TryGetParametersAdditionData(string souceData, out string additionData)
{
additionData = null;
string parametersData = null;
if (souceData != null)
{
if (souceData.EndsWith(")"))
{
int startIndex = souceData.LastIndexOf('(');
if (startIndex > 0)
{
parametersData = souceData.Remove(startIndex);
additionData = souceData.Substring(startIndex + 1, souceData.Length - startIndex - 2);
}
else
{
parametersData = souceData;
}
}
else
{
parametersData = souceData;
}
}
return parametersData;
}
}
public class MyConfiguration
{
//◎●◐◑◒◓◔◕◖◗▼▲
public static string ParametersDataSplitStr = "*#"; //参数化数据分隔符
public static string ParametersExecuteSplitStr = "`"; //参数再运算风格符
public static string CaseShowTargetAndContent = "➤";
public static string CaseShowCaseNodeStart = "◆";
public static string CaseShowJumpGotoNode = "▼";
public static string CaseShowGotoNodeStart = "▲";
}
}
================================================
FILE: AutoTest/ParameterizationPick/ParameterPick.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.ParameterizationPick
{
[Serializable]
[DataContract]
public class ParameterPick
{
[DataMember]
public string ParameterName { get; set; }
[DataMember]
public ParameterPickType PickType { get; set; }
[DataMember]
public ParameterPickRange PickRange { get; set; }
[DataMember]
public string PickTypeAdditional { get; set; }
[DataMember]
public string PickTypeExpression { get; set; }
public override string ToString()
{
return string.Format("get [{0}] from [{1}] by [{2} grep]({3}) with [{4}]", ParameterName, PickRange.ToString(), PickType.ToString(), PickTypeAdditional, PickTypeExpression);
}
}
public class ParameterPickInfo
{
public ParameterPickType PickType{get;private set;}
public List> PickTypeAdditionalList { get; private set; }
public bool Editable { get; private set; }
public Func ParameterPickFunc { get; private set; }
public ParameterPickInfo(ParameterPickType pickType, List> pickTypeAdditionalList, bool editable, Func parameterPickFunc)
{
PickType = pickType;
PickTypeAdditionalList = pickTypeAdditionalList;
Editable = editable;
ParameterPickFunc = parameterPickFunc;
}
}
public class ParameterPickTypeEngine
{
public static Dictionary dictionaryParameterPickFunc = new Dictionary() {
{ParameterPickType.Str , new ParameterPickInfo(ParameterPickType.Str,new List>(){new KeyValuePair("str-str","StartString-EndString"),new KeyValuePair("str-len","StartString-StringLength"),new KeyValuePair("index-len","StartIndex-StringLength")},false,ParameterPickHelper.ParameterPickStr)},
{ParameterPickType.Regex , new ParameterPickInfo(ParameterPickType.Regex,new List>(){new KeyValuePair("1","RegexExpression"),new KeyValuePair("0","RegexExpression")},true,ParameterPickHelper.ParameterPickRegex)},
{ParameterPickType.Xml , new ParameterPickInfo(ParameterPickType.Xml,new List>(){new KeyValuePair("1","XpathExpression"),new KeyValuePair("0","XpathExpression")},true,ParameterPickHelper.ParameterPickXml)}
};
}
}
================================================
FILE: AutoTest/ParameterizationPick/ParameterPickHelper.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
namespace FreeHttp.AutoTest.ParameterizationPick
{
public class ParameterPickHelper
{
///
/// 使用xpth查找xml匹配项
///
/// xpth表达式 (如//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置)
/// 数据源
/// 返回结果(结果为XmlNodeList的InnerXml字符串数组)
public static string[] PickXmlParameter(string yourTarget, string yourSouce)
{
XmlDocument xml = new XmlDocument();
try
{
xml.LoadXml(yourSouce);
}
catch (Exception)
{
return null;
}
XmlNodeList tempNodeList;
try
{
tempNodeList = xml.SelectNodes("//" + yourTarget);
}
catch (Exception)
{
return null;
}
if (tempNodeList.Count > 0)
{
string[] backStrs = new string[tempNodeList.Count];
for (int i = 0; i < tempNodeList.Count; i++)
{
backStrs[i] = tempNodeList[i].InnerXml;
}
return backStrs;
}
return null;
}
public static string[] PickRegexParameter(string yourTarget, string yourSouce)
{
MatchCollection mc;
try
{
mc = Regex.Matches(yourSouce, yourTarget);
}
catch (Exception )
{
return null;
}
if (mc.Count > 0)
{
string[] backStrs = new string[mc.Count];
for (int i = 0; i < mc.Count; i++)
{
backStrs[i] = mc[i].Value;
}
return backStrs;
}
return null;
}
public static string PickStrParameter(int yourStrStart, int yourStrLen, string yourSouce)
{
if (yourStrStart < 0 || yourStrLen < 0)
{
return null;
}
if (yourSouce.Length >= yourStrStart + yourStrLen)
{
if (yourStrLen==0)
{
return yourSouce.Remove(0, yourStrStart);
}
return yourSouce.Substring(yourStrStart, yourStrLen);
}
return null;
}
public static string PickStrParameter(string yourTarget, int yourStrLen, string yourSouce)
{
if (yourStrLen < 0)
{
return null;
}
if (yourSouce.Contains(yourTarget))
{
string tempPickStr;
int tempStart = yourSouce.IndexOf(yourTarget) + yourTarget.Length;
tempPickStr = yourSouce.Remove(0, tempStart);
if (tempPickStr.Length > yourStrLen)
{
if (yourStrLen != 0)
{
tempPickStr = tempPickStr.Remove(yourStrLen);
}
}
return tempPickStr;
}
return null;
}
public static string PickStrParameter(string yourTarget, string yourStrEnd, string yourSouce)
{
if (yourSouce.Contains(yourTarget))
{
string tempPickStr;
int tempStart = yourSouce.IndexOf(yourTarget) + yourTarget.Length;
tempPickStr = yourSouce.Remove(0, tempStart);
if (tempPickStr.Contains(yourStrEnd))
{
int tempEnd = tempPickStr.IndexOf(yourStrEnd);
tempPickStr = tempPickStr.Remove(tempEnd);
return tempPickStr;
}
}
return null;
}
public static bool GetStrPickData(string yourSouce, out string yourFrontTarget, out string yourBackStr)
{
yourFrontTarget = null;
yourBackStr = null;
if (yourSouce.Contains("-"))
{
yourFrontTarget = yourSouce.Remove(yourSouce.LastIndexOf("-"));
yourBackStr = yourSouce.Remove(0, yourSouce.LastIndexOf("-") + 1);
return true;
}
else
{
yourFrontTarget = yourSouce;
}
return false;
}
public static string ParameterPickStr(string sourceStr,string pickExpression,string pickExpressionAdditional)
{
if (string.IsNullOrEmpty(sourceStr) || string.IsNullOrEmpty(pickExpression) || string.IsNullOrEmpty(pickExpressionAdditional))
{
throw new Exception("your ParameterPick data is null or empty");
}
string frontStr;
string backStr;
int frontIndex;
int strLen;
if (!GetStrPickData(pickExpression, out frontStr, out backStr))
{
throw new Exception( string.Format("this Expressions error :{0}", "it should contain '-'"));
}
if (string.IsNullOrEmpty(frontStr) || string.IsNullOrEmpty(backStr))
{
throw new Exception( string.Format("this Expressions error :{0}", "the '-' position is illegal"));
}
switch(pickExpressionAdditional)
{
case "str-str":
return PickStrParameter(frontStr, backStr, sourceStr);
case "str-len":
if(!int.TryParse(backStr,out strLen))
{
throw new Exception(string.Format("this Expressions error :{0}", "the len should be a int value"));
}
return PickStrParameter(frontStr, strLen, sourceStr);
case "index-len":
if (!int.TryParse(backStr, out strLen) )
{
throw new Exception(string.Format("this Expressions error :{0}", "the len should be a int value"));
}
if(!int.TryParse(frontStr, out frontIndex))
{
throw new Exception(string.Format("this Expressions error :{0}", "the index should be a int value"));
}
return PickStrParameter(frontIndex, strLen, sourceStr);
default:
throw new Exception("your ParameterPick data is null or empty");
}
}
public static string ParameterPickXml(string sourceStr, string pickExpression, string pickExpressionAdditional)
{
if (string.IsNullOrEmpty(sourceStr) || string.IsNullOrEmpty(pickExpression) || string.IsNullOrEmpty(pickExpressionAdditional))
{
throw new Exception("your ParameterPick data is null or empty");
}
int returnIndex;
if (!int.TryParse(pickExpressionAdditional, out returnIndex))
{
throw new Exception("this PickTypeAdditional should be a number");
}
if (returnIndex<0)
{
throw new Exception("this PickTypeAdditional should greater than 0");
}
string[] returnArray = PickXmlParameter(pickExpressionAdditional, sourceStr);
if (returnArray==null)
{
return null;
}
if (returnIndex==0)
{
return string.Join(",", returnArray);
}
else if (returnIndex > returnArray.Length)
{
return null;
}
else
{
return returnArray[returnIndex - 1];
}
}
public static string ParameterPickRegex(string sourceStr, string pickExpression, string pickExpressionAdditional)
{
{
if (string.IsNullOrEmpty(sourceStr) || string.IsNullOrEmpty(pickExpression) || string.IsNullOrEmpty(pickExpressionAdditional))
{
throw new Exception("your ParameterPick data is null or empty");
}
int returnIndex;
if (!int.TryParse(pickExpressionAdditional, out returnIndex))
{
throw new Exception("this PickTypeAdditional should be a number");
}
if (returnIndex < 0)
{
throw new Exception("this PickTypeAdditional should greater than 0");
}
string[] returnArray = PickRegexParameter(pickExpression, sourceStr);
if (returnArray == null)
{
return null;
}
if (returnIndex == 0)
{
return string.Join(",", returnArray);
}
else if (returnIndex > returnArray.Length)
{
return null;
}
else
{
return returnArray[returnIndex - 1];
}
}
}
public static string CheckParameterPickExpression(ParameterPick yourParameterPick)
{
if (string.IsNullOrEmpty(yourParameterPick.PickTypeExpression))
{
return "your Expression is empty";
}
switch (yourParameterPick.PickType)
{
case ParameterPickType.Regex:
int tempAdditionalIndex;
if (int.TryParse(yourParameterPick.PickTypeAdditional, out tempAdditionalIndex))
{
if (tempAdditionalIndex < 0)
{
return "this PickTypeAdditional should greater than 0";
}
}
else
{
return "this PickTypeAdditional should be a number";
}
try
{
System.Text.RegularExpressions.Regex.Matches("", yourParameterPick.PickTypeExpression);
}
catch (Exception ex)
{
return string.Format("this Regex Expressions error :{0}", ex.Message);
}
break;
case ParameterPickType.Xml:
if (int.TryParse(yourParameterPick.PickTypeAdditional, out tempAdditionalIndex))
{
if (tempAdditionalIndex < 0)
{
return "this PickTypeAdditional should greater than 0";
}
}
else
{
return "this PickTypeAdditional should be a number";
}
try
{
XmlDocument xml = new XmlDocument();
xml.LoadXml("");
xml.SelectSingleNode(yourParameterPick.PickTypeExpression);
}
catch (Exception ex)
{
return string.Format("this Xpath Expressions error :{0}", ex.Message);
}
break;
case ParameterPickType.Str:
string frontStr;
string backStr;
if (!GetStrPickData(yourParameterPick.PickTypeExpression, out frontStr, out backStr))
{
return string.Format("this Expressions error :{0}", "it should contain '-'");
}
if (string.IsNullOrEmpty(frontStr) || string.IsNullOrEmpty(backStr))
{
return string.Format("this Expressions error :{0}", "the '-' position is illegal");
}
if (yourParameterPick.PickTypeAdditional == "str-str")
{
}
else if (yourParameterPick.PickTypeAdditional == "str-len")
{
if (!int.TryParse(backStr, out tempAdditionalIndex))
{
return string.Format("this Expressions error :{0}", "the len should be a int value");
}
}
else if (yourParameterPick.PickTypeAdditional == "index-len")
{
if (!int.TryParse(frontStr, out tempAdditionalIndex))
{
return string.Format("this Expressions error :{0}", "the index should be a int value");
}
if (!int.TryParse(backStr, out tempAdditionalIndex))
{
return string.Format("this Expressions error :{0}", "the len should be a int value");
}
}
break;
default:
return "unknow ParameterPickType";
}
return null;
}
}
}
================================================
FILE: AutoTest/ParameterizationPick/ParameterPickType.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.ParameterizationPick
{
[Serializable]
public enum ParameterPickType
{
Str,
Xml,
Regex
}
[Serializable]
public enum ParameterPickRange
{
Line,
Heads,
Entity
}
}
================================================
FILE: AutoTest/RunTimeStaticData/ActuatorStaticDataCollection.cs
================================================
using FreeHttp.AutoTest.RunTimeStaticData.MyStaticData;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData
{
///
/// ActuatorStaticData 集合
///
[DataContract] //[Serializable] 默认序列化公开字段及属性,且要求其有公开的Set,用[DataContract]指没有这个限制,使用 [DataMember(Name = "ID")] / [DataMember] 标记成员
[KnownType(typeof(MyStaticDataValue)), KnownType(typeof(MyStaticDataIndex)), KnownType(typeof(MyStaticDataList)), KnownType(typeof(MyStaticDataLong)), KnownType(typeof(MyStaticDataNowTime)), KnownType(typeof(MyStaticDataRandomStr)), KnownType(typeof(MyStaticDataSourceCsv)), KnownType(typeof(MyStaticDataStrIndex))]
public class ActuatorStaticDataCollection : IDisposable, ICloneable ,IEnumerable
{
public class ChangeDataEventArgs : EventArgs
{
public bool IsAddOrDel { get; set; }
public ChangeDataEventArgs(bool isAddOrDel)
{
IsAddOrDel = isAddOrDel;
}
}
[DataMember]
public bool IsAllCollectionKeyUnique { get; private set; }
//3组数据源Dictionary都分别实现了_version版本控制,这里可以不用单独实现了
private int _version;
///
/// is all staticdata list is empty in ActuatorStaticDataCollection
///
public bool IsEmpty
{
get
{
if (runActuatorStaticDataKeyList != null && runActuatorStaticDataKeyList.Count > 0) return false;
if (runActuatorStaticDataParameterList != null && runActuatorStaticDataParameterList.Count > 0) return false;
if (runActuatorStaticDataSouceList != null && runActuatorStaticDataSouceList.Count > 0) return false;
return true;
}
}
public int Count
{
get
{
int tempCount = 0;
if (runActuatorStaticDataKeyList != null) tempCount += runActuatorStaticDataKeyList.Count;
if (runActuatorStaticDataParameterList != null) tempCount += runActuatorStaticDataParameterList.Count;
if (runActuatorStaticDataSouceList != null) tempCount += runActuatorStaticDataSouceList.Count;
return tempCount;
}
}
///
/// RunTimeParameter List
///
[DataMember]
private Dictionary runActuatorStaticDataKeyList;
///
/// RunTimeStaticData List
///
[DataMember]
private Dictionary runActuatorStaticDataParameterList;
///
/// RunTimeDataSouce List
///
[DataMember]
private Dictionary runActuatorStaticDataSouceList;
private readonly object padlock = new object();
public ActuatorStaticDataCollection()
{
runActuatorStaticDataKeyList = new Dictionary();
runActuatorStaticDataParameterList = new Dictionary();
runActuatorStaticDataSouceList = new Dictionary();
IsAllCollectionKeyUnique = false;
}
public ActuatorStaticDataCollection(bool isAllCollectionKeyUnique):this()
{
IsAllCollectionKeyUnique = isAllCollectionKeyUnique;
}
public ActuatorStaticDataCollection(Dictionary yourActuatorParameterList, Dictionary yourActuatorStaticDataList, Dictionary yourActuatorStaticDataSouceList)
{
runActuatorStaticDataKeyList = yourActuatorParameterList;
runActuatorStaticDataParameterList = yourActuatorStaticDataList;
runActuatorStaticDataSouceList = yourActuatorStaticDataSouceList;
IsAllCollectionKeyUnique = false;
}
//public event EventHandler OnChangeCollection;
public delegate void ChangeCollectionEventHandler(object sender, ChangeDataEventArgs e);
public event ChangeCollectionEventHandler OnChangeCollection;
private void OnListChanged(bool isAddOrDel)
{
_version++;
if (OnChangeCollection!=null)
{
this.OnChangeCollection(this, new ChangeDataEventArgs(isAddOrDel));
}
}
///
/// Get RunActuatorStaticDataKeyList (do not modify this dictionary yourselves, you can call
/// [AddStaticDataKey][AddStaticDataParameter][AddStaticDataParameter][RemoveStaticData][SetStaticDataValue]do that)
///
public Dictionary RunActuatorStaticDataKeyList
{
get { return runActuatorStaticDataKeyList; }
}
///
/// Get RunActuatorStaticDataParameterList (do not modify this dictionary yourselves, you can call
/// [AddStaticDataKey][AddStaticDataParameter][AddStaticDataParameter][RemoveStaticData][SetStaticDataValue]do that)
///
public Dictionary RunActuatorStaticDataParameterList
{
get { return runActuatorStaticDataParameterList; }
}
///
/// Get RunActuatorStaticDataSouceList (do not modify this dictionary yourselves, you can call
/// [AddStaticDataKey][AddStaticDataParameter][AddStaticDataParameter][RemoveStaticData][SetStaticDataValue]do that)
///
public Dictionary RunActuatorStaticDataSouceList
{
get { return runActuatorStaticDataSouceList; }
}
private object IsHasSameKey(string key, int ignoreListIndex)
{
if (runActuatorStaticDataKeyList.ContainsKey(key) && ignoreListIndex != 1)
{
return runActuatorStaticDataKeyList;
}
if (runActuatorStaticDataParameterList.ContainsKey(key) && ignoreListIndex != 2)
{
return runActuatorStaticDataParameterList;
}
if (runActuatorStaticDataSouceList.ContainsKey(key) && ignoreListIndex != 3)
{
return runActuatorStaticDataSouceList;
}
return null;
}
///
/// Is the StaticDataCollection has th same key name
///
/// your Key
/// is has
public bool IsHaveSameKey(string yourKey)
{
return (IsHasSameKey(yourKey, 0) != null);
}
///
/// Add Data into runActuatorStaticDataKeyList (if DataParameter or DataSouce has same key retrun false , if DataKey has same key cover the vaule)
///
/// key
/// vaule
/// is success
[MethodImplAttribute(MethodImplOptions.Synchronized)]
public bool AddStaticDataKey(string key, IRunTimeStaticData vaule)
{
//if (!(vaule is MyStaticDataValue))
//{
// return false;
//}
if (IsHasSameKey(key, IsAllCollectionKeyUnique?0:1) != null)
{
if (!RemoveStaticData(key, false))
{
return false;
}
}
runActuatorStaticDataKeyList.MyAdd(key, vaule);
OnListChanged(true);
return true;
}
///
/// Add Data into runActuatorStaticDataParameterList (if DataKey or DataSouce has same key retrun false , if DataParameter has same key cover the vaule)
///
/// key
/// vaule
/// is success
[MethodImplAttribute(MethodImplOptions.Synchronized)]
public bool AddStaticDataParameter(string key, IRunTimeStaticData vaule)
{
if (IsHasSameKey(key, IsAllCollectionKeyUnique ? 0 : 2) != null)
{
if (!RemoveStaticData(key, false))
{
return false;
}
}
runActuatorStaticDataParameterList.MyAdd(key, vaule);
OnListChanged(true);
return true;
}
///
/// Add Data into runActuatorStaticDataSouceList (if DataKey or DataParameter has same key retrun false , if DataSouce has same key cover the vaule)
///
/// key
/// vaule
/// is success
[MethodImplAttribute(MethodImplOptions.Synchronized)]
public bool AddStaticDataSouce(string key, IRunTimeDataSource vaule)
{
if (IsHasSameKey(key, IsAllCollectionKeyUnique ? 0 : 3) != null)
{
if (!RemoveStaticData(key, false))
{
return false;
}
}
runActuatorStaticDataSouceList.MyAdd(key, vaule);
OnListChanged(true);
return true;
}
///
/// Add Data by CaseStaticDataType with vaule
///
/// key
/// vaule
///
[MethodImplAttribute(MethodImplOptions.Synchronized)]
public bool AddStaticData(string key, IRunTimeStaticData vaule)
{
switch(vaule.RunTimeStaticDataType)
{
case CaseStaticDataType.caseStaticData_vaule:
return AddStaticDataKey(key, vaule);
case CaseStaticDataType.caseStaticData_index:
case CaseStaticDataType.caseStaticData_long:
case CaseStaticDataType.caseStaticData_random:
case CaseStaticDataType.caseStaticData_time:
case CaseStaticDataType.caseStaticData_list:
case CaseStaticDataType.caseStaticData_strIndex:
return AddStaticDataParameter(key, vaule);
case CaseStaticDataType.caseStaticData_csv:
case CaseStaticDataType.caseStaticData_mysql:
case CaseStaticDataType.caseStaticData_redis:
IRunTimeDataSource tempDataSource = vaule as IRunTimeDataSource;
if (tempDataSource == null) return false;
return AddStaticDataSouce(key, tempDataSource);
default:
throw new NotSupportedException("nukonw CaseStaticDataType");
}
}
///
/// Remove Static Data in any list (if there not has any same key retrun false)
///
/// key or Regex
/// is use Regex
/// is success
[MethodImplAttribute(MethodImplOptions.Synchronized)]
public bool RemoveStaticData(string key, bool isRegex)
{
if (!isRegex)
{
var tempDataList = IsHasSameKey(key, 0);
if (tempDataList == null)
{
return false;
}
else if (tempDataList == runActuatorStaticDataKeyList)
{
runActuatorStaticDataKeyList.Remove(key);
}
else if (tempDataList == runActuatorStaticDataParameterList)
{
runActuatorStaticDataParameterList.Remove(key);
}
else if (tempDataList == runActuatorStaticDataSouceList)
{
runActuatorStaticDataSouceList.Remove(key);
}
else
{
//ErrorLog.PutInLog(string.Format("error to [RemoveStaticData] in ActuatorStaticDataCollection the key is {0} ", key));
return false;
}
}
else
{
try
{
bool isFindAndRegexKey = false;
System.Text.RegularExpressions.Regex sr;
sr = new System.Text.RegularExpressions.Regex(key, System.Text.RegularExpressions.RegexOptions.None);
List dataToDel = new List();
foreach (var tempKey in runActuatorStaticDataKeyList.Keys)
{
if (sr.IsMatch(tempKey))
{
dataToDel.Add(tempKey);
}
}
foreach (string tempKey in dataToDel)
{
runActuatorStaticDataKeyList.Remove(tempKey);
}
if (dataToDel.Count > 0)
{
isFindAndRegexKey = true;
dataToDel.Clear();
}
foreach (var tempKey in runActuatorStaticDataParameterList.Keys)
{
if (sr.IsMatch(tempKey))
{
dataToDel.Add(tempKey);
}
}
foreach (string tempKey in dataToDel)
{
runActuatorStaticDataParameterList.Remove(tempKey);
}
if (dataToDel.Count > 0)
{
isFindAndRegexKey = true;
dataToDel.Clear();
}
foreach (var tempKey in runActuatorStaticDataSouceList.Keys)
{
if (sr.IsMatch(tempKey))
{
dataToDel.Add(tempKey);
}
}
foreach (string tempKey in dataToDel)
{
runActuatorStaticDataSouceList.Remove(tempKey);
}
if (dataToDel.Count > 0)
{
isFindAndRegexKey = true;
dataToDel.Clear();
}
if (!isFindAndRegexKey)
{
return false;
}
}
catch (Exception ex)
{
//ErrorLog.PutInLog(ex);
return false;
}
}
OnListChanged(true);
return true;
}
///
/// set or change data in any list
///
/// key
/// config Vaule
/// is success
[MethodImplAttribute(MethodImplOptions.Synchronized)]
public bool SetStaticDataValue(string key, string configVaule)
{
var tempDataList = GetStaticData(key, 0);
if (tempDataList == null)
{
return false;
}
if (tempDataList.DataSet(configVaule))
{
OnListChanged(false);
return true;
}
return false;
}
public IRunTimeStaticData GetStaticData(string key ,int GetListIndex)
{
if (runActuatorStaticDataKeyList.ContainsKey(key) && (GetListIndex == 1 || GetListIndex == 0))
{
return runActuatorStaticDataKeyList[key];
}
if (runActuatorStaticDataParameterList.ContainsKey(key) && (GetListIndex == 1 || GetListIndex == 0))
{
return runActuatorStaticDataParameterList[key];
}
if (runActuatorStaticDataSouceList.ContainsKey(key) && (GetListIndex == 1 || GetListIndex == 0))
{
return runActuatorStaticDataSouceList[key];
}
return null;
}
public IRunTimeStaticData this[string key]
{
get
{
return GetStaticData(key, 0);
}
set
{
var tempDataList = IsHasSameKey(key, 0);
if (tempDataList == null)
{
throw new Exception("ActuatorStaticDataCollection do not have this key");
}
else if (tempDataList == runActuatorStaticDataKeyList )
{
if (value is MyStaticDataValue)
{
runActuatorStaticDataKeyList[key] = value;
}
else
{
throw new Exception("this StaticData must be a MyStaticDataValue");
}
}
else if (tempDataList == runActuatorStaticDataParameterList)
{
runActuatorStaticDataParameterList[key] = value;
}
else if (tempDataList == runActuatorStaticDataSouceList )
{
if (value is IRunTimeDataSource)
{
runActuatorStaticDataSouceList[key] = (IRunTimeDataSource)value;
}
else
{
throw new Exception("this StaticData must be a IRunTimeDataSource");
}
}
else
{
throw new Exception("nuknow DataSource");
}
OnListChanged(false);
}
}
public IEnumerator GetEnumerator()
{
return new ActuatorStaticDataEnum(this);
}
public object Clone()
{
return new ActuatorStaticDataCollection(runActuatorStaticDataKeyList.MyDeepClone(), runActuatorStaticDataParameterList.MyDeepClone(), runActuatorStaticDataSouceList.MyDeepClone());
}
public void Dispose()
{
runActuatorStaticDataKeyList.Clear();
runActuatorStaticDataParameterList.Clear();
runActuatorStaticDataSouceList.Clear();
}
public class ActuatorStaticDataEnum : IEnumerator
{
private Dictionary _staticDataKeyList;
private Dictionary _staticDataParameterList;
private Dictionary _staticDataSouceList;
private int _index;
private readonly int _version;
private KeyValuePair _current;
private IEnumerator innerEnumerator = null;
internal ActuatorStaticDataEnum(ActuatorStaticDataCollection actuatorStaticDataCollection)
{
_staticDataKeyList = actuatorStaticDataCollection.runActuatorStaticDataKeyList;
_staticDataParameterList = actuatorStaticDataCollection.runActuatorStaticDataParameterList;
_staticDataSouceList = actuatorStaticDataCollection.runActuatorStaticDataSouceList;
_index = 0;
_version = actuatorStaticDataCollection._version;
_current = default;
}
object IEnumerator.Current
{
get
{
return Current;
}
}
public KeyValuePair Current => _current;
public bool MoveNext()
{
//if (_version != _actuatorStaticDataCollection._version)
//{
// ThrowHelper.ThrowInvalidOperationException_InvalidOperation_EnumFailedVersion();
//}
if (_index == 0)
{
innerEnumerator = _staticDataKeyList.GetEnumerator();
_index = -1;
}
else if (_index == 1)
{
innerEnumerator = _staticDataParameterList.GetEnumerator();
_index = -2;
}
else if (_index == 2)
{
innerEnumerator = _staticDataSouceList.GetEnumerator();
_index = -3;
}
else if(_index == 3) // end
{
_current = default;
return false;
}
if (_index < -2 && _index > 2)
{
throw new Exception("unkonw StaticData in [MoveNext]");
}
if (innerEnumerator.MoveNext())
{
if(_index == -3)
{
KeyValuePair tempDataSourceKvp = (KeyValuePair)innerEnumerator.Current;
_current = new KeyValuePair(tempDataSourceKvp.Key, tempDataSourceKvp.Value);
}
else
{
_current = (KeyValuePair)innerEnumerator.Current;
}
return true;
}
else
{
_index = Math.Abs(_index);
return MoveNext();
}
}
public void Reset()
{
_index = 0;
_current = default;
}
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/CaseRunTimeDataTypeEngine.cs
================================================
#define ALLOW_CSV_EMPTY
using FreeHttp.AutoTest.RunTimeStaticData.MyStaticData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData
{
///
/// 如果您想要添加新类型的【RunTimeStaticData】请在此处添加解释器,并为它添加相应的继承于【IRunTimeStaticData】存储的结构
/// 然后在CaseStaticDataType枚举中直接新增自己的类型(请与原有格式保持一致),最后您还需要在执行器【LoadScriptRunTime】函数中添加自己的分支
///
public class CaseRunTimeDataTypeEngine
{
#region TypeDictionary
public static Dictionary> dictionaryStaticDataAnnotation = new Dictionary>()
{
{CaseStaticDataType.caseStaticData_vaule,new List(){"Key-Value","value","value","this value the meaning is the key","provide a key value list like dictionary"}},
{CaseStaticDataType.caseStaticData_index,new List(){"Index","start-end-step","1-1000-2","start: the start of the number \nend: the end of the number (the max is 2147483647)\nstep: when get next value the number will add step (default is 1)","provide a number index ,you can get a increase index each time"}},
{CaseStaticDataType.caseStaticData_long,new List(){"LongIndex","start-end-step","1-1000-2","start: the start of the number \nend: the end of the number (the max is 9223372036854775807)\nstep: when get next value the number will add step (default is 1)","provide a number long index ,you can get a increase index each time"}},
{CaseStaticDataType.caseStaticData_strIndex,new List(){"StringIndex","start-end-step","0001-1000-2","start: the start of the number string (the lengh should equal to the end lengh)\nend: the end of the number sting (the max is 9223372036854775807)\nstep: when get next value the number will add step (default is 1)","provide a number string index ,you can keep the same lengh of the string each time"}},
{CaseStaticDataType.caseStaticData_time,new List(){"Time","DateTimeFormatInfo","yyyy-MM-ddTHH:mm:ss","DateTimeFormatInfo: the format for data time (find DateTimeFormatInfo in dotnet doc) \n[another expression] a int number mean timestamp ,10000 is microsecond timestamp;10000000 is second timestamp ","provide a data time string with your format"}},
{CaseStaticDataType.caseStaticData_random,new List(){"Random","len-type","10-1","len: the lengh of the random string\ntype: the type of random mode (0 is all the visible asc2 ; 1 is only number ; 2 is letter in upper ; 3 is letter in lower ; 4 is the special character ; 5 is all the letters ; 6 is all the letters or numbers)(default is 1)","provide a random strng with your mode"}},
{CaseStaticDataType.caseStaticData_list,new List(){"List","v1,v2,v3,v4-mode","ab,c,de-1","v1,v2,v3: the value of the list (the value list segmentation by ,) \nmode: the mode read 1 is read by order ; 2 is read by random (default is 1)","provide a list value ,you can get it by order or random"}},
{CaseStaticDataType.caseStaticData_csv,new List(){"CSV","path-encode","csvdatasouce.csv-65001","path: the file path (start with @ means absolute path) \nencode: the encode of the file (default is 65001) \n[another expression] start with'*' and followed by ColumnCount-RowCount (like *10-10 mean creat a 10*10 empty csv data source)","provide a data souce form csv file ,you can get it by order or location"}}
};
///
/// 参数化数据类型映射表
///
public static Dictionary dictionaryStaticDataTypeClass = new Dictionary() {
{ CaseStaticDataType.caseStaticData_vaule, CaseStaticDataClass.caseStaticDataKey },
{ CaseStaticDataType.caseStaticData_index, CaseStaticDataClass.caseStaticDataParameter },
{ CaseStaticDataType.caseStaticData_long, CaseStaticDataClass.caseStaticDataParameter},
{ CaseStaticDataType.caseStaticData_list, CaseStaticDataClass.caseStaticDataParameter},
{ CaseStaticDataType.caseStaticData_time, CaseStaticDataClass.caseStaticDataParameter},
{ CaseStaticDataType.caseStaticData_random, CaseStaticDataClass.caseStaticDataParameter},
{ CaseStaticDataType.caseStaticData_csv, CaseStaticDataClass.caseStaticDataSource},
{ CaseStaticDataType.caseStaticData_mysql, CaseStaticDataClass.caseStaticDataSource},
{ CaseStaticDataType.caseStaticData_redis, CaseStaticDataClass.caseStaticDataSource},
{CaseStaticDataType.caseStaticData_strIndex, CaseStaticDataClass.caseStaticDataParameter}};
public static Dictionary> dictionaryStaticDataTypeSource = new Dictionary>()
{
{CaseStaticDataClass.caseStaticDataKey,new List(){CaseStaticDataType.caseStaticData_vaule}},
{CaseStaticDataClass.caseStaticDataParameter,new List(){CaseStaticDataType.caseStaticData_index,CaseStaticDataType.caseStaticData_list,CaseStaticDataType.caseStaticData_long,CaseStaticDataType.caseStaticData_random,CaseStaticDataType.caseStaticData_strIndex,CaseStaticDataType.caseStaticData_time}},
{CaseStaticDataClass.caseStaticDataSource,new List(){CaseStaticDataType.caseStaticData_csv}}
};
//参数化数据处理函数委托
public delegate bool GetStaticDataAction(out T yourStaticData, out string errorMes, string yourFormatData) where T : IRunTimeStaticData;
///
/// CaseStaticDataType数据与处理函数映射表
///
public static Dictionary> dictionaryStaticDataParameterAction = new Dictionary>() {
{ CaseStaticDataType.caseStaticData_index, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetIndexStaticData) } ,
{ CaseStaticDataType.caseStaticData_strIndex, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetStrIndexStaticData) } ,
{ CaseStaticDataType.caseStaticData_long, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetLongStaticData) } ,
{ CaseStaticDataType.caseStaticData_list, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetListStaticData) } ,
{ CaseStaticDataType.caseStaticData_time, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetTimeStaticData) } ,
{ CaseStaticDataType.caseStaticData_random, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetRandomStaticData) }
};
///
/// CaseStaticDataType数据与处理函数映射表
///
public static Dictionary> dictionaryStaticDataSourceAction = new Dictionary>() {
{ CaseStaticDataType.caseStaticData_csv, new GetStaticDataAction(CaseRunTimeDataTypeEngine.GetCsvStaticDataSource) }
};
#endregion
#region IRunTimeStaticData
public static bool GetIndexStaticData(out IRunTimeStaticData yourStaticData, out string errorMes, string yourFormatData)
{
try
{
string[] tempStartEnd;
tempStartEnd = yourFormatData.Split('-');
if (tempStartEnd.Length == 2)
{
yourStaticData = new MyStaticDataIndex(int.Parse(tempStartEnd[0]), int.Parse(tempStartEnd[1]), 1, yourFormatData);
errorMes = null;
return true;
}
if (tempStartEnd.Length == 3)
{
yourStaticData = new MyStaticDataIndex(int.Parse(tempStartEnd[0]), int.Parse(tempStartEnd[1]), int.Parse(tempStartEnd[2]), yourFormatData);
errorMes = null;
return true;
}
else
{
yourStaticData = new MyStaticDataIndex(0, 2147483647, 1, yourFormatData);
errorMes = "find error data[myStaticDataIndex] in RunTimeStaticData - ScriptRunTime :(find error number of parameters)";
}
}
catch (Exception)
{
yourStaticData = new MyStaticDataIndex(0, 2147483647, 1, yourFormatData);
errorMes = "find error data[myStaticDataIndex] in RunTimeStaticData - ScriptRunTime ";
}
return false;
}
public static bool GetStrIndexStaticData(out IRunTimeStaticData yourStaticData, out string errorMes, string yourFormatData)
{
try
{
string[] tempStartEnd;
tempStartEnd = yourFormatData.Split('-');
if (tempStartEnd.Length == 2)
{
if (tempStartEnd[0].Length == tempStartEnd[0].Length)
{
yourStaticData = new MyStaticDataStrIndex(long.Parse(tempStartEnd[0]), long.Parse(tempStartEnd[1]), 1, tempStartEnd[0].Length, yourFormatData);
errorMes = null;
return true;
}
else
{
yourStaticData = new MyStaticDataStrIndex(0, 9223372036854775807, 1, 19, yourFormatData);
errorMes = "find error data[myStaticDataStrIndex] with error len in RunTimeStaticData - ScriptRunTime ";
}
}
else if (tempStartEnd.Length == 3)
{
if (tempStartEnd[0].Length == tempStartEnd[0].Length)
{
yourStaticData = new MyStaticDataStrIndex(long.Parse(tempStartEnd[0]), long.Parse(tempStartEnd[1]), long.Parse(tempStartEnd[2]), tempStartEnd[0].Length, yourFormatData);
errorMes = null;
return true;
}
else
{
yourStaticData = new MyStaticDataStrIndex(0, 9223372036854775807, 1, 19, yourFormatData);
errorMes = "find error data[myStaticDataStrIndex] with error len in RunTimeStaticData - ScriptRunTime ";
}
}
else
{
yourStaticData = new MyStaticDataStrIndex(0, 9223372036854775807, 1, 19, yourFormatData);
errorMes = "find error data[myStaticDataLong] in RunTimeStaticData - ScriptRunTime :(find error number of parameters)";
}
}
catch (Exception)
{
yourStaticData = new MyStaticDataStrIndex(0, 9223372036854775807, 1, 19, yourFormatData);
errorMes = "find error data[myStaticDataLong] in RunTimeStaticData - ScriptRunTime ";
}
return false;
}
public static bool GetLongStaticData(out IRunTimeStaticData yourStaticData, out string errorMes, string yourFormatData)
{
try
{
string[] tempStartEnd;
tempStartEnd = yourFormatData.Split('-');
if (tempStartEnd.Length == 2)
{
yourStaticData = new MyStaticDataLong(long.Parse(tempStartEnd[0]), long.Parse(tempStartEnd[1]), 1, yourFormatData);
errorMes = null;
return true;
}
else if (tempStartEnd.Length == 3)
{
yourStaticData = new MyStaticDataLong(long.Parse(tempStartEnd[0]), long.Parse(tempStartEnd[1]), long.Parse(tempStartEnd[2]), yourFormatData);
errorMes = null;
return true;
}
else
{
yourStaticData = new MyStaticDataLong(0, 9223372036854775807, 1, yourFormatData);
errorMes = "find error data[myStaticDataLong] in RunTimeStaticData - ScriptRunTime :(find error number of parameters)";
}
}
catch (Exception)
{
yourStaticData = new MyStaticDataLong(0, 9223372036854775807, 1, yourFormatData);
errorMes = "find error data[myStaticDataLong] in RunTimeStaticData - ScriptRunTime ";
}
return false;
}
public static bool GetTimeStaticData(out IRunTimeStaticData yourStaticData, out string errorMes, string yourFormatData)
{
errorMes = null;
try
{
System.DateTime.Now.ToString(yourFormatData);
}
catch
{
errorMes = "find error data[myStaticDataNowTime] in RunTimeStaticData - ScriptRunTime ";
yourStaticData = new MyStaticDataNowTime("", yourFormatData);
return false;
}
yourStaticData = new MyStaticDataNowTime(yourFormatData, yourFormatData);
return true;
}
public static bool GetRandomStaticData(out IRunTimeStaticData yourStaticData, out string errorMes, string yourFormatData)
{
try
{
string[] tempStartEnd;
tempStartEnd = yourFormatData.Split('-');
if (tempStartEnd.Length < 2)
{
yourStaticData = new MyStaticDataRandomStr(10, 0, yourFormatData);
errorMes = "find error data[myStaticDataRandomNumber] in RunTimeStaticData - ScriptRunTime ";
}
else
{
yourStaticData = new MyStaticDataRandomStr(int.Parse(tempStartEnd[0]), int.Parse(tempStartEnd[1]), yourFormatData);
errorMes = null;
return true;
}
}
catch (Exception)
{
yourStaticData = new MyStaticDataRandomStr(10, 0, yourFormatData);
errorMes = "find error data[myStaticDataRandomNumber] in RunTimeStaticData - ScriptRunTime ";
}
return false;
}
public static bool GetListStaticData(out IRunTimeStaticData yourStaticData, out string errorMes, string yourFormatData)
{
try
{
if (yourFormatData.EndsWith("-1"))
{
yourFormatData = yourFormatData.Remove(yourFormatData.Length - 2);
yourStaticData = new MyStaticDataList(yourFormatData, false, yourFormatData);
}
else if (yourFormatData.EndsWith("-2"))
{
yourFormatData = yourFormatData.Remove(yourFormatData.Length - 2);
yourStaticData = new MyStaticDataList(yourFormatData, true, yourFormatData);
}
else
{
yourStaticData = new MyStaticDataList(yourFormatData, false, yourFormatData);
}
errorMes = null;
return true;
}
catch (Exception)
{
yourStaticData = new MyStaticDataList("", false, yourFormatData);
errorMes = "find error data[myStaticDataList] in RunTimeStaticData - ScriptRunTime ";
}
return false;
}
#endregion
#region IRunTimeDataSource
public static bool GetCsvStaticDataSource(out IRunTimeDataSource yourStaticData, out string errorMes, string yourFormatData)
{
errorMes = null;
yourStaticData = null;
string csvPath = null;
int CodePage = 65001;
Encoding csvEncoding = null;
#if ALLOW_CSV_EMPTY
if (yourFormatData.StartsWith("*"))
{
int[] tempConuts;
if (!yourFormatData.Remove(0, 1).MySplitToIntArray('-', out tempConuts) || tempConuts.Length!=2)
{
errorMes = string.Format("[GetCsvStaticDataSource]error in [MySplitToIntArray] with :[{0}]", yourFormatData);
return false;
}
if(tempConuts[0]<1||tempConuts[1]<1)
{
errorMes = string.Format("[GetCsvStaticDataSource]error in [MySplitToIntArray] with :[{0}] \nYour row conut and columu conut should greater than 0 ", yourFormatData);
return false;
}
List tempRow = new List(tempConuts[0]);
for (int i = 0; i < tempConuts[0]; i++)
{
tempRow.Add(null);
}
List> tempCsvDataSource = new List>(tempConuts[1]);
for (int i = 0; i < tempConuts[1];i++ )
{
tempCsvDataSource.Add(tempRow.ToList());
}
yourStaticData = new MyStaticDataSourceCsv(tempCsvDataSource, yourFormatData);
return true;
}
#endif
if (yourFormatData.Contains('-'))
{
if (!yourFormatData.MySplitIntEnd('-', out csvPath, out CodePage))
{
errorMes = string.Format("[GetCsvStaticDataSource]error in [MySplitIntEnd] with :[{0}]", yourFormatData);
return false;
}
}
else
{
csvPath = yourFormatData;
}
try
{
csvEncoding = System.Text.Encoding.GetEncoding(CodePage);
}
catch
{
errorMes = string.Format("[GetCsvStaticDataSource]error in 【CodePage】 [{0}]", yourFormatData);
return false;
}
csvPath = csvPath.StartsWith("@") ? csvPath.Remove(0, 1) : string.Format("{0}\\FreeHttp\\{1}", MyCommonTool.rootPath, csvPath);
if (!System.IO.File.Exists(csvPath))
{
errorMes = string.Format("[GetCsvStaticDataSource]error in csv path [path not exixts] [{0}]", yourFormatData);
return false;
}
MyCommonHelper.FileHelper.CsvFileHelper myCsv = new MyCommonHelper.FileHelper.CsvFileHelper(csvPath, csvEncoding);
try
{
yourStaticData = new MyStaticDataSourceCsv(myCsv.GetListCsvData(), yourFormatData);
}
catch (Exception ex)
{
errorMes = ex.Message;
return false;
}
finally
{
myCsv.Dispose();
}
return true;
}
#endregion
}
}
================================================
FILE: AutoTest/RunTimeStaticData/CaseStaticDataType.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData
{
public enum CaseStaticDataType
{
caseStaticData_vaule = 10000,
caseStaticData_index = 20000,
caseStaticData_long = 20001,
caseStaticData_random = 20002,
caseStaticData_time = 20003,
caseStaticData_list = 20004,
caseStaticData_strIndex = 20005,
caseStaticData_csv = 30000,
caseStaticData_mysql = 30001,
caseStaticData_redis = 30002,
}
///
/// 静态参数化数据大分类
///
public enum CaseStaticDataClass
{
caseStaticDataKey = 0,
caseStaticDataParameter = 1,
caseStaticDataSource = 2
}
}
================================================
FILE: AutoTest/RunTimeStaticData/IRunTimeDataSource.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData
{
public interface IRunTimeDataSource : IRunTimeStaticData
{
///
/// 获取一个值指示该数据源是否已经连接
///
bool IsConnected { get; }
///
/// 连接数据源
///
///
bool ConnectDataSource();
///
/// 断开数据源连接
///
///
bool DisConnectDataSource();
///
/// 以指定地址返回数据源中的数据(地址无效或错误请返回null)
///
/// 地址字符串(需要按格式指定并定义)
/// 目标数据
string GetDataVaule(string vauleAddress);
///
/// 设置指定地址的数据值 (IRunTimeStaticData 中的DataSet 设置的是当前值)
///
/// 地址字符串(需要按格式指定并定义)
/// 期望值
/// 是否成功设置
bool DataSet(string vauleAddress, string expectData);
}
}
================================================
FILE: AutoTest/RunTimeStaticData/IRunTimeStaticData.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData
{
///
/// StaticData数据结构接口
/// Current 属性指向集合中的当前成员。
/// MoveNext 属性将枚举数移到集合中的下一成员
/// Reset 属性将枚举数移回集合的开始处
///
//[ServiceKnownType(typeof(System.DBNull))]
public interface IRunTimeStaticData : ICloneable
{
///
///原始连接字符串
///
string OriginalConnectString
{
get;
}
///
/// 获取当前初始化数据类型别名
///
string RunTimeStaticDataTypeAlias
{
get;
}
///
/// 获取当前初始化数据类型
///
CaseStaticDataType RunTimeStaticDataType
{
get;
}
///
/// 获取当前游标地址的值
///
///
string DataCurrent();
///
/// 将游标下移,并返回下移之后的值(如何已经到达上边界,则重置游标)(为方便使用请特殊处理初始游标也包括重置后的DataMoveNext与DataCurrent一致,即此时DataMoveNext不向下移动)
///
///
string DataMoveNext();
///
/// 重置游标
///
void DataReset();
///
/// 设置当前游标指示的数据的值
///
/// 期望值
/// 设置是否成功
bool DataSet(string expectData);
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataIndex.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
///
/// 为StaticData提供类似索引递增的动态数据【IRunTimeStaticData】
///
[DataContract]
public class MyStaticDataIndex : IRunTimeStaticData
{
[DataMember]
private bool isNew;
[DataMember]
private int dataIndex;
[DataMember]
private int defaultStart;
[DataMember]
private int defaultEnd;
[DataMember]
private int defaultStep;
[DataMember]
public string OriginalConnectString { get; private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_index"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_index; }
}
public MyStaticDataIndex(int yourStart, int yourEnd, int yourStep)
{
isNew = true;
dataIndex = defaultStart = yourStart;
defaultEnd = yourEnd;
defaultStep = yourStep;
}
public MyStaticDataIndex(int yourStart, int yourEnd, int yourStep, string originalConnectString)
: this(yourStart, yourEnd, yourStep)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataIndex(defaultStart, defaultEnd, defaultStep);
}
public string DataCurrent()
{
return dataIndex.ToString();
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public string DataMoveNext()
{
if (isNew)
{
isNew = false;
return dataIndex.ToString();
}
if (dataIndex >= defaultEnd)
{
DataReset();
return DataMoveNext();
}
else
{
dataIndex += defaultStep;
}
return dataIndex.ToString();
}
public void DataReset()
{
isNew = true;
dataIndex = defaultStart;
}
public bool DataSet(string expectData)
{
int tempData;
if (int.TryParse(expectData, out tempData))
{
if (tempData >= defaultStart && tempData <= defaultEnd)
{
dataIndex = tempData;
return true;
}
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataList.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
///
/// 为StaticData提供当基于List的列表数据支持据【IRunTimeStaticData】
///
[DataContract]
public class MyStaticDataList : IRunTimeStaticData
{
[DataMember]
private bool isNew;
[DataMember]
private string souseData;
[DataMember]
private List souseListData;
[DataMember]
private int nowIndex;
[DataMember]
private bool isRandom;
private Random ran;
[DataMember]
public string OriginalConnectString { get;private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_list"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_list; }
}
public MyStaticDataList(string yourSourceData, bool isRandomNext)
{
isNew = true;
souseData = yourSourceData;
souseListData = yourSourceData.Split(',').ToList();
nowIndex = 0;
isRandom = isRandomNext;
if (isRandom)
{
ran = new Random();
}
else
{
ran = null;
}
}
public MyStaticDataList(string yourSourceData, bool isRandomNext, string originalConnectString)
: this(yourSourceData, isRandomNext)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataList(souseData, isRandom);
}
public string DataCurrent()
{
return souseListData[nowIndex];
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public string DataMoveNext()
{
if (isRandom)
{
nowIndex = ran.Next(0, souseListData.Count - 1);
return souseListData[nowIndex];
}
else
{
if (isNew)
{
isNew = false;
}
else
{
nowIndex++;
if (nowIndex > (souseListData.Count - 1))
{
nowIndex = 0;
}
}
return souseListData[nowIndex];
}
}
public void DataReset()
{
isNew = true;
nowIndex = 0;
}
public bool DataSet(string expectData)
{
if (souseListData.Contains(expectData))
{
nowIndex = souseListData.IndexOf(expectData);
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataLong.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
///
/// 为StaticData提供长数字索引支持【IRunTimeStaticData】
///
[DataContract]
public class MyStaticDataLong : IRunTimeStaticData
{
[DataMember]
private bool isNew;
[DataMember]
private long dataIndex;
[DataMember]
private long defaultStart;
[DataMember]
private long defaultEnd;
[DataMember]
private long defaultStep;
[DataMember]
public string OriginalConnectString { get; private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_long"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_long; }
}
public MyStaticDataLong(long yourStart, long yourEnd, long yourStep)
{
isNew = true;
dataIndex = defaultStart = yourStart;
defaultEnd = yourEnd;
defaultStep = yourStep;
}
public MyStaticDataLong(long yourStart, long yourEnd, long yourStep, string originalConnectString)
: this(yourStart, yourEnd, yourStep)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataLong(defaultStart, defaultEnd, defaultStep);
}
public string DataCurrent()
{
return dataIndex.ToString();
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public string DataMoveNext()
{
if (isNew)
{
isNew = false;
return dataIndex.ToString();
}
if (dataIndex >= defaultEnd)
{
DataReset();
return DataMoveNext();
}
else
{
//lock(this)
//{
dataIndex += defaultStep;
//}
}
return dataIndex.ToString();
}
public void DataReset()
{
isNew = true;
dataIndex = defaultStart;
}
public bool DataSet(string expectData)
{
long tempData;
if (long.TryParse(expectData, out tempData))
{
if (tempData >= defaultStart && tempData <= defaultEnd)
{
dataIndex = tempData;
return true;
}
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataNowTime.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
///
/// 为StaticData提供当前时间的动态数据【IRunTimeStaticData】
///
[DataContract]
public class MyStaticDataNowTime : IRunTimeStaticData
{
[DataMember]
string myNowStr;
[DataMember]
string myDataFormatInfo;
[DataMember]
int timestampFormatdividend;
[DataMember]
public string OriginalConnectString { get; private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_time"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_time; }
}
public MyStaticDataNowTime(string yourRormatInfo)
{
myNowStr = "";
if (int.TryParse(yourRormatInfo, out timestampFormatdividend))
{
if(timestampFormatdividend<=0)
{
timestampFormatdividend = 0;
myDataFormatInfo = "";
}
}
else
{
myDataFormatInfo = yourRormatInfo;
}
}
public MyStaticDataNowTime(string yourRormatInfo, string originalConnectString)
: this(yourRormatInfo)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataNowTime(myDataFormatInfo);
}
public string DataCurrent()
{
return myNowStr;
}
public string DataMoveNext()
{
if (timestampFormatdividend == 0)
{
myNowStr = System.DateTime.Now.ToString(myDataFormatInfo);
}
else
{
myNowStr = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / timestampFormatdividend).ToString();
}
return myNowStr;
}
public void DataReset()
{
myNowStr = "";
}
public bool DataSet(string expectData)
{
if (expectData != null)
{
myNowStr = expectData;
return true;
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataRandomStr.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
///
/// 为StaticData提供随机字符串动态数据【IRunTimeStaticData】
///
[DataContract]
public class MyStaticDataRandomStr : IRunTimeStaticData
{
[DataMember]
string myNowStr;
[DataMember]
int myStrNum;
[DataMember]
int myStrType;
[DataMember]
public string OriginalConnectString { get; private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_random"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_random; }
}
public MyStaticDataRandomStr(int yourStrNum, int yourStrType)
{
myNowStr = "";
myStrNum = yourStrNum;
myStrType = yourStrType;
}
public MyStaticDataRandomStr(int yourStrNum, int yourStrType, string originalConnectString)
: this(yourStrNum, yourStrType)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataRandomStr(myStrNum, myStrType);
}
public string DataCurrent()
{
return myNowStr;
}
public string DataMoveNext()
{
myNowStr = MyCommonTool.GenerateRandomStr(myStrNum, myStrType);
return myNowStr;
}
public void DataReset()
{
myNowStr = "";
}
public bool DataSet(string expectData)
{
if (expectData != null)
{
myNowStr = expectData;
return true;
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataSourceCsv.cs
================================================
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
[DataContract]
public class MyStaticDataSourceCsv : IRunTimeDataSource
{
[DataMember]
private bool isNew;
[DataMember]
private int nowRowIndex;
[DataMember]
private int nowColumnIndex;
[DataMember]
private List> csvData;
[DataMember]
public string OriginalConnectString { get; private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticDataSource_csv"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_csv; }
}
public MyStaticDataSourceCsv(List> yourCsvData)
{
isNew = true;
nowRowIndex = 0;
nowColumnIndex = 0;
if(!SetDataSource(yourCsvData))
{
csvData = new List>() { new List() { "NullData" } };
}
}
public MyStaticDataSourceCsv(List> yourCsvData, string originalConnectString)
: this(yourCsvData)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataSourceCsv(csvData);
}
public bool IsConnected
{
get { return true; }
}
public bool ConnectDataSource()
{
return true;
}
public bool DisConnectDataSource()
{
return true;
}
public List> GetDataSource()
{
return csvData;
}
public bool SetDataSource(List> yourDataSource)
{
if (yourDataSource.Count == 0 || yourDataSource[0] == null || yourDataSource[0].Count==0)
{
return false;
}
for (int i = yourDataSource.Count -1 ; i >= 0; i--)
{
if (yourDataSource[i] == null || yourDataSource[i].Count==0)
{
yourDataSource.RemoveAt(i);
}
}
csvData = yourDataSource;
if(nowRowIndex>=yourDataSource.Count || nowColumnIndex>=yourDataSource[nowRowIndex].Count)
{
DataReset();
}
return true;
}
public string GetDataVaule(string vauleAddress)
{
if (vauleAddress != null)
{
int[] csvPosition;
if (vauleAddress.MySplitToIntArray('-', out csvPosition))
{
if (csvPosition.Length == 2)
{
return GetDataVaule(csvPosition[1], csvPosition[0]);
}
}
}
return null;
}
public string GetDataVaule(int yourRowIndex, int yourColumnIndex)
{
if (yourRowIndex < csvData.Count)
{
if (yourColumnIndex < csvData[yourRowIndex].Count)
{
return csvData[yourRowIndex][yourColumnIndex] ?? "";
}
}
return null;
}
public string DataCurrent()
{
//不需要检查 Index ,索引在内部操作,不可能越界
return csvData[nowRowIndex][nowColumnIndex] ?? "";
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public string DataMoveNext()
{
if (isNew)
{
isNew = false;
}
else
{
//内部游标没有变化前不会越界
if (nowColumnIndex + 1 < csvData[nowRowIndex].Count)
{
nowColumnIndex++;
}
else if (nowRowIndex + 1 < csvData.Count)
{
nowColumnIndex = 0;
nowRowIndex++;
}
else
{
DataReset();
}
}
return DataCurrent();
}
public void DataReset()
{
//对于csv文件解析出来的数据不可能出现空行空列的情况,所以(0,0)
nowRowIndex = 0;
nowColumnIndex = 0;
isNew = true;
}
///
/// 设置源数据(使用|分割数据地址及数据值,如果以|开头则表示设置当前地址的值,不含有|的数据也表示当前值)
///
/// 数据地址及数据内容字符串
/// 是否完成
public bool DataExpressionSet(string ExpressionData)
{
if (ExpressionData != null)
{
int splitIndex = ExpressionData.IndexOf('|');
if (splitIndex > 0)
{
return DataSet(ExpressionData.Substring(0, splitIndex), ExpressionData.Remove(0, splitIndex + 1));
}
else if(splitIndex ==0)
{
return DataSet(ExpressionData.Remove(0, 1));
}
else
{
return DataSet(ExpressionData);
}
}
return false;
}
public bool DataSet(string expectData)
{
if (expectData != null)
{
csvData[nowRowIndex][nowColumnIndex] = expectData;
return true;
}
return false;
}
public bool DataSet(int yourRowIndex, int yourColumnIndex, string expectData)
{
if (yourRowIndex < 0 || yourColumnIndex<0)
{
return false;
}
if (yourColumnIndex > csvData.Count - 1)
{
for (int i = 0; yourColumnIndex > csvData.Count - 1; i++)
{
csvData.Add(new List { "" });
}
}
if (yourRowIndex > csvData[yourColumnIndex].Count - 1)
{
for (int i = 0; yourRowIndex > csvData[yourRowIndex].Count-1; i++)
{
csvData[yourRowIndex].Add("");
}
}
csvData[yourRowIndex][yourColumnIndex] = expectData;
return true;
}
public bool DataSet(string vauleAddress, string expectData)
{
if (vauleAddress != null)
{
int[] csvPosition;
if (vauleAddress.MySplitToIntArray('-', out csvPosition))
{
if (csvPosition.Length == 2)
{
DataSet(csvPosition[1], csvPosition[0], expectData);
return true;
}
}
}
return false;
}
public bool SetDataLocation(int yourRowIndex, int yourColumnIndex)
{
if (yourRowIndex < 0 || yourColumnIndex < 0)
{
return false;
}
if (yourRowIndex > csvData.Count - 1 || yourColumnIndex > csvData[yourRowIndex].Count - 1)
{
return false;
}
nowRowIndex = yourRowIndex;
nowColumnIndex = yourColumnIndex;
return true;
}
public Point GetDataLocation()
{
return new Point(nowColumnIndex, nowRowIndex);
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataStrIndex.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
///
/// 为StaticData提定长字符串型数字索引支持【IRunTimeStaticData】
///
[DataContract]
public class MyStaticDataStrIndex : IRunTimeStaticData
{
[DataMember]
private bool isNew;
[DataMember]
private long dataIndex;
[DataMember]
private long defaultStart;
[DataMember]
private long defaultEnd;
[DataMember]
private long defaultStep;
[DataMember]
private int strLen;
[DataMember]
public string OriginalConnectString { get; private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_strIndex"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_strIndex; }
}
public MyStaticDataStrIndex(long yourStart, long yourEnd, long yourStep, int yourStrLen)
{
isNew = true;
dataIndex = defaultStart = yourStart;
defaultEnd = yourEnd;
defaultStep = yourStep;
strLen = yourStrLen;
}
public MyStaticDataStrIndex(long yourStart, long yourEnd, long yourStep, int yourStrLen, string originalConnectString)
: this(yourStart, yourEnd, yourStep, yourStrLen)
{
OriginalConnectString = originalConnectString;
}
public object Clone()
{
return new MyStaticDataStrIndex(defaultStart, defaultEnd, defaultStep, strLen);
}
private string GetLenStr(long yourLeng)
{
string outStr = yourLeng.ToString();
int distinction = strLen - outStr.Length;
if (distinction > 0)
{
for (int i = 0; i < distinction; i++)
{
outStr = "0" + outStr;
}
}
return outStr;
}
public string DataCurrent()
{
return GetLenStr(dataIndex);
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public string DataMoveNext()
{
if (isNew)
{
isNew = false;
return GetLenStr(dataIndex);
}
if (dataIndex >= defaultEnd)
{
DataReset();
return DataMoveNext();
}
else
{
dataIndex += defaultStep;
}
return GetLenStr(dataIndex);
}
public void DataReset()
{
isNew = true;
dataIndex = defaultStart;
}
public bool DataSet(string expectData)
{
long tempData;
if (long.TryParse(expectData, out tempData))
{
if (tempData >= defaultStart && tempData <= defaultEnd)
{
dataIndex = tempData;
return true;
}
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/MyStaticData/MyStaticDataValue.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.Serialization;
namespace FreeHttp.AutoTest.RunTimeStaticData.MyStaticData
{
[DataContract]
public class MyStaticDataValue : IRunTimeStaticData
{
[DataMember]
private string defaultValue;
[DataMember]
public string OriginalConnectString { get;private set; }
public string RunTimeStaticDataTypeAlias
{
get { return "staticData_value"; }
}
public CaseStaticDataType RunTimeStaticDataType
{
get { return CaseStaticDataType.caseStaticData_vaule; }
}
public MyStaticDataValue(string yourVaule)
{
defaultValue=OriginalConnectString=yourVaule;
}
public object Clone()
{
return new MyStaticDataValue(defaultValue);
}
public string DataCurrent()
{
return defaultValue;
}
public string DataMoveNext()
{
return defaultValue;
}
public void DataReset()
{
}
public bool DataSet(string expectData)
{
if (expectData!=null)
{
defaultValue = expectData;
return true;
}
return false;
}
}
}
================================================
FILE: AutoTest/RunTimeStaticData/RunTimeStaticDataHelper.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.AutoTest.RunTimeStaticData
{
public static class RunTimeStaticDataHelper
{
public static bool AddStaticDataToCollection(ActuatorStaticDataCollection actuatorStaticDataCollection, CaseStaticDataType dataType, string staticDataKey, string staticDataVaule, out string errorMes)
{
errorMes = null;
if (actuatorStaticDataCollection==null)
{
errorMes = "your ActuatorStaticDataCollection is null";
return false;
}
if (actuatorStaticDataCollection.IsHaveSameKey(staticDataKey))
{
errorMes = (string.Format("find same key 【{0}】in RunTimeParameter with [ CaseStaticDataClass.caseStaticDataKey] in - ScriptRunTime ,and will drop this key", staticDataKey));
return false;
}
switch(CaseRunTimeDataTypeEngine.dictionaryStaticDataTypeClass[dataType])
{
case CaseStaticDataClass.caseStaticDataKey:
if (dataType == CaseStaticDataType.caseStaticData_vaule)
{
if (!actuatorStaticDataCollection.AddStaticDataKey(staticDataKey, new FreeHttp.AutoTest.RunTimeStaticData.MyStaticData.MyStaticDataValue(staticDataVaule)))
{
errorMes = (string.Format("can not add {0} into ActuatorStaticDataCollection", staticDataKey));
return false;
}
//runActuatorStaticDataCollection.RunActuatorStaticDataKeyList.MyAdd(new KeyValuePair());
}
else
{
throw new Exception(string.Format("find nonsupport Protocol 【{0}】with [ CaseStaticDataClass.caseStaticDataKey] in - ScriptRunTime ", dataType));
}
break;
case CaseStaticDataClass.caseStaticDataParameter:
IRunTimeStaticData tempRunTimeStaticData;
string tempTypeError;
if (CaseRunTimeDataTypeEngine.dictionaryStaticDataParameterAction[dataType](out tempRunTimeStaticData, out tempTypeError, staticDataVaule))
{
if (!actuatorStaticDataCollection.AddStaticDataParameter(staticDataKey, tempRunTimeStaticData))
{
errorMes = (string.Format("can not add {0} into ActuatorStaticDataCollection", staticDataKey));
return false;
}
//runActuatorStaticDataCollection.RunActuatorStaticDataParameterList.MyAdd(tempName, tempRunTimeStaticData);
}
else
{
errorMes = string.Format("find error in 【RunTimeStaticData】->【{0}】:value:【{1}】 by {2}", staticDataKey, staticDataVaule, tempTypeError);
return false;
}
break;
case CaseStaticDataClass.caseStaticDataSource:
IRunTimeDataSource tempRunTimeDataSource;
if (CaseRunTimeDataTypeEngine.dictionaryStaticDataSourceAction[dataType](out tempRunTimeDataSource, out tempTypeError, staticDataVaule))
{
if (!actuatorStaticDataCollection.AddStaticDataSouce(staticDataKey, tempRunTimeDataSource))
{
errorMes = (string.Format("can not add {0} into ActuatorStaticDataCollection", staticDataKey));
return false;
}
//runActuatorStaticDataCollection.RunActuatorStaticDataSouceList.MyAdd(tempName, tempRunTimeDataSource);
}
else
{
errorMes = (string.Format("find error in 【RunTimeStaticData】->【{0}】:value:【{1}】 by {2}", staticDataKey, staticDataVaule, tempTypeError));
return false;
}
break;
default:
throw new Exception(" find nonsupport CaseStaticDataClass");
}
return true;
}
}
}
================================================
FILE: FiddlerFreeHttp.cs
================================================
using Fiddler;
using FreeHttp.AutoTest.RunTimeStaticData;
using FreeHttp.FiddlerHelper;
using FreeHttp.FreeHttpControl;
using FreeHttp.MyHelper;
using FreeHttp.WebService;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
/*******************************************************************************
* Copyright (c) 2018 lulianqi
* All rights reserved.
*
* 文件名称:
* 内容摘要: mycllq@hotmail.com
*
* 历史记录:
* 日 期: 20181103 创建人: lulianqi [mycllq@hotmail.com]
* 描 述: 创建
*
* 历史记录:
* 日 期: 修改:
* 描 述:
*******************************************************************************/
[assembly: Fiddler.RequiredVersion("2.3.5.0")]
namespace FreeHttp
{
public class FiddlerFreeHttp : IAutoTamper, IDisposable
{
private bool isOnLoad = false; //是否已经加载过tab
private bool isCheckedUpdata = false; //是否已经成功完成更新检查,如果检查失败会被重新设置为false
private bool isInFreeHttpTab = false; //是否在正在FreeHttp Tab页中
private Image myIco;
private TabPage tabPage;
private FreeHttpWindow myFreeHttpWindow;
private UpgradeService upgradeService;
private OperationReportService operationReportService;
public bool IsSkipConnectTunnels
{
get
{
if (myFreeHttpWindow != null && myFreeHttpWindow.ModificSettingInfo != null)
return myFreeHttpWindow.ModificSettingInfo.IsSkipConnectTunnels;
else
return true;
}
}
public bool IsSkipUiHide
{
get
{
if (myFreeHttpWindow != null && myFreeHttpWindow.ModificSettingInfo != null)
return myFreeHttpWindow.ModificSettingInfo.IsSkipUiHide;
else
return true;
}
}
public bool IsOnlyMatchFistTamperRule
{
get
{
if (myFreeHttpWindow != null && myFreeHttpWindow.ModificSettingInfo != null)
return myFreeHttpWindow.ModificSettingInfo.IsOnlyMatchFirstTamperRule;
else
return false;
}
}
public bool IsHideFreeHttpSession
{
get
{
return isCheckedUpdata && myFreeHttpWindow.ModificSettingInfo.IsHideSelfSession;
}
}
private void ShowMes(string mes)
{
ShowMes(mes, false);
}
private void ShowMes(string mes , bool isReport = false)
{
if (!isOnLoad)
{
return;
}
if (isReport) _ = RemoteLogService.ReportLogAsync(mes, RemoteLogService.RemoteLogOperation.SessionTamp, RemoteLogService.RemoteLogType.Info);
if (myFreeHttpWindow.InvokeRequired)
{
//BeginInvoke,Invoke will execute in the contol ui thread, but Invoke will with the end in the ui thread
//myFreeHttpWindow.Invoke(new Action(()=>{System.Threading.Thread.Sleep(10000);}) );
myFreeHttpWindow.BeginInvoke(new Action(myFreeHttpWindow.PutInfo), mes);
}
else
{
myFreeHttpWindow.PutInfo(mes);
}
}
private void ShowError(string mes)
{
ShowError(mes, true);
}
private void ShowError(string mes ,bool isReport = true)
{
if (!isOnLoad)
{
return;
}
AddFiddlerObjectLog(mes);
if(isReport) _ = RemoteLogService.ReportLogAsync(mes, RemoteLogService.RemoteLogOperation.SessionTamp, RemoteLogService.RemoteLogType.Error);
if (myFreeHttpWindow.InvokeRequired)
{
myFreeHttpWindow.BeginInvoke(new Action(myFreeHttpWindow.PutError), mes);
}
else
{
myFreeHttpWindow.PutError(mes);
}
}
private void AddFiddlerObjectLog(string mes)
{
FiddlerObject.log(string.Format("【FiddlerFreeHttp】:{0}", mes));
}
private void SetStatusText(string mes)
{
FiddlerObject.StatusText = mes;
}
private void MarkSession(Session oSession)
{
oSession["ui-backcolor"] = "Khaki";
oSession["ui-bold"] = "true";
oSession["ui-color"] = "Indigo";
oSession.RefreshUI();
}
public void OnBeforeUnload()
{
SerializableHelper.SerializeRuleList(myFreeHttpWindow.RequestRuleListView, myFreeHttpWindow.ResponseRuleListView);
SerializableHelper.SerializeData(myFreeHttpWindow.ModificSettingInfo, "FreeHttp\\FreeHttpSetting.xml");
SerializableHelper.SerializeContractData(myFreeHttpWindow.StaticDataCollection, "FreeHttp\\FreeHttpStaticDataCollection.xml");
SerializableHelper.SerializeContractData(myFreeHttpWindow.ModificRuleGroup, "FreeHttp\\FreeHttpModificRuleGroup.xml");
if (isInFreeHttpTab)
{
operationReportService.OutOperation(DateTime.Now, myFreeHttpWindow.RequestRuleListView.Items.Count, myFreeHttpWindow.ResponseRuleListView.Items.Count);
}
if (operationReportService.HasAnyOperation && IsSkipConnectTunnels)
{
operationReportService.StaticDataCollection = myFreeHttpWindow.StaticDataCollection.IsEmpty? null: myFreeHttpWindow.StaticDataCollection;
operationReportService.RuleGroup = myFreeHttpWindow.ModificRuleGroup.IsEmpty ? null : myFreeHttpWindow.ModificRuleGroup;
operationReportService.FiddlerRequestChangeRuleList = myFreeHttpWindow.FiddlerRequestChangeList;
operationReportService.FiddlerResponseChangeRuleList = myFreeHttpWindow.FiddlerResponseChangeList;
operationReportService.StartReportThread();
}
upgradeService.TrySilentUpgrade();
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
public void OnLoad()
{
AddFiddlerObjectLog("OnLoad");
//string workPath = string.Format("{0}\\FreeHttp", System.Windows.Forms.Application.StartupPath);
//System.Threading.Tasks.Task.Run(OnLoad);
string workPath = string.Format("{0}\\FreeHttp", Directory.GetCurrentDirectory());
if (!isOnLoad)
{
tabPage = new TabPage();
tabPage.Text = "Free Http";
if (FiddlerApplication.UI.tabsViews.ImageList != null)
{
myIco = FreeHttp.Resources.MyResource.freehttp;
FiddlerApplication.UI.tabsViews.ImageList.Images.Add(myIco);
tabPage.ImageIndex = FiddlerApplication.UI.tabsViews.ImageList.Images.Count - 1;
}
try
{
if (!Directory.Exists(workPath))
{
AddFiddlerObjectLog(string.Format("Create working directory {0}", workPath));
Directory.CreateDirectory(workPath);
}
AddFiddlerObjectLog(string.Format("load configuration"));
myFreeHttpWindow = new FreeHttpWindow(SerializableHelper.DeserializeRuleList(),
SerializableHelper.DeserializeData("FreeHttp\\FreeHttpSetting.xml"),
SerializableHelper.DeserializeContractData("FreeHttp\\FreeHttpStaticDataCollection.xml"),
SerializableHelper.DeserializeContractData("FreeHttp\\FreeHttpModificRuleGroup.xml"));
}
catch (Exception ex)
{
AddFiddlerObjectLog(string.Format("load configuration fial ,{0}", ex.Message));
}
finally
{
if (myFreeHttpWindow == null)
{
myFreeHttpWindow = new FreeHttpWindow(null, null, null ,null);
}
}
myFreeHttpWindow.OnUpdataFromSession += myFreeHttpWindow_OnUpdataFromSession;
myFreeHttpWindow.OnGetSessionRawData += myFreeHttpWindow_OnGetSessionRawData;
myFreeHttpWindow.OnGetSessionEventArgs += MyFreeHttpWindow_OnGetSessionEventArgs;
myFreeHttpWindow.OnGetSessionSeekHead += myFreeHttpWindow_OnGetSessionSeekHead;
myFreeHttpWindow.OnShowInIndependentWindow += MyFreeHttpWindow_OnShowInIndependentWindow;
myFreeHttpWindow.Dock = DockStyle.Fill;
myFreeHttpWindow.Enter += myFreeHttpWindow_Enter;
tabPage.Controls.Add(myFreeHttpWindow);
FiddlerApplication.UI.tabsViews.TabPages.Add(tabPage);
Fiddler.FiddlerApplication.UI.Deactivate += UI_Deactivate;
FiddlerApplication.UI.tabsViews.SelectedIndexChanged += tabsViews_SelectedIndexChanged;
FiddlerApplication.OnWebSocketMessage += FiddlerApplication_OnWebSocketMessage;
FiddlerApplication.UI.tabsViews.ParentChanged += TabsViews_ParentChanged;
upgradeService = new UpgradeService();
upgradeService.GetUpgradeMes += upgradeService_GetUpgradeMes;
operationReportService = new OperationReportService();
isOnLoad = true;
}
}
private void TabsViews_ParentChanged(object sender, EventArgs e)
{
myFreeHttpWindow.FreeHttpWindowParentChanged(sender);
}
void tabsViews_SelectedIndexChanged(object sender, EventArgs e)
{
if (isCheckedUpdata == false && FiddlerApplication.UI.tabsViews.SelectedTab == tabPage)
{
isCheckedUpdata = true;
upgradeService.StartCheckUpgrade();
//upgradeService.StartCheckUpgradeThread();
}
//operation report
if (FiddlerApplication.UI.tabsViews.SelectedTab == tabPage)
{
isInFreeHttpTab = true;
operationReportService.InOperation(DateTime.Now);
myFreeHttpWindow.FreeHttpWindowSelectedChanged(true);
}
else if (isInFreeHttpTab)
{
isInFreeHttpTab = false;
operationReportService.OutOperation(DateTime.Now, myFreeHttpWindow.RequestRuleListView.Items.Count, myFreeHttpWindow.ResponseRuleListView.Items.Count);
myFreeHttpWindow.FreeHttpWindowSelectedChanged(false);
}
}
void myFreeHttpWindow_Enter(object sender, EventArgs e)
{
//when myFreeHttpWindow is enter do somethings
}
void UI_Deactivate(object sender, EventArgs e)
{
myFreeHttpWindow.CloseEditRtb();
}
private void upgradeService_GetUpgradeMes(object sender, UpgradeService.UpgradeServiceEventArgs e)
{
Action ShowDialogResultBox = (message, title) =>
{
if (string.IsNullOrEmpty(e.UpgradeInfo.url))
{
MessageBox.Show(message, title);
}
else
{
if (MessageBox.Show(message, title,e.UpgradeInfo.isForceEnter? MessageBoxButtons.OK : MessageBoxButtons.OKCancel, MessageBoxIcon.Information) == DialogResult.OK)
{
ShowMes(string.Format("enter message details [flag:{0}]", e.UpgradeInfo.messageFlag??"any"),true);
if (string.IsNullOrEmpty(e.UpgradeInfo.url))
{
MessageBox.Show("UpgradeInfo.url is error");
return;
}
try
{
System.Diagnostics.Process.Start(e.UpgradeInfo.url);
}
catch (Exception ex)
{
MessageBox.Show(string.Format("UpgradeMes is error \r\n{0}", ex.Message));
ShowError(string.Format("process start fail [{0}] [{1}] ", e.UpgradeInfo.url , ex.Message));
}
}
else
{
ShowMes(string.Format("cancel enter message details [flag:{0}]", e.UpgradeInfo.messageFlag ?? "any"),true);
}
}
};
if (e.IsSuccess)
{
if(!string.IsNullOrEmpty(e.UpgradeInfo.uuid)&& string.IsNullOrEmpty(myFreeHttpWindow.ModificSettingInfo.UserToken))
{
myFreeHttpWindow.ModificSettingInfo.UserToken = e.UpgradeInfo.uuid;
}
if (e.UpgradeInfo.isNeedUpdata && !e.UpgradeInfo.isSilentUpgrade)
{
//ShowDialogResultBox(string.IsNullOrEmpty(e.UpgradeInfo.message)?"Find new version for [ FreeHttp Plug-in ] \r\nDo you want goto upgrade page to udpade your FreeHttp" : e.UpgradeInfo.message , "find new version");
myFreeHttpWindow.Invoke(new Action(() => {
ShowDialogResultBox(string.IsNullOrEmpty(e.UpgradeInfo.message) ? "Find new version for [ FreeHttp Plug-in ] \r\nDo you want goto upgrade page to udpade your FreeHttp" : e.UpgradeInfo.message, "find new version");
}));
return;
}
else if(e.UpgradeInfo.isNeedUpdata && e.UpgradeInfo.isSilentUpgrade)
{
//Silent Upgrade
}
else if (e.UpgradeInfo.isShowMessage && !string.IsNullOrEmpty(e.UpgradeInfo.message))
{
//show meaasge
if(string.IsNullOrEmpty(e.UpgradeInfo.messageFlag))
{
myFreeHttpWindow.Invoke(new Action(() => {
ShowDialogResultBox(e.UpgradeInfo.message, "new message");
}));
}
else
{
if (!myFreeHttpWindow.ModificSettingInfo.ReadedMessageFlags.Contains(e.UpgradeInfo.messageFlag))
{
myFreeHttpWindow.Invoke(new Action(() =>
{
ShowDialogResultBox(e.UpgradeInfo.message, "new message");
}));
myFreeHttpWindow.ModificSettingInfo.ReadedMessageFlags.Add(e.UpgradeInfo.messageFlag);
}
}
}
else
{
//not any thing
}
}
else
{
isCheckedUpdata = false;
}
}
private void myFreeHttpWindow_OnGetSessionRawData(object sender, FreeHttpWindow.GetSessionRawDataEventArgs e)
{
Session tempSession = Fiddler.FiddlerObject.UI.GetFirstSelectedSession();
if (tempSession == null)
{
Fiddler.FiddlerObject.UI.ShowAlert(new frmAlert("STOP", "please select a session", "OK"));
FreeHttpWindow.MarkWarnControl(Fiddler.FiddlerApplication.UI.lvSessions);
return;
}
switch (e.SessionAction)
{
case FreeHttpWindow.GetSessionAction.ShowShowResponse:
string tempStr = FiddlerSessionTamper.GetSessionRawData(tempSession, true);
ShowMes(tempStr == null ? "error session" : string.Format("Get Raw Data\r\n{0}", tempStr));
myFreeHttpWindow.ShowOwnerWindow(tempSession.fullUrl, tempStr);
break;
case FreeHttpWindow.GetSessionAction.SetCookies:
myFreeHttpWindow.SetClientAddCookies(tempSession.RequestHeaders["Cookie"]);
break;
case FreeHttpWindow.GetSessionAction.DeleteCookies:
myFreeHttpWindow.SetClientDelCookies(tempSession.RequestHeaders["Cookie"]);
break;
default:
Fiddler.FiddlerObject.UI.ShowAlert(new frmAlert("STOP", "Not supported this SessionAction", "OK"));
break;
}
}
private void MyFreeHttpWindow_OnGetSessionEventArgs(object sender, FreeHttpWindow.GetSessionEventArgs e)
{
Session tempSession = Fiddler.FiddlerObject.UI.GetFirstSelectedSession();
if (tempSession == null)
{
e.IsGetSuccess = false;
}
else
{
e.IsGetSuccess = FiddlerSessionTamper.GetSessionData(tempSession, e);
}
}
private void myFreeHttpWindow_OnGetSessionSeekHead(object sender, FreeHttpWindow.GetSessionSeekHeadEventArgs e)
{
Session tempSession = Fiddler.FiddlerObject.UI.GetFirstSelectedSession();
if (tempSession == null)
{
FreeHttpWindow.MarkWarnControl(Fiddler.FiddlerApplication.UI.lvSessions);
}
else
{
if (e != null && e.ResquestHead.Key != null)
{
//HTTPHeaderItem nowHTTPHeaderItem = tempSession.RequestHeaders.First(hTTPHeaderItem => hTTPHeaderItem.Name == e.ResquestHead.Key);
HTTPHeaderItem nowHTTPHeaderItem = tempSession.RequestHeaders.FirstOrDefault(hTTPHeaderItem => hTTPHeaderItem.Name == e.ResquestHead.Key);
if (nowHTTPHeaderItem != null)
{
e.ResquestHead = new KeyValuePair(nowHTTPHeaderItem.Name, nowHTTPHeaderItem.Value);
e.SeekUri = tempSession.fullUrl;
}
}
if (e != null && e.ResponseHead.Key != null)
{
HTTPHeaderItem nowHTTPHeaderItem = tempSession.ResponseHeaders.FirstOrDefault(hTTPHeaderItem => hTTPHeaderItem.Name == e.ResponseHead.Key);
if (nowHTTPHeaderItem != null)
{
e.ResponseHead = new KeyValuePair(nowHTTPHeaderItem.Name, nowHTTPHeaderItem.Value);
e.SeekUri = tempSession.fullUrl;
}
}
}
}
private void MyFreeHttpWindow_OnShowInIndependentWindow(object sender, bool e)
{
if(e)
{
myFreeHttpWindow.FreeHttpWindowParentChanged(sender);
Form newForm = new Form();
newForm.Icon = FreeHttp.Resources.MyResource.freehttpico;
newForm.Text = "FreeHttp";
newForm.Size = tabPage.Size;
newForm.FormClosing += new FormClosingEventHandler((yourSender, yourE) => {
myFreeHttpWindow.FreeHttpWindowParentChanged(sender);
MyControlHelper.SetControlFreeze(tabPage);
myFreeHttpWindow.independentWindowToolStripMenuItem.Text = "independent window";
tabPage.Controls.Clear();
tabPage.Controls.Add(myFreeHttpWindow);
MyControlHelper.SetControlUnfreeze(tabPage);
});
MyControlHelper.SetControlFreeze(newForm);
Label lb_info = new Label();
lb_info.Text = "closing...";
lb_info.ForeColor = Color.Blue;
lb_info.Location = new Point((newForm.Width - lb_info.Width) / 2, (newForm.Height - lb_info.Height) / 2);
lb_info.Anchor = AnchorStyles.None;
newForm.Controls.Add(lb_info);
newForm.Controls.Add(myFreeHttpWindow);
lb_info.SendToBack();
MyControlHelper.SetControlUnfreeze(newForm);
newForm.Show();
LinkLabel llb_info = new LinkLabel();
llb_info.Text = "FreeHttp is in independent mode";
llb_info.ForeColor = Color.Blue;
llb_info.AutoSize = true;
llb_info.Location = new Point((tabPage.Width - llb_info.Width) / 2, (tabPage.Height - llb_info.Height) / 2);
llb_info.Anchor = AnchorStyles.None;
llb_info.LinkClicked += new LinkLabelLinkClickedEventHandler((yourSender, yourE) => { newForm.Activate(); });
tabPage.Controls.Add(llb_info);
LinkLabel llb_infoRecover = new LinkLabel();
llb_infoRecover.Text = "recover to addin mode";
llb_infoRecover.ForeColor = Color.Blue;
llb_infoRecover.AutoSize = true;
llb_infoRecover.Location = new Point((tabPage.Width - llb_infoRecover.Width) / 2, ((tabPage.Height - llb_infoRecover.Height) / 2) + 20);
llb_infoRecover.Anchor = AnchorStyles.None;
llb_infoRecover.LinkClicked += new LinkLabelLinkClickedEventHandler((yourSender, yourE) => { myFreeHttpWindow.independentWindowToolStripMenuItem_Click(null, null);});
tabPage.Controls.Add(llb_infoRecover);
}
else
{
(myFreeHttpWindow.Parent as Form)?.Close();
}
}
private void myFreeHttpWindow_OnUpdataFromSession(object sender, EventArgs e)
{
Session tempSession = Fiddler.FiddlerObject.UI.GetFirstSelectedSession();
if (tempSession != null)
{
ShowMes(string.Format("Get http session in {0}", tempSession.fullUrl));
((FreeHttpWindow)sender).SetModificSession(tempSession);
}
else
{
Fiddler.FiddlerObject.UI.ShowAlert(new frmAlert("STOP", "please select a session", "OK"));
//((FreeHttpWindow)sender).MarkWarnControl(Fiddler.FiddlerApplication.UI.Controls[0]);
FreeHttpWindow.MarkWarnControl(Fiddler.FiddlerApplication.UI.lvSessions);
}
}
private void FiddlerApplication_OnWebSocketMessage(object sender, WebSocketMessageEventArgs e)
{
//((Bitmap)((Fiddler.Session)sender).ViewItem.ImageList.Images[34]).Save(@"D:\A1.ico", System.Drawing.Imaging.ImageFormat.Icon);
Session oSession = (Session)sender;
WebSocketMessage webSocketMessage = e.oWSM;
if (!isOnLoad)
{
return;
}
if(webSocketMessage==null)
{
AddFiddlerObjectLog("get null WebSocketMessage");
return;
}
if (webSocketMessage.FrameType == WebSocketFrameTypes.Close ||
webSocketMessage.FrameType == WebSocketFrameTypes.Ping ||
webSocketMessage.FrameType == WebSocketFrameTypes.Pong ||
webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx3 ||
webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx4 ||
webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx5 ||
webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx6 ||
webSocketMessage.FrameType == WebSocketFrameTypes.Reservedx7 ||
webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxB ||
webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxC ||
webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxD ||
webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxE ||
webSocketMessage.FrameType == WebSocketFrameTypes.ReservedxF)
{
return;
}
if ((myFreeHttpWindow.IsRequestRuleEnable && webSocketMessage.IsOutbound)|| (myFreeHttpWindow.IsResponseRuleEnable && !webSocketMessage.IsOutbound))
{
if (IsSkipUiHide && oSession["ui-hide"] !=null)
{
return;
}
if (IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT")
{
return;
}
bool isRequest = webSocketMessage.IsOutbound;
List matchItems = null;
if(isRequest)
{
matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerRequestChangeList, isRequest, webSocketMessage);
}
else
{
//oSession.WriteResponseToStream(new MemoryStream(new Byte[] { 0x81,0x81,0x01,0x41 }), false);
//WebSocket ws = oSession.__oTunnel as WebSocket;
//ws.listMessages.Add(webSocketMessage);
matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerResponseChangeList, isRequest, webSocketMessage);
}
if (matchItems != null && matchItems.Count > 0)
{
foreach (var matchItem in matchItems)
{
ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem);
FreeHttpWindow.MarkMatchRule(tempListViewItem);
MarkSession(oSession);
ShowMes(string.Format("macth the [requst rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl));
FiddlerSessionTamper.ModificWebSocketMessage(oSession, webSocketMessage, matchItem ,isRequest, ShowError, ShowMes);
if (!isRequest)
{
FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem);
if (nowFiddlerResponseChange.ResponseLatency > 0)
{
ShowMes(string.Format("[reponse rule {0}] is modified , now delay {1} ms", tempListViewItem.SubItems[0].Text, nowFiddlerResponseChange.ResponseLatency));
System.Threading.Thread.Sleep(nowFiddlerResponseChange.ResponseLatency);
}
if (IsOnlyMatchFistTamperRule)
{
break;
}
}
}
}
}
}
public void AutoTamperRequestAfter(Session oSession)
{
//throw new NotImplementedException();
}
public void AutoTamperRequestBefore(Session oSession)
{
//if (oSession.HTTPMethodIs("CONNECT") && oSession.HostnameIs("api.map.baidu.com"))
//{
// oSession["x-OverrideSslProtocols"] = "ssl3.0";
//}
//oSession.oRequest["AddOrigin"] = "from lijie PC";
if (!isOnLoad)
{
return;
}
if(IsHideFreeHttpSession && oSession.oRequest.host=="api.lulianqi.com")
{
oSession["ui-hide"] = "true";
}
if (myFreeHttpWindow.IsRequestRuleEnable)
{
//IsRequestRuleEnable is more efficient then string comparison (so if not IsRequestRuleEnable the string comparison will not execute)
if (IsSkipUiHide && oSession["ui-hide"] != null)
{
return;
}
if (IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT")
{
return;
}
List matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerRequestChangeList,true);
if (matchItems != null && matchItems.Count>0)
{
foreach (var matchItem in matchItems)
{
FiddlerRequestChange nowFiddlerRequsetChange = ((FiddlerRequestChange)matchItem);
ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem);
FreeHttpWindow.MarkMatchRule(tempListViewItem);
MarkSession(oSession);
ShowMes(string.Format("macth the [requst rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl));
FiddlerSessionTamper.ModificSessionRequest(oSession, nowFiddlerRequsetChange,ShowError,ShowMes);
if(IsOnlyMatchFistTamperRule)
{
break;
}
}
}
}
if (myFreeHttpWindow.IsResponseRuleEnable)
{
if (IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT")
{
return;
}
List matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerResponseChangeList,false);
if (matchItems != null && matchItems.Count>0)
{
oSession.bBufferResponse = true;// if any response rule may match the Session, we should set bBufferResponse true (When streaming is enabled for a response, each block of data read from the server is immediately passed to the client application. )
foreach (var matchItem in matchItems)
{
FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem);
ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem);
if (nowFiddlerResponseChange.IsIsDirectRespons)
{
FreeHttpWindow.MarkMatchRule(tempListViewItem);
MarkSession(oSession);
ShowMes(string.Format("macth the [reponse rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl));
FiddlerSessionTamper.ReplaceSessionResponse(oSession, nowFiddlerResponseChange,ShowError,ShowMes);
//oSession.state = SessionStates.Done;
if (IsOnlyMatchFistTamperRule)
{
break;
}
}
}
}
}
}
public void AutoTamperResponseAfter(Session oSession)
{
if (!isOnLoad)
{
return;
}
if (myFreeHttpWindow.IsResponseRuleEnable)
{
if (IsSkipUiHide && oSession["ui-hide"] !=null)
{
return;
}
if (IsSkipConnectTunnels && oSession.RequestMethod == "CONNECT")
{
return;
}
List matchItems = FiddlerSessionHelper.FindMatchTanperRule(oSession, myFreeHttpWindow.FiddlerResponseChangeList,false);
if (matchItems != null && matchItems.Count>0)
{
foreach (var matchItem in matchItems)
{
FiddlerResponseChange nowFiddlerResponseChange = ((FiddlerResponseChange)matchItem);
ListViewItem tempListViewItem = myFreeHttpWindow.FindListViewItemFromRule(matchItem);
if (!(nowFiddlerResponseChange.IsRawReplace && nowFiddlerResponseChange.IsIsDirectRespons))
{
FreeHttpWindow.MarkMatchRule(tempListViewItem);
MarkSession(oSession);
ShowMes(string.Format("macth the [reponse rule {0}] with {1}", tempListViewItem.SubItems[0].Text, oSession.fullUrl));
FiddlerSessionTamper.ModificSessionResponse(oSession, nowFiddlerResponseChange,ShowError,ShowMes);
}
if (nowFiddlerResponseChange.ResponseLatency > 0)
{
ShowMes(string.Format("[reponse rule {0}] is modified , now delay {1} ms", tempListViewItem.SubItems[0].Text, nowFiddlerResponseChange.ResponseLatency));
System.Threading.Thread.Sleep(nowFiddlerResponseChange.ResponseLatency);
}
if (IsOnlyMatchFistTamperRule)
{
break;
}
}
}
}
}
public void AutoTamperResponseBefore(Session oSession)
{
//throw new NotImplementedException();
}
public void OnBeforeReturningError(Session oSession)
{
this.AutoTamperResponseAfter(oSession);
}
public void Dispose()
{
tabPage.Dispose();
myFreeHttpWindow.Dispose();
}
}
}
================================================
FILE: FiddlerHelper/FiddlerActuatorStaticDataCollectionController.cs
================================================
using FreeHttp.AutoTest.RunTimeStaticData;
using FreeHttp.AutoTest.RunTimeStaticData.MyStaticData;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.FiddlerHelper
{
public class FiddlerActuatorStaticDataCollectionController
{
public ActuatorStaticDataCollection actuatorStaticDataCollection;
public FiddlerActuatorStaticDataCollectionController(ActuatorStaticDataCollection yourStaticDataCollection)
{
actuatorStaticDataCollection = yourStaticDataCollection;
}
public void SetActuatorStaticDataCollection(ActuatorStaticDataCollection yourStaticDataCollection)
{
actuatorStaticDataCollection = yourStaticDataCollection;
}
public bool SetActuatorStaticData(string key, string value)
{
if (actuatorStaticDataCollection == null)
{
return false;
}
IRunTimeStaticData nowStaticData = actuatorStaticDataCollection[key];
if (nowStaticData != null)
{
nowStaticData.DataMoveNext();
return actuatorStaticDataCollection.SetStaticDataValue(key, value);
}
else
{
return actuatorStaticDataCollection.AddStaticDataKey(key, new MyStaticDataValue(value));
}
}
}
}
================================================
FILE: FiddlerHelper/FiddlerHttpFilter.cs
================================================
using Fiddler;
using FreeHttp.AutoTest;
using FreeHttp.HttpHelper;
using FreeHttp.MyHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace FreeHttp.FiddlerHelper
{
public enum FiddlerUriMatchMode
{
Contain,
StartWith,
EndWith,
Is,
Regex,
AllPass
}
[Serializable]
[DataContract]
public class FiddlerUriMatch
{
[DataMember]
public FiddlerUriMatchMode MatchMode { get; set; }
[DataMember]
public String MatchUri { get; set; }
public FiddlerUriMatch()
{
MatchMode = FiddlerUriMatchMode.AllPass;
MatchUri = null;
}
public FiddlerUriMatch(FiddlerUriMatchMode matchMode,string matchUri)
{
MatchMode = matchMode;
MatchUri = matchUri;
}
public bool Match(string matchString)
{
switch(MatchMode)
{
case FiddlerUriMatchMode.AllPass:
return true;
case FiddlerUriMatchMode.Contain:
return (matchString.Contains(MatchUri));
case FiddlerUriMatchMode.Is:
return matchString == MatchUri;
case FiddlerUriMatchMode.Regex:
return System.Text.RegularExpressions.Regex.IsMatch(matchString, MatchUri);
case FiddlerUriMatchMode.StartWith:
return matchString.StartsWith(MatchUri);
case FiddlerUriMatchMode.EndWith:
return matchString.EndsWith(MatchUri);
default:
return false;
}
}
public bool Equals(FiddlerUriMatch targetUriMatch)
{
return (this.MatchMode == targetUriMatch.MatchMode && this.MatchUri == targetUriMatch.MatchUri);
}
public new bool Equals(object targetFiddlerHttpTamper)
{
IFiddlerHttpTamper fiddlerHttpTamper = targetFiddlerHttpTamper as IFiddlerHttpTamper;
if(fiddlerHttpTamper== null)
{
return false;
}
return this.Equals(fiddlerHttpTamper.HttpFilter.UriMatch);
}
public new string ToString()
{
return string.Format("[{0}] {1}", MatchMode.ToString(), string.IsNullOrEmpty(MatchUri) ? "" : MatchUri);
}
}
[Serializable]
[DataContract]
public class FiddlerHeadMatch
{
[DataMember]
public List> HeadsFilter { get; set; }
public FiddlerHeadMatch()
{
HeadsFilter = null;
}
public FiddlerHeadMatch(List> headsFilter)
{
HeadsFilter = headsFilter;
}
public void AddHeadMatch(MyKeyValuePair yourHeadMatch)
{
if(HeadsFilter==null)
{
HeadsFilter=new List>();
}
HeadsFilter.Add(yourHeadMatch);
}
public bool Match(HTTPHeaders matchHeaders)
{
if(HeadsFilter!=null && HeadsFilter.Count>0)
{
foreach(MyKeyValuePair headFilter in HeadsFilter)
{
if(!matchHeaders.ExistsAndContains(headFilter.Key,headFilter.Value))
{
return false;
}
}
}
return true;
}
public bool Equals(FiddlerHeadMatch yourFiddlerHeadMatch)
{
if (yourFiddlerHeadMatch.HeadsFilter.Count == HeadsFilter.Count)
{
List> HeadsFilterForEqual = HeadsFilter.MyClone();
foreach(var tempHead in yourFiddlerHeadMatch.HeadsFilter)
{
if(HeadsFilterForEqual.MyContains(tempHead))
{
HeadsFilterForEqual.Remove(tempHead);
}
else
{
return false;
}
}
if(HeadsFilterForEqual.Count==0)
{
return true;
}
}
return false;
}
public new string ToString()
{
if (HeadsFilter == null || HeadsFilter.Count == 0)
{
return null;
}
StringBuilder tempSb = new StringBuilder(HeadsFilter.Count * 30);
foreach(MyKeyValuePair tempKv in HeadsFilter)
{
tempSb.AppendLine(string.Format("{0} [contain] {1}", tempKv.Key, tempKv.Value));
}
if(tempSb[tempSb.Length-2]=='\r'&& tempSb[tempSb.Length - 1] == '\n')
{
tempSb.Remove(tempSb.Length - 2, 2);
}
return tempSb.ToString();
}
}
[Serializable]
[DataContract]
public class FiddlerBodyMatch: FiddlerUriMatch
{
[DataMember]
public Byte[] MatchBodyBytes { get; set; }
[System.Xml.Serialization.XmlIgnore]
public bool IsHexMatch{ get { return MatchBodyBytes != null; } }
private string bufferBodyBytesStr;
public new bool Match(string matchString)
{
if (IsHexMatch)
{
return false;
}
return base.Match(matchString);
}
public FiddlerBodyMatch() : base()
{ }
public FiddlerBodyMatch(FiddlerUriMatchMode matchMode, string matchData) //: base(matchMode, matchUri)
{
if (String.IsNullOrEmpty(matchData) && matchMode != FiddlerUriMatchMode.AllPass)
{
throw new Exception("empty data is illegal for this mode");
}
if (matchData.StartsWith(""))
{
if(matchMode== FiddlerUriMatchMode.Regex)
{
throw new Exception("Regex can not use hex mode");
}
MatchBodyBytes = MyBytes.HexStringToByte(matchData.Remove(0, "".Length), HexDecimal.hex16);
if((MatchBodyBytes==null || MatchBodyBytes.Length==0)&& matchMode != FiddlerUriMatchMode.AllPass)
{
throw new Exception("empty data is illegal for this mode");
}
MatchMode = matchMode;
MatchUri = string.Format("{0}", BitConverter.ToString(MatchBodyBytes));
}
else
{
MatchMode = matchMode;
MatchUri = matchData;
}
}
public static FiddlerBodyMatch GetFiddlerBodyMatch(FiddlerUriMatchMode matchMode, string matchData)
{
try { return new FiddlerBodyMatch(matchMode, matchData); } catch { }
return null;
}
public bool Match(Byte[] matchBytes)
{
if(MatchBodyBytes==null && MatchBodyBytes.Length==0)
{
return false;
}
if (bufferBodyBytesStr == null)
{
bufferBodyBytesStr = BitConverter.ToString(MatchBodyBytes);
}
string matchString= BitConverter.ToString(matchBytes);
switch (MatchMode)
{
case FiddlerUriMatchMode.AllPass:
return true;
case FiddlerUriMatchMode.Contain:
return (matchString.Contains(bufferBodyBytesStr));
case FiddlerUriMatchMode.Is:
return matchString == bufferBodyBytesStr;
case FiddlerUriMatchMode.Regex:
return false;
case FiddlerUriMatchMode.StartWith:
return matchString.StartsWith(bufferBodyBytesStr);
default:
return false;
}
}
}
[Serializable]
[DataContract]
public class FiddlerHttpFilter
{
[DataMember]
public string Name { get; set; }
[DataMember]
public FiddlerUriMatch UriMatch { get; set; } //UriMatch must not be null
[DataMember]
public FiddlerHeadMatch HeadMatch { get; set; }
[DataMember]
public FiddlerBodyMatch BodyMatch { get; set; }
public FiddlerHttpFilter()
{
UriMatch = null;
}
public FiddlerHttpFilter(FiddlerUriMatch uriMatch)
{
UriMatch = uriMatch;
}
public bool Match(Session oSession, bool isRequest, WebSocketMessage webSocketMessage = null)
{
bool isWebSocket = webSocketMessage != null;// oSession.BitFlags.HasFlag(SessionFlags.IsWebSocketTunnel);
bool isMatch = true;
if (isWebSocket)
{
if(!oSession.BitFlags.HasFlag(SessionFlags.IsWebSocketTunnel))
{
return false;
}
if(!((isRequest && webSocketMessage.IsOutbound) || (!isRequest && !webSocketMessage.IsOutbound)))
{
return false;
}
if (!UriMatch.Match(oSession.fullUrl))
{
return false;
}
if (BodyMatch != null)
{
if (webSocketMessage.FrameType == WebSocketFrameTypes.Binary && BodyMatch.IsHexMatch)
{
if(! BodyMatch.Match(webSocketMessage.PayloadAsBytes()))
{
return false;
}
}
else if (webSocketMessage.FrameType == WebSocketFrameTypes.Text && !BodyMatch.IsHexMatch)
{
if (!BodyMatch.Match(webSocketMessage.PayloadAsString()))
{
return false;
}
}
else if(webSocketMessage.FrameType == WebSocketFrameTypes.Continuation)
{
//延续帧
return false;
}
else
{
return false;
}
}
}
else
{
if (UriMatch != null)
{
if (!UriMatch.Match(oSession.fullUrl))
{
return false;
}
}
if (HeadMatch != null)
{
if (!HeadMatch.Match(true ? (HTTPHeaders)oSession.RequestHeaders : (HTTPHeaders)oSession.ResponseHeaders))
{
return false;
}
}
if (BodyMatch != null)
{
if (BodyMatch.IsHexMatch)
{
if (!BodyMatch.Match(true ? oSession.requestBodyBytes : oSession.responseBodyBytes))
{
return false;
}
}
else
{
if (!BodyMatch.Match(true ? oSession.GetRequestBodyAsString() : oSession.GetResponseBodyAsString()))
{
return false;
}
}
}
}
return isMatch;
}
public bool Equals(FiddlerHttpFilter yourFiddlerHttpFilter)
{
if (!UriMatch.Equals(yourFiddlerHttpFilter.UriMatch))
{
return false;
}
if ((HeadMatch == null || yourFiddlerHttpFilter.HeadMatch == null) && (!(HeadMatch == null && yourFiddlerHttpFilter.HeadMatch == null)))
{
return false;
}
if (HeadMatch != null && yourFiddlerHttpFilter.HeadMatch != null)
{
if(!HeadMatch.Equals(yourFiddlerHttpFilter.HeadMatch))
{
return false;
}
}
if ((BodyMatch == null || yourFiddlerHttpFilter.BodyMatch == null) && (!(BodyMatch == null && yourFiddlerHttpFilter.BodyMatch == null)))
{
return false;
}
if (BodyMatch != null && yourFiddlerHttpFilter.BodyMatch != null)
{
if (!BodyMatch.Equals(yourFiddlerHttpFilter.BodyMatch))
{
return false;
}
}
return true;
}
public new bool Equals(object targetFiddlerHttpFilter)
{
IFiddlerHttpTamper fiddlerHttpTamper = targetFiddlerHttpFilter as IFiddlerHttpTamper;
if (fiddlerHttpTamper == null)
{
return false;
}
return this.Equals(fiddlerHttpTamper.HttpFilter);
}
public string GetShowTitle()
{
if (!String.IsNullOrEmpty(this.Name))
{
return this.Name;
}
if (this.UriMatch != null)
{
return string.Format("【{0}】: {1}", this.UriMatch.MatchMode.ToString(), this.UriMatch.MatchUri);
}
return default;
}
public new string ToString()
{
StringBuilder tempSb = new StringBuilder(string.Format("Uri:\r\n{0}\r\n",UriMatch.ToString()));
if(HeadMatch!=null)
{
tempSb.AppendLine(string.Format("Heads:\r\n{0}", HeadMatch.ToString()));
}
if(BodyMatch!=null)
{
tempSb.AppendLine(string.Format("Body:\r\n{0}", BodyMatch.ToString()));
}
return tempSb.ToString();
}
}
}
================================================
FILE: FiddlerHelper/FiddlerModificHttpRuleCollection.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.FiddlerHelper
{
[Serializable]
public class FiddlerModificHttpRuleCollection
{
List requestRuleList;
List responseRuleList;
public List RequestRuleList { get { return requestRuleList; } set { requestRuleList = value; } }
public List ResponseRuleList { get { return responseRuleList; } set { responseRuleList = value; } }
public FiddlerModificHttpRuleCollection() // Serializable 需要空参数的构造函数
{
requestRuleList = null;
responseRuleList = null;
}
public FiddlerModificHttpRuleCollection(List yourRequestRuleList, List yourResponseRuleList)
{
requestRuleList = yourRequestRuleList;
responseRuleList = yourResponseRuleList;
}
}
}
================================================
FILE: FiddlerHelper/FiddlerModificSettingInfo.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.FiddlerHelper
{
[Serializable]
public class FiddlerModificSettingInfo
{
///
/// the rule will skip tls handshake when it is true
///
public bool IsSkipConnectTunnels { get; set; } = true;
///
/// if it is true the FiddlerFreeHttp will only match the fist request or response rule
///
public bool IsOnlyMatchFirstTamperRule { get; set; } = false;
///
/// if it is sync TamperRule in server
///
public bool IsSyncTamperRule { get; set; } = true;
///
/// if it is hide freehttp self session
///
public bool IsHideSelfSession { get; set; } = true;
///
/// is skip when the session is hide
///
public bool IsSkipUiHide { get; set; } = true;
///
/// is enable request rule when the application load
///
public bool IsEnableRequestRule { get; set; }
///
/// is enable response rule when the application load
///
public bool IsEnableResponseRule { get; set; }
///
/// user token
///
public string UserToken { get; set; }
///
/// message flag
///
public List ReadedMessageFlags { get; set; }
public FiddlerModificSettingInfo():this(true, false ,true,true)
{
}
public FiddlerModificSettingInfo( bool isSkipTlsHandshake, bool isOnlyMatchFirstTamperRule ,bool isSyncTamperRule, bool isSkipUiHide,bool isHideSelfSession = true ,bool isEnableRequestRule = false, bool isEnableResponseRule = false ,string userToken=null)
{
IsSkipConnectTunnels = isSkipTlsHandshake;
IsOnlyMatchFirstTamperRule = isOnlyMatchFirstTamperRule;
IsSyncTamperRule = isSyncTamperRule ;
IsSkipUiHide = isSkipUiHide;
IsHideSelfSession = isHideSelfSession;
IsEnableRequestRule = isEnableRequestRule;
IsEnableResponseRule = isEnableResponseRule;
UserToken = userToken;
ReadedMessageFlags = new List();
}
}
}
================================================
FILE: FiddlerHelper/FiddlerRequsetChange.cs
================================================
using FreeHttp.AutoTest.ParameterizationPick;
using FreeHttp.AutoTest.RunTimeStaticData;
using FreeHttp.AutoTest.RunTimeStaticData.MyStaticData;
using FreeHttp.HttpHelper;
using FreeHttp.MyHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace FreeHttp.FiddlerHelper
{
[Serializable]
[System.Runtime.Serialization.DataContract()]
public class FiddlerRequestChange : IFiddlerHttpTamper
{
private string _uid;
///
/// get rule uid (not set this vaule in your business code)
///
[DataMember]
public string RuleUid
{
get
{
if(_uid==null)
{
_uid = Guid.NewGuid().ToString("D");
}
return _uid;
}
set
{
_uid = value;
}
}
[DataMember]
public bool IsEnable { get; set; }
[DataMember]
public bool IsHasParameter { get ; set; }
[DataMember]
public TamperProtocalType TamperProtocol { get ; set ; }
[DataMember]
public FiddlerHttpFilter HttpFilter{ get; set; }
[DataMember]
public List ParameterPickList { get; set; }
[DataMember]
public ParameterHttpRequest HttpRawRequest { get; set; }
[DataMember]
public ParameterContentModific UriModific { get; set; }
[DataMember]
public List HeadAddList { get; set; }
[DataMember]
public List HeadDelList { get; set; }
[DataMember]
public ParameterContentModific BodyModific { get; set; }
//[NonSerialized]
[System.Xml.Serialization.XmlIgnore]
public object Tag { get; set; }
[System.Xml.Serialization.XmlIgnore]
public FiddlerActuatorStaticDataCollectionController ActuatorStaticDataController { get; set; }
public bool IsRawReplace
{
get { return HttpRawRequest != null; }
}
public void SetHasParameter(bool hasParameter , ActuatorStaticDataCollection staticDataController = null)
{
if(staticDataController!=null)
{
ActuatorStaticDataController = new FiddlerActuatorStaticDataCollectionController(staticDataController);
}
IsHasParameter = hasParameter;
if(IsRawReplace)
{
if(HttpRawRequest!=null)
{
HttpRawRequest.SetUseParameterInfo(IsHasParameter, ActuatorStaticDataController.actuatorStaticDataCollection);
}
}
else
{
if (UriModific != null && UriModific.ModificMode != ContentModificMode.NoChange)
{
UriModific.SetUseParameterInfo(IsHasParameter, ActuatorStaticDataController.actuatorStaticDataCollection);
}
if (BodyModific != null && BodyModific.ModificMode != ContentModificMode.NoChange)
{
BodyModific.SetUseParameterInfo(IsHasParameter, ActuatorStaticDataController.actuatorStaticDataCollection);
}
}
}
public object Clone()
{
FiddlerRequestChange cloneFiddlerRequestChange = this.MyDeepClone();
cloneFiddlerRequestChange?.SetHasParameter(IsHasParameter, ActuatorStaticDataController?.actuatorStaticDataCollection);
return cloneFiddlerRequestChange;
}
}
}
================================================
FILE: FiddlerHelper/FiddlerResponseChange.cs
================================================
using FreeHttp.AutoTest.ParameterizationPick;
using FreeHttp.AutoTest.RunTimeStaticData;
using FreeHttp.AutoTest.RunTimeStaticData.MyStaticData;
using FreeHttp.HttpHelper;
using FreeHttp.MyHelper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
namespace FreeHttp.FiddlerHelper
{
[Serializable]
[System.Runtime.Serialization.DataContract()]
public class FiddlerResponseChange : IFiddlerHttpTamper
{
private string _uid;
///
/// get rule uid (not set this vaule in your business code)
///
[DataMember]
public string RuleUid
{
get
{
if (_uid == null)
{
_uid = Guid.NewGuid().ToString("D");
}
return _uid;
}
set
{
_uid = value;
}
}
[DataMember]
public bool IsEnable { get; set; }
[DataMember]
public bool IsHasParameter { get; set; }
[DataMember]
public TamperProtocalType TamperProtocol { get; set; }
[DataMember]
public FiddlerHttpFilter HttpFilter { get; set; }
[DataMember]
public List ParameterPickList { get; set; }
[DataMember]
public ParameterHttpResponse HttpRawResponse { get; set; }
[DataMember]
public bool IsIsDirectRespons { get; set; } //only for HttpRawResponse
[DataMember]
public int ResponseLatency { get; set; }
[DataMember]
public List HeadAddList { get; set; }
[DataMember]
public List HeadDelList { get; set; }
[DataMember]
public ParameterContentModific BodyModific { get; set; }
//[NonSerialized]
[System.Xml.Serialization.XmlIgnore]
public object Tag { get; set; }
[System.Xml.Serialization.XmlIgnore]
public FiddlerActuatorStaticDataCollectionController ActuatorStaticDataController { get; set; }
public bool IsRawReplace
{
get { return HttpRawResponse != null; }
}
public void SetHasParameter(bool hasParameter, ActuatorStaticDataCollection staticDataController = null)
{
if (staticDataController != null)
{
ActuatorStaticDataController = new FiddlerActuatorStaticDataCollectionController(staticDataController);
}
IsHasParameter = hasParameter;
if (IsRawReplace)
{
if (HttpRawResponse != null)
{
HttpRawResponse.SetUseParameterInfo(IsHasParameter, ActuatorStaticDataController.actuatorStaticDataCollection);
}
}
else
{
if (BodyModific != null && BodyModific.ModificMode != ContentModificMode.NoChange)
{
BodyModific.SetUseParameterInfo(IsHasParameter, ActuatorStaticDataController.actuatorStaticDataCollection);
}
}
}
public object Clone()
{
FiddlerResponseChange cloneFiddlerResponseChange = this.MyDeepClone();
cloneFiddlerResponseChange?.SetHasParameter(IsHasParameter, ActuatorStaticDataController?.actuatorStaticDataCollection);
return cloneFiddlerResponseChange;
}
}
}
================================================
FILE: FiddlerHelper/FiddlerRuleGroup.cs
================================================
using FreeHttp.WebService;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FiddlerHelper
{
[Serializable]
[System.Runtime.Serialization.DataContract()]
public class FiddlerRuleGroup
{
private ListView RequestRuleListView;
private ListView ResponseRuleListView;
private bool _isRequestRuleGroupInTemporaryStatus = false;
private bool _isResponseRuleGroupInTemporaryStatus = false;
[DataMember]
public Dictionary> RequestGroupDictionary { get; set; }
[DataMember]
public Dictionary> ResponseGroupDictionary { get; set; }
public FiddlerRuleGroup(ListView rqLv,ListView rpLv)
{
RequestRuleListView = rqLv;
ResponseRuleListView = rpLv;
RequestGroupDictionary = new Dictionary>();
ResponseGroupDictionary = new Dictionary>();
}
public bool IsEmpty
{
get
{
return (RequestGroupDictionary == null || RequestGroupDictionary.Count == 0) && (ResponseGroupDictionary == null || ResponseGroupDictionary.Count == 0);
}
}
public void SetRuleGroupListView(ListView rqLv, ListView rpLv)
{
RequestRuleListView = rqLv;
ResponseRuleListView = rpLv;
}
///
/// 重排listView顺序(因为在存在分组的情况下拖拽排序会不生效,所以需要强制刷新,任何地方都不要自行调用该方法修改ListView)
///
///
private void ReflushListViewItem(ListView listView)
{
List listViewItems = new List();
foreach (ListViewItem itm in listView.Items)
{
listViewItems.Add(itm);
}
listView.Items.Clear();
foreach (ListViewItem itm in listViewItems)
{
listView.Items.Add(itm);
}
}
///
/// 更新GroupDictionary
///
/// 选择更新指定ListView(默认null表示全部更新)
public void ReflushGroupDc(ListView listView=null)
{
if (RequestRuleListView == listView || listView==null)
{
RequestGroupDictionary.Clear();
if (RequestRuleListView.Groups != null && RequestRuleListView.Groups.Count > 0)
{
foreach (ListViewGroup listViewGroup in RequestRuleListView.Groups)
{
List ruleUidList = new List();
foreach (ListViewItem listViewItem in listViewGroup.Items)
{
ruleUidList.Add(((IFiddlerHttpTamper)listViewItem.Tag).RuleUid);
}
if (RequestGroupDictionary.ContainsKey(listViewGroup.Header))
{
_ = RemoteLogService.ReportLogAsync($"find same key :{listViewGroup.Header} in[ReflushGroupDc]", RemoteLogService.RemoteLogOperation.EditRule, RemoteLogService.RemoteLogType.Error);
}
else
{
RequestGroupDictionary.Add(listViewGroup.Header, ruleUidList);
}
}
}
}
if (ResponseRuleListView == listView || listView == null)
{
ResponseGroupDictionary.Clear();
if (ResponseRuleListView.Groups != null && ResponseRuleListView.Groups.Count > 0)
{
foreach (ListViewGroup listViewGroup in ResponseRuleListView.Groups)
{
List ruleUidList = new List();
foreach (ListViewItem listViewItem in listViewGroup.Items)
{
ruleUidList.Add(((IFiddlerHttpTamper)listViewItem.Tag).RuleUid);
}
if (ResponseGroupDictionary.ContainsKey(listViewGroup.Header))
{
_ = RemoteLogService.ReportLogAsync($"find same key :{listViewGroup.Header} in[ReflushGroupDc]", RemoteLogService.RemoteLogOperation.EditRule, RemoteLogService.RemoteLogType.Error);
}
else
{
ResponseGroupDictionary.Add(listViewGroup.Header, ruleUidList);
}
}
}
}
}
///
/// 对item进行重新排列,在有group且顺序发送变化时需要重排
///
///
public void ReArrangeGroup(ListView listView = null)
{
if (RequestRuleListView == listView || listView == null)
{
FreeHttpControl.MyControlHelper.SetControlFreeze(RequestRuleListView);
RemoveGroupTemporary(RequestRuleListView);
RecoverTemporaryGroup(RequestRuleListView);
FreeHttpControl.MyControlHelper.SetControlUnfreeze(RequestRuleListView);
}
if (ResponseRuleListView == listView || listView == null)
{
FreeHttpControl.MyControlHelper.SetControlFreeze(ResponseRuleListView);
RemoveGroupTemporary(ResponseRuleListView);
RecoverTemporaryGroup(ResponseRuleListView);
FreeHttpControl.MyControlHelper.SetControlUnfreeze(ResponseRuleListView);
}
}
///
/// 临时移除分组,需要与RecoverTemporaryGroup配合使用
///
///
public void RemoveGroupTemporary(ListView listView)
{
if (RequestRuleListView == listView)
{
if (_isRequestRuleGroupInTemporaryStatus) return;
if (RequestRuleListView.Groups != null && RequestRuleListView.Groups.Count > 0)
{
ReflushGroupDc(RequestRuleListView);
RequestRuleListView.Groups.Clear();
foreach(ListViewItem listViewItem in listView.Items)
{
listViewItem.Group = null;
}
_isRequestRuleGroupInTemporaryStatus = true;
}
}
else if (ResponseRuleListView == listView)
{
if (_isResponseRuleGroupInTemporaryStatus) return;
if (ResponseRuleListView.Groups != null && ResponseRuleListView.Groups.Count > 0)
{
ReflushGroupDc(ResponseRuleListView);
ResponseRuleListView.Groups.Clear();
foreach (ListViewItem listViewItem in listView.Items)
{
listViewItem.Group = null;
}
_isResponseRuleGroupInTemporaryStatus = true;
}
}
else
{
_ = RemoteLogService.ReportLogAsync("unknow listView in [RemoveGroupTemporary]", RemoteLogService.RemoteLogOperation.EditRule, RemoteLogService.RemoteLogType.Error);
}
}
///
/// 恢复分组
///
///
/// 是否检查_isRequestRuleGroupInTemporaryStatus/_isResponseRuleGroupInTemporaryStatus状态,如果不检查即直接恢复
public void RecoverTemporaryGroup(ListView listView ,bool isCheckStatuus = true)
{
if (RequestRuleListView == listView)
{
if (!_isRequestRuleGroupInTemporaryStatus && isCheckStatuus) return;
if (!isCheckStatuus) listView.Groups.Clear(); //如果不检查状态需要清除listView自己的Groups,以免照成重复,或空的Groups。
if (RequestGroupDictionary != null && RequestGroupDictionary.Count > 0)
{
ReflushListViewItem(listView);
Dictionary tempIdGroupDc = new Dictionary();
foreach (var kv in RequestGroupDictionary)
{
ListViewGroup tempListViewGroup = new ListViewGroup(kv.Key);
listView.Groups.Add(tempListViewGroup);
foreach (var tempUid in kv.Value)
{
try
{
tempIdGroupDc.Add(tempUid, tempListViewGroup);
}
catch(Exception ex)
{
_ = RemoteLogService.ReportLogAsync($"error in [RecoverTemporaryGroup] :{ex}", RemoteLogService.RemoteLogOperation.EditRule, RemoteLogService.RemoteLogType.Error);
}
}
}
if(tempIdGroupDc.Count>0)
{
foreach(ListViewItem listViewItem in listView.Items)
{
if(tempIdGroupDc.ContainsKey(((IFiddlerHttpTamper)listViewItem.Tag).RuleUid))
{
listViewItem.Group = tempIdGroupDc[((IFiddlerHttpTamper)listViewItem.Tag).RuleUid];
}
}
}
((FreeHttpControl.MyListView)listView).SetGroupState(FreeHttpControl.ListViewGroupState.Collapsible);
_isRequestRuleGroupInTemporaryStatus = false;
}
}
else if (ResponseRuleListView == listView)
{
if (!_isResponseRuleGroupInTemporaryStatus && isCheckStatuus) return;
if (!isCheckStatuus) listView.Groups.Clear();
if (ResponseGroupDictionary != null && ResponseGroupDictionary.Count > 0)
{
ReflushListViewItem(listView);
Dictionary tempIdGroupDc = new Dictionary();
foreach (var kv in ResponseGroupDictionary)
{
ListViewGroup tempListViewGroup = new ListViewGroup(kv.Key);
listView.Groups.Add(tempListViewGroup);
foreach (var tempUid in kv.Value)
{
try
{
tempIdGroupDc.Add(tempUid, tempListViewGroup);
}
catch (Exception ex)
{
_ = RemoteLogService.ReportLogAsync($"error in [RecoverTemporaryGroup] :{ex}", RemoteLogService.RemoteLogOperation.EditRule, RemoteLogService.RemoteLogType.Error);
}
}
}
if (tempIdGroupDc.Count > 0)
{
foreach (ListViewItem listViewItem in listView.Items)
{
if (tempIdGroupDc.ContainsKey(((IFiddlerHttpTamper)listViewItem.Tag).RuleUid))
{
listViewItem.Group = tempIdGroupDc[((IFiddlerHttpTamper)listViewItem.Tag).RuleUid];
}
}
}
((FreeHttpControl.MyListView)listView).SetGroupState(FreeHttpControl.ListViewGroupState.Collapsible);
_isResponseRuleGroupInTemporaryStatus = false;
}
}
else
{
_ = RemoteLogService.ReportLogAsync("unknow listView in [RecoverTemporaryGroup]", RemoteLogService.RemoteLogOperation.EditRule, RemoteLogService.RemoteLogType.Error);
}
}
///
/// 恢复分组信息(首次加载时可以用于还原保存的上一次分组)
///
public void RecoverGroup()
{
RecoverTemporaryGroup(RequestRuleListView, false);
RecoverTemporaryGroup(ResponseRuleListView, false);
}
}
}
================================================
FILE: FiddlerHelper/FiddlerSessionHelper.cs
================================================
using Fiddler;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.FiddlerHelper
{
class FiddlerSessionHelper
{
///
/// 在指定rule列表中寻找匹配rule列表
///
/// IFiddlerHttpTamper 类型
/// 目标oSession
/// 目标rule列表
/// 是否是request (如果不是则为response)
/// 是否为WebSocket规则
/// 匹配成功的rule列表
public static List FindMatchTanperRule(Session oSession, List ruleList,bool isRequest,WebSocketMessage webSocketMessage = null) where T : IFiddlerHttpTamper
{
if (oSession == null || ruleList == null || ruleList.Count == 0)
{
return null;
}
List matchRuleList = new List();
bool isMatchWebsocket = webSocketMessage != null;
foreach (IFiddlerHttpTamper tempItem in ruleList)
{
if (!tempItem.IsEnable)
{
continue;
}
if (isMatchWebsocket)
{
if (tempItem.TamperProtocol == TamperProtocalType.Http)
{
continue;
}
if (!oSession.BitFlags.HasFlag(SessionFlags.IsWebSocketTunnel))
{
continue;
}
if (tempItem.HttpFilter.Match(oSession, isRequest, webSocketMessage))
{
matchRuleList.Add(tempItem);
}
}
else
{
if (tempItem.TamperProtocol == TamperProtocalType.WebSocket)
{
continue;
}
if (tempItem.HttpFilter.Match(oSession, isRequest))
{
matchRuleList.Add(tempItem);
}
}
}
return matchRuleList;
}
}
}
================================================
FILE: FiddlerHelper/IFiddlerHttpTamper.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace FreeHttp.FiddlerHelper
{
public interface IFiddlerHttpTamper:ICloneable
{
string RuleUid { get; set; }
bool IsEnable { get; set; }
bool IsHasParameter { get; set; }
TamperProtocalType TamperProtocol { get; set; }
FiddlerHttpFilter HttpFilter { get; set; }
List ParameterPickList { get; set; }
FiddlerActuatorStaticDataCollectionController ActuatorStaticDataController { get; set; }
bool IsRawReplace { get; }
}
}
================================================
FILE: FiddlerHelper/TamperProtocalType.cs
================================================
namespace FreeHttp.FiddlerHelper
{
public enum TamperProtocalType
{
Http,
WebSocket
}
}
================================================
FILE: FiddlerHelper/VersionControl/FiddlerModificHttpRuleCollectionV1.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//using FiddlerRequsetChange = FreeHttp.FiddlerHelper.FiddlerRequestChange;
namespace FreeHttp.FiddlerHelper.VersionControlV1
{
[Serializable]
public class FiddlerModificHttpRuleCollection
{
List requestRuleList;
List responseRuleList;
//因为V1.0-V1.3 版本 FiddlerRequsetChange 这个英文拼错了 这里进行进行升级修复
public List RequestRuleList { get { return requestRuleList; } set { requestRuleList = value; } }
public List ResponseRuleList { get { return responseRuleList; } set { responseRuleList = value; } }
public FiddlerModificHttpRuleCollection() // Serializable 需要空参数的构造函数
{
requestRuleList = null;
responseRuleList = null;
}
public FiddlerModificHttpRuleCollection(List yourRequestRuleList, List yourResponseRuleList)
{
requestRuleList = yourRequestRuleList;
responseRuleList = yourResponseRuleList;
}
public static explicit operator FreeHttp.FiddlerHelper.FiddlerModificHttpRuleCollection(FiddlerModificHttpRuleCollection fiddlerModificHttpRuleCollectionV1)
{
List RequestRuleList = new List();
if(fiddlerModificHttpRuleCollectionV1.RequestRuleList!=null && fiddlerModificHttpRuleCollectionV1.RequestRuleList.Count>0)
{
foreach(FiddlerRequsetChange item in fiddlerModificHttpRuleCollectionV1.RequestRuleList)
{
RequestRuleList.Add(item.GetBase());
}
}
FreeHttp.FiddlerHelper.FiddlerModificHttpRuleCollection fiddlerModificHttpRuleCollection = new FreeHttp.FiddlerHelper.FiddlerModificHttpRuleCollection(RequestRuleList, fiddlerModificHttpRuleCollectionV1.ResponseRuleList);
if(fiddlerModificHttpRuleCollection.RequestRuleList!=null && fiddlerModificHttpRuleCollection.RequestRuleList.Count>0)
{
foreach (FiddlerRequestChange item in fiddlerModificHttpRuleCollection.RequestRuleList)
{
if(item.UriModific!=null && item.UriModific.ModificMode != HttpHelper.ContentModificMode.NoChange)
{
item.UriModific.ParameterReplaceContent = new AutoTest.ParameterizationContent.CaseParameterizationContent(item.UriModific.ReplaceContent);
item.UriModific.ParameterTargetKey = new AutoTest.ParameterizationContent.CaseParameterizationContent(item.UriModific.TargetKey);
}
if (item.BodyModific != null && item.BodyModific.ModificMode != HttpHelper.ContentModificMode.NoChange)
{
item.BodyModific.ParameterReplaceContent = new AutoTest.ParameterizationContent.CaseParameterizationContent(item.BodyModific.ReplaceContent);
item.BodyModific.ParameterTargetKey = new AutoTest.ParameterizationContent.CaseParameterizationContent(item.BodyModific.TargetKey);
}
if(item.IsRawReplace && item.HttpRawRequest.ParameterizationContent.hasParameter)
{
item.IsHasParameter = true;
//item.SetHasParameter(true);
}
}
}
if (fiddlerModificHttpRuleCollection.ResponseRuleList != null && fiddlerModificHttpRuleCollection.ResponseRuleList.Count > 0)
{
foreach (FiddlerResponseChange item in fiddlerModificHttpRuleCollection.ResponseRuleList)
{
if (item.BodyModific != null && item.BodyModific.ModificMode != HttpHelper.ContentModificMode.NoChange)
{
item.BodyModific.ParameterReplaceContent = new AutoTest.ParameterizationContent.CaseParameterizationContent(item.BodyModific.ReplaceContent);
item.BodyModific.ParameterTargetKey = new AutoTest.ParameterizationContent.CaseParameterizationContent(item.BodyModific.TargetKey);
}
if (item.IsRawReplace && item.HttpRawResponse.ParameterizationContent.hasParameter)
{
item.IsHasParameter = true;
//item.SetHasParameter(true);
}
}
}
return fiddlerModificHttpRuleCollection;
}
}
[Serializable]
[System.Runtime.Serialization.DataContract()]
public class FiddlerRequsetChange : FiddlerRequestChange
{
public FiddlerRequestChange GetBase()
{
FiddlerRequestChange fiddlerRequestChange = new FiddlerRequestChange();
fiddlerRequestChange.IsEnable = IsEnable;
fiddlerRequestChange.TamperProtocol = TamperProtocol;
fiddlerRequestChange.HttpFilter = HttpFilter;
fiddlerRequestChange.ParameterPickList = ParameterPickList;
fiddlerRequestChange.HttpRawRequest = HttpRawRequest;
fiddlerRequestChange.UriModific = UriModific;
fiddlerRequestChange.HeadAddList = HeadAddList;
fiddlerRequestChange.HeadDelList = HeadDelList;
fiddlerRequestChange.BodyModific = BodyModific;
fiddlerRequestChange.Tag = Tag;
fiddlerRequestChange.ActuatorStaticDataController = ActuatorStaticDataController;
return fiddlerRequestChange;
}
}
}
================================================
FILE: FiddlerSessionTamper.cs
================================================
using Fiddler;
using FreeHttp.FiddlerHelper;
using FreeHttp.HttpHelper;
using FreeHttp.AutoTest;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FreeHttp.AutoTest.ParameterizationPick;
namespace FreeHttp
{
public class FiddlerSessionTamper
{
///
/// Modific the http request in oSession with your rule
///
/// oSession
/// FiddlerRequsetChange
public static void ModificSessionRequest(Session oSession, FiddlerRequestChange nowFiddlerRequsetChange, Action ShowError, Action ShowMes)
{
if (nowFiddlerRequsetChange.ParameterPickList != null)
{
PickSessionParameter(oSession, nowFiddlerRequsetChange, ShowError, ShowMes, true);
}
if (nowFiddlerRequsetChange.IsRawReplace)
{
ReplaceSessionRequest(oSession, nowFiddlerRequsetChange, ShowError, ShowMes);
}
else
{
string errMes;
NameValueCollection nameValueCollection = new NameValueCollection();
//Modific uri
if (nowFiddlerRequsetChange.UriModific != null && nowFiddlerRequsetChange.UriModific.ModificMode != ContentModificMode.NoChange)
{
try
{
oSession.fullUrl = nowFiddlerRequsetChange.UriModific.GetFinalContent(oSession.fullUrl, nameValueCollection, out errMes);
}
catch(Exception ex)
{
errMes = ex.Message;
}
if(errMes!=null)
{
ShowError(string.Format("error in GetFinalContent in UriModific that [{0}]", errMes));
}
}
//Modific body
if (nowFiddlerRequsetChange.BodyModific != null && nowFiddlerRequsetChange.BodyModific.ModificMode != ContentModificMode.NoChange)
{
if (nowFiddlerRequsetChange.BodyModific.ModificMode == ContentModificMode.HexReplace)
{
try
{
oSession.RequestBody = nowFiddlerRequsetChange.BodyModific.GetFinalContent(oSession.requestBodyBytes);
}
catch (Exception ex)
{
ShowError(string.Format("error in GetFinalContent in HexReplace with [{0}]", ex.Message));
}
}
else
{
string sourceRequestBody = null;
try //GetRequestBodyAsString may throw exception
{
//oSession.utilDecodeRequest();
sourceRequestBody = oSession.GetRequestBodyAsString();
}
catch (Exception ex)
{
ShowError(string.Format("error in GetRequestBodyAsString [{0}]", ex.Message));
oSession.utilDecodeRequest();
sourceRequestBody = oSession.GetRequestBodyEncoding().GetString(oSession.requestBodyBytes);
}
finally
{
if (nowFiddlerRequsetChange.BodyModific.ModificMode == ContentModificMode.ReCode)
{
try
{
oSession.RequestBody = nowFiddlerRequsetChange.BodyModific.GetRecodeContent(sourceRequestBody);
}
catch (Exception ex)
{
ShowError(string.Format("error in GetRecodeContent in ReCode with [{0}]", ex.Message));
}
}
else
{
//oSession.requestBodyBytes = oSession.GetRequestBodyEncoding().GetBytes(nowFiddlerRequsetChange.BodyModific.GetFinalContent(sourceRequestBody)); // requestBodyBytes直接修改内部成员
//oSession.ResponseBody = oSession.GetRequestBodyEncoding().GetBytes(nowFiddlerRequsetChange.BodyModific.GetFinalContent(sourceRequestBody)); //ResponseBody修改内部成员 更新Content-Length ,同时删除编码头,适用于hex数据
//Session.RequestBody : Gets or Sets the HTTP Request body bytes. Setter adjusts Content-Length header, and removes Transfer-Encoding and Content-Encoding headers. Setter DOES NOT CLONE the passed array. Setter will throw if the Request object does not exist for some reason. Use utilSetRequestBody(sStr) to ensure proper character encoding if you need to use a string.
//oSession.utilSetRequestBody(nowFiddlerRequsetChange.BodyModific.GetFinalContent(sourceRequestBody)); //utilSetRequestBody 虽然会自动更新Content-Length 但是会强制使用utf8 ,适用于字符串
string tempRequestBody = nowFiddlerRequsetChange.BodyModific.GetFinalContent(sourceRequestBody, nameValueCollection, out errMes);
if (errMes != null)
{
ShowError(string.Format("error in GetFinalContent in BodyModific that [{0}]", errMes));
}
if (tempRequestBody != sourceRequestBody)
{
oSession.utilSetRequestBody(tempRequestBody);
}
}
}
}
}
//Modific heads
if (nowFiddlerRequsetChange.HeadDelList != null && nowFiddlerRequsetChange.HeadDelList.Count > 0)
{
foreach (var tempDelHead in nowFiddlerRequsetChange.HeadDelList)
{
oSession.RequestHeaders.Remove(tempDelHead);
}
}
if (nowFiddlerRequsetChange.HeadAddList != null && nowFiddlerRequsetChange.HeadAddList.Count > 0)
{
foreach (var tempAddHead in nowFiddlerRequsetChange.HeadAddList)
{
if (tempAddHead.Contains(": "))
{
oSession.RequestHeaders.Add(tempAddHead.Remove(tempAddHead.IndexOf(": ")), tempAddHead.Substring(tempAddHead.IndexOf(": ") + 2));
}
else
{
ShowError(string.Format("error to deal add head string with [{0}]", tempAddHead));
}
}
}
//other action
if (nameValueCollection != null && nameValueCollection.Count > 0)
{
ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString()));
}
}
}
///
/// Replace the http request in oSession with your rule (it may call by ModificSessionRequest)
///
/// oSession
/// FiddlerRequsetChange
public static void ReplaceSessionRequest(Session oSession, FiddlerRequestChange nowFiddlerRequsetChange, Action ShowError, Action ShowMes)
{
string errMes;
NameValueCollection nameValueCollection;
HttpRequest tempRequestHttpRequest;
try
{
tempRequestHttpRequest = nowFiddlerRequsetChange.HttpRawRequest.UpdateHttpRequest(out errMes, out nameValueCollection);
}
catch (Exception ex)
{
ShowError(string.Format("Fail to ReplaceSessionResponse :{0}", ex.Message));
return;
}
if (errMes != null)
{
ShowError(errMes);
}
if (nameValueCollection != null && nameValueCollection.Count > 0)
{
ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString()));
}
oSession.oRequest.headers = new HTTPRequestHeaders();
oSession.RequestMethod = tempRequestHttpRequest.RequestMethod;
try
{
oSession.fullUrl = tempRequestHttpRequest.RequestUri;
}
catch (ArgumentException ex)
{
if (ex.Message == "URI scheme must be http, https, or ftp")
{
oSession.url = tempRequestHttpRequest.RequestUri;
}
else
{
ShowError(ex.Message);
}
}
catch (Exception ex)
{
ShowError(ex.Message);
}
((Fiddler.HTTPHeaders)(oSession.RequestHeaders)).HTTPVersion = tempRequestHttpRequest.RequestVersions;
if (tempRequestHttpRequest.RequestHeads != null)
{
foreach (var tempHead in tempRequestHttpRequest.RequestHeads)
{
if (tempHead.Key == "Host")
{
oSession.oRequest.headers.Remove("Host");
}
oSession.oRequest.headers.Add(tempHead.Key, tempHead.Value);
}
}
oSession.requestBodyBytes = tempRequestHttpRequest.RequestEntity;
}
///
/// Modific the http response in oSession with your rule (if IsRawReplace and IsIsDirectRespons it will not call ReplaceSessionResponse)
///
/// oSession
/// FiddlerResponseChange
public static void ModificSessionResponse(Session oSession, FiddlerResponseChange nowFiddlerResponseChange, Action ShowError, Action ShowMes)
{
if (nowFiddlerResponseChange.ParameterPickList != null && nowFiddlerResponseChange.ParameterPickList.Count>0)
{
PickSessionParameter(oSession, nowFiddlerResponseChange, ShowError, ShowMes, false);
}
if (nowFiddlerResponseChange.IsRawReplace)
{
//if IsIsDirectRespons do nothing
if (!nowFiddlerResponseChange.IsIsDirectRespons)
{
ReplaceSessionResponse(oSession, nowFiddlerResponseChange, ShowError, ShowMes);
}
}
else
{
string errMes;
NameValueCollection nameValueCollection = new NameValueCollection();
//modific body
if (nowFiddlerResponseChange.BodyModific != null && nowFiddlerResponseChange.BodyModific.ModificMode != ContentModificMode.NoChange)
{
if (nowFiddlerResponseChange.BodyModific.ModificMode == ContentModificMode.HexReplace)
{
try
{
oSession.ResponseBody = nowFiddlerResponseChange.BodyModific.GetFinalContent(oSession.responseBodyBytes);
}
catch (Exception ex)
{
ShowError(string.Format("error in GetFinalContent in HexReplace with [{0}]", ex.Message));
}
}
else
{
//you should not change the media data as string
string sourceResponseBody = null;
try
{
sourceResponseBody = oSession.GetResponseBodyAsString(); //if the head encode is change ,GetResponseBodyAsString maybe fail
if (nowFiddlerResponseChange.BodyModific.ParameterTargetKey.ToString().Contains('\n'))
{
sourceResponseBody = sourceResponseBody.Replace("\r\n", "\n");
}
}
catch (Exception ex)
{
ShowError(string.Format("error in GetResponseBodyAsString [{0}]", ex.Message));
oSession.utilDecodeResponse();
sourceResponseBody = oSession.GetResponseBodyEncoding().GetString(oSession.ResponseBody);
}
finally
{
if (nowFiddlerResponseChange.BodyModific.ModificMode == ContentModificMode.ReCode)
{
try
{
oSession.ResponseBody = nowFiddlerResponseChange.BodyModific.GetRecodeContent(sourceResponseBody);
}
catch (Exception ex)
{
ShowError(string.Format("error in GetRecodeContent in ReCode with [{0}]", ex.Message));
}
}
else
{
//oSession.utilSetResponseBody(nowFiddlerResponseChange.BodyModific.GetFinalContent(sourceResponseBody));
string tempResponseBody = nowFiddlerResponseChange.BodyModific.GetFinalContent(sourceResponseBody, nameValueCollection, out errMes);
if (errMes != null)
{
ShowError(string.Format("error in GetFinalContent in BodyModific that [{0}]", errMes));
}
if (tempResponseBody != sourceResponseBody)
{
oSession.utilSetResponseBody(tempResponseBody);
}
}
}
//you can use below code to modific the body
//oSession.utilDecodeResponse();
//oSession.utilReplaceInResponse("","");
//oSession.utilDeflateResponse();
}
}
//modific heads
if (nowFiddlerResponseChange.HeadDelList != null && nowFiddlerResponseChange.HeadDelList.Count > 0)
{
foreach (var tempDelHead in nowFiddlerResponseChange.HeadDelList)
{
oSession.ResponseHeaders.Remove(tempDelHead);
}
}
if (nowFiddlerResponseChange.HeadAddList != null && nowFiddlerResponseChange.HeadAddList.Count > 0)
{
foreach (var tempAddHead in nowFiddlerResponseChange.HeadAddList)
{
if (tempAddHead.Contains(": "))
{
oSession.ResponseHeaders.Add(tempAddHead.Remove(tempAddHead.IndexOf(": ")), tempAddHead.Substring(tempAddHead.IndexOf(": ") + 2));
}
else
{
ShowError(string.Format("error to deal add head string with [{0}]", tempAddHead));
}
}
}
//other action
if (nameValueCollection != null && nameValueCollection.Count > 0)
{
ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString()));
}
}
}
///
/// Replace the http response in oSession with your rule
///
/// oSession
/// FiddlerResponseChange
public static void ReplaceSessionResponse(Session oSession, FiddlerResponseChange nowFiddlerResponseChange, Action ShowError, Action ShowMes)
{
bool isClosePipeWhenReplace = false;
byte[] tempResponseBytes;
string errMes;
NameValueCollection nameValueCollection;
HttpResponse tempHttpResponse;
try
{
tempHttpResponse = nowFiddlerResponseChange.HttpRawResponse.UpdateHttpResponse(out errMes, out nameValueCollection);
tempResponseBytes = tempHttpResponse.GetRawHttpResponse();
}
catch (Exception ex)
{
ShowError(string.Format("Fail to ReplaceSessionResponse :{0}", ex.Message));
return;
}
if (errMes != null)
{
ShowError(errMes);
}
if (nameValueCollection != null && nameValueCollection.Count > 0)
{
ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString()));
}
using (MemoryStream ms = new MemoryStream(tempResponseBytes))
{
if (isClosePipeWhenReplace)
{
oSession.PoisonClientPipe(); //关闭客户端与代理的连接(Ensures that, after the response is complete, the client socket is closed and not reused. Does NOT (and must not) close the pipe. )
oSession.PoisonServerPipe(); //关闭代理与服务器的连接
}
if (!oSession.LoadResponseFromStream(ms, null))
{
ShowError("error to oSession.LoadResponseFromStream");
ShowError("try to modific the response");
//modific the response
oSession.oResponse.headers = new HTTPResponseHeaders();
oSession.oResponse.headers.HTTPResponseCode = tempHttpResponse.ResponseCode;
oSession.ResponseHeaders.StatusDescription = tempHttpResponse.ResponseStatusDescription;
((Fiddler.HTTPHeaders)(oSession.ResponseHeaders)).HTTPVersion = tempHttpResponse.ResponseVersion;
if (tempHttpResponse.ResponseHeads != null && tempHttpResponse.ResponseHeads.Count > 0)
{
foreach (var tempHead in tempHttpResponse.ResponseHeads)
{
oSession.oResponse.headers.Add(tempHead.Key, tempHead.Value);
}
}
oSession.responseBodyBytes = tempHttpResponse.ResponseEntity;
}
}
}
///
/// Modific the websocket message with your rule
///
///
///
///
///
///
public static void ModificWebSocketMessage(Session oSession, WebSocketMessage webSocketMessage, IFiddlerHttpTamper nowFiddlerChange, bool isRequest,Action ShowError, Action ShowMes)
{
if (nowFiddlerChange.ParameterPickList != null)
{
PickSessionParameter(oSession, nowFiddlerChange, ShowError, ShowMes, webSocketMessage.IsOutbound, webSocketMessage);
}
ParameterContentModific payLoadModific = null;
if (isRequest)
{
FiddlerRequestChange nowFiddlerRequsetChange = (FiddlerRequestChange)nowFiddlerChange;
payLoadModific = nowFiddlerRequsetChange.BodyModific;
}
else
{
FiddlerResponseChange nowFiddlerResponseChange = (FiddlerResponseChange)nowFiddlerChange;
payLoadModific = nowFiddlerResponseChange.BodyModific;
}
//Modific body
if (payLoadModific != null && payLoadModific.ModificMode != ContentModificMode.NoChange)
{
if (payLoadModific.ModificMode == ContentModificMode.HexReplace)
{
try
{
webSocketMessage.SetPayload(payLoadModific.GetFinalContent(webSocketMessage.PayloadAsBytes()));
}
catch (Exception ex)
{
ShowError(string.Format("error in GetFinalContent in HexReplace with [{0}]", ex.Message));
}
}
else
{
if (webSocketMessage.FrameType == WebSocketFrameTypes.Binary)
{
ShowError("error in GetFinalContent that WebSocketFrameTypes is Binary ,just use mode");
}
else if (webSocketMessage.FrameType == WebSocketFrameTypes.Ping || webSocketMessage.FrameType == WebSocketFrameTypes.Pong || webSocketMessage.FrameType == WebSocketFrameTypes.Close)
{
// do nothing
}
else
{
string sourcePayload = webSocketMessage.PayloadAsString();
if (payLoadModific.ModificMode == ContentModificMode.ReCode)
{
try
{
webSocketMessage.SetPayload(payLoadModific.GetRecodeContent(sourcePayload));
}
catch (Exception ex)
{
ShowError(string.Format("error in GetRecodeContent in ReCode with [{0}]", ex.Message));
}
}
else
{
string errMes;
NameValueCollection nameValueCollection = new NameValueCollection();
//webSocketMessage.SetPayload(payLoadModific.GetFinalContent(sourcePayload));
string tempPayload = payLoadModific.GetFinalContent(sourcePayload, nameValueCollection, out errMes);
if (errMes != null)
{
ShowError(string.Format("error in GetFinalContent in PayLoadModific that [{0}]", errMes));
}
if (tempPayload != sourcePayload) //非标准协议的实现,或没有实现的压缩会导致PayloadAsString()使数据不可逆
{
webSocketMessage.SetPayload(tempPayload);
}
if (nameValueCollection != null && nameValueCollection.Count > 0)
{
ShowMes(string.Format("[ParameterizationContent]:{0}", nameValueCollection.MyToFormatString()));
}
}
}
}
}
}
public static void PickSessionParameter(Session oSession, IFiddlerHttpTamper nowFiddlerHttpTamper, Action ShowError, Action ShowMes, bool isRequest , WebSocketMessage webSocketMessage=null)
{
Func PickFunc = (sourceStr, parameterPick) =>
{
try { return ParameterPickTypeEngine.dictionaryParameterPickFunc[parameterPick.PickType].ParameterPickFunc(sourceStr, parameterPick.PickTypeExpression, parameterPick.PickTypeAdditional); }
catch (Exception) { return null; }
};
bool isWebSocket = webSocketMessage != null;
if (nowFiddlerHttpTamper.ParameterPickList != null)
{
foreach (ParameterPick parameterPick in nowFiddlerHttpTamper.ParameterPickList)
{
string pickResult = null;
string pickSource = null;
switch (parameterPick.PickRange)
{
case ParameterPickRange.Line:
if (isRequest)
{
pickSource = oSession.fullUrl;
if (string.IsNullOrEmpty(pickSource))
{
pickResult = null;
break;
}
}
else
{
if (oSession.oResponse.headers == null)
{
pickResult = null;
break;
}
else
{
//pickSource = string.Format("{0} {1} {}", oSession.oResponse.headers.HTTPVersion, oSession.oResponse.headers.HTTPResponseCode,oSession.oResponse.headers.StatusDescription);
pickSource = string.Format("{0} {1}", oSession.oResponse.headers.HTTPVersion, oSession.oResponse.headers.HTTPResponseStatus);
}
}
pickResult = PickFunc(pickSource, parameterPick);
break;
case ParameterPickRange.Heads:
if(isWebSocket)
{
ShowError("[ParameterizationPick] can not pick parameter in head when the session is websocket");
break;
}
IEnumerable headerItems = isRequest ? (IEnumerable)oSession.RequestHeaders : (IEnumerable)oSession.ResponseHeaders;
foreach (HTTPHeaderItem tempHead in headerItems)
{
pickResult = PickFunc(tempHead.ToString(), parameterPick);
if (pickResult != null)
{
break;
}
}
break;
case ParameterPickRange.Entity:
if (isWebSocket)
{
if(webSocketMessage.PayloadLength==0)
{
pickResult = null;
break;
}
pickSource = webSocketMessage.PayloadAsString();
pickResult = PickFunc(pickSource, parameterPick);
}
else
{
if (((oSession.requestBodyBytes == null || oSession.requestBodyBytes.Length == 0) && isRequest) && ((oSession.ResponseBody == null || oSession.ResponseBody.Length == 0) && isRequest))
{
pickResult = null;
break;
}
pickSource = isRequest ? oSession.GetRequestBodyAsString() : oSession.GetResponseBodyAsString();
pickResult = PickFunc(pickSource, parameterPick);
}
break;
default:
ShowError("[ParameterizationPick] unkonw pick range");
break;
}
if (pickResult == null)
{
ShowMes(string.Format("[ParameterizationPick] can not find the parameter with [{0}]", parameterPick.ParameterName));
}
else
{
ShowMes(string.Format("[ParameterizationPick] pick the parameter [{0} = {1}]", parameterPick.ParameterName, pickResult));
if (nowFiddlerHttpTamper.ActuatorStaticDataController.SetActuatorStaticData(parameterPick.ParameterName, pickResult))
{
ShowMes(string.Format("[ParameterizationPick] add the parameter [{0}] to ActuatorStaticDataCollection", parameterPick.ParameterName));
}
else
{
ShowError(string.Format("[ParameterizationPick] fail to add the parameter [{0}] to ActuatorStaticDataCollection", parameterPick.ParameterName));
}
}
}
}
else
{
ShowError("[ParameterizationPick] not find ParameterPick to pick");
}
}
public static string GetSessionRawData(Session oSession, bool isHaveResponse)
{
if (oSession == null)
{
return null;
}
StringBuilder sbRawData = new StringBuilder();
MemoryStream ms = new MemoryStream();
//tempSession.WriteToStream(SmartAssembly, false);
oSession.WriteRequestToStream(true, true, ms);
ms.Position = 0;
StreamReader sr = new StreamReader(ms, Encoding.UTF8);
sbRawData.Append(sr.ReadToEnd());
sr.Close();
ms.Close();
if (oSession.requestBodyBytes != null && oSession.requestBodyBytes.Length > 0)
{
sbRawData.AppendLine(oSession.GetRequestBodyAsString());
sbRawData.Append("\r\n");
}
if (isHaveResponse && oSession.bHasResponse)
{
sbRawData.AppendLine(oSession.ResponseHeaders.ToString());
if (oSession.responseBodyBytes != null && oSession.responseBodyBytes.Length > 0)
{
sbRawData.AppendLine(oSession.GetResponseBodyAsString());
}
}
return sbRawData.ToString();
}
public static bool GetSessionData(Session oSession, FreeHttpControl.FreeHttpWindow.GetSessionEventArgs sessionEventArgs)
{
if (sessionEventArgs == null || oSession==null)
{
return false;
}
sessionEventArgs.Uri = oSession.fullUrl;
if (oSession.oRequest!=null)
{
sessionEventArgs.RequestHeads = new List>(oSession.oRequest.headers.Count());
foreach (var head in oSession.oRequest.headers)
{
sessionEventArgs.RequestHeads.Add(new KeyValuePair(head.Name, head.Value));
}
if(sessionEventArgs.IsGetEntity)
{
sessionEventArgs.RequestEntity = oSession.GetRequestBodyAsString();
}
}
if (oSession.bHasResponse && oSession.oResponse != null)
{
sessionEventArgs.ResponseHeads = new List>(oSession.oResponse.headers.Count());
foreach (var head in oSession.oResponse.headers)
{
sessionEventArgs.ResponseHeads.Add(new KeyValuePair(head.Name, head.Value));
}
if (sessionEventArgs.IsGetEntity)
{
sessionEventArgs.ResponseEntity = oSession.GetResponseBodyAsString();
}
}
return true;
}
}
}
================================================
FILE: FreeHttp.csproj
================================================
Debug
AnyCPU
{432A476E-3D49-4994-A75C-346EFDAD1E9A}
Library
Properties
FreeHttp
FreeHttp
v4.5
512
true
full
false
bin\Debug\
DEBUG;TRACE;NET4_5UP
prompt
4
false
AnyCPU
pdbonly
true
bin\Release\
TRACE
prompt
4
false
False
bin\Debug\Fiddler4.5\Fiddler.exe
Form
ChangeEncodeForm.cs
Form
EditKeyVaule.cs
Form
EditCookieForm.cs
Form
EditParameterPickWindow.cs
Form
EditSheetForm.cs
Form
GetRemoteRuleWindow.cs
Component
Form
SortRule.cs
Form
RuleInfoWindow.cs
UserControl
AddParameterPickBox.cs
Form
UserControl
EditListView.cs
UserControl
UserControl
FreeHttpWindow.cs
Form
HttpFilterWindow.cs
Form
Component
Component
Component
UserControl
MyEnableSwitch.cs
Component
UserControl
RawRequestEdit.cs
UserControl
RawResponseEdit.cs
Form
RemoveHead.cs
Form
SaveShareRule.cs
Form
SettingWindow.cs
Form
SetVaule.cs
Form
ShowSheetForm.cs
Form
ShowTextForm.cs
Form
StaticDataAddWindow.cs
Form
StaticDataManageWindow.cs
UserControl
TextBoxEditer.cs
Component
Form
UserFeedbackWindow.cs
True
True
Resources.resx
True
True
MyResource.resx
ChangeEncodeForm.cs
Designer
EditKeyVaule.cs
Designer
EditCookieForm.cs
Designer
EditParameterPickWindow.cs
Designer
EditSheetForm.cs
GetRemoteRuleWindow.cs
SortRule.cs
RuleInfoWindow.cs
AddParameterPickBox.cs
Designer
EditListView.cs
FreeHttpWindow.cs
HttpFilterWindow.cs
MyBaseInfoWindow.cs
MyListView.cs
MyEnableSwitch.cs
RawRequestEdit.cs
RawResponseEdit.cs
RemoveHead.cs
SaveShareRule.cs
SettingWindow.cs
SetVaule.cs
ShowSheetForm.cs
ShowTextForm.cs
StaticDataAddWindow.cs
StaticDataManageWindow.cs
TextBoxEditer.cs
Designer
UserFeedbackWindow.cs
ResXFileCodeGenerator
Resources.Designer.cs
Designer
ResXFileCodeGenerator
Designer
MyResource.Designer.cs
copy "$(TargetPath)" "$(SYSTEMDRIVE)$(HOMEPATH)\AppData\Local\Programs\Fiddler\Scripts\$(TargetFilename)"
================================================
FILE: FreeHttp.sln
================================================
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28803.452
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeHttp", "FreeHttp.csproj", "{432A476E-3D49-4994-A75C-346EFDAD1E9A}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeHttpWebService", "..\FreeHttpWebService\FreeHttpWebService.csproj", "{1BEB4588-FC73-4221-89F3-59913E39BA01}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeHttpTests", "..\FreeHttpTests\FreeHttpTests.csproj", "{4E9B0249-D28D-4CD1-93D6-5EA4AB8D5CF9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeHttpWeb", "..\FreeHttpWeb\FreeHttpWeb.csproj", "{6B40B9FE-A972-47A9-ACDA-01AE89C8EFC9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{432A476E-3D49-4994-A75C-346EFDAD1E9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{432A476E-3D49-4994-A75C-346EFDAD1E9A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{432A476E-3D49-4994-A75C-346EFDAD1E9A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{432A476E-3D49-4994-A75C-346EFDAD1E9A}.Release|Any CPU.Build.0 = Release|Any CPU
{1BEB4588-FC73-4221-89F3-59913E39BA01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1BEB4588-FC73-4221-89F3-59913E39BA01}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1BEB4588-FC73-4221-89F3-59913E39BA01}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1BEB4588-FC73-4221-89F3-59913E39BA01}.Release|Any CPU.Build.0 = Release|Any CPU
{4E9B0249-D28D-4CD1-93D6-5EA4AB8D5CF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4E9B0249-D28D-4CD1-93D6-5EA4AB8D5CF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4E9B0249-D28D-4CD1-93D6-5EA4AB8D5CF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4E9B0249-D28D-4CD1-93D6-5EA4AB8D5CF9}.Release|Any CPU.Build.0 = Release|Any CPU
{6B40B9FE-A972-47A9-ACDA-01AE89C8EFC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B40B9FE-A972-47A9-ACDA-01AE89C8EFC9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6B40B9FE-A972-47A9-ACDA-01AE89C8EFC9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B40B9FE-A972-47A9-ACDA-01AE89C8EFC9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5D63C238-74AD-4459-AD37-9BD7804E7E56}
EndGlobalSection
EndGlobal
================================================
FILE: FreeHttpControl/ChangeEncodeForm.Designer.cs
================================================
namespace FreeHttp.FreeHttpControl
{
partial class ChangeEncodeForm
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ChangeEncodeForm));
this.bt_ok = new System.Windows.Forms.Button();
this.tb_contentType = new System.Windows.Forms.TextBox();
this.lb_info_3 = new System.Windows.Forms.Label();
this.lb_info_1 = new System.Windows.Forms.Label();
this.cb_body = new System.Windows.Forms.ComboBox();
this.lb_info_2 = new System.Windows.Forms.Label();
this.tb_recode = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// bt_ok
//
this.bt_ok.Location = new System.Drawing.Point(234, 99);
this.bt_ok.Name = "bt_ok";
this.bt_ok.Size = new System.Drawing.Size(75, 23);
this.bt_ok.TabIndex = 10;
this.bt_ok.Text = "confirm";
this.bt_ok.UseVisualStyleBackColor = true;
this.bt_ok.Click += new System.EventHandler(this.bt_ok_Click);
//
// tb_contentType
//
this.tb_contentType.Location = new System.Drawing.Point(99, 67);
this.tb_contentType.Name = "tb_contentType";
this.tb_contentType.Size = new System.Drawing.Size(210, 21);
this.tb_contentType.TabIndex = 6;
//
// lb_info_3
//
this.lb_info_3.AutoSize = true;
this.lb_info_3.Location = new System.Drawing.Point(13, 70);
this.lb_info_3.Name = "lb_info_3";
this.lb_info_3.Size = new System.Drawing.Size(83, 12);
this.lb_info_3.TabIndex = 8;
this.lb_info_3.Text = "Content-Type:";
//
// lb_info_1
//
this.lb_info_1.AutoSize = true;
this.lb_info_1.Location = new System.Drawing.Point(15, 11);
this.lb_info_1.Name = "lb_info_1";
this.lb_info_1.Size = new System.Drawing.Size(35, 12);
this.lb_info_1.TabIndex = 11;
this.lb_info_1.Text = "Body:";
//
// cb_body
//
this.cb_body.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cb_body.FormattingEnabled = true;
this.cb_body.Items.AddRange(new object[] {
"change request encode",
"change response encode"});
this.cb_body.Location = new System.Drawing.Point(99, 7);
this.cb_body.Name = "cb_body";
this.cb_body.Size = new System.Drawing.Size(210, 20);
this.cb_body.TabIndex = 12;
//
// lb_info_2
//
this.lb_info_2.AutoSize = true;
this.lb_info_2.Location = new System.Drawing.Point(15, 41);
this.lb_info_2.Name = "lb_info_2";
this.lb_info_2.Size = new System.Drawing.Size(47, 12);
this.lb_info_2.TabIndex = 13;
this.lb_info_2.Text = "Encode:";
//
// tb_recode
//
this.tb_recode.AutoCompleteCustomSource.AddRange(new string[] {
"utf-8",
"gb2312",
"utf-16",
"utf-32",
"x-cp20936",
"gbk",
"euc-jp",
"EUC-CN",
"GB18030",
"unicodeFFFE",
"big5",
"IBM037",
"IBM437",
"IBM500",
"windows-1250",
"Windows-1252",
"windows-1253",
"Johab",
"x-mac-chinesetrad",
"utf-32BE"});
this.tb_recode.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.tb_recode.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource;
this.tb_recode.Location = new System.Drawing.Point(99, 36);
this.tb_recode.Name = "tb_recode";
this.tb_recode.Size = new System.Drawing.Size(210, 21);
this.tb_recode.TabIndex = 14;
this.tb_recode.Text = "utf-8";
this.tb_recode.TextChanged += new System.EventHandler(this.Tb_recode_TextChanged);
//
// ChangeEncodeForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(315, 128);
this.Controls.Add(this.tb_recode);
this.Controls.Add(this.lb_info_2);
this.Controls.Add(this.cb_body);
this.Controls.Add(this.lb_info_1);
this.Controls.Add(this.bt_ok);
this.Controls.Add(this.lb_info_3);
this.Controls.Add(this.tb_contentType);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "ChangeEncodeForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "Change Encode";
this.Load += new System.EventHandler(this.ChangeEncodeForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Button bt_ok;
private System.Windows.Forms.TextBox tb_contentType;
private System.Windows.Forms.Label lb_info_3;
private System.Windows.Forms.Label lb_info_1;
private System.Windows.Forms.ComboBox cb_body;
private System.Windows.Forms.Label lb_info_2;
private System.Windows.Forms.TextBox tb_recode;
}
}
================================================
FILE: FreeHttpControl/ChangeEncodeForm.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl
{
public partial class ChangeEncodeForm : Form
{
public class ChangeEncodeInfo
{
public String ContentType_Request { get; set; }
public String ContentType_Response { get; set; }
public String NowEncode { get; set; }
public FreeHttpWindow.RuleEditMode EditMode { get; set; } = FreeHttpWindow.RuleEditMode.NewRuleMode;
}
ChangeEncodeInfo changeEncodeInfo;
public ChangeEncodeForm(ChangeEncodeInfo info)
{
InitializeComponent();
if(info!=null)
{
changeEncodeInfo = info;
}
else
{
throw new Exception("your ChangeEncodeInfo is null");
}
}
private void ChangeEncodeForm_Load(object sender, EventArgs e)
{
if (changeEncodeInfo.EditMode == FreeHttpWindow.RuleEditMode.EditRequsetRule)
{
cb_body.Enabled = false;
cb_body.SelectedIndex = 0;
}
else if (changeEncodeInfo.EditMode == FreeHttpWindow.RuleEditMode.EditResponseRule)
{
cb_body.Enabled = false;
cb_body.SelectedIndex = 1;
}
//cb_body.SelectedIndex = changeEncodeInfo.EditMode ==FreeHttpWindow.RuleEditMode.EditResponseRule ? 1:0 ;
UpdataContentType();
tb_contentType.Enabled = false;
tb_recode.Focus();
}
private void Tb_recode_TextChanged(object sender, EventArgs e)
{
UpdataContentType();
}
private void UpdataContentType()
{
string nowContentType = cb_body.SelectedIndex == 0 ? changeEncodeInfo.ContentType_Request : changeEncodeInfo.ContentType_Response;
if (!string.IsNullOrEmpty(nowContentType))
{
nowContentType = nowContentType.Trim();
if (nowContentType.Contains("charset"))
{
int startIndex = nowContentType.IndexOf("charset");
int endIndex = nowContentType.IndexOf(';', startIndex);
if (endIndex < 0)
{
tb_contentType.Text = string.Format("{0}charset={1}", nowContentType.Remove(startIndex), tb_recode.Text);
}
else
{
tb_contentType.Text = string.Format("{0};charset={1}", nowContentType.Remove(startIndex, endIndex + 1 - startIndex), tb_recode.Text);
}
}
else
{
tb_contentType.Text = string.Format("{0};charset={1}", nowContentType, tb_recode.Text);
}
}
else
{
tb_contentType.Text = string.Format("charset={0}", tb_recode.Text);
}
}
private void bt_ok_Click(object sender, EventArgs e)
{
try
{
Encoding.GetEncoding(tb_recode.Text);
changeEncodeInfo.NowEncode = tb_recode.Text;
if(cb_body.SelectedIndex==0)
{
changeEncodeInfo.ContentType_Request = tb_contentType.Text;
changeEncodeInfo.ContentType_Response = null;
}
else
{
changeEncodeInfo.ContentType_Response = tb_contentType.Text;
changeEncodeInfo.ContentType_Request = null;
}
}
catch(Exception ex)
{
MessageBox.Show(string.Format("your recode is illegal that {0}", ex.Message),"Stop",MessageBoxButtons.OK,MessageBoxIcon.Stop);
return;
}
this.Close();
}
}
}
================================================
FILE: FreeHttpControl/ChangeEncodeForm.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
AAABAAEAQEAAAAAAIAAoQgAAFgAAACgAAABAAAAAgAAAAAEAIAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXCwAAIBAAACAQ
AAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQ
AAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQ
AAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAIBAAACAQ
AAAgEAAAIBAAACAQAAAgEAAAIBAAACAQAAAgEAAAHxAAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABNJgAAwmICWs1nAuDNaALrzWcC681oAuvNZwLrzWgC681nAuvNaALrzWcC681oAuvNZwLrzWgC681n
AuvNaALrzWcC681oAuvNZwLrzWgC681nAuvNaALrzWcC681oAuvNZwLrzWgC681nAuvNaALrzWcC681o
AuvNZwLrzWgC681nAuvNaALrzWcC681oAuvNZwLrzWgC681nAuvNaALrzWcC681oAuvNZwLrzWgC681n
AuvNaALrzWcC681oAuvNZwLrzWgC681nAuvNaALrzWcC681oAuvNZwLrzWgC68xoAt5wOQFHAgEAAAAA
AAAAAAAAAAAAAAAAAAAAAAAApFMCJ81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgD/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oA//NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAP/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWcC/x8QABIAAAAAAAAAAAAAAAAAAAAAAAAAAKNTAl/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oA//MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81nAv8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACkUwJfzWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NZwP/HxAARwAAAAAAAAAAAAAAAAAA
AAAAAAAAo1MCX81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWcC/x8Q
AEcAAAAAAAAAAAAAAAAAAAAAAAAAAKRTAl/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgD/81o
A//NaAL/zWgD/81oA//NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
A//NaAP/zWgC/81oA//NaAP/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAP/zWgD/81oAv/NaAP/zWgD/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgD/81nA/8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACjUwJfzWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NZwL/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAApFMCX81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWcD/x8QAEcAAAAAAAAAAAAA
AAAAAAAAAAAAAKNTAl/NaAL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAP/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oA//MZwL/zWgC/81nAv/NZwL/zGcC/81o
Av/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oA//MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81n
Av8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACkUwJfzWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAP/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/y14C/ygU
AHwSCQAKSSUBIsZkAvfNaAP/zWgD/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oA//NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NZwP/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAAo1MCX81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/4k+AeAAAAAAAAAAAAAAAACJRQExzWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWcC/x8QAEcAAAAAAAAAAAAAAAAAAAAAAAAAAKRT
Al/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zmUC/79hAv/HZQL/zWgC/81oA/+AQAHNAAAAAAAAAAAAAAAARCQAAM1nA/vNaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zGcC/79hAv/HZAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81nA/8fEABHAAAAAAAA
AAAAAAAAAAAAAAAAAACjUwJfzWgD/8xnAv/NaAL/zGcC/81oA//MZwL/zWgC/8xnAv/NaAP/zGcC/81o
Av/MZwL/zWgD/8xnAv/NaAL/xmQD/1IcAK0AAAAANBoAAMRjAtvNaAP/xmUC/xUKAAAAAAAAAAAAAAcD
AACsVwJ1zGcC/81oA//MZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zGcC/1suAMoAAAAAIxEAAKZU
AsLMZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81oA//MZwL/zWgC/8xn
Av/NZwP/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAApFMCX81oA//NaAP/zWgD/81oAv/NaAP/zWgC/81o
A//NaAP/zWgD/81oAv/NaAP/zWgD/81oA//NaAP/w2MC/zYbAJEAAAAAAAAAAAAAAABtNwEAzWgD/81o
Av9UKgFXAAAAAAAAAAAAAAAAcDgBBc1oA//NaAP/zWgD/81oA//NaAL/zWgD/81oA//NaAP/zWgC/7Zc
Av8AAAAAAAAAAAAAAAAOBwAAo1MCrc1oA//NaAP/zWgD/81oA//NaAP/zWgC/81oA//NaAP/zWgD/81o
Av/NaAP/zWgC/81oA//NaAP/zWcD/x8QAEcAAAAAAAAAAAAAAAAAAAAAAAAAAKNTAl/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAP/w2MC/zgcAHkAAAAAAAAAAAAA
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
A//NaAL/zWcD/x8QAEcAAAAAAAAAAAAAAAAAAAAAAAAAAKNTAl/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/8ZkAv1HJAAZAAAAAAAAAAAAAAAAlEoBAM1o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/7VbAv8MBgAAAAAAAAAAAAApBgAAyWQC1cxn
Av+4XAL/BAIAAAAAAAAAAAAASSgAAMxeAifNaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81nAv8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACkUwJfzWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAP/zWgD/81oAv/NaAP/yGUC/38w
ARkEAgAAXC4AAMdlAl3NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgD/81oA//NaAL/NhsAKgAA
AAAAAAAAAAAAAI1IAQ/NZwL/zWcC/4ZEATscDgAAWy4AAMljAiXNaAL/zWgD/81oA//NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NZwP/HxAARwAAAAAAAAAAAAAAAAAA
AAAAAAAAo1MCX81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
A//MZwL/zWgC/8xnAv/NaAL/zWgC4c1oAvXMZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAP/zGcC/5NOAbUAAAAAAAAAAAAAAABGIwAAzWcC9c1oAv/MZwL/zWcC7s1nAuvNaAL/zGcC/81o
Av/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWcC/x8Q
AEcAAAAAAAAAAAAAAAAAAAAAAAAAAKRTAl/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/AYQL/GAwAAAAAAAAAAAAARCIAAM1oAtrNaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81nA/8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACjUwJfzWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWcC/5tPAo88HgAAOx0AAMBi
AgvMZwL+zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NZwL/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAApFMCX81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAP/zWgD/81oAv/NaAP/zWgD/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgD/81oA//NaAL/zWgD/81oA//NaAP/zWgC/81o
A//NaAL/zWgC5c1nAsLNaAP+zWgC/81oA//NaAL/zWgD/81oA//NaAP/zWgC/81oA//NaAP/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAP/zWcD/x8QAEcAAAAAAAAAAAAA
AAAAAAAAAAAAAKNTAl/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81n
Av8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACkUwJfzWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NZwP/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAAo1MCX81oAv/MZwL/zWgC/8xn
Av/NaAP/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oA//MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oA//MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zWcC/x8QAEcAAAAAAAAAAAAAAAAAAAAAAAAAAKRT
Al/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oA//NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAP/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgD/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81nA/8fEABHAAAAAAAA
AAAAAAAAAAAAAAAAAABTKgFNaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0
Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0
Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0
Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0Ac9pNAHPaTQBz2k0
Ac9pNAHPEAgAOgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAXjABAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8
AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8
AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8
AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8AQB2PAEAdjwBAHY8
AQB2PAEAdjsBABIJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKRTAl/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81nA/8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACjUwJfzWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NZwL/HxAARwAAAAAAAAAAAAAAAAAA
AAAAAAAApFMCX81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/ymYC/8hlAv/IZQL/ymYC/81o
Av/NaAL/zWgD/81oAv/NaAL/yWYC/8hlAv/IZQL/ymYC/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
A//NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oAv/JZgL/yGUC/8hlAv/IZQL/yGUC/8hl
Av/IZQL/yGUC/8hlAv/IZQL/ymYC/81oAv/NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWcD/x8Q
AEcAAAAAAAAAAAAAAAAAAAAAAAAAAKNTAl/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/kUkB/x4P
AEgAAAAAAAAAABgMAACFQwJ1zGcC/s1oAv/MZwL/g0EB+BcLABMAAAAAAAAAAB8PAACUSwK5zWgC/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv92PAHkEQgABAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoNAACUSAFgzWcC/81oAv/MZwL/zWgC/8xn
Av/NaAL/zGcC/81nAv8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACkUwJfzWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWcC/yEQADsAAAAAAAAAAAAAAAAAAAAAAgEAAMBhAqrNaAP/u18C/wIBAAcAAAAAAAAAAAAA
AAAAAAAAJhMAAM1oAv3NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A/+qVgL/AQAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgMAAL1f
Am/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NZwP/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAAo1MCX81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81nAv8rFQALAAAAAAAAAAAAAAAAAAAAAAoFAADBYgJXzWgC/71g
Av8JBAAAAAAAAAAAAAAAAAAAAAAAAC4XAADNZwLBzGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/sFYB/wgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAQCAADLZgIQzWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWcC/x8QAEcAAAAAAAAAAAAA
AAAAAAAAAAAAAKRTAl/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/o1ICtz0eAAAWCwAAFgsAABYL
AACZTAEAzWgC481oA//NaAL/lksBXRYLAAAWCwAAFgsAAD8PAAClVAIHzWgD/81oA//NaAP/zWgC/81o
A//NaAP/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/85kAv9rMgEhFgsAABYLAAAWCwAAFgsAABYL
AAAWCwAAFgsAABYLAAAWCwAAFgsAAB0OAAB8PgEAzWgC181oA//NaAL/zWgD/81oAv/NaAP/zWgD/81n
A/8fEABHAAAAAAAAAAAAAAAAAAAAAAAAAACjUwJfzWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xn
Av/NaALuzWgCo81oAqHNZwKlzWgC/cxnAv/NaAL/zGcC/81oAv/NZwLWzWgCoc1oAqHNZwKvzGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/81o
Ar7NaAKhzWgCoc1oAqHNaAKhzWgCoc1oAqHNaAKhzWgCoc1oAqHNaAKlzWgC9cxnAv/NaAL/zGcC/81o
Av/MZwL/zWgC/8xnAv/NZwL/HxAARwAAAAAAAAAAAAAAAAAAAAAAAAAApFMCX81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81o
Av/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWgD/81oAv/NaAP/zWgC/81o
A//NaAL/zWgD/81oAv/NaAP/zWgC/81oA//NaAL/zWcD/x8QAEcAAAAAAAAAAAAAAAAAAAAAAAAAAI9I
ATTNZwL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAP/zGcC/81o
Av/MZwL/zWgC/8xnAv/NaAL/zGcC/81oA//MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgD/8xn
Av/NaAL/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAP/zGcC/81oAv/MZwL/zWgC/8xnAv/NaAL/zGcC/81o
A//MZwL/zWgC/8xnAv/NaAL/zGcC/81oAv/MZwL/zWgD/8xnAv/NaAL/zGcC/7JaAv8LBgAbAAAAAAAA
AAAAAAAAAAAAAAAAAAAOBwAAdzwAcqRTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RT
Av+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RT
Av+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RT
Av+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/6RTAv+kUwL/pFMC/45I
Af8uFwBcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA////////////////////////////////8AAAAAAAAAfgAAAAAAAAA+AAAAAAAAAD4AAAAAAA
AAPgAAAAAAAAA+AAAAAAAAAD4AAAAAAAAAPgAAAAAAAAA+AAAAAAAAAD4AAAAAAAAAPgAAA4AAAAA+AA
ADwAAAAD4AAGPAAwAAPgAA8cAHgAA+AAHx4AfAAD4AA+DgA+AAPgAHwPAB8AA+AA+AcAD4AD4AHwB4AH
wAPgA+AHgAPgA+AHwAOAAfAD4A+AA8AA+APgHgADwAB8A+AeAAHAADwD4B8AAeAAfAPgD4AB4ADwA+AD
wADwAeAD4AHgAPADwAPgAPAAcAeAA+AA+AB4D4AD4AA8ADgeAAPgAB4AODwAA+AADwA8eAAD4AAGABww
AAPgAAAAHgAAA+AAAAAeAAAD4AAAAAwAAAPgAAAAAAAAA+AAAAAAAAAD4AAAAAAAAAPgAAAAAAAAA+AA
AAAAAAAD4AAAAAAAAAP//////////////////////////////////////////+AAAAAAAAAD4AAAAAAA
AAPgAAAAAAAAA+AHA4AAP/AD4A+HwAB/+APgD4/AAP/4A+APh4AAf/gD4AAAAAAAAAPgAAAAAAAAA+AA
AAAAAAAD8AAAAAAAAAf///////////////////////////////8=
================================================
FILE: FreeHttpControl/ControlHelper/LoadBitmap.cs
================================================
using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl.ControlHelper
{
class LoadBitmap
{
//private int count = -1;
//private ArrayList images = new ArrayList();
//public Bitmap[] bitmap = new Bitmap[8];
private int _value = 1;
private Color _circleColor = Color.Red;
private float _circleSize = 0.8f;
private int Width;
private int Height;
public LoadBitmap(Size size)
{
Width = size.Width;
Height = size.Height;
}
internal void SetSize(int size)
{
SetSize(new Size(size, size));
}
public void SetSize(Size size)
{
Width = size.Width;
Height = size.Height;
}
public Bitmap DrawCircle(int j)
{
const float angle = 360.0F / 8; Bitmap map = new Bitmap(Width, Height);
Graphics g = Graphics.FromImage(map);
g.TranslateTransform(Width / 2.0F, Height / 2.0F);
g.RotateTransform(angle * _value);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.AntiAlias;
int[] a = new int[8] { 25, 50, 75, 100, 125, 150, 175, 200 };
for (int i = 1; i <= 8; i++)
{
int alpha = a[(i + j - 1) % 8];
Color drawColor = Color.FromArgb(alpha, _circleColor);
using (SolidBrush brush = new SolidBrush(drawColor))
{
float sizeRate = 3.5F / _circleSize;
float size = Width / (6 * sizeRate);
float diff = (Width / 10.0F) - size;
float x = (Width / 80.0F) + diff;
float y = (Height / 80.0F) + diff;
g.FillEllipse(brush, x, y, size, size);
g.RotateTransform(angle);
}
}
//g.DrawLine(new Pen(Color.Red),1,1,10,10);
//g.Save();
return map;
}
}
}
================================================
FILE: FreeHttpControl/ControlHelper/LoadWindowService.cs
================================================
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl.ControlHelper
{
public class LoadWindowService
{
Form loadForm = null;
LoadBitmap loadBitmap = new LoadBitmap(new System.Drawing.Size(100,100));
PictureBox pictureBox = new PictureBox();
Timer timer = new System.Windows.Forms.Timer();
System.Timers.Timer asyncTimer = new System.Timers.Timer();
int loadTime = 0;
bool isInload = false;
public LoadWindowService()
{
pictureBox.SizeMode = PictureBoxSizeMode.Zoom;
timer.Interval = 300;
timer.Tick += Timer_Tick;
asyncTimer.Elapsed += Timer_Elapsed;
}
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Timer_Tick(null, null);
}
private void Timer_Tick(object sender, EventArgs e)
{
if(loadForm==null || loadForm.Created==false)
{
StopLoad();
return;
}
pictureBox.Image = loadBitmap.DrawCircle(loadTime);
loadTime++;
}
public void StartLoad(Form form,bool isAsync = false)
{
if (isInload) return;
loadForm = form;
loadForm.Controls.Add(pictureBox);
loadForm.FormClosed += new FormClosedEventHandler((o, e) => { StopLoad(); });
pictureBox.Dock = DockStyle.Fill;
pictureBox.BringToFront();
loadBitmap.SetSize(pictureBox.Width > pictureBox.Height ? pictureBox.Height : pictureBox.Width);
isInload = true;
loadTime = 0;
if (isAsync)
{
asyncTimer.Start();
}
else
{
timer.Start();
}
}
public void StopLoad()
{
if (!isInload) return;
loadForm?.Controls.Remove(pictureBox);
loadForm = null;
isInload = false;
timer.Stop();
asyncTimer.Stop();
}
}
}
================================================
FILE: FreeHttpControl/ControlHelper/MarkControlService.cs
================================================
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl
{
public class MarkControlService:IDisposable
{
///
/// the information for the mark Control
///
class RemindControlInfo
{
public int RemindTime { get; set; }
public Color OriginColor { get; set; }
public RemindControlInfo(int yourRemindTime, Color yourOriginColor)
{
RemindTime = yourRemindTime;
OriginColor = yourOriginColor;
}
}
Timer myTimer = new Timer();
Dictionary remindItemDc;
Dictionary remindControlDc;
public MarkControlService(int clickTime)
{
remindItemDc = new Dictionary();
remindControlDc = new Dictionary();
myTimer.Interval = clickTime;
myTimer.Tick += myTimer_Tick;
myTimer.Start();
}
void myTimer_Tick(object sender, EventArgs e)
{
if (remindItemDc.Count > 0)
{
//MyControlHelper.SetControlFreeze(lv_requestRuleList);
List tempRemoveItem = new List();
List tempHighlightList = new List();
tempHighlightList.AddRange(remindItemDc.Keys);
foreach (var tempHighlightItem in tempHighlightList)
{
if(tempHighlightItem==null)
{
tempRemoveItem.Add(tempHighlightItem);
continue;
}
remindItemDc[tempHighlightItem].RemindTime--;
if (remindItemDc[tempHighlightItem].RemindTime == 0)
{
tempRemoveItem.Add(tempHighlightItem);
}
}
//MyControlHelper.SetControlUnfreeze(lv_requestRuleList);
System.Threading.Monitor.Enter(remindItemDc);
foreach (var tempItem in tempRemoveItem)
{
tempItem.BackColor = remindItemDc[tempItem].OriginColor;
remindItemDc.Remove(tempItem);
}
System.Threading.Monitor.Exit(remindItemDc);
}
if (remindControlDc.Count > 0)
{
List tempRemoveControl = new List();
List tempRemindList = new List();
tempRemindList.AddRange(remindControlDc.Keys);
foreach (var tempRemindControl in tempRemindList)
{
remindControlDc[tempRemindControl].RemindTime--;
if (remindControlDc[tempRemindControl].RemindTime == 0)
{
tempRemoveControl.Add(tempRemindControl);
}
}
System.Threading.Monitor.Enter(remindControlDc);
foreach (var tempItem in tempRemoveControl)
{
tempItem.BackColor = remindControlDc[tempItem].OriginColor;
remindControlDc.Remove(tempItem);
}
System.Threading.Monitor.Exit(remindControlDc);
}
}
public void MarkControl(Control yourControl, Color yourColor, int yourShowTick)
{
try
{
if (yourControl != null)
{
System.Threading.Monitor.Enter(remindControlDc);
if (remindControlDc.ContainsKey(yourControl))
{
remindControlDc[yourControl] = new RemindControlInfo(yourShowTick, remindControlDc[yourControl].OriginColor);
}
else
{
remindControlDc.Add(yourControl, new RemindControlInfo(yourShowTick, yourControl.BackColor));
}
System.Threading.Monitor.Exit(remindControlDc);
yourControl.BackColor = yourColor;
}
}
catch(Exception ex)
{
}
}
public void MarkControl(ListViewItem yourItem, Color yourColor, int yourShowTick)
{
try
{
if (yourItem != null)
{
System.Threading.Monitor.Enter(remindItemDc);
if (remindItemDc.ContainsKey(yourItem))
{
remindItemDc[yourItem] = new RemindControlInfo(yourShowTick, remindItemDc[yourItem].OriginColor);
}
else
{
remindItemDc.Add(yourItem, new RemindControlInfo(yourShowTick, yourItem.BackColor));
}
System.Threading.Monitor.Exit(remindItemDc);
yourItem.BackColor = yourColor;
}
}
catch (Exception ex)
{
}
}
public void SetColor(Control yourControl, Color yourColor)
{
if (yourControl != null)
{
if (remindControlDc.ContainsKey(yourControl))
{
remindControlDc.Remove(yourControl);
}
yourControl.BackColor = yourColor;
}
}
public void SetColor(ListViewItem yourItem, Color yourColor)
{
if (yourItem != null)
{
if (remindItemDc.ContainsKey(yourItem))
{
remindItemDc.Remove(yourItem);
}
yourItem.BackColor = yourColor;
}
}
public void Dispose()
{
myTimer.Dispose();
}
}
}
================================================
FILE: FreeHttpControl/ControlHelper/MyControlHelper.cs
================================================
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl
{
public class MyControlHelper
{
private const int WM_SETREDRAW = 0xB;
///
/// 停止控件刷新
///
/// your Control
public static void SetControlFreeze(System.Windows.Forms.Control yourCtr)
{
UnsafeNativeMethods.SendMessage(yourCtr.Handle, WM_SETREDRAW, 0, IntPtr.Zero);
}
///
/// 恢复控件刷新
///
/// your Control
public static void SetControlUnfreeze(System.Windows.Forms.Control yourCtr)
{
UnsafeNativeMethods.SendMessage(yourCtr.Handle, WM_SETREDRAW, 1, IntPtr.Zero);
yourCtr.Refresh();
}
///
/// 为TextBoxBase 控件添加拖放数据的功能
///
/// 需要启用拖放数据的控件
/// 拖放完成后的辅助事件
public static void SetRichTextBoxDropString(System.Windows.Forms.TextBoxBase yourCtr, Action action = null)
{
if (yourCtr == null)
{
return;
}
if (yourCtr is RichTextBox)
{
((RichTextBox)yourCtr).AllowDrop = true;
}
else if (yourCtr is TextBox)
{
((TextBox)yourCtr).AllowDrop = true;
}
else
{
yourCtr.AllowDrop = true;
}
yourCtr.DragDrop += (sender, e) =>
{
System.Windows.Forms.TextBoxBase tempTextBoxBase = sender as System.Windows.Forms.TextBoxBase;
string tempText = (string)e.Data.GetData(typeof(string));
if (tempText == null || tempTextBoxBase == null)
{
return;
}
int selectionStart = tempTextBoxBase.SelectionStart;
tempTextBoxBase.Text = tempTextBoxBase.Text.Insert(selectionStart, tempText);
tempTextBoxBase.Select(selectionStart, tempText.Length);
action?.Invoke();
};
yourCtr.DragEnter += (sender,e)=>
{
if (e.Data.GetData(typeof(string)) == null)
{
e.Effect = System.Windows.Forms.DragDropEffects.None;
}
else
{
e.Effect = System.Windows.Forms.DragDropEffects.Move;
}
};
}
public static void SetRichTextBoxDropString(System.Windows.Forms.RichTextBox yourRtb)
{
if(yourRtb==null)
{
return;
}
yourRtb.AllowDrop = true;
yourRtb.DragDrop += Rtb_DragDrop;
yourRtb.DragEnter += Rtb_DragEnter;
}
private static void Rtb_DragEnter(object sender, System.Windows.Forms.DragEventArgs e)
{
if (e.Data.GetData(typeof(string)) == null)
{
e.Effect = System.Windows.Forms.DragDropEffects.None;
}
}
private static void Rtb_DragDrop(object sender, System.Windows.Forms.DragEventArgs e)
{
System.Windows.Forms.RichTextBox tempRichTextBox = sender as System.Windows.Forms.RichTextBox;
string tempText = (string)e.Data.GetData(typeof(string));
if (tempText == null || tempRichTextBox==null)
{
return;
}
int selectionStart = tempRichTextBox.SelectionStart;
tempRichTextBox.Text = tempRichTextBox.Text.Insert(selectionStart, tempText);
tempRichTextBox.Select(selectionStart, tempText.Length);
}
}
[System.Security.SuppressUnmanagedCodeSecurity]
internal static class UnsafeNativeMethods
{
[System.Runtime.InteropServices.DllImport("user32")]
public static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
}
public static class MyExtensionMethods
{
public static int GetLatency(this System.Windows.Forms.LinkLabel llb)
{
//delay:200ms
string tempText = llb.Text;
int latency = 0;
if (tempText.StartsWith("delay:") && tempText.EndsWith("ms"))
{
tempText = tempText.Substring(6, tempText.Length - 8);
if(!int.TryParse(tempText,out latency))
{
latency = 0;
}
}
return latency;
}
public static void SetLatency(this System.Windows.Forms.LinkLabel llb, int latency)
{
if(latency>0)
{
llb.Text = string.Format("delay:{0}ms", latency);
}
else
{
llb.Text = "";
}
}
///
/// 添加带颜色内容
///
/// 目标richtextbox
/// 输入内容
/// 颜色
/// 是否换行
public static void AddRtbStr(this RichTextBox rtb, string strInput, Color fontColor, bool isNewLine , Font font = null)
{
lock (rtb)
{
int p1 = rtb.TextLength;
//rtb.SelectionColor = fontColor;
if (isNewLine)
{
rtb.AppendText(strInput + "\n"); //保留每行的所有颜色。 // rtb.Text += strInput + "/n"; //添加时,仅当前行有颜色。
}
else
{
rtb.AppendText(strInput);
}
int p2 = strInput.Length;
rtb.Select(p1, p2);
rtb.SelectionColor = fontColor;
//rtb.SelectionFont = new Font(FontFamily.GenericMonospace, 14);
if(font!=null)
{
rtb.SelectionFont = font;
}
rtb.Select(rtb.TextLength, 0);
rtb.SelectionColor = rtb.ForeColor;
if (font != null)
{
rtb.SelectionFont = rtb.Font;
}
}
}
}
}
================================================
FILE: FreeHttpControl/EditCookieForm.Designer.cs
================================================
namespace FreeHttp.FreeHttpControl
{
partial class EditCookieForm
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditCookieForm));
this.rtb_setValue = new System.Windows.Forms.RichTextBox();
this.tb_name = new System.Windows.Forms.TextBox();
this.rtb_value = new System.Windows.Forms.RichTextBox();
this.lb_info_1 = new System.Windows.Forms.Label();
this.lb_info_2 = new System.Windows.Forms.Label();
this.lb_info_3 = new System.Windows.Forms.Label();
this.bt_ok = new System.Windows.Forms.Button();
this.tb_attribute = new FreeHttp.FreeHttpControl.WatermakTextBox();
this.SuspendLayout();
//
// rtb_setValue
//
this.rtb_setValue.Dock = System.Windows.Forms.DockStyle.Top;
this.rtb_setValue.Enabled = false;
this.rtb_setValue.Location = new System.Drawing.Point(0, 0);
this.rtb_setValue.Name = "rtb_setValue";
this.rtb_setValue.Size = new System.Drawing.Size(449, 70);
this.rtb_setValue.TabIndex = 0;
this.rtb_setValue.Text = "";
//
// tb_name
//
this.tb_name.Location = new System.Drawing.Point(87, 76);
this.tb_name.Name = "tb_name";
this.tb_name.Size = new System.Drawing.Size(350, 21);
this.tb_name.TabIndex = 1;
this.tb_name.TextChanged += new System.EventHandler(this.tb_attribute_TextChanged);
//
// rtb_value
//
this.rtb_value.Location = new System.Drawing.Point(87, 103);
this.rtb_value.Name = "rtb_value";
this.rtb_value.Size = new System.Drawing.Size(350, 85);
this.rtb_value.TabIndex = 2;
this.rtb_value.Text = "";
this.rtb_value.TextChanged += new System.EventHandler(this.tb_attribute_TextChanged);
//
// lb_info_1
//
this.lb_info_1.AutoSize = true;
this.lb_info_1.Location = new System.Drawing.Point(7, 80);
this.lb_info_1.Name = "lb_info_1";
this.lb_info_1.Size = new System.Drawing.Size(35, 12);
this.lb_info_1.TabIndex = 4;
this.lb_info_1.Text = "Name:";
//
// lb_info_2
//
this.lb_info_2.AutoSize = true;
this.lb_info_2.Location = new System.Drawing.Point(8, 112);
this.lb_info_2.Name = "lb_info_2";
this.lb_info_2.Size = new System.Drawing.Size(41, 12);
this.lb_info_2.TabIndex = 5;
this.lb_info_2.Text = "Value:";
//
// lb_info_3
//
this.lb_info_3.AutoSize = true;
this.lb_info_3.Location = new System.Drawing.Point(9, 199);
this.lb_info_3.Name = "lb_info_3";
this.lb_info_3.Size = new System.Drawing.Size(71, 12);
this.lb_info_3.TabIndex = 6;
this.lb_info_3.Text = "Attributes:";
//
// bt_ok
//
this.bt_ok.Location = new System.Drawing.Point(362, 219);
this.bt_ok.Name = "bt_ok";
this.bt_ok.Size = new System.Drawing.Size(75, 23);
this.bt_ok.TabIndex = 7;
this.bt_ok.Text = "confirm";
this.bt_ok.UseVisualStyleBackColor = true;
this.bt_ok.Click += new System.EventHandler(this.bt_ok_Click);
//
// tb_attribute
//
this.tb_attribute.Location = new System.Drawing.Point(87, 195);
this.tb_attribute.Name = "tb_attribute";
this.tb_attribute.Size = new System.Drawing.Size(350, 21);
this.tb_attribute.TabIndex = 3;
this.tb_attribute.WatermarkText = "Domain=company.cn; HttpOnly;Path=/; Expires=Wed, 30 Aug 2019 00:00:00 GMT";
this.tb_attribute.TextChanged += new System.EventHandler(this.tb_attribute_TextChanged);
//
// EditCookieForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(449, 254);
this.Controls.Add(this.bt_ok);
this.Controls.Add(this.lb_info_3);
this.Controls.Add(this.lb_info_2);
this.Controls.Add(this.lb_info_1);
this.Controls.Add(this.tb_attribute);
this.Controls.Add(this.rtb_value);
this.Controls.Add(this.tb_name);
this.Controls.Add(this.rtb_setValue);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "EditCookieForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "EditCookieForm";
this.Load += new System.EventHandler(this.EditCookieForm_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.RichTextBox rtb_setValue;
private System.Windows.Forms.TextBox tb_name;
private System.Windows.Forms.RichTextBox rtb_value;
private WatermakTextBox tb_attribute;
private System.Windows.Forms.Label lb_info_1;
private System.Windows.Forms.Label lb_info_2;
private System.Windows.Forms.Button bt_ok;
private System.Windows.Forms.Label lb_info_3;
}
}
================================================
FILE: FreeHttpControl/EditCookieForm.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl
{
public partial class EditCookieForm : Form
{
ListView editListView;
public EditCookieForm(ListView yourEditListView)
{
InitializeComponent();
editListView = yourEditListView;
tb_name.Text = "name";
rtb_value.Text = "vaule";
tb_attribute.Text = "Path=/";
}
public EditCookieForm(ListView yourEditListView , string name, string vaule, string attribute)
: this(yourEditListView)
{
if (name != null) { tb_name.Text = name; }
if (vaule != null) { rtb_value.Text = vaule; }
if (attribute != null) { tb_attribute.Text = attribute; }
}
private void EditCookieForm_Load(object sender, EventArgs e)
{
UpdataSetText();
//this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximumSize = this.Size;
this.MinimumSize = this.Size;
}
private void tb_attribute_TextChanged(object sender, EventArgs e)
{
UpdataSetText();
}
private void bt_ok_Click(object sender, EventArgs e)
{
if (tb_attribute.Text.Contains("Domain=www.yourhost.com"))
{
MessageBox.Show("please change Domain=www.yourhost.com to your web host\r\nwww.yourhost.com is just a example", "edit Domain");
editListView.Tag = null;
return;
}
editListView.Items.Add(rtb_setValue.Text);
this.Close();
}
private void UpdataSetText()
{
if (tb_attribute.Text != "")
{
rtb_setValue.Text = string.Format("Set-Cookie: {0}={1}; {2}", tb_name.Text, rtb_value.Text, tb_attribute.Text);
}
else
{
rtb_setValue.Text = string.Format("Set-Cookie: {0}={1}", tb_name.Text, rtb_value.Text);
}
}
}
}
================================================
FILE: FreeHttpControl/EditCookieForm.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
AAABAAEAgGQAAAEAIABozgAAFgAAACgAAACAAAAAyAAAAAEAIAAAAAAAAMgAAGmKAABpigAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABfAAAAsAAAAOAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA9AAAAMIAAACKAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAAlwAA
APIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADJAAAATAAA
AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAABAAAAUAAAANAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAigAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwAAADkAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAiAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAATAAAAuAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADvAAAATAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAHsAAAD+AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADKAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAuAAAA4gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB0AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFsAAAD2AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKwAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAlAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD8AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPkAAAD5AAAA+QAA
APkAAAD5AAAA+QAAAPkAAAD5AAAA+QAAAPoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA1QAA
ABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC5AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAKsAAABOAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAA
AE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABPAAAATwAAAE8AAABNAAAAdAAA
APcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADpAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyAAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP4AAABZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAQAAAFsAAACoAAAAZAAAACMAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADzAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAswAAAP8AAAD9AAAA3AAA
AJwAAABQAAAAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAACDAAAA/wAAAP8AAAD/AAAA/wAAAPcAAADPAAAAiwAAAD8AAAAPAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE4AAAD7AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAL4AAAB0AAAAMAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADYAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAN8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADnAAAArwAAAGAAAAAhAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPMAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAvwAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/AAAANsAAACaAAAAUAAA
ABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD2AAAAzgAAAIcAAAA9AAAADgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AFkAAAD8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPAAAAC+AAAAdAAAADAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKQAAAOMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAywAA
ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAOAAAAxAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAABNAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADPAAAAOgAA
AAAAAAAAAAAAJQAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAF8AAAD7AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAtAAAACkAAAAAAAAAAAAAADcAAADJAAAA4gAAAEcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALQAAAOoAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAJ4AAAAZAAAAAAAA
AAAAAABGAAAA2AAAAP8AAAD/AAAA1QAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAASAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPkAAACNAAAADwAAAAAAAAADAAAAWwAAAOIAAAD/AAAA/wAAAP8AAAD/AAAAvAAA
AB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADrAAAAcQAAAAgAAAAAAAAACQAA
AHoAAADvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArAAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAD8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA4gAAAFcAAAABAAAAAAAAAA8AAACLAAAA+gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAlwAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADzAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAA
APAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANgAAABGAAAAAAAAAAAAAAAbAAAAoAAA
APwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD4AAAAeAAAAAQAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAygAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAC/AAAAMwAAAAAAAAAAAAAALQAAALwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADxAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAACjAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqgAAACAAAAAAAAAAAAAAADoAAADOAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADrAAAAUAAA
AAAAAAAAAAAAAAAAADYAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGcAAAD+AAAA/wAAAP8AAAD/AAAA/AAA
AJsAAAAUAAAAAAAAAAAAAABOAAAA2QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADZAAAANwAAAAAAAAAAAAAANgAAAPMAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAPQAAAPIAAAD/AAAA/wAAAPEAAAB+AAAADAAAAAAAAAAFAAAAawAAAOkAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADHAAAAJwAAAAAAAAA2AAAA8wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAA0AAAAP8AAADpAAAAZAAA
AAQAAAAAAAAACwAAAH0AAAD2AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC6AAAAGAAAADMAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAQAAACqAAAA5AAAAFMAAAAAAAAAAAAAABQAAACSAAAA+QAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAACbAAAARAAAAPIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEYAAAA/AAAAAAAA
AAAAAAAiAAAAsAAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPgAAACzAAAA9QAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAMMAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADMAAADQAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJQAAAMcAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANAAAANUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASwAAAOoAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAPEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAdQAA
APcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAkQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAXwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAATAAAArAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAABeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAugAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAHEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAsAAAAzwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA3QAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAAA5AAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAygAA
ACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVAAAA6wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAsgAAABkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAABqAAAA9AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAogAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAACKAAAA/gAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD+AAAAiQAAAAYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAA4AAACdAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD0AAAAbAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcAAACwAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADtAAAAWgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAADMAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADlAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADoAAADaAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADPAAAALgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAAADkAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC+AAAAIAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAGIAAADzAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAACwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAH4AAAD6AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP4AAACRAAAACgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAAI8AAAD9AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPgAAAB5AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAA
AKgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APQAAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAAAMQAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOgAAABLAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAALwAAAM8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAANcAAAA3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAN8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMsAAAApAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAWgAAAPEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAALcAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAbwAA
APUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/gAA
AJoAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAgwAAAPsAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+wAAAIgAAAAIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAOAAAAoQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA+gAAAF8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAtwAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADCAAAALwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAmAAAAxgAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD+AAAAswAAACIAAAAAAAAAAgAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAA2wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAJQAAAAWAAAAAAAAAAMAAABhAAAAvwAA
ADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AIcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRAAAA6QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
APUAAAB8AAAACwAAAAAAAAAJAAAAdAAAAO8AAAD/AAAAvwAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABqAAAA+gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADsAAAAbAAAAAQAAAAAAAAAEwAAAJMAAAD4AAAA/wAA
AP8AAAD/AAAAqAAAABMAAAAAAAAAAAAAAAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUAAADzAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2gAA
AFAAAAABAAAAAAAAAB0AAACoAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAmAAAAAsAAAAAAAAAAAAA
AAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANQAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMwAAAA6AAAAAAAAAAAAAAAsAAAAuQAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD7AAAAewAAAAMAAAAAAAAAAAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAjAAAAAwAAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAA
AA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAA
AA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAA
AA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAA
AA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAA
AA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAA4AAAAOAAAADgAAAAsAAABBAAAA8wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAC+AAAALAAA
AAAAAAAAAAAAQwAAANEAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADwAAAAYQAA
AAAAAAAAAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADeAAAAvQAAAL4AAAC+AAAAvgAA
AL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAA
AL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAA
AL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAA
AL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAA
AL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAAAL4AAAC+AAAAvgAA
AL4AAAC+AAAAvQAAAMoAAAD8AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD8AAAAoQAAABwAAAAAAAAAAQAAAFMAAADiAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADpAAAATwAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+QAAAIoAAAAPAAAAAAAA
AAYAAABpAAAA6gAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADbAAAAPwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPEAAAB5AAAACAAAAAAAAAAOAAAAiQAAAPQAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADVAAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADhAAAAXAAAAAMAAAAAAAAAFwAA
AJwAAAD+AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA1gAAAEUAAAAAAAAAAAAAACUAAACvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAMkAAAA2AAAAAAAAAAAAAAA5AAAAyQAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AN8AAACpAAAAJAAAAAAAAAAAAAAASAAAANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAcQAAAA4AAAAAAAAABAAAAF8AAADkAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADUAAAARAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAABeAAAAAAAAAAoAAAB+AAAA8QAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAxwAAADUAAAAAAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAF8AAAAAAAAAIAAAANEAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAALkAAAAnAAAAAAAAAAAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAAXwAAAAAAAAAAAAAATQAAAOgAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAPoAAACcAAAAGgAAAAAAAAAAAAAAAAAA
AP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAABfAAAAAAAAAAAAAAAAAAAAaQAA
APUAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD3AAAAgwAAAA0AAAAAAAAAAAAAAAAAAAAAAAAA1wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA9gAAAEsAAAAAAAAAAAAAAAAAAAAEAAAAewAAAPgAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA8AAAAHIAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAACpAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADfAAAAIgAAAAAAAAAAAAAAAAAA
AAAAAAAKAAAAkQAAAP4AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AN4AAABXAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD8AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAMcAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAsAAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADQAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAARgAAAPMAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAlAAAAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAiAAAAwAAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAwwAA
ADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAvgAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAPMAAABOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA0AAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/QAAAKYAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABFAAAA6wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAkwAAAAYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA2wAAAP8AAAD/AAAA/wAAAPMAAACMAAAAEgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAACBAAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAM0AAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA1AAAAlAAAALUAAACcAAAATgAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAACvAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADiAAAASwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAACwAAAAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ABYAAACBAAAA6wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD8AAAAtgAAADkAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAABEAAAAvgAAAPMAAAD8AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD2AAAA3wAAAHkAAAARAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAXAAAARgAAAH0AAACpAAAA1wAAAP0AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAO0AAAC4AAAAkwAA
AFoAAAArAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAf////AAAAAAAA
AAAAAAAAD////wAAAAAAAAAAAAAAAAf///8AAAAAAAAAAAAAAAAD////AAAAAAAAAAAAAAAAA////wAA
AAAAAAAAAAAAAAP///8AAAAAAAAAAAAAAAAD////AAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAH/
//8AAAAAAAAAAAAAAAAB////AB/////////////AAf///wAf//////wP////wAH///8AH//////4A///
/8AB////AB//////+AB////AAf///wAf//////gAH///wAH///8AH//////4AAP//8AB////AB//////
+AAAf//AAf///wAf//////wAAB//wAH///8AH//////8AAAD/8AB////AB///////AAAAP/AAf///wAf
//////wAAAD/wAH///8AH//////8AAAA/8AB////AB///////gAAAB/AAf///wAf//////4AAAAPwAH/
//8AH//////+AAAAB8AB////AB///////gAAAAPAAf///wAf//////8AAAABwAH///8AH///////AAAA
AcAB////AB///////wAAAADAAf///wAf//////8AAAAAQAH///8AH///////gAAAAAAB////AB//////
/4AAAAAAAf///wAf//////+AAAAAAAH///8AH///////wAAAAAAB////AB///////8AAAAAAAf///wAf
///////AAAAAAAH///8AH///////wAAAAAAB////AB///////8AAAAAAAf///wAf///////AAAAAAAH/
//8AH///////+AAAAAAB////AB////////gAAAAAAf///wAf///////4AAAAAAH///8AH////////AAA
AAAB////AB////////4AAAAAAf///wAf////////AAAAAAH///8AH////////4AAAAAB////AB//////
//+AAAAAAP///wAf////////wAAAAAB///8AH////////+AAAAAAP///AB/////////wAAAAAB///wAf
////////+AAAAAAf//8AH/////////wAAAAAD///AB/////////8AAAAAAf//wAf/////////gAAAAAD
//8AH/////////8AAAAAAf//AB//////////wAAAAAD//wAf/////////8AAAAAAf/8AH//////////g
AAAAAH//AB//////////8AAAAAA//wAf//////////gAAAAAD/8AH//////////8AAAAAA//AB//////
/////gAAAAAH/wAf//////////4AAAAAA/8AH///////////AAAAAAH/AB///////////4AAAAAA/wAf
///////////AAAAAAP8AH///////////4AAAAAB/AB////////////AAAAAAfwAf///////////4AAAA
AB8AH///////////+AAAAAAPAB////////////wAAAAADwAf///////////+AAAAAAMAH///////////
/wAAAAABAB////////////+AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAAAAAAAAAAAAAAAAAAAwAAAAAAAAAAAAAAAAAAAA8AAAAAAAAAAAAAAAACAAAPAAAAAAAA
AAAAAAAAAwAAPwAAAAAAAAAAAAAAAAOAAH8AAAAAAAAAAAAAAAADwAD/AAAAAAAAAAAAAAAAB+AB/wAA
AAAAAAAAAAAAAA/wB/8AAAAAAAAAAAAAAAAP+A//gAAAAAAAAAAAAAAAH////8AAAAAAAAAAAAAAAD//
//8=
================================================
FILE: FreeHttpControl/EditKeyVaule.Designer.cs
================================================
namespace FreeHttp.FreeHttpControl
{
partial class EditKeyVaule
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditKeyVaule));
this.lb_info_2 = new System.Windows.Forms.Label();
this.lb_info_1 = new System.Windows.Forms.Label();
this.rtb_value = new System.Windows.Forms.RichTextBox();
this.tb_key = new System.Windows.Forms.TextBox();
this.bt_ok = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// lb_info_2
//
this.lb_info_2.AutoSize = true;
this.lb_info_2.Location = new System.Drawing.Point(14, 48);
this.lb_info_2.Name = "lb_info_2";
this.lb_info_2.Size = new System.Drawing.Size(41, 12);
this.lb_info_2.TabIndex = 9;
this.lb_info_2.Text = "Value:";
//
// lb_info_1
//
this.lb_info_1.AutoSize = true;
this.lb_info_1.Location = new System.Drawing.Point(13, 16);
this.lb_info_1.Name = "lb_info_1";
this.lb_info_1.Size = new System.Drawing.Size(29, 12);
this.lb_info_1.TabIndex = 8;
this.lb_info_1.Text = "Key:";
//
// rtb_value
//
this.rtb_value.Location = new System.Drawing.Point(93, 39);
this.rtb_value.Name = "rtb_value";
this.rtb_value.Size = new System.Drawing.Size(250, 111);
this.rtb_value.TabIndex = 7;
this.rtb_value.Text = "";
//
// tb_key
//
this.tb_key.Location = new System.Drawing.Point(93, 12);
this.tb_key.Name = "tb_key";
this.tb_key.Size = new System.Drawing.Size(250, 21);
this.tb_key.TabIndex = 6;
//
// bt_ok
//
this.bt_ok.Location = new System.Drawing.Point(268, 157);
this.bt_ok.Name = "bt_ok";
this.bt_ok.Size = new System.Drawing.Size(75, 23);
this.bt_ok.TabIndex = 10;
this.bt_ok.Text = "confirm";
this.bt_ok.UseVisualStyleBackColor = true;
this.bt_ok.Click += new System.EventHandler(this.bt_ok_Click);
//
// AddHead
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(351, 185);
this.Controls.Add(this.bt_ok);
this.Controls.Add(this.lb_info_2);
this.Controls.Add(this.lb_info_1);
this.Controls.Add(this.rtb_value);
this.Controls.Add(this.tb_key);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "AddHead";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "AddHead";
this.Load += new System.EventHandler(this.EditKeyVaule_Load);
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lb_info_2;
private System.Windows.Forms.Label lb_info_1;
private System.Windows.Forms.RichTextBox rtb_value;
private System.Windows.Forms.TextBox tb_key;
private System.Windows.Forms.Button bt_ok;
}
}
================================================
FILE: FreeHttpControl/EditKeyVaule.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl
{
public partial class EditKeyVaule : Form
{
ListView editListView;
string splitStr; //splitStr ": "
bool isAdd; //add or edit mode
bool isUnique; //is not allow repetition
public EditKeyVaule(ListView yourEditListView , bool yourIsAdd ,string yourSplitStr)
{
InitializeComponent();
editListView = yourEditListView;
isAdd = yourIsAdd;
splitStr = yourSplitStr == null ? ": " : yourSplitStr;
}
public EditKeyVaule(ListView yourEditListView, string yourHeadKey,string yourSplitStr)
: this(yourEditListView, true, yourSplitStr)
{
tb_key.Text = yourHeadKey;
tb_key.Enabled = false;
}
public EditKeyVaule(ListView yourEditListView, bool yourIsAdd, bool yourIsUnique, string yourSplitStr)
: this(yourEditListView, yourIsAdd, yourSplitStr)
{
isUnique = yourIsUnique;
}
private void EditKeyVaule_Load(object sender, EventArgs e)
{
if(!isAdd)
{
string headStr= editListView.SelectedItems[0].Text;
if (headStr.Contains(splitStr))
{
tb_key.Text = headStr.Remove(headStr.IndexOf(splitStr));
rtb_value.Text = headStr.Substring(headStr.IndexOf(splitStr) + splitStr.Length);
}
}
//this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.MaximumSize = this.Size;
this.MinimumSize = this.Size;
}
private void bt_ok_Click(object sender, EventArgs e)
{
if(tb_key.Text==""||rtb_value.Text=="")
{
MessageBox.Show("input key and value","Stop" , MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
else
{
string tempItemStr = String.Format("{0}{1}{2}", tb_key.Text, splitStr, rtb_value.Text);
if(isUnique)
{
foreach(ListViewItem tempItem in editListView.Items)
{
if (tempItem.Text == tempItemStr)
{
if(!isAdd && tempItem==editListView.SelectedItems[0])
{
continue;
}
MessageBox.Show("Find the same data in the list", "Stop", MessageBoxButtons.OK, MessageBoxIcon.Stop);
return;
}
}
}
if (isAdd)
{
editListView.Items.Add(tempItemStr);
}
else
{
editListView.SelectedItems[0].Text = tempItemStr;
}
this.Close();
}
}
}
}
================================================
FILE: FreeHttpControl/EditKeyVaule.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAJAJkALQCXAGUAmACYAJgAzACY
AOcAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZ
APAAmQDwAJgA5wCYAMwAmACYAJcAZQCZAC0AjQAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAlQApAJkAkQCYANkAmAD4AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA+ACY
ANkAmQCRAJUAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwACAJcAfgCYAPEAmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADxAJcAfgB/AAIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcAJQCY
AL0AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJgAvQCXACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVAC4AmADbAJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA2wCV
AC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAjAJgA4ACZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA4ACZACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAH8ABACYAL8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCY
AP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgAvwB/AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQB9AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/wCWAP8CmgL/BZwH/wadCP8GnQj/Bp0I/wad
CP8GnQj/Bp0I/wadCP8GnQj/Bp0I/wadCP8GnQj/Bp0I/wadCP8GnQj/Bp0I/wadCP8FnAf/ApoC/wCW
AP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkAfQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJcAJQCYAPQAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wCX
AP8Uph3/NbtL/0vJa/9U0Hn/WNJ+/1fRff9X0X3/V9F9/1fRff9X0X3/V9F9/1fRff9X0X3/V9F9/1fR
ff9X0X3/V9F9/1fRff9X0X3/WNJ+/1TQef9LyWv/NbtL/xSmHf8AlwD/AJgA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmAD0AJcAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACTAJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8DmwX/NrxO/13Whv9k2Y//YdiL/2DXif9f1on/X9eJ/1/X
if9f14n/X9eJ/1/Xif9f14n/X9eJ/1/Xif9f14n/X9eJ/1/Xif9f14n/X9eJ/1/Xif9f1on/YNeJ/2HY
i/9k2Y//XdaG/za8Tv8DmwX/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlwCSAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAH8ACACYAN8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/BZsI/0XG
Yf9l2pD/YdeJ/1/Wh/9f1of/X9aH/2DWiP9g1oj/YNaI/2DWiP9g1oj/YNaI/2DWiP9g1oj/YNaI/2DW
iP9g1oj/YNaI/2DWiP9g1oj/YNaI/2DWiP9f1of/X9aH/1/Wh/9h14n/ZdqQ/0XGYf8Fmwj/AJgA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAN8AfwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlgAxAJgA/ACZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCWAP84vU//Z9yS/2DXiP9g14j/YdeI/2LYiv9g14j/X9eH/1/X
h/9f14f/X9eH/1/Xh/9f14f/X9eH/1/Xh/9f14f/X9eH/1/Xh/9f14f/X9eH/1/Xh/9f14f/X9eH/2DX
iP9i2Ir/YdeI/2DXiP9g14j/Z9yS/zi9T/8AlgD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/ACW
ADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAGYAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/FKYc/2HX
iP9j2Iv/YdeJ/2LYiv9g14j/TtN7/0PQc/8/z3D/QM9x/0DPcf9Az3H/QM9x/0DPcf9Az3H/QM9x/0DP
cf9Az3H/QM9x/0DPcf9Az3H/QM9x/0DPcf8/z3D/Q9Bz/07Te/9g14j/YtiK/2HXif9j2Iv/YdeI/xSm
HP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgAZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAnACZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCWAP85vlH/Z9yT/2HYiv9i2Iv/X9eI/0TQdP83zWv/Oc5s/zrO
bP86zmz/Os5s/zrObP86zmz/Os5s/zrObP86zmz/Os5s/zrObP86zmz/Os5s/zrObP86zmz/Os5s/zrO
bP85zmz/N81r/0TQdP9f14j/YtiL/2HYiv9n3JP/Ob5R/wCWAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAAUAmADOAJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/ApsD/1DM
cf9m2o//YtiL/2XYjP9O03z/OM5r/zvPbv88z27/O89u/zvPbv87z27/O89u/zvPbv87z27/O89u/zvP
bv87z27/O89u/zvPbv87z27/O89u/zvPbv87z27/O89u/zzPbv87z27/OM5r/07TfP9l2Iz/YtiL/2ba
j/9QzHH/ApsD/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAM4AmQAFAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEADgCZ
AOsAmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8GnQj/W9WB/2baj/9k2Yz/Y9mM/0XRdf88z27/PtBv/z7Q
b/8+0G//PtBv/z7Qb/8+0G//PtBv/z7Qb/8+0G//PtBv/z7Qb/8+0G//PtBv/z7Qb/8+0G//PtBv/z7Q
b/8+0G//PtBv/z7Qb/88z27/RdF1/2PZjP9k2Yz/ZtqP/1vVgf8GnQj/AJgA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA6wCRAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAPAJgA8QCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wad
Cf9g1oX/Z9uP/2bajv9k2oz/RdF0/z7QcP8/0HH/P9Bx/z/Qcf8/0HH/P9Bx/z/Qcf8/0HH/P9Bx/z/Q
cf8/0HH/P9Bx/z/Qcf8/0HH/P9Bx/z/Qcf8/0HH/P9Bx/z/Qcf8/0HH/P9Bx/z7QcP9F0XT/ZNqM/2ba
jv9n24//YNaF/wadCf8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADxAJkADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ
AA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/Bp0J/2HWhv9p25H/aNqP/2bajv9G0nb/P9Fx/0DR
cv9A0XL/QNFy/0DRcv9A0XL/QNFy/0DRcv9A0XL/QNFy/0DRcv9A0XL/QNFy/0DRcv9A0XL/QNFy/0DR
cv9A0XL/QNFy/0DRcv9A0XL/P9Fx/0bSdv9m2o7/aNqP/2nbkf9h1ob/Bp0J/wCYAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCY
AP8GnQn/YteH/2rck/9p25D/Z9uP/0nTd/9C0nL/Q9Jz/0PSc/9D0nP/Q9Jz/0PSc/9D0nP/Q9Jz/0PS
c/9D0nP/Q9Jz/0PSc/9D0nP/Q9Jz/0PSc/9D0nP/Q9Jz/0PSc/9D0nP/Q9Jz/0PSc/9C0nL/SdN3/2fb
j/9p25D/atyT/2LXh/8GnQn/AJgA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZAA8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wadCf9k2Ij/a92U/2rckf9o3JD/StN5/0PS
dP9E0nX/RNJ1/0TSdf9E0nX/RNJ1/0TSdf9E0nX/RNJ1/0TSdf9E0nX/RNJ1/0TSdf9E0nX/RNJ1/0TS
df9E0nX/RNJ1/0TSdf9E0nX/RNJ1/0PSdP9K03n/aNyQ/2rckf9r3ZT/ZNiI/wadCf8AmAD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQDwAJkADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmAD/B50J/2XYif9t3ZX/bNyS/2rckf9M1Hv/RdN2/0bTd/9G03f/RtN3/0bTd/9G03f/RtN3/0bT
d/9G03f/RtN3/0bTd/9G03f/RtN3/0bTd/9G03f/RtN3/0bTd/9G03f/RtN3/0bTd/9G03f/RdN2/0zU
e/9q3JH/bNyS/23dlf9l2In/B50J/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8HnQn/ZtiJ/2/dlf9t3JL/bNyR/07V
fP9H1Hf/SNR4/0jUeP9I1Hj/SNR4/0jUeP9I1Hj/SNR4/0jUeP9I1Hj/SNR4/0jUeP9I1Hj/SNR4/0jU
eP9I1Hj/SNR4/0jUeP9I1Hj/SNR4/0jUeP9H1Hf/TtV8/2zckf9t3JL/b92V/2bYif8HnQn/AJgA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA/wedCf9n2Iv/cN2X/2/clP9t3JP/T9V9/0jUeP9J1Hn/SdR5/0nUef9J1Hn/SdR5/0nU
ef9J1Hn/SdR5/0nUef9J1Hn/SdR5/0nUef9J1Hn/SdR5/0nUef9J1Hn/SdR5/0nUef9J1Hn/SdR5/0jU
eP9P1X3/bdyT/2/clP9w3Zf/Z9iL/wedCf8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAJkADwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/B50J/2najP9y35j/cN6V/2/e
lP9S13//S9Z6/0zWe/9M1nv/TNZ7/0zWe/9M1nv/TNZ7/0zWe/9M1nv/TNZ7/0zWe/9M1nv/TNZ7/0zW
e/9M1nv/TNZ7/0zWe/9M1nv/TNZ7/0zWe/9M1nv/S9Z6/1LXf/9v3pT/cN6V/3LfmP9p2oz/B50J/wCY
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZ
AP8AmQD/AJkA/wCYAP8HnQn/atuN/3Pgmf9x35b/cN+V/1PYgP9N13v/Ttd8/07XfP9O13z/Ttd8/07X
fP9O13z/Ttd8/07XfP9O13z/Ttd8/07XfP9O13z/Ttd8/07XfP9O13z/Ttd8/07XfP9O13z/Ttd8/07X
fP9N13v/U9iA/3Dflf9x35b/c+CZ/2rbjf8HnQn/AJgA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZ
AA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wedCf9r24//dOCb/3Lf
mP9x35f/VNiC/07Xff9P137/T9d+/0/Xfv9P137/T9d+/0/Xfv9P137/T9d+/0/Xfv9P137/T9d+/0/X
fv9P137/T9d+/0/Xfv9P137/T9d+/0/Xfv9P137/T9d+/07Xff9U2IL/cd+X/3LfmP904Jv/a9uP/wed
Cf8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAJkADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmAD/B50J/23bkP924Jz/dN+Z/3PfmP9X2YT/Udh//1LYgP9S2ID/UtiA/1LY
gP9S2ID/UtiA/1LYgP9S2ID/UtiA/1LYgP9S2ID/UtiA/1LYgP9S2ID/UtiA/1LYgP9S2ID/UtiA/1LY
gP9S2ID/Udh//1fZhP9z35j/dN+Z/3bgnP9t25D/B50J/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
APAAmQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8HnQn/b92S/3ji
nf924Zr/deGZ/1nahf9T2YD/VNmB/1TZgf9U2YH/VNmB/1TZgf9U2YH/VNmB/1TZgf9U2YH/VNmB/1TZ
gf9U2YH/VNmB/1TZgf9U2YH/VNmB/1TZgf9U2YH/VNmB/1TZgf9T2YD/WdqF/3Xhmf924Zr/eOKd/2/d
kv8HnQn/AJgA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZ
AP8AmQD/AJkA/wCZAP8AmQD/AJgA/wedCv9w3pP/eeOf/3finP924pv/W9uH/1Xagv9W2oP/VtqD/1ba
g/9W2oP/VtqD/1bag/9W2oP/VtqD/1bag/9W2oP/VtqD/1bag/9W2oP/VtqD/1bag/9W2oP/VtqD/1ba
g/9W2oP/VtqD/1Xagv9b24f/duKb/3finP9545//cN6T/wedCv8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQDwAJkADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/B50K/3Pe
lP9846H/euKe/3ninf9d24n/V9qE/1jahf9Y2oX/WNqF/1jahf9Y2oX/WNqF/1jahf9Y2oX/WNqF/1ja
hf9Y2oX/WNqF/1jahf9Y2oX/WNqF/1jahf9Y2oX/WNqF/1jahf9Y2oX/V9qE/13bif954p3/euKe/3zj
of9z3pT/B50K/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIsACwCZ
APAAmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8InQr/dN6U/33jof974p7/euKd/1/civ9Z24X/WtuG/1rb
hv9a24b/WtuG/1rbhv9a24b/WtuG/1rbhv9a24b/WtuG/1rbhv9a24b/WtuG/1rbhv9a24b/WtuG/1rb
hv9a24b/WtuG/1rbhv9Z24X/X9yK/3rinf974p7/feOh/3TelP8InQr/AJgA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA8ACLAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJkABQCJAA0AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCZ
AA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAeAJgA8QCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wid
Cv9135X/f+Oi/33in/984p7/Yd2M/1vch/9c3Ij/XNyI/1zciP9c3Ij/XNyI/1zciP9c3Ij/XNyI/1zc
iP9c3Ij/XNyI/1zciP9c3Ij/XNyI/1zciP9c3Ij/XNyI/1zciP9c3Ij/XNyI/1vch/9h3Yz/fOKe/33i
n/9/46L/dd+V/widCv8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADxAJkAHgCZAA8AmQAPAJkADwCZ
AA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCJAA0AmQAFAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAkAmQAtAJcAZQCYAJgAmADMAJgA5wCZ
APAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZ
APAAmAD+AJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/CJ4K/3ffl/+B5aT/f+Sh/37koP9k3o7/Xt2J/1/d
iv9f3Yr/X92K/1/div9f3Yr/X92K/1/div9f3Yr/X92K/1/div9f3Yr/X92K/1/div9f3Yr/X92K/1/d
iv9f3Yr/X92K/1/div9f3Yr/Xt2J/2Tejv9+5KD/f+Sh/4HlpP9335f/CJ4K/wCYAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCYAP4AmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZ
APAAmQDwAJkA8ACZAPAAmQDwAJgA5wCYAMwAmACYAJcAZQCZAC0AjQAJAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACV
ACkAmQCRAJgA2QCYAPgAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCY
AP8Ingr/ed+Y/4Plpf+B5KL/gOSh/2bej/9f3Yr/YN2L/2Ddi/9g3Yv/YN2L/2Ddi/9g3Yv/YN2L/2Dd
i/9g3Yv/YN2L/2Ddi/9g3Yv/YN2L/2Ddi/9g3Yv/YN2L/2Ddi/9g3Yv/YN2L/2Ddi/9f3Yr/Zt6P/4Dk
of+B5KL/g+Wl/3nfmP8Ingr/AJgA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA+ACYANkAmQCRAJUAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAIAlwB+AJgA8QCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wieCv964Jr/hOan/4LlpP+B5aP/aN+R/2Le
jP9j3o3/Y96N/2Pejf9j3o3/Y96N/2Pejf9j3o3/Y96N/2Pejf9j3o3/Y96N/2Pejf9j3o3/Y96N/2Pe
jf9j3o3/Y96N/2Pejf9j3o3/Y96N/2LejP9o35H/geWj/4LlpP+E5qf/euCa/wieCv8AmAD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADxAJcAfgB/
AAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlwAlAJgAvQCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmAD/CJ4K/3vhnP+F56n/g+am/4Lmpf9p4ZL/ZOCN/2Xgjv9l4I7/ZeCO/2Xgjv9l4I7/ZeCO/2Xg
jv9l4I7/ZeCO/2Xgjv9l4I7/ZeCO/2Xgjv9l4I7/ZeCO/2Xgjv9l4I7/ZeCO/2Xgjv9l4I7/ZOCN/2nh
kv+C5qX/g+am/4Xnqf974Zz/CJ4K/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgAvQCXACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJUALgCYANsAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8Ingr/fuGd/4jnqv+G5qf/heam/2zh
lf9m4JD/Z+CR/2fgkf9n4JH/Z+CR/2fgkf9n4JH/Z+CR/2fgkf9n4JH/Z+CR/2fgkf9n4JH/Z+CR/2fg
kf9n4JH/Z+CR/2fgkf9n4JH/Z+CR/2fgkf9m4JD/bOGV/4Xmpv+G5qf/iOeq/37hnf8Ingr/AJgA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA2wCVAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZACMAmADgAJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA/wieCv+A4p//iuis/4jnqf+H56j/buKW/2nhkv9q4ZP/auGT/2rhk/9q4ZP/auGT/2rh
k/9q4ZP/auGT/2rhk/9q4ZP/auGT/2rhk/9q4ZP/auGT/2rhk/9q4ZP/auGT/2rhk/9q4ZP/auGT/2nh
kv9u4pb/h+eo/4jnqf+K6Kz/gOKf/wieCv8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA4ACZACMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAfwAEAJgAvwCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCY
AP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AlwD/Bp0H/4HjoP+M6a3/ieiq/4no
qf9w45j/a+KT/2zilP9s4pT/bOKU/2zilP9s4pT/bOKU/2zilP9s4pT/bOKU/2zilP9s4pT/bOKU/2zi
lP9s4pT/bOKU/2zilP9s4pT/bOKU/2zilP9s4pT/a+KT/3DjmP+J6Kn/ieiq/4zprf+B46D/Bp0H/wCX
AP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCY
AP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmAD/AJgA/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJgAvwB/AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAH0AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlgD/AJUA/wObBP8HnQn/CZ4L/wieCv8Ingr/CJ4K/wie
Cv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wie
Cv8Ingr/CJ4K/widCv8QohT/hOOh/43prf+M6Kr/i+iq/3Lkmf9t45X/buOW/27jlv9u45b/buOW/27j
lv9u45b/buOW/27jlv9u45b/buOW/27jlv9u45b/buOW/27jlv9u45b/buOW/27jlv9u45b/buOW/27j
lv9t45X/cuSZ/4voqv+M6Kr/jemt/4Tjof8QohT/CJ0K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wie
Cv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wieCv8Ingr/CJ4K/wme
C/8HnQn/A5sE/wCVAP8AlgD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkAfQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAlwAlAJgA9ACZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/AJYA/yGr
KP9TyGT/dNuO/4Hinv+G5KP/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xk
ov+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xko/+N6Kz/juit/47o
rf+M6Kz/c+SZ/3DkmP9w5Jj/cOSY/3DkmP9w5Jj/cOSY/3DkmP9w5Jj/cOSY/3DkmP9w5Jj/cOSY/3Dk
mP9w5Jj/cOSY/3DkmP9w5Jj/cOSY/3DkmP9w5Jj/cOSY/3DkmP9z5Jn/jOis/47orf+O6K3/jeis/4Xk
o/+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/heSi/4Xk
ov+F5KL/heSi/4Xkov+F5KL/heSi/4Xkov+F5KL/huSj/4Hinv90247/U8hk/yGrKP8AlgD/AJcA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD0AJcAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAJMAmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJcA/wabCP9VyWj/kOqu/5jvuP+U7LP/kuux/5LrsP+S67H/kuux/5Lr
sf+S67H/kuux/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lr
sf+S67H/kuux/5Lrsf+S67H/kuuw/5Dqrv+P6q7/keqv/4foqP9z5Jr/c+Sa/3Pkmv9z5Jr/c+Sa/3Pk
mv9z5Jr/c+Sa/3Pkmv9z5Jr/c+Sa/3Pkmv9z5Jr/c+Sa/3Pkmv9z5Jr/c+Sa/3Pkmv9z5Jr/c+Sa/3Pk
mv9z5Jr/c+Sa/3Pkmv+H6Kj/keqv/4/qrv+Q6q7/kuuw/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lr
sf+S67H/kuux/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lrsf+S67H/kuux/5Lr
sf+S67D/kuux/5Tss/+Y77j/kOqu/1XJaP8Gmwj/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AlwCSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAfwAIAJgA3wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8InAr/atWB/5rv
u/+T67L/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5Hq
sP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5Lq
sP+Q6q//e+af/3Tlm/915Zv/deWb/3Xlm/915Zv/deWb/3Xlm/915Zv/deWb/3Xlm/915Zv/deWb/3Xl
m/915Zv/deWb/3Xlm/915Zv/deWb/3Xlm/915Zv/deWb/3Xlm/915Zv/dOWb/3vmn/+Q6q//kuqw/5Hq
sP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5Hq
sP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+R6rD/keqw/5HqsP+T67L/mu+7/2rV
gf8InAr/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAN8AfwAIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWADEAmAD8AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJYA/1jLav+d8b7/k+ux/5Lrsf+T67H/lOuy/5Lrsf+R67D/kuuw/5Lr
sP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5Lr
sP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+R67D/i+qs/33nof935p3/eOae/3jmnv945p7/eOae/3jm
nv945p7/eOae/3jmnv945p7/eOae/3jmnv945p7/eOae/3jmnv945p7/eOae/3jmnv945p7/eOae/3jm
nv945p7/eOae/3jmnv945p7/d+ad/33nof+L6qz/keuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5Lr
sP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5LrsP+S67D/kuuw/5Lr
sP+S67D/keuw/5Lrsf+U67L/k+ux/5Lrsf+T67H/nfG+/1jLav8AlgD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA/ACWADEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJgAZgCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCWAP8hrCf/lOyz/5ft
tf+U7LL/leyz/5Pssf+H6qn/gOik/33nof9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37n
ov9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/3zn
oP9655//eeee/3rnn/9655//euef/3rnn/9655//euef/3rnn/9655//euef/3rnn/9655//euef/3rn
n/9655//euef/3rnn/9655//euef/3rnn/9655//euef/3rnn/9655//euef/3rnn/9655//eeee/3rn
n/9856D/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37n
ov9+56L/fuei/37nov9+56L/fuei/37nov9+56L/fuei/37nov9956H/gOik/4fqqf+T7LH/leyz/5Ts
sv+X7bX/lOyz/yCrJv8AlgD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgAZgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACcAJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJYA/1vMbf+g8sD/lu20/5fttf+V7LT/g+mm/3rooP976KH/fOih/3zo
of986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zo
of986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zo
of986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zo
of986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zo
of986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zoof986KH/fOih/3zo
of986KH/fOih/3zoof976KH/euig/4Pppv+V7LT/l+21/5bttP+g8sD/Wsxt/wCWAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAM4AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8EmwX/ft+X/53w
u/+Y7bX/mu22/4rrrP986KH/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/p
o/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/p
o/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/p
o/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/p
o/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/p
o/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/f+mj/3/po/9/6aP/fOih/4rr
rP+a7bb/mO21/53wu/9+35f/BJsF/wCYAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAM4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkA6wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJgA/wmeC/+P56n/ne+6/5vttv+a7bf/huqo/3/po/+B6aT/gemk/4Hp
pP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4Hp
pP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4Hp
pP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4Hp
pP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4Hp
pP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4HppP+B6aT/gemk/4Hp
pP+B6aT/gemk/4HppP+B6aT/gemk/4HppP9/6aP/huqo/5rtt/+b7bb/ne+6/4/nqf8Jngv/AJgA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA6wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmADxAJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD/Cp4L/5Pp
rf+g77v/ne64/5vut/+H66n/guqm/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pq
p/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pq
p/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pq
p/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pq
p/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pq
p/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Pqp/+D6qf/g+qn/4Lq
pv+H66n/m+63/53uuP+g77v/k+mt/wqeC/8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADxAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ
APAAmQD/AJkA/wCZAP8AmQD/AJkA/wCYAP8Kngv/lOqu/6HwvP+e77n/ne+4/4nsq/+E66f/heuo/4Xr
qP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4Xr
qP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4Xr
qP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4Xr
qP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4Xr
qP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/heuo/4Xr
qP+F66j/heuo/4XrqP+F66j/heuo/4XrqP+F66j/hOun/4nsq/+d77j/nu+5/6HwvP+U6q7/Cp4L/wCY
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/wqe
C/+V6rD/ovG+/5/vu/+e77r/jOyt/4frqf+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jr
qv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jr
qv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jr
qv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jr
qv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jr
qv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jrqv+I66r/iOuq/4jr
qv+H66n/jOyt/57vuv+f77v/ovG+/5XqsP8Kngv/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8AAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/Cp4L/5jrsf+l8sD/ovC9/6HwvP+P7a//iuyr/4vs
rP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vs
rP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vs
rP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vs
rP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vs
rP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vs
rP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4vsrP+L7Kz/i+ys/4rsq/+P7a//ofC8/6Lwvf+l8sD/mOux/wqe
C/8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCX
AP8Kngz/muyz/6fzwf+k8b7/o/G9/5DusP+L7az/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4zt
rf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4zt
rf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4zt
rf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4zt
rf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4zt
rf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4ztrf+M7a3/jO2t/4zt
rf+M7a3/i+2s/5DusP+j8b3/pPG+/6fzwf+a7LP/Cp4M/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
APAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/wqeDP+c7LT/qfPD/6bxwP+l8b//k+6y/47u
sP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/u
sP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/u
sP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/u
sP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/u
sP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/u
sP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+P7rD/j+6w/4/usP+O7rD/k+6y/6Xxv/+m8cD/qfPD/5zs
tP8Kngz/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQDwAJkA/wCZAP8AmQD/AJkA/wCZ
AP8AlwD/Cp4M/57ttP+r9MP/qPLA/6fyv/+V77P/kO6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Hu
sf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Hu
sf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Hu
sf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Hu
sf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Hu
sf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Husf+R7rH/ke6x/5Hu
sf+R7rH/ke6x/5Dusf+V77P/p/K//6jywP+r9MP/nu20/wqeDP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Kngz/n+22/6z0xf+p8sL/qPLB/5fw
tP+S77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pv
sv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pv
sv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pv
sv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pv
sv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pv
sv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/k++y/5Pvsv+T77L/ku+y/5fwtP+o8sH/qfLC/6z0
xf+f7bb/Cp4M/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkA8ACZAP8AmQD/AJkA/wCZ
AP8AmQD/AJcA/wqeDP+h7rf/rvTG/6vyw/+q8sL/mfC2/5XwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bw
tP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bw
tP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bw
tP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bw
tP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bw
tP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bwtP+W8LT/lvC0/5bw
tP+W8LT/lvC0/5bwtP+V8LT/mfC2/6rywv+r8sP/rvTG/6Hut/8Kngz/AJcA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/Cp4M/6Luuf+w9cj/rfPF/6zz
xP+b8Lj/l/C2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jw
tv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jw
tv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jw
tv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jw
tv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jw
tv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5jwtv+Y8Lb/mPC2/5fwtv+b8Lj/rPPE/63z
xf+w9cj/ou65/wqeDP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAPAAmQD/AJkA/wCZ
AP8AmQD/AJkA/wCXAP8Lnwz/o+66/7H2yf+u9Mb/rfTG/53xuv+Z8bj/mvG4/5rxuP+a8bj/mvG4/5rx
uP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rx
uP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rx
uP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rx
uP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rx
uP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rxuP+a8bj/mvG4/5rx
uP+a8bj/mvG4/5rxuP+a8bj/mfG4/53xuv+t9Mb/rvTG/7H2yf+j7rr/C58M/wCXAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/wufDP+k7rv/svbL/6/0
x/+u9Mf/n/K7/5vyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zy
uf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zy
uf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zy
uf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zy
uf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zy
uf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+c8rn/nPK5/5zyuf+b8rn/n/K7/670
x/+v9Mf/svbL/6Tuu/8Lnwz/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8AAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQDwAJkA/wCZ
AP8AmQD/AJkA/wCZAP8AlwD/C58M/6fvvf+1983/svXJ/7H1yf+i873/nvK7/5/yu/+f8rv/n/K7/5/y
u/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/y
u/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/y
u/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/y
u/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/y
u/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/yu/+f8rv/n/K7/5/y
u/+f8rv/n/K7/5/yu/+f8rv/n/K7/57yu/+i873/sfXJ/7L1yf+1983/p++9/wufDP8AlwD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Lnwz/qe++/7f3
zv+09cr/s/XK/6Pzv/+f873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dz
vf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dz
vf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dz
vf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dz
vf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dz
vf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/oPO9/6Dzvf+g873/n/O9/6Pz
v/+z9cr/tPXK/7f3zv+p777/C58M/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkA8ACZ
AP8AmQD/AJkA/wCZAP8AmQD/AJcA/wufDP+r8L//ufjP/7b2y/+09sv/pvTA/6Lzvv+j877/o/O+/6Pz
vv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pz
vv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pz
vv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pz
vv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pz
vv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+j877/o/O+/6Pz
vv+j877/o/O+/6Pzvv+j877/o/O+/6Pzvv+i877/pvTA/7T2y/+29sv/ufjP/6vwv/8Lnwz/AJcA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmADxAJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/C58M/63w
wf+6+NH/uPbN/7f2zf+o9cL/pPTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0
wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0
wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0
wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0
wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0
wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6X0wP+l9MD/pfTA/6T0
wP+o9cL/t/bN/7j2zf+6+NH/rfDB/wufDP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADxAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ
AOsAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Lnwz/q/C//7340v+59s7/ufbO/6v1xP+m9MH/p/TC/6f0
wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0
wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0
wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0
wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0
wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0
wv+n9ML/p/TC/6f0wv+n9ML/p/TC/6f0wv+n9ML/pvTB/6v1xP+59s7/ufbO/7340v+r8L//C58M/wCX
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAOsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAzgCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wWc
Bv+c6a//wPnV/7r3z/+798//sfbJ/6j1wv+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1
w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1
w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1
w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1
w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1
w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1w/+p9cP/qfXD/6n1
w/+o9cL/sfbJ/7v3z/+698//wPnV/5zpr/8FnAb/AJgA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgAzgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAmACcAJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJUA/3PTgP/H/d3/u/fQ/7z40f+799D/r/bH/6r1
w/+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1
xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v2xP+r9sT/q/bE/6v2
xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v2
xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v2xP+r9sT/q/bE/6v1xP+r9cT/q/XE/6v1
xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1
xP+r9cT/q/XE/6v1xP+r9cT/q/XE/6v1xP+r9cT/qvXD/6/2x/+799D/vPjR/7v30P/H/d3/c9OA/wCV
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAGYAmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AlQD/Kq8w/7/50//A+tT/vfjR/7740v+9+NH/tffM/7H2yf+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2
yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2
yP+w9sj/sPbI/7D2yP+u9sf/rfbG/632xv+t9sb/rfbG/632xv+t9sb/rfbG/632xv+t9sb/rfbG/632
xv+t9sb/rfbG/632xv+t9sb/rfbG/632xv+t9sb/rfbG/632xv+t9sb/rfbG/632xv+t9sb/rfbG/632
xv+t9sb/rfbG/632xv+t9sb/rvbH/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2
yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7D2yP+w9sj/sPbI/7H2
yf+198z/vfjR/7740v+9+NH/wPrU/7/50/8qrzD/AJUA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCY
AGYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJYAMQCYAPwAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlQD/ctN//8z+4v/A+NP/v/jT/7/4
0//A+NP/v/jT/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/4
0v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7740v+7+M//svfK/672
x/+v98j/r/fI/6/3yP+v98j/r/fI/6/3yP+v98j/r/fI/6/3yP+v98j/r/fI/6/3yP+v98j/r/fI/6/3
yP+v98j/r/fI/6/3yP+v98j/r/fI/6/3yP+v98j/r/fI/6/3yP+u9sf/svfK/7v4z/+++NL/v/jS/7/4
0v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jS/7/4
0v+/+NL/v/jS/7/40v+/+NL/v/jS/7/40v+/+NL/v/jT/8D40/+/+NP/v/jT/8D40//M/uL/ctN//wCV
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmAD8AJYAMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAIAJgA3wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCXAP8JnQv/jeCd/87/4v/E+tf/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H5
1P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H5
1P/B+dT/wfnU/8H51P/B+dT/wfnU/8L51f/A+dT/tPjL/7H3yP+x98n/sffJ/7H3yf+x98n/sffJ/7H3
yf+x98n/sffJ/7H3yf+x98n/sffJ/7H3yf+x98n/sffJ/7H3yf+x98n/sffJ/7H3yf+x98n/sffJ/7H3
yf+x98n/sffI/7T4y//A+dT/wvnV/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H5
1P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H51P/B+dT/wfnU/8H5
1P/B+dT/wfnU/8H51P/E+tf/zv/i/47hnf8JnQv/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCY
AN8AfwAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAlwCSAJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCWAP8JnQv/ddSC/8P6
1v/P/+P/yfzc/8f72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b7
2f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/D+dX/wvnV/8P5
1v+++NL/svfK/7P3y/+z98v/s/fL/7P3y/+z98v/s/fL/7P3y/+z98v/s/fL/7P3y/+z98v/s/fL/7P3
y/+z98v/s/fL/7P3y/+z98v/s/fL/7P3y/+z98v/s/fL/7P3y/+y98r/vvjS/8P51v/C+dX/w/nV/8b7
2f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b7
2f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8b72f/G+9n/xvvZ/8f72f/J/Nz/z//j/8P61v911IL/Cp0L/wCW
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJcAkgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXACUAmAD0AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8AlgD/L7A0/3PSf/+j6rP/s/HF/7n0yv+488n/uPPJ/7jz
yf+488n/uPPJ/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jz
yf+488n/uPPJ/7jzyf+488n/ufTK/8P51f/E+db/xPnW/8P51f+2+M3/tfjM/7X4zP+1+Mz/tfjM/7X4
zP+1+Mz/tfjM/7X4zP+1+Mz/tfjM/7X4zP+1+Mz/tfjM/7X4zP+1+Mz/tfjM/7X4zP+1+Mz/tfjM/7X4
zP+1+Mz/tfjM/7b4zf/D+dX/xPnW/8T51v/D+dX/ufTK/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jz
yf+488n/uPPJ/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jzyf+488n/uPPJ/7jz
yf+59Mr/s/HF/6Pqs/9z0n//L7A0/wCWAP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCY
APQAlwAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAHwAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AlQD/AJUA/wWcBv8Kngz/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyf
Df8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wydDf8XpBn/uvTL/8j7
2//F+tf/xfrX/7n5zv+3+c3/t/nN/7f5zf+3+c3/t/nN/7f5zf+3+c3/t/nN/7f5zf+3+c3/t/nN/7f5
zf+3+c3/t/nN/7f5zf+3+c3/t/nN/7f5zf+3+c3/t/nN/7f5zf+3+c3/ufnO/8X61//F+tf/yPvb/7r0
y/8XpBn/DJ0N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyf
Df8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Mnw3/DJ8N/wyfDf8Kngz/BZwG/wCVAP8AlQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAwCZ
AL4AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA/wCXAP8AlwD/AJcA/wCX
AP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCX
AP8AlwD/AJcA/wCXAP8AlwD/AJUA/wmdCf+69Mv/yvzd/8f62f/G+tn/u/nQ/7n5z/+5+c//ufnP/7n5
z/+5+c//ufnP/7n5z/+5+c//ufnP/7n5z/+5+c//ufnP/7n5z/+5+c//ufnP/7n5z/+5+c//ufnP/7n5
z/+5+c//ufnP/7n5z/+7+dD/xvrZ/8f62f/K/N3/uvTL/wmdCf8AlQD/AJcA/wCXAP8AlwD/AJcA/wCX
AP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCX
AP8AlwD/AJcA/wCXAP8AmAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AL4AVQADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAIgCYAN4AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/DJ8N/7z1
zf/M/d7/yPva/8j72v+9+tH/u/nQ/7v50P+7+dD/u/nQ/7v50P+7+dD/u/nQ/7v50P+7+dD/u/nQ/7v5
0P+7+dD/u/nQ/7v50P+7+dD/u/nQ/7v50P+7+dD/u/nQ/7v50P+7+dD/u/nQ/7360f/I+9r/yPva/8z9
3v+89c3/DJ8N/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADeAJYAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJkALQCYANsAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Mnw3/vvXO/8793//K+9v/yfvb/7760/+8+dL/vPnS/7z5
0v+8+dL/vPnS/7z50v+8+dL/vPnS/7z50v+8+dL/vPnS/7z50v+8+dL/vPnS/7z50v+8+dL/vPnS/7z5
0v+8+dL/vPnS/7z50v+8+dL/vvrT/8n72//K+9v/zv3f/771zv8Mnw3/AJcA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA2wCZ
AC0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcAJQCYAL0AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/wyf
Df+/9c//z/3g/8v73P/L+9z/wfrU/7/60/+/+tP/v/rT/7/60/+/+tP/v/rT/7/60/+/+tP/v/rT/7/6
0/+/+tP/v/rT/7/60/+/+tP/v/rT/7/60/+/+tP/v/rT/7/60/+/+tP/v/rT/7/60//B+tT/y/vc/8v7
3P/P/eD/v/XP/wyfDf8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAL0AlwAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAH8AAgCXAH4AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/DJ8N/8H10P/R/eH/zfvd/8373f/C+9X/wPrU/8D6
1P/A+tT/wPrU/8D61P/A+tT/wPrU/8D61P/A+tT/wPrU/8D61P/A+tT/wPrU/8D61P/A+tT/wPrU/8D6
1P/A+tT/wPrU/8D61P/A+tT/wPrU/8L71f/N+93/zfvd/9H94f/B9dD/DJ8N/wCXAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAlwB+AH8AAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACV
ACkAmQCRAJkA1wCYAPgAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCX
AP8Mnw3/wvXQ/9L94f/O+93/zvvd/8T71v/C+9X/wvvV/8L71f/C+9X/wvvV/8L71f/C+9X/wvvV/8L7
1f/C+9X/wvvV/8L71f/C+9X/wvvV/8L71f/C+9X/wvvV/8L71f/C+9X/wvvV/8L71f/C+9X/xPvW/877
3f/O+93/0v3h/8L10P8Mnw3/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJgA+ACZANcAmQCRAJUAKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAIAJQAKwCXAGMAmACVAJgAygCZ
AOYAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZ
APAAmQDwAJgA/gCZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/w2fDv/D9tH/1P7i/9D83v/Q/N7/xvvX/8T7
1v/E+9b/xPvW/8T71v/E+9b/xPvW/8T71v/E+9b/xPvW/8T71v/E+9b/xPvW/8T71v/E+9b/xPvW/8T7
1v/E+9b/xPvW/8T71v/E+9b/xPvW/8T71v/G+9f/0Pze/9D83v/U/uL/w/bR/w2fDv8AlwD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmAD+AJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZ
APAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAOYAmADKAJgAlQCXAGMAlAArAH8ACAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAEAIkADQCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCZ
AA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAB4AmADxAJkA/wCZAP8AmQD/AJkA/wCZ
AP8AlwD/DZ8O/8T20f/V/uT/0fzg/9H84P/H+9n/xfvY/8X72P/F+9j/xfvY/8X72P/F+9j/xfvY/8X7
2P/F+9j/xfvY/8X72P/F+9j/xfvY/8X72P/F+9j/xfvY/8X72P/F+9j/xfvY/8X72P/F+9j/xfvY/8f7
2f/R/OD/0fzg/9X+5P/E9tH/DZ8O/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAPEAmQAeAJkADwCZ
AA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAJkADwCZAA8AmQAPAIkADQB/
AAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAIsACwCZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Nnw7/xfbT/9b+5f/S/OH/0vzh/8n8
2f/H/Nj/x/zY/8f82P/H/Nj/x/zY/8f82P/H/Nj/x/zY/8f82P/H/Nj/x/zY/8f82P/H/Nj/x/zY/8f8
2P/H/Nj/x/zY/8f82P/H/Nj/x/zY/8f82P/H/Nj/yfzZ/9L84f/S/OH/1v7l/8X20/8Nnw7/AJcA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACLAAsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZ
AP8AmQD/AJcA/w2fDv/G9tP/1/7l/9P84f/T/OH/yvzb/8j82v/I/Nr/yPza/8j82v/I/Nr/yPza/8j8
2v/I/Nr/yPza/8j82v/I/Nr/yPza/8j82v/I/Nr/yPza/8j82v/I/Nr/yPza/8j82v/I/Nr/yPza/8j8
2v/K/Nv/0/zh/9P84f/X/uX/xvbT/w2fDv8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAJkADwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/DZ8O/8f31P/Y/+b/1P3i/9T9
4v/L/Nz/yfzb/8n82//J/Nv/yfzb/8n82//J/Nv/yfzb/8n82//J/Nv/yfzb/8n82//J/Nv/yfzb/8n8
2//J/Nv/yfzb/8n82//J/Nv/yfzb/8n82//J/Nv/yfzb/8v83P/U/eL/1P3i/9j/5v/H99T/DZ8O/wCX
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZ
AP8AmQD/AJkA/wCXAP8Nnw7/yffV/9r/5//W/eP/1v3j/8383f/L/Nz/y/zc/8v83P/L/Nz/y/zc/8v8
3P/L/Nz/y/zc/8v83P/L/Nz/y/zc/8v83P/L/Nz/y/zc/8v83P/L/Nz/y/zc/8v83P/L/Nz/y/zc/8v8
3P/L/Nz/zfzd/9b94//W/eP/2v/n/8n31f8Nnw7/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZ
AA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/w2fDv/K99b/2//o/9f9
5P/X/eT/zvze/8383f/N/N3/zfzd/8383f/N/N3/zfzd/8383f/N/N3/zfzd/8383f/N/N3/zfzd/838
3f/N/N3/zfzd/8383f/N/N3/zfzd/8383f/N/N3/zfzd/8383f/O/N7/1/3k/9f95P/b/+j/yvfW/w2f
Dv8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAJkADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZ
AP8AmQD/AJkA/wCZAP8AlwD/DZ8O/8v31//c/+n/2P3l/9j95f/P/d//zv3e/8793v/O/d7/zv3e/879
3v/O/d7/zv3e/8793v/O/d7/zv3e/8793v/O/d7/zv3e/8793v/O/d7/zv3e/8793v/O/d7/zv3e/879
3v/O/d7/zv3e/8/93//Y/eX/2P3l/9z/6f/L99f/DZ8O/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
APAAmQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Nnw7/zPfX/93/
6f/Z/eX/2f3l/9H94P/Q/d//0P3f/9D93//Q/d//0P3f/9D93//Q/d//0P3f/9D93//Q/d//0P3f/9D9
3//Q/d//0P3f/9D93//Q/d//0P3f/9D93//Q/d//0P3f/9D93//Q/d//0f3g/9n95f/Z/eX/3f/p/8z3
1/8Nnw7/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZ
AP8AmQD/AJkA/wCZAP8AmQD/AJcA/w2fDv/N99j/3v/q/9r95v/a/eb/0v3h/9H94P/R/eD/0f3g/9H9
4P/R/eD/0f3g/9H94P/R/eD/0f3g/9H94P/R/eD/0f3g/9H94P/R/eD/0f3g/9H94P/R/eD/0f3g/9H9
4P/R/eD/0f3g/9H94P/S/eH/2v3m/9r95v/e/+r/zffY/w2fDv8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQDwAJkADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/DZ8O/874
2f/f/+v/2/7n/9v+5//T/eL/0v3h/9L94f/S/eH/0v3h/9L94f/S/eH/0v3h/9L94f/S/eH/0v3h/9L9
4f/S/eH/0v3h/9L94f/S/eH/0v3h/9L94f/S/eH/0v3h/9L94f/S/eH/0v3h/9P94v/b/uf/2/7n/9//
6//O+Nn/DZ8O/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZ
APAAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Nnw7/z/jZ/+D/6//c/uf/3P7n/9T94v/T/eH/0/3h/9P9
4f/T/eH/0/3h/9P94f/T/eH/0/3h/9P94f/T/eH/0/3h/9P94f/T/eH/0/3h/9P94f/T/eH/0/3h/9P9
4f/T/eH/0/3h/9P94f/T/eH/1P3i/9z+5//c/uf/4P/r/8/42f8Nnw7/AJcA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA8ACZAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/w2f
Dv/Q+Nv/4f/t/93+6f/d/un/1v7k/9X+4//V/uP/1f7j/9X+4//V/uP/1f7j/9X+4//V/uP/1f7j/9X+
4//V/uP/1f7j/9X+4//V/uP/1f7j/9X+4//V/uP/1f7j/9X+4//V/uP/1f7j/9X+4//W/uT/3f7p/93+
6f/h/+3/0Pjb/w2fDv8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQDwAJkADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZ
AA8AmQDwAJkA/wCZAP8AmQD/AJkA/wCZAP8AlwD/DZ8O/9H42//i/+3/3v7p/97+6f/X/uX/1v7k/9b+
5P/W/uT/1v7k/9b+5P/W/uT/1v7k/9b+5P/W/uT/1v7k/9b+5P/W/uT/1v7k/9b+5P/W/uT/1v7k/9b+
5P/W/uT/1v7k/9b+5P/W/uT/1v7k/9f+5f/e/un/3v7p/+L/7f/R+Nv/DZ8O/wCXAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAPAAmQAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJkADwCZAPAAmQD/AJkA/wCZAP8AmQD/AJkA/wCX
AP8Onw7/0fjc/+P/7v/f/ur/3/7q/9j+5f/X/uT/1/7k/9f+5P/X/uT/1/7k/9f+5P/X/uT/1/7k/9f+
5P/X/uT/1/7k/9f+5P/X/uT/1/7k/9f+5P/X/uT/1/7k/9f+5P/X/uT/1/7k/9f+5P/X/uT/2P7l/9/+
6v/f/ur/4//u/9H43P8Onw7/AJcA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACZAA8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAmQAPAJkA8ACZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/w6fDv/S+Nz/5P/u/+D+6v/g/ur/2f7m/9j+
5f/Y/uX/2P7l/9j+5f/Y/uX/2P7l/9j+5f/Y/uX/2P7l/9j+5f/Y/uX/2P7l/9j+5f/Y/uX/2P7l/9j+
5f/Y/uX/2P7l/9j+5f/Y/uX/2P7l/9j+5f/Z/ub/4P7q/+D+6v/k/+7/0vjc/w6fDv8AlwD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQDwAJkADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZAA8AmADxAJkA/wCZAP8AmQD/AJkA/wCZ
AP8AlwD/Dp8O/9P43f/l/+//4f7r/+H+6//a/uf/2f7m/9n+5v/Z/ub/2f7m/9n+5v/Z/ub/2f7m/9n+
5v/Z/ub/2f7m/9n+5v/Z/ub/2f7m/9n+5v/Z/ub/2f7m/9n+5v/Z/ub/2f7m/9n+5v/Z/ub/2f7m/9r+
5//h/uv/4f7r/+X/7//T+N3/Dp8O/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAPEAmQAPAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAJEADgCZAOsAmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8Nnw7/0fjc/+b/8P/h/+z/4f/s/9z+
5//b/ub/2/7m/9v+5v/b/ub/2/7m/9v+5v/b/ub/2/7m/9v+5v/b/ub/2/7m/9v+5v/b/ub/2/7m/9v+
5v/b/ub/2/7m/9v+5v/b/ub/2/7m/9v+5v/b/ub/3P7n/+H/7P/h/+z/5v/w/9H43P8Nnw7/AJcA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA6wCRAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmQAFAJgAzgCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJcA/wedCP/B88z/6v/z/+P/7P/j/+z/3//q/9v+5//c/uj/3P7o/9z+6P/c/uj/3P7o/9z+
6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9v+
5//f/+r/4//s/+P/7P/q//P/wfPM/wedCP8AlwD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADOAJkABQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAmACcAJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJYA/43alf/x//v/4//s/+P/
7f/j/+z/3v7p/9z+6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+
6P/c/uj/3P7o/9z+6P/c/uj/3P7o/9z+6P/c/uj/3v7p/+P/7P/j/+3/4//s//H/+/+N2pX/AJYA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAGYAmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AlAD/NbM5/+b/8P/n//D/5P/t/+T/7f/j/+z/4P/r/9//6v/e/+n/3v/p/97/
6f/e/+n/3v/p/97/6f/e/+n/3v/p/97/6f/e/+n/3v/p/97/6f/e/+n/3v/p/97/6f/e/+n/3//q/+D/
6//j/+z/5P/t/+T/7f/n//D/5v/w/zWzOf8AlAD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgAZgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJYAMQCYAPwAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlgD/itqT//T/
/v/l/+7/5P/t/+X/7v/l/+7/5P/u/+T/7f/k/+3/5P/t/+T/7f/k/+3/5P/t/+T/7f/k/+3/5P/t/+T/
7f/k/+3/5P/t/+T/7f/k/+3/5P/t/+T/7f/k/+7/5f/u/+X/7v/k/+3/5f/u//T//v+K2pP/AJYA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAPwAlgAxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAIAJgA3wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCWAP8LnQ3/quez//X//v/o//H/5f/u/+X/7v/l/+7/5f/u/+X/
7v/l/+7/5f/u/+X/7v/l/+7/5f/u/+X/7v/l/+7/5f/u/+X/7v/l/+7/5f/u/+X/7v/l/+7/5f/u/+X/
7v/l/+7/5f/u/+j/8f/1//7/quez/wudDf8AlgD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA3wB/
AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlwCSAJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCW
AP8Mng7/j9qW/+j/8f/1//3/7f/1/+v/8//q//L/6v/y/+r/8v/q//L/6v/y/+r/8v/q//L/6v/y/+r/
8v/q//L/6v/y/+r/8v/q//L/6v/y/+r/8v/q//L/6//z/+3/9f/1//3/6P/x/4/alv8Mng7/AJYA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AlwCSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACX
ACUAmAD0AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCXAP8AlgD/ObM9/4jXj//C8sv/0/jc/9n5
4f/Z+eD/2fng/9n54P/Z+eD/2fng/9n54P/Z+eD/2fng/9n54P/Z+eD/2fng/9n54P/Z+eD/2fng/9n5
4f/T+Nz/wvLL/4jXj/85sz3/AJYA/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJgA9ACX
ACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAHwAmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCYAP8AlAD/AJUA/wedCP8Mnw3/Dp8P/w6fD/8Onw//Dp8P/w6fD/8Onw//Dp8P/w6f
D/8Onw//Dp8P/w6fD/8Onw//Dp8P/w6fD/8Onw//Dp8P/wyfDf8HnQj/AJUA/wCUAP8AmAD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAFUAAwCZAL4AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJcA/wCX
AP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCXAP8AlwD/AJcA/wCX
AP8AlwD/AJcA/wCXAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkAvgBV
AAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJYAIgCYAN4AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCYAN4AlgAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAJkALQCYANsAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmADbAJkALQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJcAJQCY
AL0AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJgAvQCXACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAgCXAH4AmQDwAJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA8ACXAH4AfwACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAACVACkAmQCRAJkA1wCYAPgAmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZAP8AmQD/AJkA/wCZ
AP8AmAD4AJkA1wCZAJEAlQApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfwAIAJQAKwCX
AGMAmACVAJgAygCZAOYAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZAPAAmQDwAJkA8ACZ
APAAmQDwAJkA8ACZAPAAmQDwAJkA5gCYAMoAmACVAJcAYwCUACsAfwAIAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////AAAAD////////////////AAAAAP//////////
/////AAAAAA///////////////gAAAAAH//////////////wAAAAAA//////////////4AAAAAAH////
/////////8AAAAAAA//////////////AAAAAAAP/////////////gAAAAAAB/////////////4AAAAAA
Af////////////8AAAAAAAD/////////////AAAAAAAA/////////////wAAAAAAAP////////////8A
AAAAAAD////////////+AAAAAAAAf////////////gAAAAAAAH////////////4AAAAAAAB/////////
///+AAAAAAAAf////////////gAAAAAAAH////////////4AAAAAAAB////////////+AAAAAAAAf///
/////////gAAAAAAAH////////////4AAAAAAAB////////////+AAAAAAAAf////////////gAAAAAA
AH////////////4AAAAAAAB////////////+AAAAAAAAf////////////gAAAAAAAH////////////4A
AAAAAAB////////////+AAAAAAAAf////////////gAAAAAAAH/////////8AAAAAAAAAAAAAD//////
wAAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAA
H///8AAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAH///AAAAAAAAAAAAAAAAAA///wAAAAAAAAAAA
AAAAAAP//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAD//wAAAAAA
AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8A
AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAA
AP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAA
AAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAA
AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8A
AAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAA
AP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAA
AAAAAAD//4AAAAAAAAAAAAAAAAAB//+AAAAAAAAAAAAAAAAAAf//wAAAAAAAAAAAAAAAAAP//8AAAAAA
AAAAAAAAAAAD///gAAAAAAAAAAAAAAAAB///8AAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAf///8
AAAAAAAAAAAAAAAAP////wAAAAAAAAAAAAAAAP/////AAAAAAAAAAAAAAAP//////AAAAAAAAAAAAAA/
/////////gAAAAAAAH////////////4AAAAAAAB////////////+AAAAAAAAf////////////gAAAAAA
AH////////////4AAAAAAAB////////////+AAAAAAAAf////////////gAAAAAAAH////////////4A
AAAAAAB////////////+AAAAAAAAf////////////gAAAAAAAH////////////4AAAAAAAB/////////
///+AAAAAAAAf////////////gAAAAAAAH////////////4AAAAAAAB////////////+AAAAAAAAf///
/////////gAAAAAAAH////////////4AAAAAAAB/////////////AAAAAAAA/////////////wAAAAAA
AP////////////8AAAAAAAD/////////////AAAAAAAA/////////////4AAAAAAAf////////////+A
AAAAAAH/////////////wAAAAAAD/////////////8AAAAAAA//////////////gAAAAAAf/////////
////8AAAAAAP//////////////gAAAAAH//////////////8AAAAAD///////////////wAAAAD/////
///////////AAAAD////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////8=
================================================
FILE: FreeHttpControl/EditParameterPickWindow.Designer.cs
================================================
namespace FreeHttp.FreeHttpControl
{
partial class EditParameterPickWindow
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditParameterPickWindow));
this.lb_info = new System.Windows.Forms.Label();
this.bt_ok = new System.Windows.Forms.Button();
this.pb_add = new System.Windows.Forms.PictureBox();
((System.ComponentModel.ISupportInitialize)(this.pb_add)).BeginInit();
this.SuspendLayout();
//
// lb_info
//
this.lb_info.AutoSize = true;
this.lb_info.ForeColor = System.Drawing.SystemColors.HotTrack;
this.lb_info.Location = new System.Drawing.Point(16, 12);
this.lb_info.Name = "lb_info";
this.lb_info.Size = new System.Drawing.Size(479, 12);
this.lb_info.TabIndex = 1;
this.lb_info.Text = "Parameter Name PickType PickAdditional PickRange Pick Expression";
//
// bt_ok
//
this.bt_ok.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.bt_ok.Location = new System.Drawing.Point(711, 31);
this.bt_ok.Name = "bt_ok";
this.bt_ok.Size = new System.Drawing.Size(75, 23);
this.bt_ok.TabIndex = 11;
this.bt_ok.Text = "confirm";
this.bt_ok.UseVisualStyleBackColor = true;
this.bt_ok.Click += new System.EventHandler(this.bt_ok_Click);
//
// pb_add
//
this.pb_add.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pb_add.BackColor = System.Drawing.Color.Transparent;
this.pb_add.Cursor = System.Windows.Forms.Cursors.Hand;
this.pb_add.Image = ((System.Drawing.Image)(resources.GetObject("pb_add.Image")));
this.pb_add.Location = new System.Drawing.Point(762, 2);
this.pb_add.Name = "pb_add";
this.pb_add.Size = new System.Drawing.Size(23, 23);
this.pb_add.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pb_add.TabIndex = 58;
this.pb_add.TabStop = false;
this.pb_add.Visible = false;
this.pb_add.Click += new System.EventHandler(this.pb_add_Click);
//
// EditParameterPickWindow
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(792, 59);
this.Controls.Add(this.pb_add);
this.Controls.Add(this.bt_ok);
this.Controls.Add(this.lb_info);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.MinimizeBox = false;
this.Name = "EditParameterPickWindow";
this.Text = "EditParameterPickWindow";
this.Load += new System.EventHandler(this.EditParameterPickWindow_Load);
((System.ComponentModel.ISupportInitialize)(this.pb_add)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label lb_info;
private System.Windows.Forms.Button bt_ok;
private System.Windows.Forms.PictureBox pb_add;
}
}
================================================
FILE: FreeHttpControl/EditParameterPickWindow.cs
================================================
using FreeHttp.AutoTest.ParameterizationPick;
using FreeHttp.FreeHttpControl.MyControl;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace FreeHttp.FreeHttpControl
{
public partial class EditParameterPickWindow : Form
{
public EditParameterPickWindow()
{
InitializeComponent();
}
private Action> SetParameterPickAction;
private readonly Point startLocation = new Point(8, 28);
private readonly int parameterPickBoxHeight = 26;
private readonly int startWindowHeight = 87;
private List addParameterPickBoxList = new List();
public EditParameterPickWindow(List parameterPicklist, Action> setParameterPickAction)
{
InitializeComponent();
if(parameterPicklist!=null && parameterPicklist.Count>0)
{
foreach(var parameterPick in parameterPicklist)
{
AddParameterPickBox(parameterPick);
}
}
else
{
AddParameterPickBox(null);
}
SetParameterPickAction = setParameterPickAction;
}
private void EditParameterPickWindow_Load(object sender, EventArgs e)
{
}
private void AddParameterPickBox(ParameterPick yourParameterPick)
{
AddParameterPickBox tempAddParameterPickBox;
if(yourParameterPick==null)
{
tempAddParameterPickBox = new AddParameterPickBox();
}
else
{
tempAddParameterPickBox = new AddParameterPickBox(yourParameterPick);
tempAddParameterPickBox.Tag = yourParameterPick;
}
tempAddParameterPickBox.OnAddParameterClick += AddParameterPickBox_OnAddParameterClick;
AddAddParameterPickBox(tempAddParameterPickBox);
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
private void AddAddParameterPickBox(AddParameterPickBox yourAddParameterPickBox)
{
if(addParameterPickBoxList.Contains(yourAddParameterPickBox))
{
return;
}
int nowParameterPickBoxCount = addParameterPickBoxList.Count;
yourAddParameterPickBox.Location = new Point(startLocation.X, startLocation.Y + nowParameterPickBoxCount * parameterPickBoxHeight);
this.Controls.Add(yourAddParameterPickBox);
yourAddParameterPickBox.GetFocus();
this.Height += parameterPickBoxHeight;
addParameterPickBoxList.Add(yourAddParameterPickBox);
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]
private void ResizeParameterPickBoxList()
{
if(addParameterPickBoxList!=null)
{
for(int i=0;i setParameterPickList = new List();
foreach (var tempItem in addParameterPickBoxList)
{
if(tempItem.Tag!=null&& tempItem.Tag is ParameterPick)
{
setParameterPickList.Add((ParameterPick)tempItem.Tag);
}
else
{
try
{
ParameterPick tempParameterPick = tempItem.GetParameterPickInfo();
tempItem.Tag = tempParameterPick;
setParameterPickList.Add(tempParameterPick);
}
catch (Exception ex)
{
MessageBox.Show(string.Format("this parameter add infomation is illegal :{0}", ex.Message));
return;
}
}
}
if(SetParameterPickAction!=null)
{
SetParameterPickAction(setParameterPickList);
}
this.Close();
}
}
}
================================================
FILE: FreeHttpControl/EditParameterPickWindow.resx
================================================
text/microsoft-resx
2.0
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
iVBORw0KGgoAAAANSUhEUgAAAgwAAAIMCAYAAACZhvQPAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6
JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAB3RJTUUH4AoSFw0uGiHw4AAAOQlJREFU
eF7tnWm4HVWZts0cCDHMgTAJIqMIODaCIIgIEgVERJBRG3ACBbS16fCBioogQmtrgyiKijhgt4CANCCD
0gwaRIFGbTQyyRjmMGX4vmeZNx/FS51z9j57V+16V933dd1/Wi97P289a52Vc2pXvQgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA33nD+GWPlFDlDbiK3l/vIj8mT5HflhfI6eau8U86V
j8un5QK5UC6S/3cI03+W/jvz5VPyUXm/nCNvkr+UP5XfkMfJD8t3yq3kenJFOUnapwYAAIC+oR+w4+V0
+Vq5r/y8PE/eIh+Rw/2Qb6rp0HGvvF5+T/6z3FVuJKfJMRYfAAAAlqAfkBPkS+RM+Wl5sbxbpn/Rl/3A
bYPpNx/ptyFny4/I9JuKlSSHCQAAyBv9sBsn15bvlqfK9FuC9K/tsh+YOLSPyatkOlylP7+kP3fYlAEA
AAKhH2AT5abyCHmJTPcLlP3ww/55l0z3a+wt15D8NgIAAJqDfjAl058U3icvkE/Ish9oWL/pBs/T5Fvl
snbJAAAAqkc/eNKNiJvL9G2AP8qyH1TYTJ+Vl8uDZfothF1VAACAHtEPlfS1xXRAOEHeLst+EGFM07dM
rpEfkKvZJQcAAOgM/fBI//o8Uv6PLPtBg3manklxkdxNTrE6AAAALEY/HNJXG9Md9z+RfHMBl3ifPF5u
YFUBAIC2oR8Cy8pDZHpSYdkPC8Si6bkY6WmWb5LjrEYAAJAj2ujTUxOPkvfIsh8KiJ2a7n3YXU60egEA
QGS0oadDwtEyvT+hbONH7NXZMr07g8MDAEAktHGndxIcLtM7C8o2eMSqvFruKMdaHQEAoElog07PR3iX
5JsN2BTPkZtZRQEAYJCkDVmeaxs0YhN9UqZ3X6xgtQUAgDrQxjtVptci844GjObv5c7S2gwAAH1Hm+zr
5JWybCNGjGT6muYpcmWrNwAA9II21PTmx8Nkeq1x2caLGN30LYttrPIAANAN2kBXl+l1xWUbLGKOpjed
psPxBFsGAAAwFNost5A3yLINFbEtni5XsmUBAAAJbYzJ9JXI+2XZ5onYVn8hN7SlAgDQTrQRjpPpV7DP
yLLNEhEXe6vc0pYOAEA70MaXbmQ8Vi6SZZsjIpb7N7mTLSUAgDzRRjdZnmAbHyKO3vRulF1taQEA5IE2
tknyi7bRIWL/fFjuZksNACAm2sjS+x2Os40NEavzQflWW3oAADHQxjVGfsw2MkSszzvlVrYUAQCaizar
/eSztnkh4mC8SfJ1TABoHtqctpPpRqyyzQsRB+PFkgdAAcDg0Wa0rkxv4CvbrBCxGX5V8shpAKgfbT5T
5A9sM0LE5puee3KILWEAgGrRhpM80jYgRIznffJ1tqQBAPqPNpmtZPred9kmhIixTPc3LGvLGwCgd9Km
Ii+1TQYR8/ITttQBAEaPNpMj3OaCiPn5gHy1LXsAgM7R5rGxTC+6KdtcEDFP043ME20bAAAYGm0WY+Vp
tnkgYvtcKN9hWwIAwAvRJrGNfMo2DURst7+U02x7AAD4+0FhgvyhbRKIiEUPsK0CANqMNoNtJe9+QMTh
vF7yFUyANqLFP06eZZsBImInvse2EABoA1r0r5LzCpsAImKnpmeyLGXbCQDkihb6iYWFj4g4GtM3Kbaz
bQUAckKLe4a83RY7ImI/PF3aLgMA4dGC3rewwLHdphtcH5P3y3SAvFXeKK+Tv5JXysvlFfIqebX8tUyv
MP+TvEvOlelPWgtk2f8PbJf3yrVsuwGAiGgRpxsbz7VFjXn6iLxJ/kR+QR4sd5CvkKvJqTJ9bXaM1aLv
6H87PexrkkzvHFlbvlbuKg+XX5WXyL/IJ2VZBszD91olACASWrzry0cLixlj+rS8WX5LfkimN4auKkM+
vlefOzlFvlTuLGfJ8+SdcpEsmwHGMV3LcXa5AaDpaMEeVFjAGMNn5G9kuik1/SBdXbZu41XmpeRGcn/5
HTlHls0Lm2v6rdc6dkkBoIlokY6R/2mLFptr+q1BukfgSLmpnGyXEErQfJLLyzfJL8l030XZXLFZ7muX
EACahBZn+hbEfYXFis0x3Vx4itxaTrFLBj2gOSZXkXvK/5CPy7LZ42BNvyWyqwYAA0cLcsfCAsXB+7/y
U3ITOdYuE1SMZp3ujXiLPFNy/05z/LPksdIAg0YL8bjCwsTB+LD8mnyN5IavhqBr8WL5DvlzmR40VHbt
sB7T/F9rlwYA6kSLL32VLT2itWxxYvWm5xakG/N4/W8QdK3WlZ+R98iya4rV+wG7HABQB1p0K8n04J2y
BYnVmL7yl/5Wvo3kzwzB0TVMv304UKZnWJRdb6zOb9tlAIAq0WJLD8Xh++r1mH6N+n35SmlXAHJD1zY9
dGoPOVuW9QD772/lJLsEANBvtMD2Kyw4rM70dMx0MLPJQ1vQNU+Hh33kH2RZN7B/pkeUz7DRA0C/0MI6
obDQsP/eIGdK/twAf0ddmCY/IdNNrWWdwf64hY0cAHpBiymZHrdattCwN9O/cNIPhKk2boBS1JEN5Nmy
rEfYu++xUQPAaNAimijTewTKFhiO3ovl5jZmgI5Rb9IL3d4j75Bl3cLRe4yNGQC6QYsnPQr3wcJiwt58
Sv6zXNpGDNAT6lL6muY5sqxvODr5BgVAN2jRrCPnFxYRjt5089oONlqAvqN+TZbpT1vpHSFlHcTu/IWs
7HXsANmghZKeFli2iLA7L5Dr2lgBKkd9S75dpld1l3USO/cWOcFGCwAeLZD0HPyyxYOd++9yORspwEBQ
B18l0+vKyzqKnZmeyLmMjRQAlqCFsVdhoWD3pkf+8iAYaBTq5Eslj3AfvektpCvZOAFAC+L9hQWCnZue
eJluZOSFT9Bo1NHV5M9kWY9xeJ+Va9goAdqLFsLHCwsDO5eDAoRDnV1VpvtryjqNQ5v+cfAyGyNA+9AC
+D+FBYGd+Wk53kYIEBJ1eE15hXUaO3djGyFAe1DxP+sWAg5vuplxKRsfQBao0xvJ31vHsTM3tfEB5I8K
f7xbADi0F8oVbXQAWaKOv1HyyvrOfaWNDiBfVHQOC535J8mvH6FVqPPvlem16mVrAp8vj3eHfFHB+TPE
yD4jd7WRAbQO9X+8/FdbDzi8/HkC8kPF5gbHkf2c5JGwAEJrIX2j4jpbGzi0G9rIAOKjQvPVyeG9Vk63
cQFAAa2NHWV6eVrZ2sHFvtTGBRAXFZmHMg1teiDLTBsVAAyB1slYeYqtG3yh6b6PGTYugHiowDzueWi/
KXnwEkAXaM2kN9n+xdYQPt/0ttDlbVQAcVBxeZFUuQ9KblQC6AGtoUMLawqf8xHJ81ogDiosr6gu9wRp
UwKAXtBaWkn+1tYWPucdkt9eQvNRUdOvDMtK3GYfkNzJDFABWluHFNYaLvYGaRMCaCAq6PJyvhUWF5tu
1LIJAUAVaI2tLG+1NYeLvcDGA9AsVM6JMv19vqy4bfRJ+RobDwDUgNbcUYU1iOef8VUbDUAzUCmTNxdK
2nbPk7xREmAAaO1tIB+2tYjnn3GkjQZg8KiQ6QdkWVHb6F42FgAYEFqHY+TZhXXZdt9uowEYHCpiuvO/
rKBt8065qo0FABqA1uQehTXadl9hYwGoHxVwP1fItvotaVMBgCahtZneSXG3rdU2m54GyYOdoH5UvNcW
ithm32kjAYCGonWa/F5h3bbVe+VYGwtA9ahw6YEpi6yAbfUhuZaNBAACoDV7QGENt9UrbBwA1aKypZfA
3F8oXxu9TPIkNYCAaO1uKNN7F8rWdlv8ko0DoDpUtEtd8drmsTYKAAiK1vFS8sbCum6j77JxAPQfFew4
V7i2yauoATJCazq9NbZsrbfF9W0UAP1DxdrRFa1NPiXXsVEAQEZobX+gsNbbZnoi7SQbBUDvqFDpa0ll
ZWuDf5JL2ygAIEO0xrcprPm2+RsbA0BvqEzpiWn3FcrVJi+UNgkAyBmt9bVk+m1i2V6QuyfYGABGj4r0
n65YbfFkGwEAtASt+ynyr4V9oE3uaGMA6B4V6CBXqLZ4mI0AAFqG1n/66vjVhf2gTa5oYwDoHBVnPVek
tribjQAAWoz2gh+4vaENzpE2AYAOUGHGyUetQG1ySxsBAEDaC092e0Qb/JrFBxgZFeZcV6A2uJHFBwD4
/2hvOMrtFW2Q+xlgZFSUfV1xcne+XNPiAwC8AO0R7y/sGW1xmsUHeCEqyAxXmNxNX6GabvEBAIZEe8U+
hb2jDf7OogO8EBXkdleYnH1cLmfRAQBGRHvGOwp7SBs8yqIDPIeKcaIrSs6mGzr5dRsAdI32jl0Ke0kb
3NCiA/x9AbzKFSRn02FhqkUHAOga7SEzC3tK7j4sx1h0aDMqQvoK5TwrRu6mP0PwmwUA6BntJbsW9pbc
Pd1iQ5tREc5yxcjVdIMj9ywAQN/QnrJHYY/JXZ5T02ZUgG1dIXI1fXVyZYsNANA3tLfsX9hrcvZpOd5i
Q5vQhZ8gn7Ui5OwiyXMWAKAytMccWthzcvZsiwxtQhf+h64IucoTHAGgcrTXHOP2nlzd2iJDG9AF38YV
IFf5mxsA1Ib2nH93e1COpvvBxllkyBld6PTq1iftwucsb50EgNrR3vNTtxfl6DcsLuSMLvSp7sLn6GEW
FwCgVrT/JG8o7Ee5uplFhhzRBd7IXfAc/ZLFBQAYCNqHxst7CvtSjj4gLTFkhy7u3woXO0cvsKgAAANF
+9GyMn2lu2yvysWjLS7khC7sEe5C5+YfpaUFABg82pPWL+xRucobf3NCFzSddMsudC6mu3aXtrgAAI1B
e9POhb0qR6+3qJADuqCXugucm+tYVACAxqE96pNuz8rNmRYVIqMLuZW7sLm5s0UFAGgs2qv+w+1dOZke
Gz3WokJEdAGT6dWkZRc4B4+xqAAAjUb7VXJOYf/KzRMtKkREF/BId0Fz8lKLCQAQAu1b6X6y9H6bsj0t
B7kBMiK6cFPchczJhySPJgWAcGjvel1hL8vNX1pMiIQu3A/chcxJ3j4JAGHRHvYxt6fl5OstJkRAF2xd
dwFzcneLCQAQFu1lF7u9LRfvs4gQAV2w37sLmIvftIgAAKHRfpYeH/14YX/LyQMtJjQZXaht3YXLxTuk
pQQAiI/2tFyfBLlAcp9Z09FFmlu4aDm5ikUEAMgG7W2Hur0uFz9rEaGJ6ALt6y5YLu5pEQEAskN73OVu
z8vFKRYRmoQuzBj5bOFC5eJPLSIAQJZon5ssc3yz5bctIjQJXZgcv6YzT463iAAA2aK97g2FvS8nV7aI
0AR0QdLdtjk+PezVFhEAIHu0553q9sAcPN/iQRPQBTnOXaAc/JLFAwBoBdr30p+WHyzsg7nIw/aagC7E
JHdhcvA+aQkBANqD9r6NCnthLl5m8WCQ6EKc6C5MDq5v8QAAWof2wOPdnpiDL7V4MAh0AXL87cLnLR4A
QCvRPpi8v7Av5uAVFg8GgS7ACe6CRPcBaekAANqL9sIc/zSxtsWDOtHgJ7oLkYObWDyArlB3Zsij5CXy
Npm+kpu+1z4I09NWfyd/IneTk+xjAnSFuvNlWbZXRvVSiwZ1osEf6y5EdL9u0QA6Qp1JfkQ+YR1qsn+Q
r7SPDtAR6kz61kQ6/JZ1KqqrWTyoAw18nMzpuQvPSF5UAh2jvuwun7T+RPJqubrFABgR9WXrQn9ykKf3
1okGfpi7ANF9q0UDGBH15euuPxHdzuIAjIj6cpHrT3SXs2hQJRp0Mv2LvOwiRPRqiwYwLOpK+vXsbwrd
ie6RFg1gWNSVZVx3onu6RYMq0aD3cIOPLs8Zh45QVy5w3clBfrsGHaGupPt1yjoUVW4GrhoNOafv5n7G
YgEMi7ryKdednFzHYgIMi7qSnoJb1qGIzrJYUAUa8BZu4JF9Wo6xaABDop6sXuhNjt5mUQGGRV15netO
ZBdISwZ9R8O9oTDs6L7NYgEMi7pypetOju5ocQGGRV251HUnsntaLOgnGmxO/8r6g8UCGBZ1ZQPXnVx9
xCIDDIu6sqLrTmTvs1jQTzTY77pBR3YDiwUwLOrKKa47OcsDbaAj1JWTXXciu7nFgn6ggeb0GOjzLRbA
iKgvj7n+5Cw3gUFHqCvjZS4P77vSYkE/0EAPdQOO7AoWC2BY1JVlXXdy93aLDjAi6suHXH8iu6zFgl7R
MHP5V9a/WSSAEVFf1nP9yd2nLTrAiKgvyQjvUenE4y0W9IIGmdPXaCZbLIARUV+2d/1pg5YeYGTUl/RO
lbIeRZOvWPYDDTGXr5QdY5EAOkKdOch1qA1OtPgAHaHO3Os6FNWdLBKMBg0wl+eHp5tzeBsldIU6w4EB
YATUmTe7DkX1ZosEo0ED/KQbaFQ/bpEAOka94cAA0AHqzR2uR1FdySJBt2h4j7thRnShHGuRADpGveHA
ANAB6s02rkdRPcEiQTdocJu5QUaV3y7AqFB3ODAAdIi6c6frUkTnWxzoBg3uXDfIiHLvAowadYcDA0CH
qDtvcl2K6ustEnSCBpae4lU2yGjyzQgYNeoPBwaALlB/7nd9iuhlFgc6QQN7lxtgVNn8YNSoPxwYALpA
/dnF9SmqrINO0bBuccOL6FcsDsCoUIc4MAB0iTo0z3UqovtZHBgODWqaG1xUp1kkgFGhDnFgAOgSdehg
16mI3mZxYDg0qMPd4CJ6rsUBGDXqEQcGgC5Rh8bKHN5kuZxFgqHQkHJ4zOfaFgdg1KhHHBgARoF69AXX
q4jylfzh0ICmu4FF9BaLA9AT6hIHBoBRoB5Ndb2K6H0WB8rQgI52A4vodhYHoCfUJQ4MAKNEXbrQdSui
0y0OeDScuW5Y0ZxnUQB6Rn3iwAAwStSlDVy3IjrL4kARDSaHP0fwNyfoG+oTBwaAHlCf7nL9iub9FgWK
aDBHuUFFdCmLA9Az6hMHBoAeUJ/2cv2KKG+w9Ggo97ghRfNnFgWgL6hTHBgAekB9Sl+xLOtZJI+wOJDQ
QJZ1A4roKywOQF9QpzgwAPSIOnWG61g0/2pRIKGBRH8y18MWBaBvqFccGAB6RJ1a03UsolMsDmgYN7nh
RPNIiwLQN9QrDgwAfUC9in7z414Wpd1oEBPcYCK6jMUB6BvqFQcGgD6gXr3X9Sya11iUdqNBbO8GE83r
LQpAX1G3ODAA9IHUK9eziI6xOO1FQ/iJG0o0d7QoAH1F3eLAANAn1K3LXdei+RqL0l40hPluKNHk1AeV
oG5xYADoE+rW1q5r0fy6RWknGsAabiDRPMeiAPQd9YsDA0CfULeSkV97/ZhFaScawJFuINF8lUUB6Dvq
FwcGgD6ifn3f9S2ay1qU9qHw/+OGEckFFgOgEtQxDgwAfUT92sz1LZrvsSjtQsGjP7LzTIsCUAnqGAcG
gD6jji1wnYvkZRajXSj45m4Q0eRR0FAp6hgHBoA+o46d6ToXyYUWo10o+BfcICK5UFoSgGpQxzgwAPQZ
deyVrnPRXN2itAeFvt0NIZI/tBgAlaGecWAA6DPqWDLytyU+YFHagQKPdwOI5pYWBaAy1DMODAAVoJ6d
53oXyXY9JlqBo9+/MNaiAFSGesaBAaAC1LM3ud5FcpHFaAcKfJwbQCSvthgAlaKucWAAqAD1LPpvuVe1
KPmjsH904SO5t8UAqBR1jQMDQEWoaze57kVyP4uRNwqaLBtAFKdaFIBKUdc4MABUhLr2Ade9SP7MYuSN
gr7EBY/kgxYDoHLUNw4MABWhrq3suhfJeRYjbxT0fS54JP/VYgBUjvrGgQGgQtS3p1z/IrmUxcgXhbzA
hY7k5hYDoHLUNw4MABWivp3t+hfJ11uMfFHIJ1zoSPJ1SqgN9Y0DA0CFqG9vcf2L5OcsRp4o4EQXOJK3
WgyAWlDnODAAVIj6tpTrXyR/ZzHyRAE3dYEjOctiANSCOseBAaBi1Lm5roNRzPtFVAp4hAscyY0sBkAt
qHMcGAAqRp37putgJKdZjPxQuEtc2EiOsRgAtaDOcWAAqBh1LvJjorexGPmhcI+7sFH8s0UAqA31jgMD
QMWoc1NcByN5nMXICwUb54JG8gSLAVAb6h0HBoAaUO/muR5G8TqLkBcKtrYLGsn8v+8KjUO948AAUAPq
3fmuh1F82iLkhYK92wWNZP5P1ILGod5xYACoAfXuQNfDSE6wGPmgUKe6kFFsxzO7oXGoexwYAGpAvVvT
9TCS61qMfFCoW1zIKF5iEQBqRd3jwABQA+rdGNfDSL7bYuSDQs13IaN4mEUAqBV1jwMDQE2oe3e5Lkbx
axYhDxRoggsYyY0tBkCtqHscGABqQt0703UxijdahDxQoJe4gJFkA4OBoO5xYACoCXVvL9fFKD5lEfJA
gWa6gFHM60JAKNQ/DgwANaHuRf6HbT5vUlaYT7lwUbzGIgDUjvrHgQGgJtS9yA8XnG4x4qMwF7twUcz7
fePQaNQ/DgwANaL+RX19wRssQnwU5m4XLoo7WASA2lH/ODAA1Ij6d5XrYxQ/ZBHiozALXbgormoRAGpH
/ePAAFAj6t9nXR+j+C2LEBsFGe+CRTKfG0kCo+swVa4jt5EHtMg2HhjK5pCzW8v0np2pVncYILoOO8my
Xjbd31qE2CjIdBcsik9aBBgAmv+68gT5kF0PxNx9QB4n17ZlADWj2a9h1yKaj1qE2CjIa12wKOZxYguG
5r6qvLRwHRDb6M/kirYsoCY087APGbQIsVGQfX2wIJ5mEaAmNPOj3TVAbLtH2PKAmtDMQ77GwD5+bBTk
8z5YEA+yCFAxmnV68ct5hdkj4nOeLW21QNVo1nMKsw+jffzYKEjUHwT/YBGgYjTr693sEfH5Xm7LBSpG
sw75M8s+fmwUJOprrVe2CFAhmvOpbu6IWO4XbdlAhWjOx7i5h9A+fmwU5BEfLIjjLQJUhGa8u5s5Ig7v
jrZ8oCI045D7kn382CjIIh8sgIvs40NFaMbJJwszR8SRfcSWEFSEZryJm3kI7ePHRSHG+lBBfNAiQEVo
xh91M0fEzvxHW0ZQAZrv8m7eIbSPHxeFmOJDBfEGiwAVoRnPczNHxM582JYRVIDmG/LpxPbx46IQM3yo
IP7AIkAFaL6ru3kjYndyU3aFaL7h/pRuHz0uChHyb0HyMxYBKkDz5QFNiL15pC0nqADNN9xrru2jx0Uh
tvehgniARYAK0Hwvd/NGxO680JYTVIDme5ubd+O1jx4XhdjHhwrithYBKkDz/aubNyJ25x9tOUEFaL6/
cPNuvPbR46IQH/OhgriRRYAK0HyfcvNGxO583JYTVIDme6abd+O1jx4XhTjJhwridIsAFaD5LnTzRsTu
nG/LCSpA8/20m3fjtY8eF4X4rg8VxKUtAlSA5suBAbE3OTBUiOZ7iJt347WPHheFuNCHCuI4iwAVoPly
YEDsTQ4MFaL57urm3Xjto8dFIa7zoYJoCaAKNF8ODIi9yYGhQjTfLd28G6999LgoxK0+VAB5j0TFaMYc
GBB7kwNDhWi+G7t5N1776HFRiDt9qAA+bR8fKkIz5sCA2JscGCpE813Tzbvx2kePi0LM9aECyHPaK0Yz
5sCA2JscGCpE813Rzbvx2kePi0KEe7ym/Jt9fKgIzZgDA2JvcmCoEM13qpt347WPHheFeNqHCuBt9vGh
IjRjDgyIvcmBoUI038lu3o3XPnpcFGKBDxXA39vHh4rQjDkwIPYmB4YK0XwnuHk3XvvocVGIiD8Yfm0f
HypCM+bAgNibHBgqRPMd5+bdeO2jx0Uhwr1TXP7KPj5UhGbMgQGxNzkwVIjmO8bNu/HaR49LWagA/sI+
PlSEZsyBAbE3OTBUiObLgaFuykIF8FL7+FARmjEHBsTe5MBQIZpvuJ9f9tHjUhYqgBfbx4eK0Iw5MCD2
JgeGCtF8OTDUTVmoAP6XfXyoCM2YAwNib3JgqBDNlwND3ZSFCuBl9vGhIjRjDgyIvcmBoUI0X+5hqJuy
UAG83D4+VIRmzIEBsTc5MFSI5suBoW4UIuLXKv/bPj5UhGbMgQGxNzkwVIjmO9bNu/HaR4+LQkT8wTDb
Pj5UhGbMgQGxNzkwVIjmy4Ob6kYh5vtQAbzFPj5UhGbMgQGxNzkwVIjmO9HNu/HaR4+LQjzlQwXwr/bx
oSI0Yw4MiL3JgaFCNN+l3bwbr330uCjEoz5UAO+zjw8VoRlzYEDsTQ4MFaL5TnPzbrz20eOiEPf7UAF8
zD4+VIRmzIEBsTc5MFSI5jvdzbvx2kePi0LM8aEC+Kx9fKgIzZgDA2JvcmCoEM13HTfvxmsfPS4KcZMP
FUH7+FARmjEHBsTe5MBQIZrvZm7ejdc+elwU4pc+VBDHWASoAM2XAwNib3JgqBDNdzs378ZrHz0uCvFT
HyqIEywCVIDmy4EBsTc5MFSI5runm3fjtY8eF4X4hg8VxBdbBKgAzZcDA2JvcmCoEM33I27ejdc+elwU
4rM+VBDXsAhQAZovBwbE3uTAUCGa70lu3o3XPnpcFOLDPlQQN7cIUAGab8TncyA2ybm2nKACNN8fuXk3
XvvocVGId/pQQdzZIkAFaL7/4+aNiN15oy0nqADN91o378ZrHz0uCrGVDxXED1sEqADN93w3b0TsznNs
OUEFaL53uXk3XvvocVGI9XyoIJ5sEaACNN93u3kjYnfuZssJKkDzfdrNu/HaR4+LQqzkQwXxAosAFaD5
hnuxC2LDnGzLCfqMZpssm3mjtY8fF4WY5EMF8Y8WASpCM/6LmzkiduYfbBlBBWi+IX9u2cePi0KEPKnJ
JywCVIRmvIWbOSJ25qttGUEFaL6runmH0D5+bBRkvg8WREsAVaEZz3YzR8ThvcaWD1SEZvwPbuYhtI8f
GwW51wcL4lIWASpCMw73RjjEAbumLR+oCM34QDfzENrHj42CXO+DBXEtiwAVojm/1c0dEcvd3pYNVIjm
fIqbewjt48dGQb7ngwVxB4sAFaNZ/4ubPSI+34/bcoGK0ayvcrMPoX382CjIP/tgQfwniwA1oHnv5uaP
iIt9my0TqAHN+wE3/xDax4+NguzqgwWRJ6nVjGa+vry9cA0Q2+wc+VJbHlAT7hqE0T5+bBRkYx8siHMs
AtSMZv92+XjhWiC2yfRyNt5nMwA096gPlVtoEWKjINNcsCgusAgwIHQN1pKfknfLZ2XZdUKMbup26vgx
klfrDxDNf0NZdo2a7r0WITYKMsYFi+QkiwENQNcjdWlyizxAlvUyZ8vmkLPWbmgCuh77yLJeNt2rLEJ8
FCbcizzM9SwCQO2of608MFh8gNpR/05zfYxiPi9MVJg/uHBR3NsiANSO+seBAaBG1L9bXB+juI9FiI/C
nO3CRfEbFgGgdtQ/DgwANaL+LXB9jOKmFiE+CvMRFy6Kf7IIALWj/nFgAKgJdW8p18VIvthixEdhtnLh
orjIIgDUjvrHgQGgJtS9zVwXI2kpMkBhVnLhIjnNYgDUirrHgQGgJtS9j7ouRvEhi5AHChT5q5VbWwyA
WlH3ODAA1IS6d7HrYhQvtwj5oFCPuZBRPN4iANSKuseBAaAm1L0nXBejeJxFyAeFCvkGMPl7iwBQK+oe
BwaAGlDvJroeRjK/Nysr1KddyChy4yMMBHWPAwNADah3m7seRnIVi5EPCrW9CxnJlSwGQG2odxwYAGpA
vZvlehjJMRYjHxRqRRcyku+wGAC1od5xYACoAfVututhFOdahLxQsGRZ4Aj+wGIA1IZ6x4EBoAbUu0Wu
h1G8wCLkh8Ld5cJG8RGLAFAb6h0HBoCKUedWdR2M5KEWIz8U7rsubCSXshgAtaDOcWAAqBh1bn/XwUhu
YjHyQ+He48JGcjuLAVAL6hwHBoCKUecucR2M5CSLkR8Kt6YLG8nTLQZALahzHBgAKkadm+86GMV5FiFP
FDDyI6Lzel43NB51jgMDQIWob6u4/kXyUouRLwoZ9cbH5BSLAVA56hsHBoAKUd8Ocv2LZL43PC5BIb/u
QkfybRYDoHLUNw4MABWivl3j+hfJ9S1GvijkW13oSJ5vMQAqR33jwABQEepa5D+RJ8dZlHxRyGVd6Egu
sBgAlaO+cWAAqAh17eWue5H8m8XIH4WNeldq8iUWA6BS1DUODAAVoa6d5LoXydMsRv4o7BUufCSPthgA
laKucWAAqAh1ba7rXiTze6X1UCjsIS58JO+0GACVoq5xYACoAPUs8p/Gk8tYlPxR2DVc+Gi252LBwFDP
ODAAVIB6drDrXSSfsBjtQIGTUd8OltzHogBUhnrGgQGgAtSzm13vIvlji9EeFPpaN4RI3mAxACpDPePA
ANBn1LFJrnPRbN/zgBT6g24I0ZxgUQAqQR3jwADQZ9Sx3V3nojnVorQHhV7NDSGau1gUgEpQxzgwAPQZ
dSzy0x0fsxjtQ+EXuGFE8lqLAVAJ6hgHBoA+on5NcH2L5rcsSvtQ+J+7YURzokUB6DvqFwcGgD6ifkX/
c8QbLUr7UPh3uGFEc0+LAtB31C8ODAB9RP26wfUtmu29d07hl3HDiObNFgWg76hfHBgA+oS6tbTrWjRv
syjtRUO43w0lmu27YxVqQd3iwADQJ9StyA9rSn7SorQXDeELbijRPMKiAPQVdYsDA0CfULfucl2L5poW
pb1oCBu6oUTzQYsC0FfULQ4MAH1AvZrhehbNZy1Ku9EgkgsLg4nouhYHoG+oVxwYAPqAenWK61k0v29R
QMM4zw0nmmdaFIC+oV5xYADoEXUqGfmZP8ktLQ5oGNu74UR0rMUB6AvqFAcGgB5Rp7Z1HYsoP1+WoGGM
c8OJ6B4WB6AvqFMcGAB6RJ36tetYNK+0KLAEDSXy2yuTf7EoAH1BneLAANAD6tNyrl8R3dXiwBI0lHe6
IUV0bYsD0DPqEwcGgB5Qn6J/bT/JKwg8Gkr0d5QnuZMV+ob6xIEBYJSoS8no38CbbXHAo+H81g0ropwG
oS+oSxwYAEaJurSb61ZEeV/RUGg473LDiujhFgegJ9QlDgwAo0RdusN1K6L8A3Qo0nDcsCL6pMUB6Al1
iQMDwChQjzZyvYro9RYHhkJD+m83tIjuZHEARo16xIEBYBSoR5e5XkV0F4sDQ6Eh7eSGFtE5Fgdg1KhH
HBgAukQdWsF1KqrjLBIMhYY01g0tqptaJIBRoQ5xYADoEnXoG65TEf25xYGR0LD+ww0votdaHIBRoQ5x
YADogtQf16eobmGRYCQ0rM3d8KK6lkUC6Br1hwMDQBeoP591fYpoelGWJYKO0MCeKgwwqhdZHICuUX84
MAB0iLoz3nUpql+xSNApGtpxbohRXcUiAXSFusOBAaBD1J1PuC5FdXWLBJ2ioa3ohhjV/7RIAF2h7nBg
AOgA9SbdLL+o0KOo3mmRoFs0vJvdMKO6skUC6Bj1hgMDQAeoNx9zPYrq/hYJukXDm+mGGdWfWiSAjlFv
ODAAjIA6M07m8NuF5HiLBd2i4Y2RuRRhNYsF0BHqDAcGgBFQZ2a5DkX1xxYJRouG+GU31KheYpEAOkKd
yeFte93Kv7CgY9SXHN4/tMT1LBaMFg1xuhtqZCkEdIz6ksvzSDrWogN0hDpzku9QUP9mkaBXNMzfuuFG
9QaLBDAi6ktOh+VOfMyiA4yI+vJi15/I7m2xoFc0zG3dcCO7pcUCGBZ1JZf3qnTqLyw6wIioLz90/Yns
WIsF/UADnecGHNV7LBLAiKgvObzuvVPfZrEBhkVdWct1J7JftljQLzTUj7ohR3ZfiwUwLOrKHq47OTvR
YgMMi7ryG9edyK5gsaBfaKg53Q2bXi7Cu85hRFJP5ELrTc6eY5EBhkVd2cZ1J7JXWSzoNxruN92wI/tF
iwUwLOrKwa47ObqsxQUYFnXlYdedyL7CYkG/0XBXdsOOLo+Mho5QVx5x3cnJky0mwLCoK4e77kSW90ZU
jYZ8hRt6ZH9lsQCGRV1ZzXUnF39jEQGGRV1ZxnUnujMtGlSFhryRG3p0t7doAMOirrzRdSe6j0pudISO
UFfOLXQnuvMsFlSNhv0HN/zIpq+LjrFoAMOiruRyaPiTnGKxAIZFXXlNoTs5eIhFg6rRsN/ghh/dEy0a
wIioLzNk5Bu/fiQtDcDwpK7IudadHEzfeuIfiXWigd9TuAA5uJZFA+gIdeYgmb6iW9anJpp+q8Bd4dAV
6szRhQ7l4CyLBnWhoe/sLkJ0/2TRADpGvUmPj36n/JX1qGk+Lc+Qr7KPDNAx6k36bVpZryI7weJBnWjw
OX0fN/l+iwbQNepPOjykrx5vKneR+w3I7eV6kmcrQE+oQzfJsr0yqp+3aFA3Gv7u7mLkII8JBYDWo70w
xweWTbJ4MAh0AXJ7oM2vLRoAQCvRPri82xdzkJvbB40uQo6/ZXifxQMAaB3aA2e7PTEHJ1s8GCS6EDl9
5WaJ/GkCAFqH9r5D3F6Yg5+zeDBodDFmuouTgzdZPACAVqB9bxW3D+Yi34xoErogd7sLlIMft3gAANmj
Pe9/3R6Yg0dZPGgKuihbu4uUiy+ziAAA2aK97jNu78vB9GC1sRYRmoQuzC2FC5WL6f4MHiMKANmiPW7z
wp6XkwdbRGgaujgbu4uVi9+xiAAAWaH9bYJ8srDf5eJj0lJCI9EFurRwwXJyN4sIAJAN2tt+7va6XJxp
EaGp6CJNdxctJ1e2mAAA4dGe9n63x+XibRYRmo4u1qnu4uXiHdJSAgDERXvZBoW9LTd5K2sUdLEmuouX
k9+2mAAAIdE+lu5beKKwr+XkRRYToqCL9gF3EXNyH4sJABAO7WFXuT0tJ5e3mBAJXbgH3IXMyfUsJgBA
GLR3Hev2spzkEdBR0cXbwl3MnExfQ+JVqQAQBu1ZOxT2sNx8RvLMnMjoAub6NcvkbIsJANBotF+t5vav
3Hy7RYWo6CIu5y5qbp5mUQEAGon2qXST48OFfSs3b7SoEB1dzH9xFzc3D7KoAACNQ3vUtW7Pys01LCpE
Rxczmd7JUHahc3FLiwsA0Bi0N53u9qrcPNGiQi7oor7WXeQc5ZQLAI1Be9Jhbo/KzXTzOTc65ogu7I8L
FzpH58mlLS4AwMDQXrRTYW/K1TdaXMgNXdxJclHhYufonyUnXgAYGNqDXl7Yk3L1QosLuaKLvIe76Dl6
pcUFAKgV7T+ryNz/YZbkt7ltQBf6v92Fz9GzLC4AQC1o35kiHy/sQ7m6t0WG3NHFzv3ZDEvk7l0AqAXt
N+PkXYX9J1evs8jQFnTR3+dKkKv/ZJEBACpB+8wYeVNh38nZ5Sw2tAld+NmuCLn6jxYZAKDvaI/5pdtz
cvV9Fhnahi5+W/40kdzLYgMA9A3tLRe6vSZX+VNE21EJ9nOlyNldLDYAQM9oTznH7TE5O81iQ5tREa5w
xcjZnS02AMCo0V5ytttbcvZdFhvajsqwtFxYKEfu7mTRAQC6RnvId92ekrMXWWyAxagUb3Ylyd2ZFh0A
oGO0d7TpNwvPyIkWHeA5VIwzCkVpg++w6AAAI6I9o033LCS3sOgAz0flSN8lvr9Qlja4j8UHABgS7RVt
+TbEEr9o0QHKUUnWdqVpgx+0+AAAz0P7Q/qHVFues7DEP1t8gOFRWQ525WmDsyw+AMDf0b6QHvfclic4
Fl3RRgAwMipM2379lvw3iw8ALUf7QXqRVBveDeHleTXQHSpNOlk/VihRW/yJjQAAWor2gfSK6ja8ddL7
dRsBQHeoPC9zZWqLv5bjbAwA0CK09l8uF9le0CbnSJsCwChQgQ4sFKpN3i15FCpAi9Ca36mwB7TNFWwM
AKNHRfq+K1ZbfFa+zMYAABmjtX5YYe23ze1sDAC9oTIl/1ooV9vc0UYBABmiNX66W/Nt8lgbA0B/UKnS
q7Db+He9JX7cRgEAmaB1PUFeW1jnbfNyGwVAf1G5tnBla5s/ljYNAIiM1vJq8hFb2230ITnexgHQf1Sw
QwuFa6N/ltwMCRAYreEdCmu6rc6wcQBUh4r2PVe8tpleBf4aGwcABEJr99jCWm6r3OQI9aHCtfFxqd4j
bBwA0HC0XtP9ClcV1m9bPdxGAlAPKt1k+UShhG31IslDngAajNboBpL96vwzvmsjAagXlW8NV8a2mh6h
zfMaABqI1ub7C2u1zc62kQAMBpVwK1fKNvshGwsADBitx/QniJ8X1mebnSsn2GgABoeKuH+hmG33MjnJ
RgMAA0BrcHP5pK3Jtptu0uZ11dAcVMjPFAradufLLW00AFAjWnvsRc93YxsNQHNQMc9yRW27X5M2HQCo
Eq219Erq22zt4WLfbOMBaB4qKF9ber4PyA1sPABQAVpjhxTWHC72vTYegGaiko6RfyyUFhf7WWlTAoB+
oDW1vJxtawyfc5aNCKDZqKwT5f2F8uJi75Ub2pgAoAe0lg4urC18zq/aiABioNK+WHKXcrmnyDE2KgDo
Aq2dGZInzZb7IxsTQCxU3ulyQaHM+JzpqXNb2agAYAS0XpJH2/rBF3qJjQogJirxS1yp8fleIJexcQFA
CVojr5Hp4UNlawjPP+M6adMCCIyKnJ7jXlZyfM5DbVwAYGhdLCPPLawTfKG/l/yJE/JBhd60UHAsN90U
yWuzofVoHSQPt3WBQ5u+kTbWxgaQDyr2qwpFx6H9L7mCjQ2gVaj728iHbS3g0KaHVI23sQHkhwqe/hZZ
Vn58oSdJNgRoBer6WvI31n0c3jmSvQHyR0V/daH4OLyL5AelTQ8gL9Tt9BXsH8qy/uML5TcL0C5U+FcW
FgCO7ONyNxsfQHjU5/SAty9Zv7Ez0z0LHBagfaj4Ly8sBOzMe+SbbIQA4VB/x8lZ1mfs3PRtCG5whPai
BbCeTL92L1sgOLS3y61tjACNR30dKz8mWe/dm56zwFcnAbQQ1pDP2sLA7rxDbmujBGgc6ud4+QnJQWF0
XiJtmgCQNpUV5WO2QLB775Nvt3ECDBz1cbJMb2kt6yt2Ju+GAChDi2OKvLuwWLB758mDJH/rhIGg7q0g
vynL+omdy1snAYZDiyT9+jLd3FO2gLBz069/j5e8pwJqQV3bSF4my/qI3TnLxgoAw6HFkry4sHiwN9ML
rta38QL0DfUquZtM99KUdQ+79702XgDoFC2cr7uFhL15l3y35M8V0BPq0HLyBLlQlnUNR+ebbcQA0C1a
QJ90Cwr7Y/ob85o2ZoARUV+S28pfy7JO4ehNB6+NbdQAMFq0kHYvLCzsr+m3DgfKiTZugOehbsyQp8gF
sqxD2JsPyhVt3ADQK1pQm0u+x12tv5BbS5s6tBV1YGl5sEwHyrKuYH+cLSfY2AGgX2hhrSQfsIWG1ZkO
ZmfJzWz00AJ0vSfI9Nu8G2RZL7C/fsdGDwBVoEWWnkP/q8Kiw2pNv4Y+U6bf8NhVgFzQNZ0k0yHhWll2
/bEaD7dLAABVowX3FbcAsXrTbx7OlW+S4+xSQDB07ZaV6c8NN8uy64zVup1dCgCoCy28vd1CxHpND9h6
v1zZLgk0EF2fMTK9GfYkOVeWXUus3ofkDLssAFA3WoDp6XJP24LEwfmUPFu+RS5llwcGhK7BKjI9Ivwa
WXa9sF4vl+Pt8gDAoNBCXEreaAsTm2H6l+w3ZPrzxRS7VFARmvGqcn+Z3mw4X5ZdExyMx9plAoCmoIV5
sluo2BzTS7HOlwfINSXv9h8lmt1EmW5CnSXT1/L4unFz5X4FgKaiBTrTLVhsruk7/ukbGHvJtSQ3Ujo0
k/Tbs83kR2V6v8oTsmyW2CznyBXsMgJAU9FCXVnyMpyYPi6vlMfJneTqMvu//SpjelDShnIfmd6hcovk
yYoxTdfPriwANJ60YOXptoAxvunv8ulfbefJY2R6dsAmcnnZ6AOFPl8yPe8g3WewhUyP4k6PWr5K8iCy
vHy7XXYAiIYW8NvcgsY8TX/HT7+duE1eJr8tPy0PkbvKLeXGMt0/saKcKifL9HTD9DCw9NXD5JIf8Mkl
/7exMv130r0D6TcB0+R0uY5Mfy7YTu4pPyLTVxd/JNODkNKfXPgGTztMveN9EADR0UJOr+JNv+ItW+iI
iL34RdtqACAXtLDTr7LLFjwiYrc+I7ew7QUAckMLPP3d+1Fb8IiIo/EiySvhAXJHCz39TTr9jbtsI0BE
HM532VYCAG1BC38b+WxhI0BEHMrr5DTbPgCgbWgDSHfJn2MbAiJime+zLQMA2o42hPTVuHQTU9lmgYjt
NP1WYTnbJgAAFqONYbxMjyou2zgQsV3ubVsDAEA52iheLdO768s2EUTM2wvl0rYdAAAMjzaMZHpSYNmG
goj5+aR8o20BAADdoQ0kPf//BttQEDFPT5S8ch0AekebSXofAV/BRMzLG+UatswBAPqDNpb0AqL0lsGy
jQcR45i+EcWbJQGgWrTRpD9TXGMbDyLG8nOSPz8AQH1o03mDfNA2IURstun9D8vb8gUAqB9tQgfJhbYp
IWKzvE2+wpYrAMBg0YaU7m/4gm1QiDh4H5MzbYkCADQLbVBT5Vm2YSFi/S6QB9uSBABoNtqwVpHpb6Zl
GxoiVuNRcqwtQwCAOGjzWlteaZsZIlZj+ubDBFt2AABx0Wb2Mvkr29wQsT+mJzROtmUGAJAP2tzWlVfY
ZoeIo/PzcpItKwCAfNFmt4b8mW1+iDiy6avLsyR/egCA9qHNbwX5LVm2QSLi+WfMk4dIns4IAKDNcLL8
lOQBUIiLvVPyHAUAgDK0QY6R75E8chrbavpWEU9mBADoFG2ar5ZX2yaKmLtflitY/QEAoFu0iS4vvyj5
cwXm5t/k3pKHLQEA9AttqsmZ8lZZtvkiRvFHcj2rNgAAVIU22+nySzI9N79sQ0Zsmukmxv3leKsxAADU
hTbf5Bskj5/GJpoOtF+Rq1tlAQBg0GhTniQPlHNk2eaNWJc/l1tIaycAADQSbdTpRslPygdk2YaO2G+v
l7vIcVZDAACIhDbw9KrtYyTPdsB+O1vuKSda3QAAIAe0sa8sPy7vkGU/ABBHMt0vs6vkkAAA0Aa04U+V
+8jrZNkPBsTks/Is+XrJ8xIAANpM+kEgXye/KR+XZT84sD3eJtM9MGtYRQAAAF6IflCkmyb3lZfLRbLs
hwrm46MyvTV1G8nrowEAYHToh8ia8sMy/fmCA0R8n5A/lm+TU+0yAwAA9Bf9kJkhD5AXyqdk2Q8lbI7p
nQ2nyTfLKXYZAQAA6kU/hJaWW8nj5U2S30IMznnyUnmoXF/yXAQAAGgu+kG1rNxWfk6mh/o8Lct+wOHo
nSsvkOlwsImcZOMHAACIi36gTZQvk+mVxqfK30kOEiP7kEw3oH5G7iDTw7jG2FgBAADagX74jZPpDZxb
y/Sv5TPljTLdvV/2AzQ3F8p75VXyZJmej7GpfLG0KQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAADSFF73o/wHdNWkEK4HhBwAAAABJRU5ErkJggg==
AAABAAEAMDAAAAEAIACoJQAAFgAAACgAAAAwAAAAYAAAAAEAIAAAAAAAAAAAAMQOAADEDgAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA2pYRmduWEv/blhL/25YS/9uWEv/blhL/3JYSZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEv/blhL/25YS/9uWEv/blhL/25YS/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblQ9G25YS/9uW
Ev/blhL/25YS/9uWEv/blRK5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA25YS/9uWEv/blhL/25YS/9uWEv/blhL/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEv/blhL/25YS/9uWEv/blhL/25YS/wAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANqWEZnblhL/25YS/9uWEv/blhL/25YS/9yW
EmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAD/gAAE25YS/9uWEv/blhL/25YS/9uWEv/alRH7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA25YS/9uWEv/blhL/25YS/9uWEv/blhL/AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEv/blhL/25YS/9uWEv/blhL/25YS/wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuUEivblhL/25YS/9uW
Ev/blhL/25YS/9uVEdQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA25YS/9uWEv/blhL/25YS/9uWEv/blhL/AAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AABNuWEv/blhL/25YS/9uWEv/blhL/2pUR+wAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEv/blhL/25YS/9uW
Ev/blhL/25YS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADalRH725YS/9uWEv/blhL/25YS/9uWEv//gAAEAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YS/9uWEv/blhL/25YS/9uWEv/blhL/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuWEv/blhL/25YS/9uW
Ev/blhL/25YS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuV
EdTblhL/25YS/9uWEv/blhL/25YS/9uUEisAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YS/9uWEv/blhL/25YS/9uWEv/blhL/AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2pUR+9uWEv/blhL/25YS/9uW
Ev/blhL//4AABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANuW
Ev/blhL/25YS/9uWEv/blhL/25YS/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/AAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uWEv/blhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AADblhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uW
Ev8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADblhL/25YS/9uW
Ev/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv/blhL/25YS/9uWEv8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///////8AAP///////wAA////////
AADgAD/8AAcAAOAAP/wABwAA4AA//AAHAADj/////8cAAOP/////xwAA4//////HAADj8D///8cAAOP4
H///xwAA4/wf///HAADj/A///8cAAOP+B///xwAA4/8H///HAADj/wP//8cAAOP/gf//xwAA4//B///H
AADj/8D//8cAAOP/4P//xwAA4//gf//HAADj//A//8cAAOP/+D//xwAA4//4H//HAADj//wP/8cAAOP/
/g//xwAA4//+B//HAADj//8D/8cAAOP//4P/xwAA4///gf/HAADj///A/8cAAOP//+D/xwAA4///4H/H
AADj///wP8cAAOP///g/xwAA4///+B/HAADj///8D8cAAOP///wPxwAA4////gfHAADj/////8cAAOP/
////xwAA4//////HAADgAD/8AAcAAOAAP/wABwAA4AA//AAHAAD///////8AAP///////wAA////////
AAA=
================================================
FILE: FreeHttpControl/EditSheetForm.Designer.cs
================================================
namespace FreeHttp.FreeHttpControl
{
partial class EditSheetForm
{
///
/// Required designer variable.
///
private System.ComponentModel.IContainer components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed; otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(EditSheetForm));
this.dataGridView = new System.Windows.Forms.DataGridView();
this.pb_saveSheet = new System.Windows.Forms.PictureBox();
this.pb_export = new System.Windows.Forms.PictureBox();
this.saveFileDialog = new System.Windows.Forms.SaveFileDialog();
this.toolTip = new System.Windows.Forms.ToolTip(this.components);
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pb_saveSheet)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pb_export)).BeginInit();
this.SuspendLayout();
//
// dataGridView
//
this.dataGridView.BackgroundColor = System.Drawing.Color.AliceBlue;
this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView.Dock = System.Windows.Forms.DockStyle.Fill;
this.dataGridView.GridColor = System.Drawing.Color.AliceBlue;
this.dataGridView.Location = new System.Drawing.Point(0, 0);
this.dataGridView.Name = "dataGridView";
this.dataGridView.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToDisplayedHeaders;
this.dataGridView.RowTemplate.Height = 23;
this.dataGridView.Size = new System.Drawing.Size(871, 410);
this.dataGridView.TabIndex = 0;
this.dataGridView.RowsAdded += new System.Windows.Forms.DataGridViewRowsAddedEventHandler(this.dataGridView_RowsAdded);
this.dataGridView.RowsRemoved += new System.Windows.Forms.DataGridViewRowsRemovedEventHandler(this.dataGridView_RowsRemoved);
//
// pb_saveSheet
//
this.pb_saveSheet.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pb_saveSheet.BackColor = System.Drawing.Color.Transparent;
this.pb_saveSheet.Cursor = System.Windows.Forms.Cursors.Hand;
this.pb_saveSheet.Image = ((System.Drawing.Image)(resources.GetObject("pb_saveSheet.Image")));
this.pb_saveSheet.Location = new System.Drawing.Point(830, 0);
this.pb_saveSheet.Name = "pb_saveSheet";
this.pb_saveSheet.Size = new System.Drawing.Size(20, 20);
this.pb_saveSheet.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pb_saveSheet.TabIndex = 43;
this.pb_saveSheet.TabStop = false;
this.toolTip.SetToolTip(this.pb_saveSheet, "save data");
this.pb_saveSheet.Click += new System.EventHandler(this.pb_saveSheet_Click);
this.pb_saveSheet.MouseLeave += new System.EventHandler(this.pictureBox_MouseLeave);
this.pb_saveSheet.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
//
// pb_export
//
this.pb_export.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.pb_export.BackColor = System.Drawing.Color.Transparent;
this.pb_export.Cursor = System.Windows.Forms.Cursors.Hand;
this.pb_export.Image = ((System.Drawing.Image)(resources.GetObject("pb_export.Image")));
this.pb_export.Location = new System.Drawing.Point(851, 0);
this.pb_export.Name = "pb_export";
this.pb_export.Size = new System.Drawing.Size(20, 20);
this.pb_export.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pb_export.TabIndex = 44;
this.pb_export.TabStop = false;
this.toolTip.SetToolTip(this.pb_export, "export data");
this.pb_export.Click += new System.EventHandler(this.pb_export_Click);
this.pb_export.MouseLeave += new System.EventHandler(this.pictureBox_MouseLeave);
this.pb_export.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox_MouseMove);
//
// saveFileDialog
//
this.saveFileDialog.Filter = "csv files (*.csv)|*.csv";
//
// EditSheetForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(871, 410);
this.Controls.Add(this.pb_export);
this.Controls.Add(this.pb_saveSheet);
this.Controls.Add(this.dataGridView);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimizeBox = false;
this.Name = "EditSheetForm";
this.Text = "EditSheetForm";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.EditSheetForm_FormClosing);
this.Load += new System.EventHandler(this.EditSheetForm_Load);
((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pb_saveSheet)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pb_export)).EndInit();
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView dataGridView;
private System.Windows.Forms.PictureBox pb_saveSheet;
private System.Windows.Forms.PictureBox pb_export;
private System.Windows.Forms.SaveFileDialog saveFileDialog;
private System.Windows.Forms.ToolTip toolTip;
}
}
================================================
FILE: FreeHttpControl/EditSheetForm.cs
================================================
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using FreeHttp.AutoTest;
namespace FreeHttp.FreeHttpControl
{
public partial class EditSheetForm : Form
{
public class SaveSheetDataEventArgs : EventArgs
{
public List> SheetData { get; set; }
public Point? SelectCell { get; set; }
public SaveSheetDataEventArgs(List> sheetData, Point? selectCell)
{
SheetData = sheetData;
SelectCell = selectCell;
}
}
public EditSheetForm()
{
InitializeComponent();
}
public event EventHandler SaveSheetData;
private List> listViewSource;
private DataTable sourceDataTable;
private Point selectCell;
public EditSheetForm(string name, List> dataSource, Point yourSelectCell)
: this()
{
this.Text = string.IsNullOrEmpty(name) ? "" : name;
if (dataSource != null) { listViewSource = dataSource; selectCell = yourSelectCell; }
}
private void EditSheetForm_Load(object sender, EventArgs e)
{
dataGridView.DataSource = FillData(listViewSource);
for(int i =0 ; i > tempViewSource;
tempViewSource = GetData();
this.SaveSheetData(this, new SaveSheetDataEventArgs(tempViewSource, dataGridView.CurrentCell == null ? (Point?)null : new Point?(new Point(dataGridView.CurrentCell.ColumnIndex, dataGridView.CurrentCell.RowIndex))));
}
}
private void EditSheetForm_FormClosing(object sender, FormClosingEventArgs e)
{
pb_saveSheet_Click(this, null);
}
private void pb_export_Click(object sender, EventArgs e)
{
//saveFileDialog
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
List> tempViewSource = GetData();
try
{
FreeHttp.AutoTest.MyCommonHelper.FileHelper.CsvFileHelper.SaveCsvFile(saveFileDialog.FileName, tempViewSource);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Stop", MessageBoxButtons.OK, MessageBoxIcon.Stop);
}
}
}
private DataTable FillData(List> sourceData)
{
sourceDataTable = new DataTable();
int columnCount = 0;
if (sourceData != null)
{
sourceDataTable.BeginLoadData();
foreach (List tempRowItem in sourceData)
{
if (tempRowItem != null && tempRowItem.Count > 0)
{
if (tempRowItem.Count > columnCount)
{
for (int i = columnCount; i < tempRowItem.Count; i++)
{
sourceDataTable.Columns.Add((i).ToString(), typeof(string));
}
columnCount = tempRowItem.Count;
}
sourceDataTable.Rows.Add(tempRowItem.ToArray());
}
else
{
sourceDataTable.Rows.Add(sourceDataTable.NewRow());
}
}
sourceDataTable.EndLoadData();
}
return sourceDataTable;
}
private List> GetData()
{
List> outData = new List>();
if (sourceDataTable != null)
{
if (dataGridView.IsCurrentCellDirty)
{
dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
dataGridView.BindingContext[dataGridView.DataSource].EndCurrentEdit();
}
dataGridView.EndEdit();
foreach (DataRow tempRow in sourceDataTable.Rows)
{
outData.Add(tempRow.ItemArray);
}
}
return outData;
}
private bool IsDataSourceEqual(List> yourDataSource)
{
if (listViewSource == yourDataSource) return true;
if(listViewSource == null || yourDataSource==null) return false;
if(listViewSource.Count!= yourDataSource.Count) return false;
for(int i =0;i< listViewSource.Count;i++)
{
if (listViewSource[i].Count != yourDataSource[i].Count) return false;
for(int j =0;j< listViewSource[i].Count;j++)
{
if(listViewSource[i][j]!= yourDataSource[i][j])
{
return false;
}
}
}
return true;
}
}
}
================================================
FILE: FreeHttpControl/EditSheetForm.resx
================================================